Interface
API
One OpenAI-compatible API format, served under /v1 by the control plane and backed by Sovereign AI. The format is compatible so that your client libraries work unchanged; the models, the machines and the operator are Media Holding's. No OpenAI services are involved.
Endpoints
The inference gateway behind these endpoints exists and is measured (see Sovereign AI). The public, key-authenticated layer is the control plane: built and tested in isolation, labelled BUILT, not yet published.
POST /v1/chat/completions
MeasuredChat completions in the OpenAI-compatible format; stream: true for Server-Sent Events, stream_options.include_usage for usage in the final chunk; tools and response_format pass through. At the inference gateway: measured on 2026-10-12.
POST /v1/completions
BuiltLegacy text generation for clients that still use the completions format.
GET /v1/models
BuiltThe models available to your project, with the default alias.
GET /v1/models/{id}
BuiltOne model by id or alias.
GET /v1/usage
BuiltYour own usage for a period — requests and token counts per model. Metadata only; never content.
GET /health
BuiltLiveness of the control plane and the state of the inference backend; no authentication; never reveals paths or internal versions.
Status labels — MEASURED — exists and was measured on the stated date by the stated method. BUILT — exists and works, not yet measured under load. PLANNED — designed, not yet built. A line without a label is not a claim of this platform.
OpenAI-compatible API format. No OpenAI services are involved.
The contract
Authentication
BuiltAuthorization: Bearer sk-sov-<prefix>-<secret>. The secret is shown once and stored only as a keyed one-way hash (HMAC-SHA-256); the prefix identifies the key in the cabinet and never the secret.
Request identifiers
BuiltEvery response carries X-Request-Id; every error body carries the same id in error.request_id. Quote it in support requests. The inference gateway already writes a request id into its audit line.
Streaming
MeasuredServer-Sent Events; the stream ends with data: [DONE]; with include_usage the final chunk carries the token counts. Measured at the inference gateway.
Usage accounting
Builtprompt_tokens, completion_tokens and total_tokens are counted by the backend and written to the metering ledger before the response is finalised, so an invoice never counts what you did not receive.
Rate limits and budgets
Built429 with Retry-After when a rate limit or a project budget is reached. Rate-limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) are planned; their final names are published in the generated specification.
Versioning
BuiltBase path /v1. A change that is not backwards-compatible is announced at least 30 days in advance (Terms of Service §5).
What is not offered
BuiltEmbeddings, images, audio, fine-tuning, assistants, threads and batch endpoints are not offered; an unknown route answers 404 with a machine-readable code.
Errors
Every error is one JSON shape with the HTTP status that names its class. The message never contains URLs, tokens, paths or upstream exception text.
| HTTP | error.type | When | Retry-After |
|---|---|---|---|
400 | invalid_request_error | The request body or parameters are invalid. | no |
401 | authentication_error | Missing, malformed, revoked or unknown API key. | no |
403 | permission_error | The key is valid but may not use this model, project or route. | no |
404 | invalid_request_error | Unknown model or route; code names it. | no |
429 | rate_limit_error · budget_exceeded | A rate limit or a project budget is reached; wait the seconds given. | yes |
500 | server_error | An unexpected failure on our side; quote the request id. | no |
503 | backend_busy · upstream_unavailable | The GPU is held by another job, or the inference provider is down. No fallback to an external supplier exists. | yes |
{
"error": {
"type": "rate_limit_error",
"code": "requests_per_minute",
"message": "Too many requests for this project. Retry after the number of seconds in Retry-After.",
"request_id": "5b8e2b2e-4a2f-4b7c-9d2e-1f3a4b5c6d7e"
}
}