Savi developer documentation

Build on Savi Finance. Connect AI assistants with the Savi MCP server or call the Savi JSON-RPC API.

Savi securely connects account data to AI clients through MCP and to apps through the JSON-RPC API.

Use with an AI agent

Export this page as Markdown or bundle it with a task for your agent.

Try a task
Preview the prompt that will be copied

Quickstart: MCP

Add https://mcp.financesavi.com/mcp as a remote MCP server in any client that supports the Model Context Protocol. The client discovers the authorization server, registers itself, and sends you to Savi to sign in with an emailed code. No token to copy. Pick your client:

Claude Code
bash
claude mcp add --transport http savi https://mcp.financesavi.com/mcp

More in the MCP guide.

Quickstart: API

  1. Check connectivity. ping is public, so it needs no token. Press Send live request to call the live API, or copy the snippet.
POSThttps://api-v2.financesavi.com/rpcPublic
cURL
bash
curl -sS --max-time 30 -X POST 'https://api-v2.financesavi.com/rpc' \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"ping","params":{},"id":1}'

Captured response

Production capture
$ POST https://api-v2.financesavi.com/rpc  (ping)
HTTP 200

{
  "jsonrpc": "2.0",
  "result": {
    "reply": "pong"
  },
  "id": 1
}

Observed from the production API. This preview does not send a request.

  1. Get a token. Two calls: request an emailed code, then exchange it. Follow Get an API token.
  2. Call an authenticated method. With a token saved in this tab, this panel lists your most recent transactions:
POSThttps://api-v2.financesavi.com/rpcRequires token
cURL
bash
curl -sS --max-time 30 -X POST 'https://api-v2.financesavi.com/rpc' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $SAVI_TOKEN" \
  -d '{"jsonrpc":"2.0","method":"listTransactions","params":{"pagination":{"limit":10,"skip":0}},"id":1}'

The snippets read your token from the SAVI_TOKEN environment variable, so it is never pasted into code. Run export SAVI_TOKEN=<your token> first.

No token yet? Get one in two calls. The token stays in this tab and is only sent to api-v2.financesavi.com. Using it sends a read-only getCurrentUser request to find your user id.

Add a token to send this request.

Captured response

Local API capture (scrubbed)
$ POST https://api-v2.financesavi.com/rpc  (listTransactions)
HTTP 200

{
  "jsonrpc": "2.0",
  "result": {
    "transactions": [
      {
        "id": "tx_9bLm4Rt7Yc",
        "accountId": "account_5kQe2Xv9Lm",
        "name": "Coffee Shop",
        "amount": -450,
        "currency": "CAD",
        "source": "MANUAL",
        "category": "FOOD",
        "type": "EXPENSE",
        "categoryId": "cat_3nTq8Wd2Zs",
        "categoryDecision": {
          "source": "USER",
          "locked": true,
          "decidedAt": "2026-10-01T15:48:50.481Z",
          "lockedAt": "2026-10-01T15:48:50.481Z"
        },
        "transactedAt": "2026-10-01T09:30:00Z",
        "createdAt": "2026-10-01T15:48:50.481Z",
        "updatedAt": "2026-10-01T15:48:50.481Z",
        "fileIds": [],
        "isApproved": true,
        "tagIds": [],
        "lineItems": [],
        "activityLog": [],
        "oneOffSplitParticipants": [],
        "netAmount": -450,
        "refundStatus": "NONE"
      }
    ],
    "numItems": 1
  },
  "id": 1
}

Captured from the local sf1/api service and scrubbed. This preview does not send a request.

Choose your next step