Documentation

worthtracker API

Read your net worth, assets, liabilities, history, goals, income and expenses, and keep values up to date from your own scripts. The API speaks JSON over HTTPS.

https://worthtracker.net/api/v1

The machine-readable description is at /api/v1/openapi.json (OpenAPI 3.1). To use worthtracker from Claude or ChatGPT, read the MCP guide.

Authentication

Create an API key in Settings, under API and AI apps. Keys start with wt_ and are shown once, when you create them. We store only a hash, so a lost key cannot be shown again: revoke it and create a new one.

Send the key in the Authorization header of every request:

curl https://worthtracker.net/api/v1/me \
  -H "Authorization: Bearer wt_your_key_here"

Apps you connect through OAuth (for example Claude) get access tokens that work the same way. Keep keys out of source code and browser code: anyone with a key can read your financial data.

Scopes and plans

ScopeAllows
readSee your net worth, assets, liabilities, snapshots, goals, income and expenses. Every key has it.
writeAdd and change assets and liabilities, and take snapshots, and delete assets and liabilities.

The Free plan has read-only API access. Pro and Family can also write. The plan is checked on every request, so if a plan ends, existing keys keep reading but writes return 403 upgrade_required until you upgrade again. Creating things through the API counts against the same plan limits as the app.

Rate limits

Each key, and each connected app, may make 60 requests per minute. Every response carries the current state:

HeaderMeaning
RateLimit-LimitRequests allowed in the window
RateLimit-RemainingRequests left in the window
RateLimit-ResetSeconds until the window resets
RateLimit-PolicyThe limit and window, for example 60;w=60

Past the limit you get 429 rate_limited with a Retry-After header in seconds.

Responses and errors

A single item comes back as a plain JSON object. Lists come back as { "data": [ ... ] }. Dates are ISO 8601 in UTC, and amounts are plain numbers in the currency shown on each item.

Every error has the same shape:

{
  "error": {
    "code": "insufficient_scope",
    "message": "This API key does not have the write scope."
  }
}
StatusCodeMeaning
400invalid_requestA field is missing, has the wrong type, or is not allowed.
400invalid_jsonThe body is not valid JSON.
401unauthorizedNo credentials were sent.
401invalid_tokenThe key or token is wrong, revoked or expired.
403insufficient_scopeThe key or connection does not have the scope this call needs.
403upgrade_requiredWriting needs a Pro or Family plan.
403plan_limit_reachedThe plan limit for this kind of item was reached.
404not_foundNo item with that id on your account.
429rate_limitedToo many requests. Wait for the number of seconds in Retry-After.
500internal_errorSomething went wrong on our side.

Endpoints

GET/api/v1/me

Get the account and credential. Who the credential belongs to, the plan, the scopes it can use now, and the plan limits. Scope: read.

curl "https://worthtracker.net/api/v1/me" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/net-worth

Get current net worth. Current totals and the breakdown by category, worked out the same way as the dashboard. Scope: read.

curl "https://worthtracker.net/api/v1/net-worth" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/assets

List assets. Scope: read.

curl "https://worthtracker.net/api/v1/assets" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

POST/api/v1/assets

Add an asset. Counts against the plan's asset limit, like adding an asset in the app. Scope: write.

curl -X POST "https://worthtracker.net/api/v1/assets" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Brokerage account","category":"STOCKS","value":25000}'

GET/api/v1/assets/{id}

Get an asset. Scope: read.

curl "https://worthtracker.net/api/v1/assets/ASSET_ID" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

PATCH/api/v1/assets/{id}

Change an asset. Send only the fields to change. A new value is recorded in the asset's value history. Scope: write.

curl -X PATCH "https://worthtracker.net/api/v1/assets/ASSET_ID" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"value":26500}'

DELETE/api/v1/assets/{id}

Delete an asset. Scope: write.

curl -X DELETE "https://worthtracker.net/api/v1/assets/ASSET_ID" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/liabilities

List liabilities. Scope: read.

curl "https://worthtracker.net/api/v1/liabilities" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

POST/api/v1/liabilities

Add a liability. Scope: write.

curl -X POST "https://worthtracker.net/api/v1/liabilities" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Mortgage","category":"MORTGAGE","balance":180000}'

GET/api/v1/liabilities/{id}

Get a liability. Scope: read.

curl "https://worthtracker.net/api/v1/liabilities/LIABILITY_ID" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

PATCH/api/v1/liabilities/{id}

Change a liability. Send only the fields to change. Scope: write.

curl -X PATCH "https://worthtracker.net/api/v1/liabilities/LIABILITY_ID" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"balance":178500}'

DELETE/api/v1/liabilities/{id}

Delete a liability. Scope: write.

curl -X DELETE "https://worthtracker.net/api/v1/liabilities/LIABILITY_ID" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/snapshots

List net worth history. Snapshots, newest first. Scope: read.

curl "https://worthtracker.net/api/v1/snapshots?limit=12" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

POST/api/v1/snapshots

Take a snapshot. Records the current net worth. Counts against the plan's monthly snapshot limit; the automatic monthly snapshot does not count. Scope: write.

curl -X POST "https://worthtracker.net/api/v1/snapshots" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"notes":"After the bonus"}'

GET/api/v1/goals

List goals. Goals with progress against the current net worth. Scope: read.

curl "https://worthtracker.net/api/v1/goals" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/income

List income streams. Scope: read.

curl "https://worthtracker.net/api/v1/income" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/expenses

List expenses. Scope: read.

curl "https://worthtracker.net/api/v1/expenses" \
  -H "Authorization: Bearer $WORTHTRACKER_API_KEY"

GET/api/v1/openapi.json

Get this OpenAPI document. Public; needs no credentials.

curl "https://worthtracker.net/api/v1/openapi.json"