Reference for the Savi Finance JSON-RPC API: request format, authentication, errors and documented methods.
Export this page as Markdown or bundle it with a task for your agent.
Preview the prompt that will be copied
Your first authenticated read
- Run ping to verify connectivity without a token. Expect a live HTTP 200 response with
reply: pong. - Sign in with the guided email-code flow, then verify the token with
getCurrentUser. - Call listAccounts. The signed-in userId replaces the example userId; a pasted token alone does not identify it. An empty account list can still be a successful read.
Requests here use your real Savi data. Local previews are fixed examples, not a sandbox. Start with reads; write and email actions require explicit confirmation.
Request format
Send a JSON-RPC 2.0 POST with Content-Type: application/json to:
https://api-v2.financesavi.com/rpc{
"jsonrpc": "2.0",
"method": "ping",
"params": {},
"id": 1
}Authenticated methods need an Authorization: Bearer <token> header. See Authentication.
Simulate transaction and goal timelines
Test clocks let an integration exercise time-based flows without waiting for bank posts. Create an isolated scenario with createTestClock, move its clock forward with advanceTestClock, and inspect posted and pending activity with getTestClock.
{
"frozenTime": "2026-10-02T00:00:00Z",
"transactions": [
{
"at": "2026-10-03T00:00:00Z",
"name": "Simulated payroll",
"amount": 2500,
"currency": "CAD",
"type": "INCOME"
}
],
"goals": [
{
"name": "Emergency fund",
"targetAmount": 1000,
"initialAmount": 100,
"contributions": [
{
"at": "2026-10-03T00:00:00Z",
"amount": 150
},
{
"at": "2026-10-04T00:00:00Z",
"amount": 250
}
]
}
]
}A clock owns only its synthetic scenario. Its events do not enter listTransactions or listSavingGoals, and the API does not contact a bank. Event schedules are fixed at creation; each createTestClock call creates a separate clock, so create one per tester or scenario and keep its returned id. Clocks belong to the authenticated Savi identity, not an individual bearer-token session. People using the same identity can access and advance the same clock IDs; separate identities are isolated. Time moves forward only, up to the returned maxTime. Clocks expire after seven days and can be removed with deleteTestClock. See the MCP test-clock workflow to run the same flow through tools.
Use with Postman
Download the collection and import it in Postman using the Postman import flow. It includes a request for every documented API method, with the versioned endpoint prefilled and public and authenticated methods grouped separately. Get an API token through the sign-in flow, then set the collection's saviToken variable locally. Store it as a secure variable or in Postman Vault, and never share or export a collection after adding a token.
Example IDs may not exist in your account. Review every request before sending; some methods change real data or send email.
Responses and errors
A successful call returns HTTP 200 with a result. A rejected call returns an error object. The captures below show the status and body returned by safe, unauthenticated production requests.
Troubleshooting a request
- No HTTP response: check connectivity or browser CORS. Local preview origins may be blocked by the production API. Run the copied cURL snippet to distinguish an API failure from browser restrictions.
- HTTP response but no matching JSON-RPC result: inspect the body and error code. HTTP 200 alone does not prove success; check the JSON-RPC version, request id, and result/error envelope.
- Unauthenticated or permission denied: sign in again or check ownership and roles. API bearer tokens and MCP OAuth tokens serve different endpoints.
- A request timed out: the docs stop waiting after 30 seconds. Check whether a write completed before retrying; requests are not automatically retried.
When reporting a problem, include the method, HTTP status, JSON-RPC error code, and a sanitized description of the request. Remove tokens, email codes, and personal financial data.
Error codes
Errors use JSON-RPC envelopes, rather than REST Problem Details. Inspect both the HTTP status and the JSON-RPC error object. These captured requests do not read or change account data.
HTTP 400 · InvalidParams (-32602)
Production capture for ping at . The request and response payloads match the capture.
{
"jsonrpc": "2.0",
"method": "ping",
"params": {
"message": 42
},
"id": 2
}{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "invalid params"
},
"id": 2
}HTTP 404 · MethodNotFound (-32601)
Production capture for codexProofMethodDoesNotExist at . The request and response payloads match the capture.
{
"jsonrpc": "2.0",
"method": "codexProofMethodDoesNotExist",
"params": {},
"id": 3
}{
"jsonrpc": "2.0",
"error": {
"code": -32601,
"message": "unknown method"
},
"id": 3
}HTTP 400 · Unauthenticated (-32002)
Production capture for getCurrentUser at . The request and response payloads match the capture.
{
"jsonrpc": "2.0",
"method": "getCurrentUser",
"params": {},
"id": 4
}{
"jsonrpc": "2.0",
"error": {
"code": -32002,
"message": "missing or invalid auth token"
},
"id": 4
}| Code | Name | What to check |
|---|---|---|
-32600 | InvalidRequest | Check the JSON-RPC request envelope. |
-32601 | MethodNotFound | Use a documented method name. The API returns HTTP 404 for unknown methods. |
-32602 | InvalidParams | Check required fields, casing, types, and constraints in the method reference. |
-32603 | Internal | Report the failure. Verify whether a write succeeded before retrying it. |
-32001 | PermissionDenied | Check account ownership, roles, and permissions. |
-32002 | Unauthenticated | Sign in again and use a valid bearer token. |
-32004 | NotFound | Look up the record again rather than reusing an outdated ID. |
-32005 | ResourceExhausted | Check the method-specific quota or limit before retrying. |
Methods
Machine-readable references: method manifest, error-code registry, and Postman collection JSON.
| Method | Auth | Summary |
|---|---|---|
advanceTestClock | Token | Advances only the clock selected by id. Use the ID from each tester's own createTestClock call; clocks are shared across tokens for the same Savi identity and isolated between identities. |
createAccount | Token | createAccount - Creates a new account for the authenticated user. |
createTestClock | Token | Each call creates an independent clock with its own ID. Create one per tester or scenario. Clocks belong to the authenticated Savi identity, so tokens for the same identity share access. |
createTransaction | Token | createTransaction — creates a new transaction for the authenticated user. |
deleteTestClock | Token | deleteTestClock permanently deletes an owned test clock and its isolated scenario. It does not modify ordinary financial data. |
deleteTransaction | Token | deleteTransaction — deletes a transaction by ID. |
getAccount | Token | Get Account - retrieves a single account by ID with optional data. |
getCurrentUser | Token | Get Current User - returns information about the authenticated user. |
getTestClock | Token | getTestClock returns the current frozen time, posted and pending synthetic transactions, and each goal's progress with its posted and upcoming contributions. Clocks are visible only to their creator… |
getTransaction | Token | getTransaction — fetches a single transaction by ID. |
listAccounts | Token | List Accounts - retrieves accounts for a specific user with optional data. |
listAlerts | Token | listAlerts — returns all spending/income alerts owned by the authenticated user. |
listLifePlans | Token | listLifePlans — paginated listing of life plans owned by the caller with their associated data. |
listProjections | Token | listProjections — lists cash-flow projections owned by the caller, with optional filters. |
listSavedFilters | Token | listSavedFilters — paginated listing of saved filters owned by the caller. |
listSavingGoals | Token | listSavingGoals — lists the saving goals the caller contributes to. |
listTransactions | Token | List Transactions - retrieves transactions for the authenticated user with optional filtering. |
loginByEmailVerification | Public | Login By Email Verification - exchanges the 6-digit code emailed by sendLoginCodeEmail for a bearer token. |
ping | Public | Ping handler - tests basic connectivity. |
sendLoginCodeEmail | Public | Send Login Code Email - issues a one-time code or login link via email. |
updateTransaction | Token | updateTransaction — partially updates a transaction using field masks. |