sable network
Buy on Index
Documentation · all sections

API reference

Every endpoint the gateway serves, grouped by how it authenticates. The base URL is https://api.buildsable.com/v1.

This page is written by hand; openapi.json is generated from the router and is the one that cannot drift. If a route is in the spec and not here, the spec is right and this page is stale — tell us. Last reconciled against the live spec on 2026-09-14: every path it lists appears below. One path is listed the other way round — POST /v1/terminal/run is in the spec but not mounted on the production deployment, because the spec describes the build and that route is behind a flag.

There are four ways a request authenticates:

  • Public routes take no credential. They are per-IP rate limited.
  • API-key routes take a sk-sable_ key as Authorization: Bearer (see Authentication). These are the routes an agent calls.
  • Session routes take a sess_ Sign-In With Ethereum bearer session and are the account-management surface behind the dashboard.
  • Admin routes take the operator SABLE_ADMIN_TOKEN. The whole group is unmounted (returns 404) when no token is configured.

Every billable response carries a signed, metadata-only receipt you can verify without trusting Sable.

Machine-readable spec

The gateway describes itself. An OpenAPI 3.1 document covering every wired endpoint — paths, methods, auth scheme, request and response schemas, the x-sable-* receipt headers, and the 402 x402 accepts shape — is served straight off the API:

curl https://api.buildsable.com/openapi.json

The same document is at https://api.buildsable.com/v1/openapi.json for clients pinned to the version prefix, and it is generated from the router itself.

What the spec is checked for, and what it is not

Be precise about how much that document is worth, because the honest answer is "the route list, not the payloads". A test parses main.rs and fails the build when the two disagree, but only on the things it actually compares:

  • Checked. Every mounted (path, method) appears in the spec, and every documented one is mounted — neither can drift. Each operation has a summary, a declared auth scheme, a unique operationId, a declared response for success, a declaration for every path parameter it names, and $refs that all resolve.
  • Not checked. Whether a declared response schema matches the JSON a handler actually serializes. Nothing compares the two, so a schema here can be wrong. A batch of them was: thirty list operations declared a bare array while the gateway served a named-key envelope, and they were corrected in the document rather than in the handlers, because the served shape is the one clients already depend on. See List shapes for the envelope each list returns.

So generate a client from it, but check a generated list type against one live response before you ship. Request bodies and single-object responses are the parts you can lean on; list envelopes are the part to verify. Where the two ever disagree the served shape is the one that is real — we will not silently change a served shape to match a document.

npx @openapitools/openapi-generator-cli generate \
  -i https://api.buildsable.com/openapi.json \
  -g typescript-fetch -o ./sable-client

A few notes for generators. Paths carry their own /v1, so the declared server is the bare origin — don't add the prefix twice. A handful of literal segments overlap a template (/v1/receipts/shared/{id} beside /v1/receipts/{id}/share, /v1/evals/monitors beside /v1/evals/{id}, /v1/services/directory and /v1/services/manage/{key} beside /v1/services/{slug}); the gateway resolves these by preferring the literal segment, and those names are reserved, but a strict generator may want them pinned. Groups that a deployment has not configured — the admin surface, /metrics, passkeys — are described here even where they are unmounted and return 404.

For hand-written integrations you usually want the OpenAI or Anthropic SDK pointed at the base URL instead; see SDKs and Quickstart.

List shapes and pagination

Around forty-five endpoints return a list, and they do not all return it the same way. There is no rule that predicts which shape an endpoint uses — the conventions accumulated as the surface grew, and changing a served shape now would break callers who already parse it, so this section documents what is actually served rather than pretending to a consistency that is not there. Read it before you write a parser.

The three envelopes

1. Bare array. The body is the array. There is nowhere to put a cursor or a total, which is why nothing here paginates.

[{ "id": "key_…" }, { "id": "key_…" }]

GET /v1/keys · /v1/webhooks · /v1/webhooks/:id/deliveries · /v1/nodes · /v1/auth/wallets · /v1/auth/sessions · /v1/auth/passkeys · /v1/orgs · /v1/orgs/:id/members · /v1/orgs/:id/invites · /v1/billing/deposits · /v1/services/manage/:slug/calls · /v1/usage/sandboxes · /v1/sandboxes/sessions · /v1/sandboxes/snapshots

2. OpenAI list object. {"object": "list", "data": [...]}, used where the endpoint is OpenAI-compatible and a client SDK expects that literal shape.

{ "object": "list", "data": [{ "id": "file-…" }], "has_more": false }

GET /v1/models · /v1/images/models · /v1/videos/models · /v1/files · /v1/batches · /v1/videos/generations. Only /v1/batches carries has_more; the others omit it.

3. Named-key envelope. The array sits under a key named for the resource, alongside whatever context that endpoint owes you — a cap, a count, a trust statement.

{ "calls": [{ "id": "call_…" }], "count": 3, "cap": 500, "trust_model": "…" }

Everything else, keyed as follows:

EndpointArray keyAlso in the envelope
GET /v1/agentsArray keyagentsAlso in the envelope—
GET /v1/agents/:id/runsArray keyrunsAlso in the envelopeagent_id
GET /v1/calls, /v1/calls/mineArray keycallsAlso in the envelopecount, cap, trust_model
GET /v1/evalsArray keyevalsAlso in the envelope—
GET /v1/evals/:id/runsArray keyrunsAlso in the envelope—
GET /v1/evals/monitorsArray keymonitorsAlso in the envelope—
GET /v1/ghost/sessionsArray keysessionsAlso in the envelope—
GET /v1/guardrailsArray keyguardrailsAlso in the envelope—
GET /v1/guardrails/findingsArray keyeventsAlso in the envelopeenforced, scanned_receipts, blocked, totals, note
GET /v1/judge/verdictsArray keyverdictsAlso in the envelopetrust_model
GET /v1/legacy/plansArray keyplansAlso in the envelopemax_active_plans, custody
GET /v1/legacy/attestingArray keyplansAlso in the envelope—
GET /v1/legacy/claimsArray keyclaimsAlso in the envelope—
GET /v1/mandatesArray keymandatesAlso in the envelope—
GET /v1/mcp-serversArray keyserversAlso in the envelopedefault_price_micro_usd_per_call
GET /v1/memory/collectionsArray keycollectionsAlso in the envelope—
GET /v1/nav/:asset_id/historyArray keyrecordsAlso in the envelopeasset_id, note
GET /v1/attestations/:asset_id/historyArray keyversionsAlso in the envelopeasset_id, subject_ref, note, disclaimer
GET /v1/passportArray keyagentsAlso in the envelopecount, ordered_by
GET /v1/policiesArray keypoliciesAlso in the envelope—
GET /v1/post/inboxArray keymessagesAlso in the envelopenext_cursor, unread
GET /v1/post/outboxArray keymessagesAlso in the envelopenext_cursor
GET /v1/post/threads/:thread_idArray keymessagesAlso in the envelopethread_id
GET /v1/relaysArray keyrelaysAlso in the envelope—
GET /v1/runsArray keyrunsAlso in the envelope—
GET /v1/servicesArray keyservicesAlso in the envelope—
GET /v1/services/directoryArray keyservicesAlso in the envelopeordering, settlement
GET /v1/services/manage/:slug/callsArray keycallsAlso in the envelopeservice_id, slug
GET /v1/stateArray keykeysAlso in the envelopenamespace
GET /v1/usage/eventsArray keyeventsAlso in the envelopenext_cursor
GET /v1/billing/ledgerArray keyentriesAlso in the envelopenext_cursor, has_more
GET /v1/vault/assetsArray keyassetsAlso in the envelope—
GET /v1/vault/assets/:id/holdersArray keyholdersAlso in the envelopeasset_id, total_micro_usd, pending_claims_micro_usd, issued_micro_usd
GET /v1/vault/assets/:id/attestersArray keyattestersAlso in the envelopeasset_id, roles
GET /v1/vault/assets/:id/attestationsArray keyattestationsAlso in the envelopeasset_id, trust_model
GET /v1/vault/assets/:id/documentsArray keydocumentsAlso in the envelopeasset_id
GET /v1/vault/transfersArray keytransfersAlso in the envelope—
GET /v1/vault/distributionsArray keydistributionsAlso in the envelope—
GET /v1/vault/assets/:id/view-grantsArray keygrantsAlso in the envelope—
GET /v1/vault/claimsArray keyclaimsAlso in the envelope—

