Reference
API Reference
Every Thrive API endpoint on one page.
Retrieve the key owner
Returns the Thrive user that owns the API key. Only the id and display name are exposed — never email or other personal data.
Authentication: API key · Required scope: profile:read
curl "https://jointhrive.org/api/public/v1/me" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "user",
"id": "8b0c…",
"display_name": "Grant"
}Errors: invalid_api_key, missing_scope, rate_limited
Sign in to test this endpoint with one of your keys.
Get a quote
Latest price for a stock, ETF, crypto asset or index, from the same live market feed that powers Thrive Markets.
Authentication: API key · Required scope: markets:read
Parameters · Get a quote
Ticker, e.g. AAPL, NVDA, BTC.
stock (default), etf, bond, crypto, commodity or index.
curl "https://jointhrive.org/api/public/v1/markets/quote?symbol=AAPL" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "quote",
"symbol": "AAPL",
"price": 341.07,
"prevClose": 335.92,
"changeAbs": 5.15,
"changePct": 1.53,
"source": "live",
"asOf": 1790366400000
}Errors: parameter_missing, parameter_invalid, symbol_not_found, market_data_unavailable
Sign in to test this endpoint with one of your keys.
Get price history
Daily closing bars for the last N days.
Authentication: API key · Required scope: markets:read
Parameters · Get price history
Ticker symbol.
Asset kind, default stock.
1–3650, default 30.
curl "https://jointhrive.org/api/public/v1/markets/history?symbol=AAPL&days=30" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "list",
"symbol": "AAPL",
"data": [
{ "d": "2026-09-24", "o": 336.72, "h": 338.91, "l": 334.3, "c": 335.92 },
{ "d": "2026-09-25", "o": 336.04, "h": 341.67, "l": 334.53, "c": 341.07 }
]
}Errors: parameter_missing, parameter_invalid, symbol_not_found
Sign in to test this endpoint with one of your keys.
List simulations
The full catalog of Thrive life simulations, from the same registry that powers the app. Each includes a link that launches it in Thrive.
Authentication: API key · Required scope: simulations:read
curl "https://jointhrive.org/api/public/v1/simulations" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "list",
"data": [
{
"id": "first-paycheck",
"title": "Spend Your First Paycheck",
"category": "Budgeting",
"difficulty": "Starter",
"minutes": 15,
"url": "https://jointhrive.org/simulations/first-paycheck"
}
]
}Errors: invalid_api_key, missing_scope
Sign in to test this endpoint with one of your keys.
List projects
The key owner's Agent Projects, most recently updated first (up to 100).
Authentication: API key · Required scope: projects:read
curl "https://jointhrive.org/api/public/v1/projects" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "list",
"data": [
{
"id": "3f1e…",
"title": "My First Car",
"goal": "Buy a reliable car under $15,000",
"template": "car",
"status": "active"
}
]
}Errors: invalid_api_key, missing_scope
Sign in to test this endpoint with one of your keys.
Retrieve a project
One project with its saved items (simulations, lessons, conversations, notes). Only the key owner's projects are reachable.
Authentication: API key · Required scope: projects:read
Parameters · Retrieve a project
Project id (path parameter).
curl "https://jointhrive.org/api/public/v1/projects/PROJECT_ID" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "project",
"id": "3f1e…",
"title": "My First Car",
"items": [ … ]
}Errors: resource_missing, missing_scope
Sign in to test this endpoint with one of your keys.
Create a project
Creates an Agent Project owned by the key owner. Retrying with the same Idempotency-Key returns the first result.
Authentication: API key · Required scope: projects:write · Supports Idempotency-Key
Parameters · Create a project
1–120 characters.
Up to 500 characters.
curl -X POST "https://jointhrive.org/api/public/v1/projects" \
-H "Authorization: Bearer $THRIVE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"title":"Emergency fund","goal":"Save $3,000"}'{
"object": "project",
"id": "3f1e…",
"title": "Emergency fund",
"status": "active"
}Errors: missing_scope, parameter_invalid, project_limit, idempotency_conflict
Get the virtual portfolio
The key owner's VIRTUAL practice portfolio — simulated cash and positions. No real money is involved.
Authentication: API key · Required scope: portfolio:read
curl "https://jointhrive.org/api/public/v1/portfolio" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "portfolio",
"virtual": true,
"cash": 91234.5,
"positions": [ { "symbol": "AAPL", "quantity": 20, "avg_cost": 331.2, "current_price": 341.07, "market_value": 6821.4 } ],
"total_value": 98055.9
}Errors: invalid_api_key, missing_scope
Sign in to test this endpoint with one of your keys.
List virtual trades
Recent virtual transactions, newest first.
Authentication: API key · Required scope: trading:read
Parameters · List virtual trades
1–200, default 50.
curl "https://jointhrive.org/api/public/v1/trades" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "list",
"virtual": true,
"data": [ { "symbol": "AAPL", "side": "buy", "quantity": 20, "price": 331.2 } ]
}Errors: missing_scope, parameter_invalid
Sign in to test this endpoint with one of your keys.
Place a virtual trade
Buys or sells in the key owner's VIRTUAL practice portfolio at the live price. The server checks cash and holdings and updates positions itself — callers can never set cash, quantity or cost basis. Send an Idempotency-Key so a retry never trades twice.
Authentication: API key · Required scope: trading:write · Supports Idempotency-Key
Parameters · Place a virtual trade
Ticker.
stock (default), etf, bond, crypto, commodity, index.
buy or sell.
Shares. Provide this or dollar_amount.
Dollars to trade. Provide this or quantity.
curl -X POST "https://jointhrive.org/api/public/v1/trades" \
-H "Authorization: Bearer $THRIVE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"symbol":"AAPL","side":"buy","quantity":2}'{
"object": "trade",
"virtual": true,
"symbol": "AAPL",
"side": "buy",
"price": 341.07,
"quantity": 2,
"newCash": 90552.36
}Errors: missing_scope, parameter_invalid, trade_rejected, idempotency_conflict, rate_limited
Get learning progress
How many lessons and simulations the key owner has started and completed.
Authentication: API key · Required scope: progress:read
curl "https://jointhrive.org/api/public/v1/progress" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "progress",
"lessons": { "started": 12, "completed": 9 },
"simulations": { "started": 4, "completed": 3 }
}Errors: missing_scope
Sign in to test this endpoint with one of your keys.
Get credit usage
Agent credit balance and the 20 most recent credit changes. Read-only: credits, billing and plans can't be changed through the API.
Authentication: API key · Required scope: usage:read
curl "https://jointhrive.org/api/public/v1/usage" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "usage",
"balance": 84,
"plan_id": "credits_100",
"recent": [ { "amount": -1, "type": "usage", "source": "developer_api" } ]
}Errors: missing_scope
Sign in to test this endpoint with one of your keys.
Get connected-app status
Which outside apps (Gmail, Plaid, …) the owner has connected, and their status. Data from those apps is never available through the API or MCP.
Authentication: API key · Required scope: connections:read
curl "https://jointhrive.org/api/public/v1/connections" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "list",
"data": [ { "provider": "gmail", "status": "connected" } ]
}Errors: missing_scope
Sign in to test this endpoint with one of your keys.
List Agent chats
Titles of the owner's saved Agent chats, most recent first.
Authentication: API key · Required scope: agent:read
Parameters · List Agent chats
1–100, default 20.
curl "https://jointhrive.org/api/public/v1/agent/chats" \
-H "Authorization: Bearer $THRIVE_API_KEY"{
"object": "list",
"data": [ { "id": "…", "title": "Can I afford a $20k car?" } ]
}Errors: missing_scope
Sign in to test this endpoint with one of your keys.
Ask the Agent
Asks the Thrive Agent a money question and returns a text answer. Costs 1 Agent credit from the owner's normal balance, charged once per Idempotency-Key — retries never double charge. Returns 402 when the balance is empty.
Authentication: API key · Required scope: agent:write · Supports Idempotency-Key
Parameters · Ask the Agent
1–2000 characters.
curl -X POST "https://jointhrive.org/api/public/v1/agent/ask" \
-H "Authorization: Bearer $THRIVE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"question":"How does an emergency fund work?"}'{
"object": "agent_answer",
"answer": "An emergency fund is…",
"credits_charged": 1,
"credits_remaining": 83
}Errors: missing_scope, insufficient_credits, agent_unavailable, idempotency_conflict