Chat completions
POST /v1/chat/completions mirrors the OpenAI Chat Completions API: the
same model, messages, temperature, max_tokens, tools,
tool_choice, and stream fields are accepted. Unknown fields are
forwarded transparently upstream. The model must be a catalog id from
GET /v1/models. An unknown model id is refused with 400
rather than passed through to an upstream. The simplest choice is the
flagship id sable, which Sable keeps pointed at a strong frontier engine
(currently disclosed on the Models page) without breaking
callers when it improves.
Every response carries Sable-specific headers:
x-sable-node: what served the request. On inference this is alwaysgateway: one gateway process, named honestly, not a claim about separate hardware. On theconfidentialtier the enclave that actually ran the model is identified by its measurement and signer in the receipt'sattestationblock.GET /v1/nodeslists the same set: the gateway, one entry per configured attested backend, and any enrolled fleet nodes.x-sable-region: the region this deployment declares it runs in, orunspecifiedwhen the operator has declared nonex-sable-privacy-tier: the tier it executed underx-sable-receipt,x-sable-receipt-sig,x-sable-receipt-signer: the signed, metadata-only receipt (streaming responses emit it as a trailingsable.receiptSSE event instead, since headers are already flushed)
Sable extensions
Three additional body fields are accepted:
sable_privacy_tier: overrides the tier inherited from the API key for that single call. See Privacy tiers.sable_region: pins the request to a region. A pin is honored only by a deployment that declares it serves that region; any other region is a400, never a silent reroute. See Region pinning.sable_scrub: settrueto have the gateway redact secret/PII shapes (emails, API keys, EVM addresses, long hex) from the outbound prompt in memory before it reaches any vendor; the receipt recordsscrubbed: true. Also accepted on/v1/messages. See Outbound scrubbing.