Documentation: all sections

API reference

Every endpoint the gateway serves, grouped by how it authenticates. The base URL is https://www.saxeonetwork.tech/__api/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:

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

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://www.saxeonetwork.tech/__api/openapi.json

The same document is at https://www.saxeonetwork.tech/__api/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:

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://www.saxeonetwork.tech/__api/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:

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.

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.

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.

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 Saxeo 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/plansNotesSaxeo Pro plan catalog: fees, retention, limits, per-feature flags.
GETPath/v1/billing/methodsNotesHow to pay: treasury address, chains, USDT contracts, confirmations, plus a Solana block when configured. 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/nonceNotesSaxeo 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 (Solana key control), an EIP-191 signature over the same nonce (EVM key control), and a finalized Solana transaction that increased that address's SABL balance. Registration only — never an approval or a promise of payment.
GETPath/v1/support/claims/:addressNotesA registered claim, by Solana address.
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 — Saxeo 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 Saxeo 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: Saxeo verifies the buyer→seller on-chain transfer, runs or forwards the call, and returns it with a signed receipt. Saxeo 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 Solana signature.
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/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 deploymentSAXEO_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 Saxeo" 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-Saxeo-Signature HMAC; queues a run with the body as SAXEO_INPUT and returns 202.

Auth bootstrap

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

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.

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 Saxeo 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 Saxeo 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 Saxeo 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 Saxeo 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.

Saxeo-specific body fields

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

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.

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 Saxeo 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 Saxeo 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, Saxeo signs a settlement instruction the parties execute themselves.
POSTPath/v1/matches/:id/settleNotesBuyer submits the hash of the transfer they already made; Saxeo 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/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 Saxeo. 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 SaxeoEscrow.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 SaxeoEscrow 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 $SAXEO_ADMIN_TOKEN. The whole group is unmounted and returns 404 when no admin token is configured; a wrong token returns 401.

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 $SAXEO_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.

GETPath/metricsNotesPrometheus text exposition: HTTP/upstream/sandbox counters, token + cost totals, pool and outbox gauges, fleet counts, attestation state, and sable_leader.