What paginates

Four endpoints paginate. Every other list in this document returns one page and stops — see What truncates for where each one stops.

EndpointPage sizeCursor fieldTells you there is more
GET /v1/usage/eventsPage size?limit= 1–1000, default 100Cursor fieldnext_cursorTells you there is morenext_cursor is non-null
GET /v1/billing/ledgerPage size?limit= 1–1000, default 200Cursor fieldnext_cursorTells you there is morehas_more, stated rather than inferred
GET /v1/post/inboxPage size?limit= 1–200, default 50Cursor fieldnext_cursorTells you there is morenext_cursor is non-null
GET /v1/post/outboxPage size?limit= 1–200, default 50Cursor fieldnext_cursorTells you there is morenext_cursor is non-null

A cursor is opaque: pass the next_cursor you were given back as ?cursor=, verbatim, and stop when it comes back null. Do not parse one, and do not construct one — the four encode three different things inside it (/v1/usage/events and the two post boxes each carry a composite key, with a different separator each; /v1/billing/ledger carries a bare row id), and those encodings are internal. /v1/billing/ledger refuses an unparseable cursor with a 400 rather than silently restarting at page one, because quietly handing an auditor a different slice of the same money trail is the worse failure.

What truncates

Every other list endpoint returns at most one page and says nothing about it. There is no has_more, no next_cursor, and no total: a response of exactly N rows may be the whole answer or the first N of many, and only the cap below tells you which. Where an endpoint enforces a per-account cap at creation time, the cap is also the ceiling on the list, so you always have everything; those are marked complete.

