SaveSlot Docs

Developers

HTTP API reference

Base URL and versions

https://api.saveslot.ai/v1

The version is in the path. Breaking changes get a new version; additive changes (new fields, new endpoints) do not.

Authentication

Every request sends a bearer token:

Authorization: Bearer <token>
TokenWho uses itReaches
API key (ss_ro_…, ss_rw_…)Your own backendOne slot, read only or read and write
OAuth access tokenApps your users authorizeThe slots and permissions the user approved. See OAuth apps

A request outside the token's reach returns 404 for slots it cannot see and 403 for actions it may not take, so a token never learns about slots it was not given.

Errors

Errors use one shape:

{
  "error": {
    "code": "read_only",
    "message": "This key can only read slot “Health”.",
    "request_id": "req_8f2c…",
    "retry_after": null
  }
}
StatuscodeWhen
400invalid_requestMalformed body or parameters; message names the field
401unauthenticatedMissing, expired or revoked token
403read_only, forbidden_scopeThe token cannot write here, or lacks create tables / delete data
404not_foundThe slot, table or record does not exist for this token
409conflict, version_mismatchThe record changed since you read it, or is in an unresolved conflict
422official_tableTried to change the structure of an official table
429rate_limitedToo many requests; wait retry_after seconds
5xxserver_errorRetry with backoff; quote request_id to support

The console maps every code to a message the person can act on, and always shows request_id on failure.

Pagination

List endpoints return one page and the total:

{ "items": [ … ], "page": 1, "page_size": 20, "total": 255 }

Query parameters: page (1-based) and page_size. Records are newest first.

Concurrency and retries

  • Every record has a version. Send If-Match: <version> on corrections; a stale version returns 409 version_mismatch.
  • Send Idempotency-Key: <uuid> on any POST. Repeating a request with the same key returns the first result instead of creating a duplicate.

Times and amounts

  • Times are ISO 8601 with offset (2026-11-15T07:40:00-08:00). The console formats them in the person's time zone and language; the API never returns display strings such as “1 hour ago”.
  • Money is an integer in the smallest unit plus a currency: { "amount": 800, "currency": "usd" }.

Resources

Slots

Method and pathPurpose
GET /slotsSlots the token can reach
GET /slots/{slot}One slot, with its tables and extensions

Tables

Method and pathPurpose
GET /slots/{slot}/tablesTables with columns, kind (official, agent, derived) and record counts
POST /slots/{slot}/tablesCreate a table (needs create tables)
POST /slots/{slot}/tables/{table}/recomputeRecompute a derived table

Records

Method and pathPurpose
GET /slots/{slot}/tables/{table}/records?q=&trust=&page=Search, filter by trust marker, and page
POST /slots/{slot}/tables/{table}/recordsAdd a record
PATCH /slots/{slot}/tables/{table}/records/{id}Correct a record; adds a version
GET …/records/{id}/historyAll versions
POST …/records/{id}/restoreRestore version n; adds a version
POST …/records/{id}/resolveSettle a conflict with the chosen option
DELETE …/records/{id}Delete (needs delete data); returns a preview first unless confirm=true

A record looks like this:

{
  "id": "rec_m2",
  "values": { "time": "2026-11-12T19:30:00-08:00", "what": "Beef noodles", "calories": 650 },
  "trust": "inferred",
  "sources": [{ "kind": "agent", "name": "Claude · Web" }],
  "version": 3,
  "written_at": "2026-11-12T19:31:04-08:00",
  "conflict": null
}

trust is one of confirmed, inferred, unknown, conflicted. When trust is conflicted, conflict.options lists each value with its source and time.

Pages

Method and pathPurpose
GET /slots/{slot}/pagesPages in a slot
GET /pages/{page}The page, its declared queries and versions
DELETE /pages/{page}Delete an agent page; default pages cannot be deleted

Activity and usage

Method and pathPurpose
GET /slots/{slot}/activity?range=&actor=&kind=&failures_only=Activity events
GET /usageCalls this period, by day and by connection

Open questions for engineering Draft