Skip to main content

Money Moves

Money Moves are structured, time-boxed financial action cycles delivered to users on their chosen cadence (weekly, biweekly, etc.). Each cycle contains a set of tasks across three categories:

Task typeDescription
"do"A concrete financial action with an associated dollar amount (e.g., transfer $150 to savings)
"learn"A short financial education task tailored to the user's situation
"mind"A mindset or reflection exercise to build healthy money habits

Money Moves require a financial plan to exist first. Use POST /v1/users/{user_id}/plan before calling /money-moves/generate.


Object reference​

Cycle object​

FieldTypeDescription
idstringUnique identifier for the cycle
user_idstringThe Ozzie user this cycle belongs to
due_datestring (ISO 8601)The date by which this cycle's tasks should be completed
cadence"weekly" | "biweekly" | "twice_monthly" | "monthly"The frequency this cycle is part of
status"scheduled" | "available" | "completed" | "skipped"Current state of the cycle
tasksTask[]The list of tasks in this cycle
created_atstring (ISO 8601)When the cycle was generated

Task object​

FieldTypeDescription
idstringUnique identifier for the task
task_type"do" | "learn" | "mind"The category of the task
titlestringHuman-readable description of the task
amount_centsinteger | nullDollar amount in cents (only present for "do" tasks)
status"pending" | "done" | "skipped"Whether the task has been completed
completed_atstring (ISO 8601) | nullWhen the task was marked done (null if pending/skipped)

GET /v1/users/{user_id}/money-moves​

Lists all money move cycles for a user. Supports filtering by status and cursor-based pagination.

Path parameters​

ParameterTypeRequiredDescription
user_idstringYesThe Ozzie user ID

Query parameters​

ParameterTypeRequiredDescription
status"scheduled" | "available" | "completed" | "skipped"NoFilter cycles by status
limitintegerNoNumber of cycles to return. Default: 10. Max: 50.
cursorstringNoPagination cursor from a previous response's next_cursor

Request​

curl "https://api.ozzieapp.com/v1/users/usr_4f8a1b2c3d/money-moves?status=available&limit=5" \
-H "Authorization: Bearer ozp_Y2xpZW50X2ExYjJjM2Q0OnNrX2xpdmVfeEs5bVAycVI3dEwu"

Response​

{
"object": "list",
"data": [
{
"id": "mmv_3a7c9e1b2d",
"user_id": "usr_4f8a1b2c3d",
"due_date": "2025-05-19T23:59:59Z",
"cadence": "biweekly",
"status": "available",
"created_at": "2025-05-05T14:40:00Z",
"tasks": [
{
"id": "tsk_1a2b3c4d5e",
"task_type": "do",
"title": "Transfer $150 to your Emergency Fund savings account",
"amount_cents": 15000,
"status": "pending",
"completed_at": null
},
{
"id": "tsk_2b3c4d5e6f",
"task_type": "learn",
"title": "Read: Why a 3-month emergency fund is the right first milestone",
"amount_cents": null,
"status": "pending",
"completed_at": null
},
{
"id": "tsk_3c4d5e6f7g",
"task_type": "mind",
"title": "Write down one thing you'd feel less stressed about with $10,000 in savings",
"amount_cents": null,
"status": "pending",
"completed_at": null
}
]
}
],
"pagination": {
"has_more": false,
"next_cursor": null
}
}

Errors​

CodeHTTP StatusWhen it occurs
UNAUTHORIZED401Missing or invalid credentials
NOT_FOUND404The user does not exist
VALIDATION_ERROR422Invalid status value or limit out of range

POST /v1/users/{user_id}/money-moves/generate​

Triggers generation of the next money move cycle for the user. Ozzie's AI analyzes the user's current plan, goal, and transaction history to produce a new set of personalized tasks.

warning

This endpoint requires that a financial plan already exists for the user. Call POST /v1/users/{user_id}/plan first. If no plan exists, you will receive a PLAN_REQUIRED error.

Each call generates exactly one new cycle. The cycle is placed in "scheduled" status and becomes "available" on its due_date.

Path parameters​

ParameterTypeRequiredDescription
user_idstringYesThe Ozzie user ID

Request body​

No request body required.

Request​

curl -X POST https://api.ozzieapp.com/v1/users/usr_4f8a1b2c3d/money-moves/generate \
-H "Authorization: Bearer ozp_Y2xpZW50X2ExYjJjM2Q0OnNrX2xpdmVfeEs5bVAycVI3dEwu" \
-H "Content-Type: application/json"

Response​

Returns the newly generated cycle with all its tasks.

