Zum Hauptinhalt springen
DokumentationDokumentation

Developers

Einmal integrieren. Das öffentliche Gateway ist OpenAI-kompatibel, regionengebunden und wird unten genau so dokumentiert, wie der Vertrag es definiert.

Quickstart

Wähle deine Region — EU, USA oder LATAM — und das Beispiel folgt: die exakte Base-URL, der OpenAI-kompatible Standard-Client und ein Platzhalter-Key. Deinen API-Key erstellst du in der Console deiner Region; GET /v1/models listet jedes Modell, das er aufrufen darf.

# Region endpoint — OpenAI-compatible /v1 base URL (https://api.eu.ccsio.ai/v1)
export CCSIO_AI_API_KEY=<your-api-key>            # placeholder, issued with your region

import os
from openai import OpenAI                          # the standard OpenAI client

client = OpenAI(
    base_url="https://api.eu.ccsio.ai/v1",                        # the routed market's API URL
    api_key=os.environ["CCSIO_AI_API_KEY"],
)

response = client.chat.completions.create(
    model="qwen3.8-flash-next",   # Qwen 3.8; GET /v1/models lists every model
    messages=[{"role": "user", "content": "Hello"}],
)

Anleitungen

Schritt-für-Schritt-Anleitungen für jede Aufgabe, mit Beispielen in curl, Python und JavaScript für deine Region.

Regionale Endpoints und Consoles

Deine Region bildet sich eins-zu-eins auf Gateway und Console ab: EU — https://api.eu.ccsio.ai/v1 mit https://console.eu.ccsio.ai; USA — https://api.us.ccsio.ai/v1 mit https://console.us.ccsio.ai; LATAM — https://api.latam.ccsio.ai/v1 mit https://console.latam.ccsio.ai. Kein stiller Cross-Region-Routing: dein Key, deine Aufrufe und deine Daten bleiben in der Region, die du gewählt hast.

RegionGateway-EndpointKonsole
EUhttps://api.eu.ccsio.ai/v1console.eu.ccsio.ai
LATAMhttps://api.latam.ccsio.ai/v1console.latam.ccsio.ai
USAhttps://api.us.ccsio.ai/v1console.us.ccsio.ai

Live-Gateway-Referenz

Die Operationen unten werden aus dem veröffentlichten Gateway-Vertrag generiert — Methode, Pfad, Parameter und Fehlervertrag genau so, wie deployed. Wir dokumentieren nur, was du heute aufrufen kannst; nichts Spekulatives wird als Anweisung ausgeliefert.

Authentifizierung

x-api-key: <api-key>Authorization: Bearer <api-key>