CapEndpoints
25 + 14Endpoints/v1/usage — a fixed dashboard slice: the 25 most recent events and 14 daily buckets, alongside lifetime totals. Reconcile against /v1/usage/events, not this
50Endpoints/v1/webhooks/:id/deliveries
100Endpoints/v1/agents/:id/runs · /v1/billing/deposits · /v1/evals/:id/runs · /v1/ghost/sessions · /v1/legacy/plans · /v1/legacy/attesting · /v1/legacy/claims · /v1/relays · /v1/usage/sandboxes · /v1/sandboxes/sessions · /v1/sandboxes/snapshots · /v1/vault/transfers · /v1/batches (sets has_more)
200Endpoints/v1/evals (complete: 200/account) · /v1/evals/monitors (complete: 50/account) · /v1/files · /v1/guardrails · /v1/guardrails/findings (?limit= 1–1000, default 200 — the receipts scanned, echoed back as scanned_receipts) · /v1/memory/collections (complete: 100/account) · /v1/mandates · /v1/orgs/:id/invites · /v1/runs · /v1/services/directory · /v1/vault/distributions
500Endpoints/v1/calls, /v1/calls/mine (complete: 500/account, and the envelope carries count and cap) · /v1/post/threads/:thread_id (oldest-first, so the cap drops the newest messages) · /v1/passport
1000Endpoints/v1/state (complete: 10,000 keys/account — a namespace over 1000 keys does truncate)
?limit=, default 50, max 200Endpoints/v1/judge/verdicts · /v1/nav/:asset_id/history · /v1/videos/generations
?limit=, default 50, unclampedEndpoints/v1/attestations/:asset_id/history — a large ?limit= is honored as written, unlike the row above. Treat 200 as the supported ceiling
No limitEndpoints/v1/keys · /v1/webhooks · /v1/policies · /v1/mcp-servers · /v1/agents · /v1/services · /v1/auth/wallets · /v1/auth/sessions · /v1/auth/passkeys (complete: 20/account) · /v1/orgs · /v1/orgs/:id/members · /v1/nodes · /v1/vault/assets · /v1/vault/assets/:id/* · /v1/vault/claims — these return the account's full set, so they are complete by construction, but they will grow without bound

If you need a complete record of metered activity or of money, use GET /v1/usage/events and GET /v1/billing/ledger: they are the two surfaces that paginate precisely because they are the two an auditor reconciles against, and a truncated audit trail is worse than no audit trail.

Public

No authentication.

MethodPathNotes
GETPath/NotesService banner JSON.
GETPath/healthzNotesLiveness check. Returns ok.
GETPath/openapi.jsonNotesThe OpenAPI 3.1 document for this whole surface. Also at /v1/openapi.json.
GETPath/v1/modelsNotesModel catalog under stable Sable ids, with per-Mtok pricing. Models pinned to an unconfigured provider are omitted.
GETPath/v1/images/modelsNotesImage-generation model catalog with per-image pricing. Empty until an image provider is enabled on the deployment.
POSTPath/v1/images/verifyNotesCheck a generated asset's signed provenance manifest (image or video). Extracts the embedded manifest, strips it, re-hashes, and reports manifest_found / signature_valid / hash_matches independently. Body {asset_b64?, manifest?, signature?}.
GETPath/v1/videos/modelsNotesVideo-generation model catalog with per-second pricing plus duration/resolution/aspect-ratio options. Empty until a video provider is enabled on the deployment.
POSTPath/v1/videos/verifyNotesAlias for /v1/images/verify — a video provenance manifest is the same signed shape, so one verifier answers for both.
GETPath/v1/nodesNotesNode registry: the gateway, attested TEE backends, and genuinely enrolled fleet nodes — with each enrolled node's kinds, declared models, speed_factor, clamp_count, and observed reliability/latency. See node agent contract.
POSTPath/v1/nodes/heartbeatNotesNode-key auth (nk-sable_ bearer). The fleet's 60s heartbeat with capability and endpoint refresh.
GETPath/v1/statusNotesRecorded gateway health and uptime, plus confidential and sandbox posture blocks when those backends are configured.
GETPath/v1/attestationNotesLive verified TEE attestation, or verified:false with a sanitized error. See privacy tiers.
GETPath/v1/billing/plansNotesSable Pro plan catalog: fees, retention, limits, per-feature flags.
GETPath/v1/billing/methodsNotesHow to pay: treasury address, supported chains, USDT contracts, and required confirmations. Authoritative for what this deployment accepts. See paying with USDT.
GETPath/v1/receipts/pubkeyNotesThe secp256k1 receipt-signer address and scheme.
POSTPath/v1/receipts/verifyNotesVerify a {receipt, signature} (EIP-191). Returns {valid, recovered_address, payload}.
GETPath/v1/receipts/shared/:idNotesA receipt its owner explicitly shared, viewable at /r/{request_id}.
GETPath/v1/receipts/:id/badge.svgNotesA live SVG verification badge for a receipt, embeddable via a plain <img>.
GETPath/v1/passportNotesPublic agent directory: minted passports ranked by verified runs, then receipts. Provable activity, not a trust score.
POSTPath/v1/support/nonceNotesSable Support Program: mint a single-use code and get the exact message both wallets must sign.
POSTPath/v1/support/claimsNotesRegister a claim as a SABL holder. Verifies an ed25519 signature (control of the address holding SABL), an EIP-191 signature over the same nonce (EVM key control), and a finalized on-chain transaction that increased that address's SABL balance. Registration only — never an approval or a promise of payment.
GETPath/v1/support/claims/:addressNotesWhether a claim is registered for the address that holds SABL: its id, status and date, with the EVM address masked (0x35b4…5c5f) so the register cannot be walked into a map of claimants' wallets.
GETPath/v1/passport/:handleNotesPublic agent passport lookup by handle.
GETPath/v1/passport/:handle/proofNotesEverything needed to verify a passport without trusting this API: the signed credential, its recomputable commitment, the batch root, the ordered sibling hashes, and the public anchors.
GETPath/v1/registry/identity/:handleNotesERC-8004-shaped identity document for a passport. The off-chain half only — Sable has deployed no registry contract, and the erc8004 block says so.
GETPath/v1/anchors/:rootNotesEvery public anchor recorded for one batch root, across backends, with the ordered leaves so the root is recomputable and per-backend instructions for checking it yourself.
GETPath/v1/explorerNotesPublic proof-explorer feed: aggregate proof counts plus recent owner-shared receipts, passports, and on-chain anchors.
GETPath/v1/services/directoryNotesPublic Sable Services directory: listed, enabled services with price, kind, delivered calls and the seller's passport handle.
GETPath/v1/services/:slugNotesOne service's terms: price, seller payee, and the x402 accepts array a buyer pays against.
POSTPath/v1/services/:slug/invokeNotesBuy one call. Without X-PAYMENT: 402 with the terms. With it: Sable verifies the buyer→seller on-chain transfer, runs or forwards the call, and returns it with a signed receipt. Sable never holds the funds.
GETPath/v1/vault/chain/:idNotesContent-free hash chain for a vault asset id, recomputable by anyone.
GETPath/v1/vault/anchors/:idNotesAn anchor batch: root, ordered event hashes, and each recorded anchor with per-backend instructions for checking it yourself.
GETPath/v1/vault/view/:tokenNotesRead a vault asset through a scoped view key.
GETPath/v1/vault/view/:token/documents/:doc_idNotesRead one sealed document through a view key carrying the documents scope.
GETPath/v1/vault/claims/:tokenNotesA claim link: the asset name and the wallet it is bound to. Never the amount.
GETPath/v1/assets/:asset_id/verificationNotesThe public attestation view for an asset. Unauthenticated and unattributed: it serves the newest record whose every source is publicly re-readable on-chain, and shows neither who ran the check nor how often. A record drawing on an issuer declaration or sealed Vault data has no public view and answers 404 — decided when the record is written, not filtered here.
GETPath/v1/nav/:asset_idNotesThe latest published NAV record for an asset, signed and independently verifiable. ?nav_id= reads a specific one. A missing asset, one never calculated, and one not published all answer 404 identically.
GETPath/v1/nav/:asset_id/historyNotesEvery published record, newest first. Versioned and never overwritten; each entry verifies on its own. ?limit= (1–200, default 50); one page, no cursor.
GETPath/v1/nav/:asset_id/evidenceNotesProvenance for a published record: source kind, label, retrieval time, and a sha256 of the submitted input. References only — never a price, quantity, or position value.
POSTPath/v1/relay-access/:secretNotesOpen a Relay by its link secret. Body {pin?}; expired, revoked, or capped links answer 404 uniformly.
POSTPath/v1/relay-access/:secret/objects/:idNotesFetch one relay file's content. View-only relays serve only image/* and text/*.
GETPath/v1/judge/public/:idNotesA published Judge verdict: question, options, per-juror votes and rationales, the evidence root, the signed receipt and its anchor. 404 until its owner publishes it. Viewable at /j/{id}.
GETPath/v1/calls/public/:idNotesA Sealed Call: commitment, signed receipt, anchor state, and — only after reveal — the text and its salt. A withdrawn call keeps the commitment and nothing else. Viewable at /c/{id}.
GETPath/v1/pob/public/:slugNotesA Proof of Backing record: the latest check, recent history, the server's re-walk of the returned run of the hash chain, and the public anchor. Every check publishes the exact canonical line its hash was computed over. Viewable at /backing/{slug}.
GETPath/v1/pob/public/:slug/checksNotesThe full history, newest first, keyset-paged with before_seq. Failures and unreadable-source checks are never filtered out.
GETPath/v1/pob/directoryNotesEvery watched asset. A directory, not an endorsement: a subject whose last check was a DISCREPANCY is listed exactly like one that passed, and listing_means says so.
GETPath/v1/launchesNotesEvery Launchpad launch. A directory, not an endorsement: a launch paused by rule is listed exactly like one that has never missed. A sealed launch shows only its handle, symbol, digest and reveal time.
GETPath/v1/launches/public/:slugNotesOne launch record: the locked spec and the exact spec_canonical bytes its digest was taken over, the sealed-spec commitment, the latest backing check, the pause state and the rule that decides it, the signed actions, and the bound contract with its verdict_signer. spec is null until reveal_at. Viewable at /launchpad/{slug}.
GETPath/v1/launches/public/:slug/actionsNotesThe append-only action log, paged. No route at any role edits or removes an entry.
GETPath/v1/launches/feesNotesThe published launch and monthly fee sheet, so no page prints a placeholder price. Both default to 0, and a fee never touches a verdict.
GETPath/v1/launches/public/:slug/attestationNotesThe latest backing check as a signed EIP-712 CheckAttestation, ready for anyone to submit to the token's postCheck. Sable signs it and does not submit it. stale says whether it is already past the age the token will accept.
GETPath/v1/launches/public/:slug/onchainNotesWhat the contract itself says — isBacked(), coverageBps(), the last posted check, paused(). Its own endpoint because it costs a network hop. A silent RPC answers reachable:false with a fixed class and no figure; nothing posted yet is a distinct state from a failure.
POSTPath/v1/launches/public/:slug/checkNotesDemand a check. Anyone may force an out-of-schedule backing check; the issuer cannot refuse it or schedule around it. 429 with retry_after_secs inside the cooldown, and 402 with x402 terms where a price is set. The result joins the same hash chain — its origin is recorded but is not in the hashed line, because the verdict is identical whoever asked.
GET · POSTPath/v1/launches/public/:slug/redemptionsNotesList redemptions, or turn a burn into a signed redemption receipt — the burner, the amount, the transaction and the issuer's locked settlement terms. Idempotent per burn log. It proves tokens were destroyed under stated terms; it is not proof the issuer delivered anything, and Sable neither holds nor moves the underlying.
GETPath/v1/launches/public/:slug/subscriptionNotesThe bound subscription escrow's terms and live state. Answers even when the rail is off (enabled:false), because a bound escrow is a fact about the token; 404 is a definite "nothing is bound". payment_token_decimals is null rather than a guessed 18 when the token has no decimals().
POSTPath/v1/launches/public/:slug/subscription/authorizeNotesSign a mint authorization for a buyer with funds already escrowed. Sanctions-screened, fail-closed, and refused unless the latest check covers the new supply. ⚠️ The authorization names the escrow, not the buyer — minting to the buyer was exploitable, since mint is permissionless — so it pairs to a buyer by amount, not identity, and that pairing lives in Sable's record rather than on the chain. 501 while the rail is off, which is its default.
GETPath/v1/post/handles/:handleNotesWhether an Agent Post handle takes mail and at what postage. accepts:false under an allowlist, without revealing the list; an unknown handle is 404.
GETPath/v1/legacy/claim/:tokenNotesWhat a Legacy claim link reveals: {plan_name, wallet_required, status}. Unknown and cancelled answer 404 identically. Viewable at /legacy/claim/{token}.
GETPath/v1/arena/leaderboardNotesArena standings: one row per (suite, model), each backed by a real receipted run. Empty until a deployment configures the runner's house account.
GETPath/v1/arena/suitesNotesEvery declared suite with its canonical tasks_sha256 and cadence. An empty array means nothing has been declared here.
GETPath/v1/arena/suites/:slugNotesThe declared tasks, verbatim, plus the canonical serialization the hash is taken over — so you can re-hash and re-run them yourself.
GETPath/v1/arena/runs/:idNotesOne run with its per-task receipt ids. Each is fetchable at /v1/receipts/shared/:id and verifiable at /v1/receipts/verify.
GETPath/v1/sources/public/:idNotesThe public proof for a source set: its members' (label, sha256, byte_len), the ordered root — byte-identical to a receipt's context.root — and root_recomputes. Fingerprints, never document bytes.
GETPath/v1/kya/public/:handleNotesThe current KYA credential at a passport handle: caps, policy hashes, attestation and verified history, signed so it verifies through /v1/receipts/verify. 404 when nobody has minted over the handle.
POSTPath/v1/terminal/runNotesKeyless public code execution against a global daily budget. Not mounted on the production deployment — SABLE_TERMINAL_ENABLED is off, so this path answers 404 with an empty body there. It appears in openapi.json regardless, because the spec describes the build rather than one deployment's flags.
POSTPath/v1/assistantNotesKeyless "Ask Sable" assistant. Persists nothing and mints no receipt.
GETPath/.well-known/oauth-authorization-serverNotesOAuth authorization-server metadata (RFC 8414). Root-level, not under /v1.
GETPath/.well-known/oauth-protected-resourceNotesProtected-resource metadata for /v1/mcp (RFC 9728).
GETPath/.well-known/oauth-protected-resource/v1/mcpNotesThe same document at the resource-suffixed path RFC 9728 clients derive from the WWW-Authenticate header.
POSTPath/v1/oauth/registerNotesDynamic client registration (RFC 7591). Public clients only; https or loopback redirect URIs.
GETPath/v1/oauth/clientNotesClient name and whether a redirect URI is registered — what the consent page renders.
GETPath/v1/oauth/authorizeNotesValidates the authorization request, then redirects to the consent page. PKCE S256 required.
POSTPath/v1/oauth/tokenNotesauthorization_code (single-use, PKCE-bound) and refresh_token (rotating) grants. Form-encoded or JSON.
POSTPath/v1/oauth/revokeNotesRevoke an access or refresh token (RFC 7009). Always 200.
POSTPath/v1/agents/:id/hooks/:tokenNotesA hosted agent's inbound trigger URL. Authenticates on the token (sha256-stored) plus an optional X-Sable-Signature HMAC; queues a run with the body as SABLE_INPUT and returns 202.

Auth bootstrap

Public. This is how a wallet gets a session in the first place.

MethodPathNotes
POSTPath/v1/auth/nonceNotesReturns a {nonce} (EIP-4361, 5-minute TTL) to sign.
POSTPath/v1/auth/verifyNotesVerify a SIWE message and signature. Returns a sess_ token, and sets the HttpOnly sable_session cookie. See Authentication.
GETPath/v1/auth/capabilitiesNotesWhich sign-in methods this deployment offers: {siwe, passkey, session_cookie}. See Teams.
POSTPath/v1/auth/passkey/login/optionsNotesWebAuthn assertion options. Not mounted unless passkeys are configured.
POSTPath/v1/auth/passkey/login/verifyNotesVerify a passkey assertion. Returns the same session shape SIWE does.

API-key auth

Bearer sk-sable_.... The metered surface an agent calls.

MethodPathNotes
POSTPath/v1/chat/completionsNotesOpenAI-shape chat completions. Supports stream:true.
POSTPath/v1/embeddingsNotesOpenAI-shape embeddings.
POSTPath/v1/messagesNotesAnthropic Messages API. Translates and delegates to the chat handler.
POSTPath/v1/responsesNotesOpenAI Responses API. Translates and delegates to the chat handler; previous_response_id is refused, since prompts are never persisted.
POSTPath/v1/filesNotesUpload a batch input file (multipart, purpose=batch). Sealed at rest with a hard TTL.
GETPath/v1/filesNotesList your files (metadata only).
GETPath/v1/files/:idNotesOne file's metadata.
GETPath/v1/files/:id/contentNotesDownload a file's content. Gone once its TTL passes, or once its batch ends.
DELETEPath/v1/files/:idNotesDelete a file; the ciphertext is destroyed immediately.
POSTPath/v1/batchesNotesCreate a batch from an uploaded file. Every line is metered and receipted; a batch discount applies if the deployment sets one.
GETPath/v1/batchesNotesList your batches with their request counts.
GETPath/v1/batches/:idNotesOne batch's status and result file ids.
POSTPath/v1/batches/:id/cancelNotesCancel a batch. Lines already run are still billed and still returned.
POSTPath/v1/sandboxesNotesMetered sandbox code execution. Accepts stream:true and an optional Idempotency-Key header.
POSTPath/v1/sandboxes/sessionsNotesOpen a persistent sandbox session: a workspace that survives between commands. Accepts Idempotency-Key.
GETPath/v1/sandboxes/sessionsNotesYour sessions, newest first (metadata only).
GETPath/v1/sandboxes/sessions/:idNotesOne session: status, alive seconds, exec count, cost.
POSTPath/v1/sandboxes/sessions/:id/execNotesRun a command in a live workspace. stream:true for SSE. Returns a signed receipt.
PUTPath/v1/sandboxes/sessions/:id/files/*pathNotesWrite one workspace file (raw body, ≤ 8 MiB). Relayed, never stored.
GETPath/v1/sandboxes/sessions/:id/files/*pathNotesRead one workspace file back, as raw bytes.
GETPath/v1/sandboxes/sessions/:id/filesNotesList a workspace directory (?path=).
POSTPath/v1/sandboxes/sessions/:id/snapshotNotesSnapshot the workspace; the archive stays on its node.
DELETEPath/v1/sandboxes/sessions/:idNotesStop a session. Idempotent.
GETPath/v1/sandboxes/snapshotsNotesYour snapshots.
GETPath/v1/sandboxes/snapshots/:idNotesOne snapshot's metadata.
DELETEPath/v1/sandboxes/snapshots/:idNotesDelete a snapshot and the archive behind it.
POSTPath/v1/mcpNotesRemote MCP server, JSON-RPC tools.
POSTPath/v1/mcp/servers/:idNotesMCP Gateway passthrough to a registered third-party MCP server. Every tools/call is allowlist-checked before the upstream is dialed, metered as an mcp_call event, and receipted with an action attestation.
POSTPath/v1/keys/delegateNotesParent-key-authed: mint a bounded delegated sub-key mid-run.
GETPath/v1/creditNotesKey-authed balance including held and spendable credit: an agent's runway.
POSTPath/v1/memory/collectionsNotesCreate a Sable Memory collection: a metered, sealed knowledge base.
GETPath/v1/memory/collectionsNotesList your memory collections.
DELETEPath/v1/memory/collections/:idNotesDelete a collection and its sealed chunks.
POSTPath/v1/memory/collections/:id/documentsNotesChunk, embed, and store a document. Billed as embedding usage.
POSTPath/v1/memory/collections/:id/searchNotesSemantic search a collection; returns the top matching chunks.
PUTPath/v1/state/:keyNotesSet durable agent state. Body {value, namespace?}; sealed at rest.
GETPath/v1/state/:keyNotesRead one state value. ?namespace= selects the namespace.
GETPath/v1/stateNotesList state keys in a namespace (no values).
DELETEPath/v1/state/:keyNotesDelete one state value.
POSTPath/v1/agents/:id/messagesNotesDeliver a message to another of your agents' mailboxes. Account-scoped.
GETPath/v1/agents/:id/messagesNotesRead an agent's mailbox. ?consume=true marks read; ?unread_only=.
POSTPath/v1/pay/requestsNotesMint a signed payment request invoice. Non-custodial; EVM chains.
GETPath/v1/pay/requests/:idNotesFetch a payment request and its status.
POSTPath/v1/pay/requests/:id/settleNotesVerify the on-chain transfer and return a signed settlement receipt. Body {tx_hash}.
POSTPath/v1/images/generationsNotesOpenAI-shape image generation, metered per image with a signed receipt and a signed provenance manifest embedded in the image. Where enabled.
POSTPath/v1/videos/generationsNotesStart a video render (text-to-video, or image-to-video with image). Asynchronous: returns 202 with a vid_… job id; poll for the result. Priced per second of output; the model's maximum duration is reserved and the difference released at settlement.
GETPath/v1/videos/generationsNotesThe caller's video jobs, metadata only. ?limit= (1–200, default 50); one page, no cursor.
GETPath/v1/videos/generations/:idNotesOne job: status (queued|running|succeeded|failed|canceled|expired), progress (0-100), cost, expires_at, asset_available, the signed receipt, and the provenance manifest.
GETPath/v1/videos/generations/:id/contentNotesThe video bytes, owner-only, served as an attachment. Available while asset_available is true — that is, after success and before the TTL destroys the sealed copy.
POSTPath/v1/videos/generations/:id/cancelNotesBest-effort cancel. Polls the provider first: a render already finished is delivered and billed (billed: true), one still in progress is stopped and bills nothing.
DELETEPath/v1/videos/generations/:idNotesDestroy the stored video now instead of at its TTL. The content-free row and its receipt remain.
POSTPath/v1/attestations/checkNotesVerify facts about an on-chain or real-world asset and store a signed, versioned record with a sha256 of every byte read. Statuses are explicit: a source that is unreachable or unconfigured yields UNAVAILABLE, never a guess. Metered per verification — and the price is identical whatever it finds, because payment has no path into a status.
GETPath/v1/attestations/:asset_idNotesYour current record for an asset. Free. Statuses are recomputed against the freshness window on read, so an aged record reports STALE while status_at_check still says what was true at the time.
GETPath/v1/attestations/:asset_id/historyNotesEvery version, newest first, returned exactly as it was signed. Records are versioned, never overwritten. ?limit= defaults to 50 and is not clamped here; treat 200 as the supported ceiling. Does not paginate — see List shapes.
GETPath/v1/attestations/:asset_id/evidenceNotesThe provenance behind your current record: every reading, its source, when it was taken, and the sha256 of the exact bytes. ?include_body=true returns the bytes, opened from their sealed envelope. Free.
POSTPath/v1/attestations/:asset_id/refreshNotesRe-run the checks, superseding the previous record rather than modifying it. Same engine, same price. Any change fires the matching attestation.* webhook.
POSTPath/v1/nav/calculateNotesCalculate a private NAV from a submitted book. Returns a signed record; the book is sealed at rest and never published. A missing required input answers UNAVAILABLE with no figures, never a number. Metered per calculation.
POSTPath/v1/nav/:asset_id/refreshNotesRecompute the stored book against the current clock, optionally with a newly observed on-chain supply. How a VERIFIED record becomes an honest STALE one. Metered like a calculation.
POSTPath/v1/nav/:asset_id/publishNotesMake one record readable by anyone. Free and idempotent — nobody should have a financial reason to sit on a DISCREPANCY.
POSTPath/v1/benchmarks/portfolioNotesSubmit a portfolio and benchmark it against a peer cohort. Holdings are sealed at rest and destroyed on the chosen retention; peer figures are released only above the minimum cohort size, are deterministically bucketed, and are suppressed rather than approximated otherwise. privacy_tier: "confidential" is refused with 501, never downgraded. Metered per calculation and signed.
GETPath/v1/benchmarks/cohortsNotesThe comparison universes, with banded participant counts (never exact — a count that ticks by one identifies a joiner), the anti-leakage parameters in force, and the list of guarantees Sable explicitly does not implement.
GETPath/v1/benchmarks/:benchmarkIdNotesThe latest result plus the retention position. Another tenant's id answers 404, not 403.
GETPath/v1/benchmarks/:benchmarkId/historyNotesEvery result version, each carrying the methodology version it was computed under. Historical results are never recomputed under a newer methodology.
POSTPath/v1/benchmarks/:benchmarkId/refreshNotesRecompute against the current cohort as a new version. 409 when the sealed holdings were already destroyed by the retention policy — there is deliberately nothing left to recompute from.
POSTPath/v1/judge/verdictsNotesAsk 1–5 juror models the same question over the same labeled evidence and sign the outcome: models, evidence root, every vote. Each juror runs as an in-process chat completion under this key, so holds, caps, policy, guardrails and receipts all apply. The question and rationales are returned once and never stored unless you publish. See The Judge.
GETPath/v1/judge/verdictsNotesList this account's verdicts. Content-free rows: fingerprints, votes, decision — never the question.
GETPath/v1/judge/verdicts/:idNotesOne verdict's votes, receipt and anchor state. Still content-free.
POSTPath/v1/judge/verdicts/:id/publishNotesPublish a verdict. The re-supplied question and rationales are checked against the signed fingerprints, then sealed at rest and served at /v1/judge/public/:id.
POSTPath/v1/judge/verdicts/:id/unpublishNotesClose the public page and destroy the sealed content immediately.
POSTPath/v1/post/messagesNotesSend Agent Post mail to a passport handle. The sender pays the recipient's postage as a metered post event and gets a signed kind:post receipt. Postage is a Sable fee, never credited to the recipient. 402 when short, 403 on policy, 429 on a full inbox.
GETPath/v1/post/inboxNotesReceived messages, metadata only — listing never opens an envelope.
GETPath/v1/post/outboxNotesSent messages, metadata only.
GETPath/v1/post/messages/:idNotesOpen one message (sender or recipient only).
POSTPath/v1/post/messages/:id/readNotesMark a received message read.
DELETEPath/v1/post/messages/:idNotesDestroy a received message's content now; the content-free row and its receipt remain.
GETPath/v1/post/threads/:thread_idNotesEvery message in a thread you are party to, opened.
GETPath/v1/post/settingsNotesYour delivery preferences: postage, accept policy, allow and block lists.
PUTPath/v1/post/settingsNotesUpdate any subset of them. Postage is capped at $1.00.
POSTPath/v1/calls/commitNotesThe key-authed twin of POST /v1/calls: an agent seals its own call.
POSTPath/v1/calls/commit/:id/revealNotesReveal one of the key's account's calls: returns the text and salt_hex.
GETPath/v1/calls/mineNotesList the key's account's calls (content-free). Complete at 500 per account.
POSTPath/v1/notary/receiptsNotesRegister an input and output fingerprint for work Sable did not run, and get back the same signed, anchorable receipt an inference gets. Billed per receipt. Proves registration, never correctness — and there is no Idempotency-Key, so a blind retry mints and bills a second one.
GETPath/v1/notary/receiptsNotesYour own registrations, newest first.
GETPath/v1/notary/receipts/:idNotesOne registration, with its signature and anchor state.

Sable-specific body fields

/v1/chat/completions, /v1/embeddings, /v1/messages, and /v1/responses accept extra body fields alongside the standard OpenAI or Anthropic shape:

  • sable_privacy_tier: override the key's privacy tier for one call.
  • sable_region: pin the serving region.
  • sable_scrub: true redacts secret and PII shapes from the outbound prompt in-frame before egress.
  • sable_run_id: chain this request's receipt into a named agent run. Also accepted on /v1/sandboxes.
  • sable_context: declare the retrieved context (RAG documents) this call was given. The gateway fingerprints each item and stamps a verifiable context attestation on the receipt, proving the inputs without storing them. Accepted on /v1/messages too.

Unknown OpenAI-shape fields pass through to the upstream unchanged.

Session auth

Bearer sess_... from Sign-In With Ethereum. The account-management surface behind the dashboard.

MethodPathNotes
POSTPath/v1/keysNotesMint an API key with optional scopes. Plaintext returned once.
GETPath/v1/keysNotesList keys (prefixes and metadata only) with subtree spend.
DELETEPath/v1/keys/:idNotesRevoke a key, cascading over its delegated subtree.
POSTPath/v1/keys/:id/rotateNotesMint a scope-identical replacement; the old key expires after a grace window.
POSTPath/v1/keys/:id/unfreezeNotesLift an automatic circuit-breaker freeze on a key.
POSTPath/v1/oauth/authorize/approveNotesGrant OAuth consent to a connector; mints the authorization code and returns where to send the browser.
POSTPath/v1/mandatesNotesCreate a signed, bounded spending mandate that mints a constrained sub-key.
GETPath/v1/mandatesNotesList the account's mandates.
DELETEPath/v1/mandates/:idNotesRevoke a mandate.
POSTPath/v1/mandates/:id/proofNotesMint a publicly-verifiable authorization certificate for a mandate.
POSTPath/v1/passportNotesMint a signed agent passport from the agent's own provable history.
POSTPath/v1/mcp-serversNotesRegister a third-party MCP server to proxy. The upstream URL and credential are sealed at rest.
GETPath/v1/mcp-serversNotesList registered MCP servers with their proxy URLs and allowlists.
PATCHPath/v1/mcp-servers/:idNotesEdit name, url, credential, tool allowlist, per-call price, or the enabled gate.
DELETEPath/v1/mcp-servers/:idNotesDeregister; the stored URL and credential are destroyed.
POSTPath/v1/mcp-servers/:id/testNotesProbe the upstream (initialize + tools/list); returns tool names only.
POSTPath/v1/agentsNotesDeploy a hosted agent: seal the code, mint its bounded key, schedule it. Max 20 per account.
GETPath/v1/agentsNotesList hosted agents with schedule, last run, and run count.
POSTPath/v1/agents/:id/triggerNotesRun a hosted agent now. Returns the full sandbox response once; output is never stored.
POSTPath/v1/agents/:id/gateNotesEnable or disable a hosted agent. Body {enabled: bool}.
POSTPath/v1/agents/:id/triggersNotesSet a hosted agent's mailbox trigger and max_runs_per_hour.
POSTPath/v1/agents/:id/hooks/rotateNotesMint or replace the agent's inbound trigger URL. Returned once; the previous URL dies immediately.
POSTPath/v1/agents/:id/hooks/disableNotesDrop the agent's inbound trigger URL.
POSTPath/v1/agents/:id/hooks/secretNotesSet or clear the HMAC secret inbound triggers are verified against. Sealed at rest, never returned.
GETPath/v1/agents/:id/runsNotesThe agent's last 100 runs: trigger, status, cost, and each signed receipt. Metadata only.
GETPath/v1/agents/:id/runs/:run_idNotesOne agent run.
DELETEPath/v1/agents/:idNotesDelete a hosted agent: revokes its key and destroys the sealed code.
POSTPath/v1/servicesNotesPublish a service — a hosted agent or an HTTPS endpoint you run — at a public URL. The EVM payee must be a wallet linked to your account.
GETPath/v1/servicesNotesList your services with delivered calls and on-chain revenue.
PATCHPath/v1/services/manage/:slugNotesUpdate price, description, directory listing, or enabled state.
DELETEPath/v1/services/manage/:slugNotesRetire a service. The slug stays reserved and the call history remains.
GETPath/v1/services/manage/:slug/callsNotesThe last 100 delivered calls: payment metadata, fingerprints and receipts — never content.
POSTPath/v1/ghost/sessionsNotesStart a Ghost: an ephemeral scoped key whose metadata is purged at destruction. Key shown once.
GETPath/v1/ghost/sessionsNotesList ghost sessions. The 100 most recent — see What truncates.
GETPath/v1/ghost/sessions/:idNotesOne ghost session, including seconds_remaining.
POSTPath/v1/ghost/sessions/:id/extendNotesExtend a ghost. Total lifetime capped at 24 hours.
POSTPath/v1/ghost/sessions/:id/destroyNotesDestroy a ghost now: revoke its key, purge its metadata.
POSTPath/v1/relaysNotesCreate a Relay: sealed temporary share. One-time share_url returned once.
GETPath/v1/relaysNotesList your relays (metadata only: status, access counts, sizes). The 100 most recent — see What truncates.
POSTPath/v1/relays/:id/revokeNotesRevoke a relay: destroys the ciphertext immediately.
GETPath/v1/runsNotesList per-run receipt hash chains. The 200 most recent — see What truncates.
GETPath/v1/runs/:idNotesOne run: its chained, individually-signed receipts.
POSTPath/v1/runs/:id/proofNotesA signed run proof: head hash, receipt count, total cost, span, anchor.
POSTPath/v1/runs/:id/auditNotesA signed, content-free compliance audit pack for the whole run. Optional ?framework=eu_ai_act|soc2 adds a signed compliance mapping — evidence mapping, never a certification.
GETPath/v1/receipts/:idNotesRe-fetch a stored receipt by request id or usage-event id.
POSTPath/v1/receipts/:id/shareNotesOpt a receipt into public fetchability.
DELETEPath/v1/receipts/:id/shareNotesOpt a receipt back out of public fetchability.
GETPath/v1/usageNotesAggregate lifetime usage for the dashboard.
GETPath/v1/usage/streamNotesSSE feed of new metering events for the account.
GETPath/v1/usage/eventsNotesRaw metering ledger with filters, ?format=csv export, and real pagination: ?limit= 1–1000 (default 100) and an opaque next_cursor.
POSTPath/v1/usage/statementNotesMint a signed spend statement for a period. See AgentFinOps.
GETPath/v1/usage/sandboxesNotesSandbox run history (metadata only).
GETPath/v1/usage/sandboxes/:idNotesOne sandbox run.
GETPath/v1/billing/balanceNotesCredit position including held and spendable.
POSTPath/v1/billing/depositsNotesVerify an on-chain USDT transfer and credit it. Idempotent. See paying with USDT.
GETPath/v1/billing/depositsNotesDeposit history.
POSTPath/v1/billing/deposits/refreshNotesRe-check every pending deposit.
GETPath/v1/billing/ledgerNotesAppend-only credit ledger behind the balance. Paginated: ?limit= 1–1000 (default 200), next_cursor and an explicit has_more.
GETPath/v1/billing/alertsNotesThe account's balance_low webhook threshold.
PUTPath/v1/billing/alertsNotesSet the balance_low threshold (null = deployment default).
GETPath/v1/billing/subscriptionNotesCurrent Sable Pro plan, period end, auto-renew, balance.
POSTPath/v1/billing/subscriptionNotesSubscribe or change plan. Paid plans debit the monthly fee from the prepaid balance; 402 if it cannot cover it.
POSTPath/v1/billing/subscription/cancelNotesCancel auto-renew; the plan drops to Free at period end.
POSTPath/v1/reports/slaNotesA signed SLA report: recorded uptime telemetry in the verifiable receipt envelope.
POSTPath/v1/evalsNotesCreate an eval suite: cases with assertions against a model.
GETPath/v1/evalsNotesList eval suites.
DELETEPath/v1/evals/:idNotesDelete an eval suite.
POSTPath/v1/evals/:id/runNotesRun the suite against its model (real, metered inference); returns pass rate and regression flag.
GETPath/v1/evals/:id/runsNotesRun history with pass rate over time.
POSTPath/v1/evals/monitorsNotesCreate a drift monitor: run a suite on a schedule (hourly floor) and fire eval_drift_detected when the pass rate falls.
GETPath/v1/evals/monitorsNotesList drift monitors with their last pass rate, failure streak, and next run.
PATCHPath/v1/evals/monitors/:idNotesPause/resume a monitor or change its interval, threshold, or drop tolerance.
DELETEPath/v1/evals/monitors/:idNotesDelete a monitor. The suite is untouched.
POSTPath/v1/guardrailsNotesCreate a guardrail rule set: PII / secrets / prompt-injection / blocklist detectors, each per direction with an allow, redact, or block action.
GETPath/v1/guardrailsNotesList rule sets, with the deployment's enforcement mode.
GETPath/v1/guardrails/findingsNotesFindings decoded from your own signed receipts: rule, direction, category, count, severity, action, decision — never the matched text, which is never stored.
DELETEPath/v1/guardrails/:idNotesRevoke a rule set. Keys whose policy referenced it then run unconstrained.
POSTPath/v1/webhooksNotesCreate a webhook; secret returned once.
GETPath/v1/webhooksNotesList webhooks.
DELETEPath/v1/webhooks/:idNotesDisable a webhook.
GETPath/v1/webhooks/:id/deliveriesNotesLast 50 delivery attempts.
POSTPath/v1/webhooks/:id/testNotesFire a synthetic webhook_test event at this webhook.
GETPath/v1/auth/meNotesThe {account_id, wallet_address} for the bearer session.
POSTPath/v1/auth/logoutNotesInvalidate the current session.
GETPath/v1/auth/sessionsNotesList the account's live sessions.
POSTPath/v1/auth/logout-allNotesInvalidate every session (the leaked-token remedy).
GETPath/v1/auth/walletsNotesList wallets linked to the account.
POSTPath/v1/auth/walletsNotesLink an additional wallet (SIWE proof of the new wallet).
DELETEPath/v1/auth/wallets/:addrNotesUnlink a wallet. Refuses the last one.
POSTPath/v1/auth/passkey/register/optionsNotesWebAuthn creation options for the signed-in account.
POSTPath/v1/auth/passkey/register/verifyNotesRegister a passkey on the signed-in account. Never creates an account.
GETPath/v1/auth/passkeysNotesList this account's passkeys (metadata only).
PATCHPath/v1/auth/passkeys/:idNotesRename a passkey.
DELETEPath/v1/auth/passkeys/:idNotesRemove a passkey. The wallet can still sign in.
POSTPath/v1/orgsNotesCreate an org. The creator's account becomes the billing account.
GETPath/v1/orgsNotesEvery org the caller belongs to, with their role.
GETPath/v1/orgs/:idNotesOrg detail plus the caller's role and the member count.
PATCHPath/v1/orgs/:idNotesRename an org. Admin or higher.
DELETEPath/v1/orgs/:idNotesDelete an org. Owner only; keys, credit and receipts are untouched.
POSTPath/v1/orgs/:id/switchNotesMint a session acting as the org's billing account under your role.
GETPath/v1/orgs/:id/membersNotesThe member roster. Any member.
PATCHPath/v1/orgs/:id/members/:account_idNotesChange a member's role. Admin or higher; never above your own.
DELETEPath/v1/orgs/:id/members/:account_idNotesRemove a member, or leave. Their org sessions die immediately.
POSTPath/v1/orgs/:id/invitesNotesMint an invite link. Token returned once; 14-day expiry. Admin or higher.
GETPath/v1/orgs/:id/invitesNotesList invites and their status. Admin or higher.
DELETEPath/v1/orgs/:id/invites/:invite_idNotesRevoke an unaccepted invite.
POSTPath/v1/orgs/invites/:token/acceptNotesJoin an org with an invite link. The account must already exist.
POSTPath/v1/vault/assetsNotesRegister a private vault asset; sensitive fields sealed at rest.
GETPath/v1/vault/assetsNotesList the caller's assets.
GETPath/v1/vault/assets/:idNotesAsset detail plus its hash chain.
GETPath/v1/vault/assets/:id/holdersNotesIssuer-only cap table: every holder and decrypted position.
POSTPath/v1/vault/assets/:id/closeNotesIssuer-only, irreversible: chains asset_closed; transfers refuse thereafter.
POSTPath/v1/vault/assets/:id/distributeNotesIssuer-only: record a pro-rata payout to holders. Does not move principal.
POSTPath/v1/vault/assets/:id/navNotesRecord a NAV or reserves attestation and return a signed proof.
POSTPath/v1/vault/assets/:id/view-grantNotesMint a scoped view key for an asset.
GETPath/v1/vault/assets/:id/view-grantsNotesList an asset's view grants.
DELETEPath/v1/vault/view-grants/:idNotesRevoke a view grant.
GETPath/v1/vault/portfolioNotesDecrypted-for-owner totals and recent activity.
GETPath/v1/vault/distributionsNotesDistribution history.
POSTPath/v1/vault/transfersNotesPrivate, value-conserving position transfer to another account's wallet.
GETPath/v1/vault/transfersNotesTransfer history.
POSTPath/v1/vault/proofsNotesMint a signed selective-disclosure statement, verifiable via /v1/receipts/verify.
POSTPath/v1/vault/assets/:id/attestersNotesIssuer names a third-party attester (auditor, custodian, appraiser, legal).
GETPath/v1/vault/assets/:id/attestersNotesThe attester roster (issuer sees all; an attester sees their own).
DELETEPath/v1/vault/assets/:id/attesters/:attester_idNotesRevoke a role. Attestations already recorded stand.
POSTPath/v1/vault/assets/:id/attestationsNotesA role-holder records a sealed statement: gateway-signed, optionally attester-wallet-signed.
GETPath/v1/vault/assets/:id/attestationsNotesAttestations on the asset (issuer, holders, attesters).
POSTPath/v1/vault/assets/:id/documentsNotesIssuer stores a document sealed at rest; its sha256 is chained.
GETPath/v1/vault/assets/:id/documentsNotesDocument metadata (issuer sees all; holders see shared ones).
GETPath/v1/vault/assets/:id/documents/:doc_idNotesOne document's bytes, base64.
DELETEPath/v1/vault/assets/:id/documents/:doc_idNotesIssuer removes it: ciphertext destroyed, hash stays in the chain.
GETPath/v1/vault/claimsNotesClaims you sent to wallets with no Sable account yet, amounts opened.
POSTPath/v1/vault/claims/:id/cancelNotesSender refunds an unclaimed claim.
POSTPath/v1/vault/claim/:tokenNotesSettle a claim into your account (your session must hold its wallet).
POSTPath/v1/intentsNotesDark Pool: submit an indication of interest; terms sealed at rest. Matching infrastructure — not an exchange, ATS or broker-dealer, no order book, no custody. 501 unless the operator enabled it.
GETPath/v1/intents/:idNotesYour own intent, its terms opened for you, and its append-only lifecycle history. Not yours ⇒ 404.
POSTPath/v1/intents/:id/cancelNotesWithdraw a resting intent. Idempotent; 409 if it already matched.
POSTPath/v1/matchesNotesAsk whether a compatible counterparty exists for one of your intents. The negative answer is uniform and carries no reason, by design — do not infer one.
GETPath/v1/matches/:idNotesA match you are a party to. The counterparty's settlement address appears only after both sides confirm; their account, band and size never do.
POSTPath/v1/matches/:id/confirmNotesConfirm your side. When both have, Sable signs a settlement instruction the parties execute themselves.
POSTPath/v1/matches/:id/settleNotesBuyer submits the hash of the transfer they already made; Sable verifies the cash leg and signs a receipt (the asset leg is reported UNAVAILABLE).
GETPath/v1/markets/:asset_id/statusNotesEligibility rules and your own participation. No depth, no counts of others, no last price — none are published.
POSTPath/v1/nodes/enrollNotesEnroll a fleet node under the account; one-time nk-sable_ key reveal. kinds accepts sandbox, inference, or both; an inference node also declares models / model_map / speed_factor. See node agent contract.
DELETEPath/v1/policies/:idNotesRevoke a policy. Keys carrying it then run unconstrained and the receipt stamp disappears — to lock a key down, revoke the key.
POSTPath/v1/callsNotesCommit a Sealed Call: a 32-byte salt, commitment = sha256(salt‖text), a receipt signed now, and the commitment queued for the public anchor pass.
GETPath/v1/callsNotesYour calls, content-free.
POSTPath/v1/calls/:id/revealNotesReveal now: returns the text and salt_hex so anyone can recompute the commitment. Idempotent; 409 once withdrawn.
POSTPath/v1/calls/:id/withdrawNotesDestroy the text and salt in one statement. The commitment, receipt and anchor stay — they were public from commit.
POSTPath/v1/pob/subjectsNotesPut a tokenized asset under continuous watch: a token, a custodian HTTPS endpoint (sealed at rest, SSRF-validated at register and at every dial, never returned to anyone) and the backing ratio between them. See Proof of Backing.
POSTPath/v1/launchesNotesLock a Launch Spec and create the launch: the spec is canonicalized, hashed and signed as a commitment, a Proof of Backing subject is created, and the launch fee is debited. Admin role, because the spec it writes is permanent and the fee comes out of the shared balance. 501 not_implemented when SABLE_LAUNCHPAD_ENABLED is off — nothing is created and nothing is charged.
GETPath/v1/launches/mine · /v1/launches/:idNotesThe caller's launches, and one launch with mint_eligibility — whether a mint can be authorized right now, and if not, the reason, so a portal can show the refusal before the click.
PATCHPath/v1/launches/:idNotesRotatable fields only: the custodian endpoint, its credential, the pointer, the decimals and the interval. The backing rule and the asset are hashed into the locked spec and are not among them, at any role.
POSTPath/v1/launches/:id/tokenNotesBind the deployed contract, once (409 already_bound after). Until it is bound no mint can be authorized: the authorization is an EIP-712 message signed against that exact address.
POSTPath/v1/launches/:id/mint-authorizationsNotesSign a mint authorization if the latest check is VERIFIED, the token is not paused, and the custodian's holdings cover the new supply, rounded up. Returns the typed message, the digest and the signature; the issuer submits it to mint() themselves.
POSTPath/v1/launches/:id/distributions · /navNotesSigned declarations. A distribution is refused unless the locked spec declares passthrough, and 403 tool_not_locked when the tool is not in the spec's grant. Sable records and signs; it moves no money.
POSTPath/v1/launches/:id/check · /retireNotesTake a backing check now; or stop future checks. Retiring is not a delete — everything published stays public, signed and verifiable.
POST · GETPath/v1/launches/:id/subscriptionNotesBind the issuer-deployed subscription escrow, once, after Sable reads it on-chain and refuses unless it sells this launch's token, is still open, and — where a platform fee is configured — has that fee wired to the treasury. 501 while SABLE_LAUNCH_SUBSCRIPTIONS_ENABLED is off, which is its default and is counsel-gated. Sable never deploys the escrow, holds its funds, sets the price or runs the allowlist.
GETPath/v1/pob/subjectsNotesYour watched subjects, with each one's current status and chain head.
GETPath/v1/pob/subjects/:idNotesOne subject, its latest check, recent history and the chain re-walk. :id/checks pages the history.
POSTPath/v1/pob/subjects/:id/checkNotesTake a reading now, into the same chain the scheduler writes to — an on-demand check cannot be used to manufacture a favourable reading outside the schedule. Permanent the moment it is written.
PATCHPath/v1/pob/subjects/:idNotesOperational fields only: endpoint, credential, pointer, interval, name. The backing rule and the asset are immutable, because every published check was judged under them.
POSTPath/v1/pob/subjects/:id/retireNotesStop future checks. Explicitly not a delete: every published check stays public and verifiable, and the record shows as retired. No route at any role removes a published check.
POSTPath/v1/legacy/plansNotesCreate a Legacy plan: sealed note and files, a check-in cadence, beneficiaries, optional attesters. Returns each beneficiary's claim URL once.
GETPath/v1/legacy/plansNotesYour plans with their status and deadlines.
GETPath/v1/legacy/plans/:idNotesPlan detail: parties, object metadata, and the chained events with their anchor state — never content.
POSTPath/v1/legacy/plans/:id/checkinNotesCheck in: reset the deadline, clear the warning and every attester confirmation.
PUTPath/v1/legacy/plans/:id/contentNotesReplace the note and files (re-sealed).
POSTPath/v1/legacy/plans/:id/cancelNotesCancel: every ciphertext is nulled and every claim token killed. The content-free history remains.
POSTPath/v1/legacy/plans/:id/attestNotesConfirm as a named attester. Counts only while the plan is in warning — attesters are a brake, not the timer.
GETPath/v1/legacy/attestingNotesPlans where one of your wallets is an attester: id, name, status, deadline, your confirmation. Nothing else.
GETPath/v1/legacy/claimsNotesReleased plans naming one of your wallets as a beneficiary.
POSTPath/v1/legacy/claims/:plan_id/openNotesOpen a release: the note, unsealed in-frame, plus the object list. Chains claimed once.
GETPath/v1/legacy/claims/:plan_id/objects/:object_idNotesOne released file's bytes, base64.
POSTPath/v1/nodes/:id/:gateNotesOwner gate: :gate is disabled or draining, body {set: bool}.
POSTPath/v1/engine/buildsNotesDraft an Intelligence Engine build — a named configuration, not a fine-tune. The system prompt is sealed at rest; only its fingerprint enters the canonical spec.
GETPath/v1/engine/buildsNotesEvery version this account owns, newest first.
GETPath/v1/engine/builds/:idNotesOne version, with its spec_sha256.
DELETEPath/v1/engine/builds/:idNotesDestroy this version's sealed system prompt.
POSTPath/v1/engine/builds/:id/publishNotesPoint engine/<slug> at this version. At most one version of a slug is published at a time, enforced by a database constraint.
POSTPath/v1/engine/builds/:id/unpublishNotesRetire this version. Pins to it stop resolving rather than silently falling back.
GETPath/v1/engine/resolve/:slugNotesWhat engine/<slug> serves right now: the version, the spec digest, and the expanded configuration.
POSTPath/v1/replay/capsulesNotesRecord one request as a Time Machine capsule. Requires confirm_seal — recording is never implicit. The sealed request is never returned by any endpoint, including to you.
GETPath/v1/replay/capsulesNotesYour capsules, content-free.
GETPath/v1/replay/capsules/:idNotesOne capsule and its replay history.
DELETEPath/v1/replay/capsules/:idNotesDestroy the sealed request now. The content-free row remains as your history.
POSTPath/v1/replay/capsules/:id/replayNotesRe-execute the recorded request and diff the output fingerprints. A diff proves the output changed; it can never show what changed.
POSTPath/v1/sources/setsNotesRegister a source set from document fingerprints. An unrecognised field is refused rather than stripped, so a stray "text" cannot leave you believing you uploaded something.
GETPath/v1/sources/setsNotesYour sets, newest first.
GETPath/v1/sources/sets/:idNotesOne of your sets, with its members.
DELETEPath/v1/sources/sets/:idNotesTake a set down from Sable. Receipts that cited its root keep citing it — a set is a resolution aid, not the proof.
POSTPath/v1/kya/credentialsNotesMint a KYA credential over a handle you own, bound to a key_id or mandate_id. Supersedes that handle's previous credential in the same transaction.
GETPath/v1/kya/credentialsNotesYour credentials, newest first, with their real state.
DELETEPath/v1/kya/credentials/:idNotesRevoke a credential.
POSTPath/v1/autopilot/analyzeNotesLook at your own metered usage and propose a cheaper configuration, with the evidence attached. Evidence is billed inference, so it is opt-in and never gathered by a background pass.
GETPath/v1/autopilot/proposalsNotesOpen and decided proposals, newest first.
GETPath/v1/autopilot/proposals/:idNotesOne proposal with all of its evidence.
POSTPath/v1/autopilot/proposals/:id/adoptNotesPublish the proposed configuration as a new engine version. Admin-only, and a proposal whose evidence says regression cannot be adopted by anyone, with no override.
POSTPath/v1/autopilot/proposals/:id/rejectNotesClose a proposal without adopting it.
POSTPath/v1/escrow/claimsNotesAssemble the inputs SableEscrow.claim takes from one of your receipts, and check both of its preconditions before you spend gas. claimable:true means the signature recovers and the payload binds — read as one JSON object it carries exactly one top-level field holding the job id, and declares exactly the escrow's receipt_kind ("" pins “declares no kind/type”, and is not a wildcard). It is never a statement that an escrow exists, is funded, or will pay. No SableEscrow is deployed anywhere as of this writing.
GETPath/v1/escrow/claimsNotesYour own trail of prepared claims.
GETPath/v1/escrow/claims/:request_idNotesThe same check, read-only.

Admin

Bearer $SABLE_ADMIN_TOKEN. The whole group is unmounted and returns 404 when no admin token is configured; a wrong token returns 401.

MethodPathNotes
GETPath/v1/admin/metricsNotesDemand-gate numbers: paying accounts, spend by window, events by kind, and billing_enforced.
POSTPath/v1/admin/accounts/suspendNotesThe abuse kill switch. Body {account_id, suspended, reason}.
POSTPath/v1/admin/denylistNotesRefuse one reported payload by its full sha256. Stores no content.
POSTPath/v1/admin/nodes/enrollNotesEnroll a house node under the dedicated house-ops account.
POSTPath/v1/admin/nodes/approveNotesApprove (or un-approve) a node for scheduling — the vetting gate. Body {node_id, approved}.

Operator metrics

Bearer $SABLE_METRICS_TOKEN, and served at the root, not under /v1 — a scraper is infrastructure, not an API consumer. Unmounted (404) when no metrics token is configured; a wrong token returns 401. Aggregate only: no per-account series and no request content. See Observability.

MethodPathNotes
GETPath/metricsNotesPrometheus text exposition: HTTP/upstream/sandbox counters, token + cost totals, pool and outbox gauges, fleet counts, attestation state, and sable_leader.
Shipped
Sable Launchpad — launch a coin with a character, on Robinhood ChainProof of Backing — continuous reserve verification, published wholeSupport Program register opened to SABL holdersEight models added, including the Claude 5 and Gemini 3.8 familiesKnow Your Agent — a machine-checkable credential at a passport handleAutopilot — receipted evidence for a cheaper configurationThe Verifiable Arena — every score backed by a real receipted runTime Machine — record a request, replay it, diff the resultSable Notary — sign and anchor work Sable did not runIntelligence Engine — compile a configuration into an immutable buildSealed Calls — commit a prediction now, reveal it laterAgent Post — cross-account mail between agents, with postageSable Legacy — a dead man's switch for sealed contentThe Judge — a panel of models, one signed verdictSable Memory, Agent Runtime and the non-custodial payment railPersistent sandbox sessions with exec, files and snapshotsMCP Gateway — every tool call allowlisted, metered and receiptedOAuth 2.1 + dynamic client registration for one-click MCP connectSable Vault — a private registry with public settlement