What the API isLink to this section
Three sentences you can build on.
- A model store. The catalog lists the models we sell with their published prices, context windows, and data posture. You call a model id from that catalog.
- One inference document. Requests are the official OpenAI Responses document — the same shape as the SDKs you already use — and responses are official Responses objects with metered
usage. - Keyed by organization. Keys start with
sk-sx-, belong to one organization, and are minted and revoked in the console. Platforms can provision them per tenant — see platform keys.
Download the contractLink to this section
The download is a static JSON document; diff it in CI and generate a client from it.
/contract/ai.product.openapi.jsonThe document describes the endpoints, the accepted request fields, the stored-response operations, the file surface, the retired route, and the error envelope. It is the same source the generated TypeScript and Rust clients use.
curl -o ai.product.openapi.json https://models.sylphx.ai/contract/ai.product.openapi.json
EndpointsLink to this section
Everything is relative to the base URL. Inference, catalog, and file calls take your Bearer key; the public catalog endpoints do not.
Inference
| Method | Path | Purpose |
|---|---|---|
| POST | /responses | Create a response. Add stream: true for SSE. |
| POST | /responses/compact | Compact a stored response into an official compaction object. |
| GET | /responses/{response_id} | Retrieve a stored response while it is retained. |
| GET | /responses/{response_id}/input_items | List the input items stored for one response. |
| DELETE | /responses/{response_id} | Forget a stored response. |
| POST | /responses/{response_id}/cancel | Official cancel route. Responses are not background jobs. |
Catalog
| Method | Path | Purpose |
|---|---|---|
| GET | /models | The full catalog for your key, with contract fields. |
| GET | /models/{model} | One model document for your key. |
| GET | /public/models | The sell catalog without authentication. |
| GET | /public/models/{model} | One public model with its usage series. |
Files
| Method | Path | Purpose |
|---|---|---|
| POST | /files | Multipart upload. Mints a file-* id for input_file and input_image. |
| GET | /files | List the files owned by your key. |
| GET | /files/{file_id} | File metadata, no bytes. |
| GET | /files/{file_id}/content | Raw file bytes. |
| DELETE | /files/{file_id} | Delete a file you own. |
Retired
| Method | Path | Purpose |
|---|---|---|
| POST | /chat/completions | Retired. Returns 404 chat_completions_retired with the replacement path. |
POST /v1/admin/tenants/{org}/keys live on the same host with their own authentication. The platform keys page documents machine provisioning.KeysLink to this section
One credential shape on the inference surface: an organization-scoped service key.
POST /responses HTTP/1.1
Host: api.models.sylphx.ai
Authorization: Bearer sk-sx-…
Content-Type: application/json
- Keys are shown once when minted and can be revoked at any time; a revoked key stops authenticating immediately.
- A key sees only its own organization’s stored responses, files, and usage — another organization’s object id is a
404, not a leak. - Machine keys for tenants use the same wire credential, minted through the platform route with an organization-scoped access token.
ErrorsLink to this section
Failures return one JSON envelope: an official error object plus the typed fields a client needs to decide what to do next.
{
"code": "rate_limit_exceeded",
"error": {
"code": "rate_limit_exceeded",
"message": "Client request rate limit for this key was reached.",
"param": null,
"type": "rate_limit_exceeded"
},
"summary": "…",
"retryable": true,
"retry_after_seconds": 3,
"next_action": "Reduce request rate for this key, then retry after the advertised window."
}
Status codes, the full code table, retry rules, and rate-limit headers are on errors and retries.
EncodingsLink to this section
Two request encodings, one document underneath. Pick the one your client already speaks.
- Responses — the primary wire and the schema in the download. Use it for new code.
- Messages — a second public encoding: POST /messages accepts the Anthropic Messages format, normalizes once into the same Responses document, and can call any catalog model.
- Chat Completions is retired —
POST /chat/completionsreturns404 chat_completions_retiredwith the replacement path in the message.
Limits and pricesLink to this section
Prices come from the catalog the API serves; the rate-limit envelope is documented in the protocol reference. Both are public, neither is a hidden plan.
Free-tier keys share one envelope: 300 burst RPM, 180 sustained RPM, 32 in flight. Every denial carries Retry-After and a typed envelope.
The catalog is the rate sheet: input, cached input, and output per million tokens for every model we sell.
Live prices