Liefere pro Anfrage ein Credential — nie beide. Credentials erstellst und verwaltest du in der Konsole deiner Region; die Beispiele verwenden nur Platzhalter.

  1. POST/v1/chat/completionsoperationId: chatCompletionsSSE

    Create a chat completion

    Creates a chat completion through a chat-completions deployment, in the OpenAI Chat Completions wire. The request body is forwarded to the model server as the client sent it; see ChatRequest for the three members the platform rewrites. stream is optional and defaults to false, and the answer depends on it. With "stream": true the answer is a text/event-stream response. Each data: line carries one chat.completion.chunk object (ChatCompletionChunk) as the model server produced it, relayed as it arrives, with the catalog model id in model; the platform always asks the model server for usage, so one that honours it ends with a chunk that has an empty choices array and a usage object, whatever stream_options the client sent. The stream ends with data: [DONE]. A failure before the first chunk is never a 200: it is a JSON error response with the status of the failure. With a stream, a 429 of the model server is a 429 provider-rate-limited, a timeout a 504 provider-timeout and any other failure a 502 provider-error; without a stream, a 429, a 5xx or an unusable answer of the model server is a 503 provider-unavailable (the deployment that failed is the only one left to try) and a 4xx of it a 502 provider-error. The quota gate of the router is a 429 in both. A failure after the first chunk cannot change the status: when the model server fails or the connection to it breaks, the stream just ends without data: [DONE], and a client must treat a stream that ends without it as failed; when the platform itself aborts the stream, one data: line holds an error object (OpenAIErrorEnvelope) followed by data: [DONE]. With stream omitted or false the answer is one application/json chat.completion object (ChatCompletion) that the platform builds from the same chunks: choices[].message holds the role, the content (null when only tool calls came back), the tool_calls and, when the model server sent reasoning, reasoning and reasoning_content; usage holds prompt_tokens, completion_tokens and total_tokens (zeros when the model server reported none, which the request log's measurement then tells apart from a call that used nothing). A failure is always a JSON error response, never a partial object.

    Parameter

    nameinrequireddescription
    X-Data-RegionheaderoptionalIgnored. The data region a request is placed in is the organization's, never a header's: a value sent here changes nothing. Kept so that clients that still send it validate.
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Request-IDheaderoptionalOptional request ULID. Lowercase input is accepted; the response X-Request-ID header uses the canonical uppercase form. When the header is absent, or is not a ULID, the platform mints the id: no request is refused for it.
    X-ResidencyheaderoptionalIgnored. The residency a request is placed in is the organization's, never a header's: a value sent here changes nothing. Kept so that clients that still send it validate.
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.
    X-Trace-IDheaderoptionalOptional trace correlation identifier. Any non-empty value is accepted and travels as a correlation label only, never as an authorization input; when it is absent the platform mints one.

    Request-Body: application/json — schema ChatRequest

    Antworten

    • 200With stream true, an SSE stream of ChatCompletionChunk objects ending with data: [DONE]; otherwise one ChatCompletion object.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit of the organization, the team, the model or the deployment was reached (organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded, rate-limit-exceeded; entitlement-denied, which the router answers as a defense in depth when the model is outside the entitlements the hop carries and core has already checked), or the model server rate-limited the call (provider-rate-limited: audio, images, decisions, and chat with a stream; chat without a stream answers that case 503 provider-unavailable). The router knows when a retry may succeed, but the API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform, rendered without internal cause details: internal-error (core could not decide or load what the request needs), quota-store-unavailable (the router could not read its quota store, so the request was refused) and, for a fault of the hop, unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch and upstream-endpoint-invalid.
    • 502The model server failed or its answer could not be used: provider-error (it answered an error status other than a 429 that this operation passes on, or nothing usable; its own error body is never relayed), provider-credential-rejected (it answered 401 or 403 to the API key stored for the model's deployment), forwarder-failed (core could not reach the router), internal-hop-body (the router could not read the body core sent). The stored key never appears in any answer.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 504provider-timeout: the dispatch deadline passed before the model server answered. Audio, images, decisions and chat; embeddings and Responses never answer 504.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -N -X POST "https://api.eu.ccsio.ai/v1/chat/completions" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "qwen3.8-flash-next",
      "messages": [
        {
          "role": "user",
          "content": "Say hello in one sentence."
        }
      ]
    }'
  2. POST/v1/responsesoperationId: createResponsesSSE

    Create a response (OpenAI-compatible)

    Creates a response through a qualified responses deployment. The request is forwarded to the model server as the client sent it, only model rewritten (see ResponsesRequest): the platform refuses no field and requires no input. The answer is one message item rebuilt from the output_text parts of the model server's answer, and usage (zeros when the model server reported none, which the request log's measurement then tells apart from a call that used nothing). A response the model server ends early (response.incomplete, or a non-streaming answer whose status is incomplete) is answered as incomplete, as OpenAI's Responses API does: status incomplete, incomplete_details.reason (for example max_output_tokens; null when the model server named none) and the usage it counted; a stream carries it as a response.incomplete frame in place of response.completed. Without a stream, a model server that refused the request with a 4xx other than 429, or answered something that is not a responses body, is a 502 responses-body-malformed; a 200 with no output_text is a 502 responses-output-missing, unless its status is incomplete (the output limit can be reached before any text: the answer is then incomplete with an empty text); a 429, a 5xx or a timeout is a 503 provider-unavailable. With a stream the 200 and the response.created frame are sent before the model server is asked, so every failure after that is one error frame that ends the stream: responses-stream-failed when the model server refused the request, provider-unavailable when it was unavailable.

    Parameter

    nameinrequireddescription
    X-Data-RegionheaderoptionalIgnored. The data region a request is placed in is the organization's, never a header's: a value sent here changes nothing. Kept so that clients that still send it validate.
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Request-IDheaderoptionalOptional request ULID. Lowercase input is accepted; the response X-Request-ID header uses the canonical uppercase form. When the header is absent, or is not a ULID, the platform mints the id: no request is refused for it.
    X-ResidencyheaderoptionalIgnored. The residency a request is placed in is the organization's, never a header's: a value sent here changes nothing. Kept so that clients that still send it validate.
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.
    X-Trace-IDheaderoptionalOptional trace correlation identifier. Any non-empty value is accepted and travels as a correlation label only, never as an authorization input; when it is absent the platform mints one.

    Request-Body: application/json — schema ResponsesRequest

    Antworten

    • 200The SSE stream (stream: true) or the final response object (stream: false).
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit was reached on the router: organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded or rate-limit-exceeded (entitlement-denied, a defense in depth when the model is outside the entitlements the hop carries). Rendered in the kernel ErrorEnvelope on this operation. The model server's own 429 is never answered here: it ends as 503 provider-unavailable. The API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform. Core renders internal-error in the OpenAI error shape; the router renders quota-store-unavailable (the quota store could not be read, so the request was refused) and the faults of the hop (unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch, upstream-endpoint-invalid) in the kernel ErrorEnvelope.
    • 502The model server refused the input or its answer could not be used. The router renders, in the kernel ErrorEnvelope, embedding-body-malformed and responses-body-malformed (the model server answered a 4xx other than a 429, which means it refused the request, or an answer that is not the body of this operation), embedding-data-missing and responses-output-missing (a 200 with no embedding data, or no output_text), and provider-credential-rejected (the provider refused the API key stored for the deployment; a fixed message that names neither the provider nor the key). A 429, a 5xx, a timeout or an answer that cannot be decoded is not a 502 here: it is a 503 provider-unavailable. Core renders forwarder-failed (it could not reach the router) in the OpenAI error shape, and the router's internal-hop-body in the kernel one.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -N -X POST "https://api.eu.ccsio.ai/v1/responses" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "your-responses-model",
      "instructions": "Answer in one short sentence.",
      "input": "What is an API gateway?"
    }'
  3. POST/v1/embeddingsoperationId: createEmbeddings

    Create embeddings

    Creates embeddings through a qualified embeddings deployment. The request is forwarded to the model server as the client sent it, only model rewritten; the answer is rebuilt from the vectors the model server returned: object, data (object, embedding, index of each entry), model (the catalog model id the request named) and usage (zeros for all three fields when the model server reported none, which the request log's measurement then tells apart from a call that used nothing). A model server that answered 200 with no data is a 502 embedding-data-missing; one that refused the request with a 4xx other than 429 is a 502 embedding-body-malformed; one that answered a 429, a 5xx, a timeout or something that is not an embeddings body is a 503 provider-unavailable. All three are rendered in the kernel ErrorEnvelope: on this operation the answer does not tell a bad input from a failing server.

    Parameter

    nameinrequireddescription
    X-Data-RegionheaderoptionalIgnored. The data region a request is placed in is the organization's, never a header's: a value sent here changes nothing. Kept so that clients that still send it validate.
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Request-IDheaderoptionalOptional request ULID. Lowercase input is accepted; the response X-Request-ID header uses the canonical uppercase form. When the header is absent, or is not a ULID, the platform mints the id: no request is refused for it.
    X-ResidencyheaderoptionalIgnored. The residency a request is placed in is the organization's, never a header's: a value sent here changes nothing. Kept so that clients that still send it validate.
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.
    X-Trace-IDheaderoptionalOptional trace correlation identifier. Any non-empty value is accepted and travels as a correlation label only, never as an authorization input; when it is absent the platform mints one.

    Request-Body: application/json — schema EmbeddingsRequest

    Antworten

    • 200Embedding list and the usage from the metered provider attempt.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit was reached on the router: organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded or rate-limit-exceeded (entitlement-denied, a defense in depth when the model is outside the entitlements the hop carries). Rendered in the kernel ErrorEnvelope on this operation. The model server's own 429 is never answered here: it ends as 503 provider-unavailable. The API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform. Core renders internal-error in the OpenAI error shape; the router renders quota-store-unavailable (the quota store could not be read, so the request was refused) and the faults of the hop (unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch, upstream-endpoint-invalid) in the kernel ErrorEnvelope.
    • 502The model server refused the input or its answer could not be used. The router renders, in the kernel ErrorEnvelope, embedding-body-malformed and responses-body-malformed (the model server answered a 4xx other than a 429, which means it refused the request, or an answer that is not the body of this operation), embedding-data-missing and responses-output-missing (a 200 with no embedding data, or no output_text), and provider-credential-rejected (the provider refused the API key stored for the deployment; a fixed message that names neither the provider nor the key). A 429, a 5xx, a timeout or an answer that cannot be decoded is not a 502 here: it is a 503 provider-unavailable. Core renders forwarder-failed (it could not reach the router) in the OpenAI error shape, and the router's internal-hop-body in the kernel one.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -X POST "https://api.eu.ccsio.ai/v1/embeddings" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "qwen3-embedding-0.6b",
      "input": [
        "The cat sleeps.",
        "A kitten is napping."
      ]
    }'
  4. GET/v1/modelsoperationId: listModels

    List active published models

    Returns the models the caller's organization may call. A model is listed when the organization holds access to it (its own model-access entitlement, or a model group that reaches it), the restriction of the acting team (X-Team-Id) allows it, and an active deployment of it serves the organization's residency and data region. The list is deduplicated by model id and sorted by id, and each item names what the model can serve in capabilities. It is answered by core alone and does not need the inference router. Its only refusals of its own are 403 organization-inactive and entitlement-denied (an acting team that is ambiguous or no longer authorized) and 500 internal-error.

    Parameter

    nameinrequireddescription
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Request-IDheaderoptionalOptional case-insensitive ULID for model listing. Lowercase input is accepted and canonicalized to uppercase in the response X-Request-ID header; when the header is absent or invalid, middleware mints the request context and response id.
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.

    Antworten

    • 200The tenant's model list.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 500A failure of the platform, rendered without internal cause details: internal-error (core could not decide or load what the request needs), quota-store-unavailable (the router could not read its quota store, so the request was refused) and, for a fault of the hop, unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch and upstream-endpoint-invalid.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl "https://api.eu.ccsio.ai/v1/models" \
      -H "Authorization: Bearer $CCSIO_API_KEY"
  5. POST/v1/audio/speechoperationId: createSpeechSSE

    Create speech

    OpenAI-compatible text to speech through an audio-speech deployment. The provider's audio bytes are relayed as they arrive (never buffered whole) with the provider's Content-Type. The deployment endpoint is the full provider URL ending in /v1/audio/speech. A failure before the first audio byte is a JSON error (a 429 of the model server is a 429 provider-rate-limited, a timeout a 504 provider-timeout, anything else a 502 provider-error); a failure after it aborts the response instead of ending it cleanly. The usage fact is operation audio with the input_characters quantity (Unicode characters of input).

    Parameter

    nameinrequireddescription
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.

    Request-Body: application/json — schema SpeechRequest

    Antworten

    • 200The synthesized audio.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit of the organization, the team, the model or the deployment was reached (organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded, rate-limit-exceeded; entitlement-denied, which the router answers as a defense in depth when the model is outside the entitlements the hop carries and core has already checked), or the model server rate-limited the call (provider-rate-limited: audio, images, decisions, and chat with a stream; chat without a stream answers that case 503 provider-unavailable). The router knows when a retry may succeed, but the API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform, rendered without internal cause details: internal-error (core could not decide or load what the request needs), quota-store-unavailable (the router could not read its quota store, so the request was refused) and, for a fault of the hop, unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch and upstream-endpoint-invalid.
    • 502The model server failed or its answer could not be used: provider-error (it answered an error status other than a 429 that this operation passes on, or nothing usable; its own error body is never relayed), provider-credential-rejected (it answered 401 or 403 to the API key stored for the model's deployment), forwarder-failed (core could not reach the router), internal-hop-body (the router could not read the body core sent). The stored key never appears in any answer.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 504provider-timeout: the dispatch deadline passed before the model server answered. Audio, images, decisions and chat; embeddings and Responses never answer 504.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -N -X POST "https://api.eu.ccsio.ai/v1/audio/speech" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "kokoro-82m",
      "input": "Welcome to the AI Control Plane.",
      "voice": "af_heart",
      "response_format": "wav"
    }'
  6. POST/v1/audio/transcriptionsoperationId: createTranscription

    Create transcription

    OpenAI-compatible speech to text through an audio-transcriptions deployment. The multipart body is forwarded to the provider byte for byte with its Content-Type (boundary included) and the provider's JSON or text answer is relayed with the provider's Content-Type (text/plain when it names none). The deployment endpoint is the full provider URL ending in /v1/audio/transcriptions. The usage fact is operation audio with the audio_seconds quantity when the provider reports a duration (verbose_json), otherwise no quantity with measurement unknown and reason final_usage_missing. A multipart body without exactly one plain model field is refused with 400 invalid-request. A failure of the model server is a JSON error (429 provider-rate-limited, 504 provider-timeout, anything else 502 provider-error).

    Parameter

    nameinrequireddescription
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.

    Request-Body: multipart/form-data — schema TranscriptionRequest

    Antworten

    • 200The transcript in the requested response_format.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit of the organization, the team, the model or the deployment was reached (organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded, rate-limit-exceeded; entitlement-denied, which the router answers as a defense in depth when the model is outside the entitlements the hop carries and core has already checked), or the model server rate-limited the call (provider-rate-limited: audio, images, decisions, and chat with a stream; chat without a stream answers that case 503 provider-unavailable). The router knows when a retry may succeed, but the API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform, rendered without internal cause details: internal-error (core could not decide or load what the request needs), quota-store-unavailable (the router could not read its quota store, so the request was refused) and, for a fault of the hop, unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch and upstream-endpoint-invalid.
    • 502The model server failed or its answer could not be used: provider-error (it answered an error status other than a 429 that this operation passes on, or nothing usable; its own error body is never relayed), provider-credential-rejected (it answered 401 or 403 to the API key stored for the model's deployment), forwarder-failed (core could not reach the router), internal-hop-body (the router could not read the body core sent). The stored key never appears in any answer.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 504provider-timeout: the dispatch deadline passed before the model server answered. Audio, images, decisions and chat; embeddings and Responses never answer 504.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -X POST "https://api.eu.ccsio.ai/v1/audio/transcriptions" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -F model=whisper-large-v3 \
      -F file=@./welcome.wav
  7. POST/v1/images/generationsoperationId: createImage

    Create images

    OpenAI-compatible image generation (the Images generations shape) through an image-generations deployment. The JSON body is relayed to the model server with only model rewritten, and the server's JSON answer is relayed; the operation never streams. Image edits and image variations are not served. The usage fact is operation image with the images quantity (the number of entries of the answer's data array); an attempt that fails or does not finish carries no quantity, with measurement unknown and reason final_usage_missing. A body without a model, or with a prompt that is missing, empty or not a string, is refused with 400 invalid-request by the platform. Of the model server's refusals three reach the caller: a 400 as 400 provider-bad-request and a 413 (input_too_long) as 413 provider-input-too-long, both with the model server's own message (bounded and scrubbed), and a 429 (busy) as 429 provider-rate-limited. Its 404, its 503 (loading), any other status and an answer that is not a JSON object are a 502 provider-error; a timeout is a 504 provider-timeout.

    Parameter

    nameinrequireddescription
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.

    Request-Body: application/json — schema ImageGenerationRequest

    Antworten

    • 200The generated images, base64-encoded PNG files.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit of the organization, the team, the model or the deployment was reached (organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded, rate-limit-exceeded; entitlement-denied, which the router answers as a defense in depth when the model is outside the entitlements the hop carries and core has already checked), or the model server rate-limited the call (provider-rate-limited: audio, images, decisions, and chat with a stream; chat without a stream answers that case 503 provider-unavailable). The router knows when a retry may succeed, but the API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform, rendered without internal cause details: internal-error (core could not decide or load what the request needs), quota-store-unavailable (the router could not read its quota store, so the request was refused) and, for a fault of the hop, unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch and upstream-endpoint-invalid.
    • 502The model server failed or its answer could not be used: provider-error (it answered an error status other than a 429 that this operation passes on, or nothing usable; its own error body is never relayed), provider-credential-rejected (it answered 401 or 403 to the API key stored for the model's deployment), forwarder-failed (core could not reach the router), internal-hop-body (the router could not read the body core sent). The stored key never appears in any answer.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 504provider-timeout: the dispatch deadline passed before the model server answered. Audio, images, decisions and chat; embeddings and Responses never answer 504.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -X POST "https://api.eu.ccsio.ai/v1/images/generations" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "flux.2-klein-4b",
      "prompt": "A lighthouse at dawn, watercolor",
      "size": "1024x1024",
      "response_format": "b64_json"
    }'
  8. POST/v1/systemoneoperationId: createDecision

    Create decisions

    Decisions through a decisions deployment: Cloudflare's Clef decision model (its SystemOne API), in the model's own wire rather than OpenAI's. The body carries a state and one or more named questions, each of type noul (the probability that a proposition is true), choice (one option among several) or score (a position on a scale); the answer carries one answer object per question id and a usage block. The JSON body is relayed to the model server with only model rewritten, and the server's JSON answer is relayed; the operation never streams. The usage fact is operation decision with the input_tokens quantity (the answer's usage.input_tokens); an attempt that fails or does not finish carries no quantity, with measurement unknown and reason final_usage_missing. The platform refuses with 400 invalid-request a body without a model, without a state (null is a state), with questions that are not a non-empty object; the model server refuses with 400 a question it cannot read and the optional images or videos, which it does not serve. Of the model server's refusals three reach the caller: a 400 as 400 provider-bad-request and a 413 (input_too_long) as 413 provider-input-too-long, both with its own message (bounded and scrubbed), and a 429 (busy) as 429 provider-rate-limited. Its 404, its 503 (loading), any other status and an answer that is not a JSON object are a 502 provider-error; a timeout is a 504 provider-timeout.

    Parameter

    nameinrequireddescription
    X-Organization-IdheaderoptionalThe organization a signed-in person acts in, for a person who belongs to more than one. A person with exactly one organization needs no header; a person with several is refused with 403 organization-selection-required without it, and a value that names an organization the person holds no active membership in is refused with 403 organization-not-selectable. An API key carries its own organization and ignores the header, except a platform administrator's credential and a platform operator signed in at the backoffice, who may name any existing organization (an operator who names none holds the platform context, which these operations refuse with 403 organization-selection-required). The header selects among memberships that already exist: it never grants one, and the residency of the organization it selects must be the plane's own (403 residency-mismatch).
    X-Session-IdheaderoptionalOptional client-provided session label, accepted on every /v1 operation. It groups the caller's requests in the request log (the session_id of the usage facts and of the request-log reads); it is a label only, never an identity, and is never used for authorization or tenancy. Grammar ^[A-Za-z0-9._:-]{1,128}$, given at most once: anything else (empty, longer than 128 characters, other characters, repeated) is refused 400 session-id-invalid in the OpenAI error shape, after the credential, billing, permission and body-size checks and before the request is decoded.
    X-Team-IdheaderoptionalThe team the call acts for. Send it when the caller holds roles in more than one team: the platform cannot pick one, and without it the call is refused with 403 policy-denied. Send it also to act for one team on purpose: the models that are listed and may be called then follow that team's entitlements, and the quota and the usage are attributed to it. The team must be one the caller is an active member of: a team the caller does not belong to, an archived team and a malformed identifier are refused with 403 team-not-selectable. A caller whose roles are organization-wide needs no team.

    Request-Body: application/json — schema DecisionRequest

    Antworten

    • 200One answer per question of the request, and the input tokens the model read.
    • 400The request is refused before it is dispatched, or the model server refused it. invalid-request: a body that is not valid JSON (or not multipart/form-data with a boundary), a member of the wrong type, a missing or empty model, a chat request with no messages, an embeddings or speech request with no input (speech: not a string), an images request with no prompt (not a string), a decisions request with no state, with questions that are not a non-empty object, a message content that is not a string, null or an array, a transcription whose multipart body does not carry exactly one plain model field. session-id-invalid: a malformed or repeated X-Session-Id. provider-bad-request: images and decisions only, the model server refused the request with 400 and the message is its own, bounded and scrubbed of any credential. The refusals of the hop (a fault of the platform) are listed in x-ccsio-hop-error-codes.
    • 401No credential, more than one, or one the platform does not accept: invalid-request (no credential, or both Authorization: Bearer and x-api-key), api-key-invalid, api-key-unknown, api-key-revoked, api-key-expired, the refusals of a bearer token (token-malformed, token-algorithm-unsupported, token-signature-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, token-claim-invalid), the trust in its issuer (issuer-untrusted, issuer-resolution-unknown, issuer-residency-mismatch, jwks-unavailable, jwks-invalid, jwks-key-not-found), a person with no account on this plane (identity-not-provisioned, organization-not-found) and, for a backoffice operator's token, staff-token-inactive, staff-not-operator and staff-directory-unavailable. The complete list is x-ccsio-boundary-error-codes. A 401 can also be a refusal of the hop between core and the router (missing-verified-context, invalid-verified-context, context-signature-*): that is a fault of the platform, not of the credential. Supply exactly one credential.
    • 402payment-required: the organization has no active subscription. The call is refused before its body is read; platform operators are exempt. credits-exhausted: the model is served from a third-party provider, the plane charges such models against prepaid credits, and the organization's balance is zero or negative; the organization tops up (or an operator credits it) and the next request is admitted. Streams already running finish. The model stays listed by GET /v1/models, which never answers credits-exhausted (and answers payment-required like every operation). The error type is invalid_request_error.
    • 403Refused by the platform after the credential was accepted: policy-denied (no role of the caller holds the permission, a personal API key whose owner lacks it, an acting team that is ambiguous or no longer authorized), tenant-mismatch (X-Tenant names another organization), team-not-selectable (X-Team-Id names a team the caller cannot act for), organization-inactive and the other states of the organization (organization-provisioning, organization-suspended, organization-disabled, organization-deleted), user-disabled, organization-selection-required (a person who belongs to several organizations and sent no X-Organization-Id, or a platform operator who selected none), organization-not-selectable, no-active-organization-membership, entitlement-denied (the organization or the acting team is not entitled to the model, which includes a model that does not exist), residency-mismatch (the organization, or the deployment's residency, does not match the plane's) or external-model-not-available (the model is served from a third-party provider and the organization is not admitted to such models: while a payment provider is configured and credits are not enabled only an organization that is billing-exempt or billed by contract is admitted; on a plane where credits are enabled the gate is credits-exhausted or model-not-priced instead, and this refusal is not answered; the model stays listed by GET /v1/models).
    • 404model-not-found: the organization is entitled to the model but no active deployment serves it with the operation's capability. A chat or embeddings model on an audio route, and an audio model on any other route, is refused this way. A path under /v1/ that nothing claims is also a 404, with the code not-found.
    • 405method-not-allowed: the path is claimed but the request method is not allowed. The Allow header lists the methods the path accepts.
    • 413request-body-too-large: the request body exceeds the operation's cap (8388608 bytes for a JSON body, 26214400 for an audio transcription upload); answered after authentication and authorization (an unauthenticated or unauthorized request is refused first, without its body being read).
    • 429A concurrency or rate limit of the organization, the team, the model or the deployment was reached (organization-concurrency-exceeded, team-concurrency-exceeded, model-concurrency-exceeded, deployment-concurrency-exceeded, rate-limit-exceeded; entitlement-denied, which the router answers as a defense in depth when the model is outside the entitlements the hop carries and core has already checked), or the model server rate-limited the call (provider-rate-limited: audio, images, decisions, and chat with a stream; chat without a stream answers that case 503 provider-unavailable). The router knows when a retry may succeed, but the API host does not relay a Retry-After header: retry with backoff.
    • 500A failure of the platform, rendered without internal cause details: internal-error (core could not decide or load what the request needs), quota-store-unavailable (the router could not read its quota store, so the request was refused) and, for a fault of the hop, unsupported-protocol-version, deployment-not-active, tenant-mismatch, model-pin-mismatch, placement-mismatch, bundle-tenant-mismatch and upstream-endpoint-invalid.
    • 502The model server failed or its answer could not be used: provider-error (it answered an error status other than a 429 that this operation passes on, or nothing usable; its own error body is never relayed), provider-credential-rejected (it answered 401 or 403 to the API key stored for the model's deployment), forwarder-failed (core could not reach the router), internal-hop-body (the router could not read the body core sent). The stored key never appears in any answer.
    • 503provider-unavailable (OpenAI shape): no deployment of the model is currently healthy, or the one deployment there is failed this very request with a 429, a 5xx or an answer that was not one (on chat without a stream, and on embeddings and non-streaming Responses, where it is rendered in the kernel envelope). model-not-priced (OpenAI shape, type server_error): the model is served from a third-party provider, the plane charges such models against prepaid credits and no price is set for the model in the plane's currency; nothing is dispatched. router-not-configured (the platform kernel envelope, the one deliberate exception of core): this deployment has no inference router at all.
    • 504provider-timeout: the dispatch deadline passed before the model server answered. Audio, images, decisions and chat; embeddings and Responses never answer 504.
    • 508loop-detected: the request carried the X-Ccsio-Egress header, which the platform's own egress adds to every request it makes to a model provider. It is answered when a provider connection points back at the platform's own API; an ordinary client never meets it.

    Beispiel

    curl -X POST "https://api.eu.ccsio.ai/v1/systemone" \
      -H "Authorization: Bearer $CCSIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "clef",
      "state": {
        "ticket": 4312,
        "message": "Production has been down for two hours. This is the third outage this month and we will cancel the contract unless someone calls today."
      },
      "questions": {
        "urgent": {
          "type": "noul",
          "instructions": "Does this ticket need an answer within the hour?"
        },
        "team": {
          "type": "choice",
          "instructions": "Which team should take this ticket?",
          "criteria": {
            "billing": "Invoices, payments and refunds.",
            "technical": "Outages, errors and how the product works.",
            "sales": "Plans, upgrades and contracts."
          }
        },
        "frustration": {
          "type": "score",
          "instructions": "How frustrated is the customer?",
          "criteria": [
            "Calm.",
            "Annoyed.",
            "Angry.",
            "About to leave."
          ]
        }
      }
    }'

Authentifizierung

Sende deinen API-Key in einem von zwei Headern — nie in beiden: Authorization: Bearer <key>, so wie es die OpenAI-Clients tun, oder x-api-key. Keys erstellst du in der Console deiner Region; jeder Key in den Beispielen ist ein Platzhalter.

Plattform-APIs

Identity, Models, Metering, Audit und Memory antworten auf dem Console-Host deiner Region mit demselben API-Key; die API-Referenz dokumentiert jede Operation. Abrechnung und die MCP-Bibliothek bleiben vorerst in der Console.

Developer-FAQ

Ja. Richte den Standard-OpenAI-Client auf die /v1-Base-URL deiner Region: Chat-Completions (mit oder ohne Streaming), Responses, Embeddings, Text-to-Speech, Speech-to-Text, Bilder und die Modellliste antworten mit den Pfaden und Formaten von OpenAI.

Plattform entdecken

Deinen ersten API-Key holen

Die Registrierung ist offen. Vier Schritte bis zum ersten Aufruf: Konto erstellen, Organisation anlegen, API-Key erzeugen, loslegen.

  1. 01Konto erstellen
  2. 02Organisation anlegen
  3. 03API-Key erzeugen
  4. 04Loslegen