{
"object": "money_move",
"data": {
"id": "mmv_5d8f2a4b9c",
"user_id": "usr_4f8a1b2c3d",
"due_date": "2025-06-02T23:59:59Z",
"cadence": "biweekly",
"status": "scheduled",
"created_at": "2025-05-05T14:45:00Z",
"tasks": [
{
"id": "tsk_4d5e6f7g8h",
"task_type": "do",
"title": "Transfer $150 to your Emergency Fund β€” you're 12% of the way there!",
"amount_cents": 15000,
"status": "pending",
"completed_at": null
},
{
"id": "tsk_5e6f7g8h9i",
"task_type": "learn",
"title": "Read: How to automate your savings so you never forget a transfer",
"amount_cents": null,
"status": "pending",
"completed_at": null
},
{
"id": "tsk_6f7g8h9i0j",
"task_type": "mind",
"title": "Reflect: What's one subscription you've kept but barely used this month?",
"amount_cents": null,
"status": "pending",
"completed_at": null
}
]
}
}

Errors​

CodeHTTP StatusWhen it occurs
UNAUTHORIZED401Missing or invalid credentials
NOT_FOUND404The user does not exist
PLAN_REQUIRED422No financial plan exists for the user
INTERNAL_ERROR500AI generation failed β€” safe to retry

GET /v1/users/{user_id}/money-moves/{move_id}​

Retrieves a single money move cycle by ID, including all of its tasks.

Path parameters​

ParameterTypeRequiredDescription
user_idstringYesThe Ozzie user ID
move_idstringYesThe money move cycle ID

Request​

curl https://api.ozzieapp.com/v1/users/usr_4f8a1b2c3d/money-moves/mmv_3a7c9e1b2d \
-H "Authorization: Bearer ozp_Y2xpZW50X2ExYjJjM2Q0OnNrX2xpdmVfeEs5bVAycVI3dEwu"

Response​

{
"object": "money_move",
"data": {
"id": "mmv_3a7c9e1b2d",
"user_id": "usr_4f8a1b2c3d",
"due_date": "2025-05-19T23:59:59Z",
"cadence": "biweekly",
"status": "available",
"created_at": "2025-05-05T14:40:00Z",
"tasks": [
{
"id": "tsk_1a2b3c4d5e",
"task_type": "do",
"title": "Transfer $150 to your Emergency Fund savings account",
"amount_cents": 15000,
"status": "done",
"completed_at": "2025-05-06T09:15:00Z"
},
{
"id": "tsk_2b3c4d5e6f",
"task_type": "learn",
"title": "Read: Why a 3-month emergency fund is the right first milestone",
"amount_cents": null,
"status": "pending",
"completed_at": null
},
{
"id": "tsk_3c4d5e6f7g",
"task_type": "mind",
"title": "Write down one thing you'd feel less stressed about with $10,000 in savings",
"amount_cents": null,
"status": "pending",
"completed_at": null
}
]
}
}

Errors​

CodeHTTP StatusWhen it occurs
UNAUTHORIZED401Missing or invalid credentials
NOT_FOUND404User or money move cycle not found

PATCH /v1/users/{user_id}/money-moves/{move_id}​

Updates the status of a money move cycle. Use this to mark a cycle as completed or skipped when the user finishes their tasks or opts out of the current cycle.

Path parameters​

ParameterTypeRequiredDescription
user_idstringYesThe Ozzie user ID
move_idstringYesThe money move cycle ID

Request body​

FieldTypeRequiredDescription
status"completed" | "skipped"YesThe new status for the cycle

Request​

curl -X PATCH https://api.ozzieapp.com/v1/users/usr_4f8a1b2c3d/money-moves/mmv_3a7c9e1b2d \
-H "Authorization: Bearer ozp_Y2xpZW50X2ExYjJjM2Q0OnNrX2xpdmVfeEs5bVAycVI3dEwu" \
-H "Content-Type: application/json" \
-d '{
"status": "completed"
}'

Response​

Returns the updated cycle object.

{
"object": "money_move",
"data": {
"id": "mmv_3a7c9e1b2d",
"user_id": "usr_4f8a1b2c3d",
"due_date": "2025-05-19T23:59:59Z",
"cadence": "biweekly",
"status": "completed",
"created_at": "2025-05-05T14:40:00Z",
"tasks": [
{
"id": "tsk_1a2b3c4d5e",
"task_type": "do",
"title": "Transfer $150 to your Emergency Fund savings account",
"amount_cents": 15000,
"status": "done",
"completed_at": "2025-05-06T09:15:00Z"
},
{
"id": "tsk_2b3c4d5e6f",
"task_type": "learn",
"title": "Read: Why a 3-month emergency fund is the right first milestone",
"amount_cents": null,
"status": "done",
"completed_at": "2025-05-07T20:30:00Z"
},
{
"id": "tsk_3c4d5e6f7g",
"task_type": "mind",
"title": "Write down one thing you'd feel less stressed about with $10,000 in savings",
"amount_cents": null,
"status": "done",
"completed_at": "2025-05-07T20:35:00Z"
}
]
}
}

Errors​

CodeHTTP StatusWhen it occurs
UNAUTHORIZED401Missing or invalid credentials
NOT_FOUND404User or money move cycle not found
VALIDATION_ERROR422Invalid status value, or cycle is already in a terminal state
INVALID_JSON400Request body is not valid JSON
tip

After marking a cycle "completed" or "skipped", you can immediately call POST /money-moves/generate to queue the next cycle. This keeps your users' task lists fresh without gaps.