Skip to main content
DocumentationModels · console.us.ccsio.ai

Organization provider connections

An organization's own provider connections and the models it serves through them, each visible to that organization alone.

Documentation menu

The descriptions of the operations and fields are the contract’s own, in English.

GET/models/v1/organizations/{org}/providers

List the organization's provider connections

Credential
API key
Permission
model-providers.manage

Lists the provider connections the organization created: an external HTTPS API reached with the organization's own API key, with the models the organization added to each. Each carries the status of its key (set, version and fingerprint), never the key.

Read more

Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default.

curl
curl "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers" \
  -H "Authorization: Bearer $CCSIO_API_KEY"

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

Responses

  • 200

    Success.

    Schema
    ListOrganizationProvidersResponse
    • providersarray of OrganizationProviderrequired
      • provider_idstringrequired

        pattern ^mp-[0-9a-hjkmnp-tv-z]{26}$

      • organization_idstringrequired

        The organization that owns the connection.

        pattern ^[a-z][a-z0-9._-]{0,63}$

      • display_namestringrequired

        1 to 80 characters

      • base_urlstringrequired

        The provider's base URL: https on a public DNS name (never an address, localhost or an internal-looking zone), at most 100 characters of letters, digits and . _ : / -, no userinfo, query or fragment, no trailing slash, and not on or under a host of CONTROL_PROVIDER_DENY_HOSTS. A deployment of the connection calls the base URL plus /chat/completions, /responses or /embeddings.

        at most 100 characters

      • protocolstringrequired

        always "openai-compat"

      • statestringrequired

        Allowed values: "enabled""disabled"

      • processing_locationstringrequired

        Where the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).

        at most 120 characters

      • credentialobjectrequired

        The status of a connection's API key, and the only thing any route says about it. `set` is false when the connection has no key; the other members are present exactly when it has one.

        • setbooleanrequired
        • versionintegeroptional

          The version of the stored key, from one global sequence that never issues a number twice.

          at least 1

        • fingerprintstringoptional

          An ellipsis and the last four characters of the key, or the ellipsis alone for a key shorter than twelve characters.

          1 to 8 characters

        • updated_atstring (date-time)optional
        • updated_bystringoptional
      • data_processing_acknowledged_bystringrequired

        Who acknowledged, when the connection was created, that requests to its models are processed by the provider.

      • data_processing_acknowledged_atstring (date-time)required
      • modelsarray of OrganizationProviderModelrequired

        The models added to the connection, sorted by name.

      • created_atstring (date-time)required
      • updated_atstring (date-time)required
      • created_bystringrequired
      • updated_bystringrequired
  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

POST/models/v1/organizations/{org}/providers

Connect the organization's own provider with its API key

Credential
API key
Permission
model-providers.manage
Request body
Body up to 65536 bytes

Creates a provider connection owned by the organization: a base URL on a public HTTPS host and one API key.

Read more

The base URL follows the rule of the platform's connections (the public-URL rule, and not under a host of CONTROL_PROVIDER_DENY_HOSTS: 503 provider-deny-hosts-unset while that setting is unset); the key is sealed under the audit keyring (503 credential-store-unavailable while the plane has none). The caller must acknowledge that requests to the connection's models leave the plane and are processed by the provider under the organization's own agreement with it: `data_processing_acknowledged` must be true (400 data-processing-not-acknowledged otherwise), and who acknowledged it and when is recorded on the connection. An organization holds at most 10 live connections (409 model-provider-limit). Nothing is callable until a model is added to the connection. Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default. It is an audited management fact (security event `model_provider.created`) and the event never carries the key. The key is write-only: it is sealed in the database, never returned by any route, never logged and never part of an event or an error. Request body capped at 65536 bytes and decoded strictly: an unknown member or trailing data is a 400 invalid-request.

curl
curl -X POST "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers" \
  -H "Authorization: Bearer $CCSIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "display_name": "string",
  "base_url": "string",
  "api_key": "string"
}'
Built from the schema’s required members: replace the values.

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

Request body application/json

CreateOrganizationProviderRequest
  • display_namestringrequired

    1 to 80 characters

  • base_urlstringrequired

    The provider's base URL: https on a public DNS name (never an address, localhost or an internal-looking zone), at most 100 characters of letters, digits and . _ : / -, no userinfo, query or fragment, no trailing slash, and not on or under a host of CONTROL_PROVIDER_DENY_HOSTS. A deployment of the connection calls the base URL plus /chat/completions, /responses or /embeddings.

    at most 100 characters

  • api_keystringrequired

    The provider's API key: 8 to 512 printable ASCII characters without spaces. Write-only: it is sealed in the database and no route, log, event or error ever returns it.

    8 to 512 characters · pattern ^[\x21-\x7E]{8,512}$

  • processing_locationstringoptional

    Where the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).

    at most 120 characters

  • data_processing_acknowledgedbooleanoptional

    Must be true: the caller acknowledges that requests to the connection's models leave the plane and are processed by the provider. Omitted or false is refused 400 data-processing-not-acknowledged.

Responses

  • 201

    The connection was created and its key stored.

    Schema
    OrganizationProvider
    • provider_idstringrequired

      pattern ^mp-[0-9a-hjkmnp-tv-z]{26}$

    • organization_idstringrequired

      The organization that owns the connection.

      pattern ^[a-z][a-z0-9._-]{0,63}$

    • display_namestringrequired

      1 to 80 characters

    • base_urlstringrequired

      The provider's base URL: https on a public DNS name (never an address, localhost or an internal-looking zone), at most 100 characters of letters, digits and . _ : / -, no userinfo, query or fragment, no trailing slash, and not on or under a host of CONTROL_PROVIDER_DENY_HOSTS. A deployment of the connection calls the base URL plus /chat/completions, /responses or /embeddings.

      at most 100 characters

    • protocolstringrequired

      always "openai-compat"

    • statestringrequired

      Allowed values: "enabled""disabled"

    • processing_locationstringrequired

      Where the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).

      at most 120 characters

    • credentialobjectrequired

      The status of a connection's API key, and the only thing any route says about it. `set` is false when the connection has no key; the other members are present exactly when it has one.

      • setbooleanrequired
      • versionintegeroptional

        The version of the stored key, from one global sequence that never issues a number twice.

        at least 1

      • fingerprintstringoptional

        An ellipsis and the last four characters of the key, or the ellipsis alone for a key shorter than twelve characters.

        1 to 8 characters

      • updated_atstring (date-time)optional
      • updated_bystringoptional
    • data_processing_acknowledged_bystringrequired

      Who acknowledged, when the connection was created, that requests to its models are processed by the provider.

    • data_processing_acknowledged_atstring (date-time)required
    • modelsarray of OrganizationProviderModelrequired

      The models added to the connection, sorted by name.

      • namestringrequired

        The name the organization gave the model, unique in the organization.

        pattern ^[a-z0-9][a-z0-9._-]{0,47}$

      • model_refstringrequired

        The model ref a request names in its model field: `byo:<org_id>:<name>`.

        pattern ^byo:[a-z][a-z0-9._-]{0,63}:[a-z0-9][a-z0-9._-]{0,47}$

      • upstream_modelstringrequired

        The model name the provider expects; the platform sends it as the request's model.

        1 to 128 characters · pattern ^[A-Za-z0-9][A-Za-z0-9._:/@-]*$

      • capabilitiesarray of stringrequired

        What the model serves: one to three of chat-completions, responses and embeddings (a value outside those three is never rendered).

        Allowed values: "chat-completions""embeddings""responses""audio-speech""audio-transcriptions""image-generations""decisions"

        at least 1 items · at most 3 items

      • statestringrequired

        `active` while the model can be called; `disabled` while its connection is disabled or holds no key.

        Allowed values: "active""disabled"

      • created_atstring (date-time)required
      • created_bystringrequired
    • created_atstring (date-time)required
    • updated_atstring (date-time)required
    • created_bystringrequired
    • updated_bystringrequired
  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 409

    The request conflicts with what the organization holds and nothing was changed. Codes: model-provider-limit (the organization holds 10 connections), provider-model-limit (the connection holds 50 models), provider-model-exists (the model name is taken in the organization).

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

GET/models/v1/organizations/{org}/providers/{provider}

Get one of the organization's provider connections

Credential
API key
Permission
model-providers.manage

Retrieves a connection of the organization by id, with the status of its key and its models. A connection that was deleted, or that belongs to another organization, is not found (400 provider-not-found: the same answer for both, so an id of another organization is not confirmed).

Read more

Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default.

curl
curl "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}" \
  -H "Authorization: Bearer $CCSIO_API_KEY"

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

provider
required
pathstring

Provider connection identifier: mp- and 26 lowercase Crockford base32 characters.

Responses

  • 200

    Success.

    Schema
    OrganizationProvider
    • provider_idstringrequired

      pattern ^mp-[0-9a-hjkmnp-tv-z]{26}$

    • organization_idstringrequired

      The organization that owns the connection.

      pattern ^[a-z][a-z0-9._-]{0,63}$

    • display_namestringrequired

      1 to 80 characters

    • base_urlstringrequired

      The provider's base URL: https on a public DNS name (never an address, localhost or an internal-looking zone), at most 100 characters of letters, digits and . _ : / -, no userinfo, query or fragment, no trailing slash, and not on or under a host of CONTROL_PROVIDER_DENY_HOSTS. A deployment of the connection calls the base URL plus /chat/completions, /responses or /embeddings.

      at most 100 characters

    • protocolstringrequired

      always "openai-compat"

    • statestringrequired

      Allowed values: "enabled""disabled"

    • processing_locationstringrequired

      Where the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).

      at most 120 characters

    • credentialobjectrequired

      The status of a connection's API key, and the only thing any route says about it. `set` is false when the connection has no key; the other members are present exactly when it has one.

      • setbooleanrequired
      • versionintegeroptional

        The version of the stored key, from one global sequence that never issues a number twice.

        at least 1

      • fingerprintstringoptional

        An ellipsis and the last four characters of the key, or the ellipsis alone for a key shorter than twelve characters.

        1 to 8 characters

      • updated_atstring (date-time)optional
      • updated_bystringoptional
    • data_processing_acknowledged_bystringrequired

      Who acknowledged, when the connection was created, that requests to its models are processed by the provider.

    • data_processing_acknowledged_atstring (date-time)required
    • modelsarray of OrganizationProviderModelrequired

      The models added to the connection, sorted by name.

      • namestringrequired

        The name the organization gave the model, unique in the organization.

        pattern ^[a-z0-9][a-z0-9._-]{0,47}$

      • model_refstringrequired

        The model ref a request names in its model field: `byo:<org_id>:<name>`.

        pattern ^byo:[a-z][a-z0-9._-]{0,63}:[a-z0-9][a-z0-9._-]{0,47}$

      • upstream_modelstringrequired

        The model name the provider expects; the platform sends it as the request's model.

        1 to 128 characters · pattern ^[A-Za-z0-9][A-Za-z0-9._:/@-]*$

      • capabilitiesarray of stringrequired

        What the model serves: one to three of chat-completions, responses and embeddings (a value outside those three is never rendered).

        Allowed values: "chat-completions""embeddings""responses""audio-speech""audio-transcriptions""image-generations""decisions"

        at least 1 items · at most 3 items

      • statestringrequired

        `active` while the model can be called; `disabled` while its connection is disabled or holds no key.

        Allowed values: "active""disabled"

      • created_atstring (date-time)required
      • created_bystringrequired
    • created_atstring (date-time)required
    • updated_atstring (date-time)required
    • created_bystringrequired
    • updated_bystringrequired
  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

PATCH/models/v1/organizations/{org}/providers/{provider}

Change one of the organization's provider connections

Credential
API key
Permission
model-providers.manage
Request body
Body up to 65536 bytes

Changes the display name, the processing location or the state of a connection (a disabled connection stops serving its models until it is enabled again), or its base URL.

Read more

A change of the base URL requires a new `api_key` in the same request (400 provider-key-required otherwise), so a stored key never follows a changed host. With an `api_key` the key is replaced and takes a new version. The request must change something. Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default. It is an audited management fact (security event `model_provider.updated`) and the event never carries the key. The key is write-only: it is sealed in the database, never returned by any route, never logged and never part of an event or an error. Request body capped at 65536 bytes and decoded strictly: an unknown member or trailing data is a 400 invalid-request.

curl
curl -X PATCH "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}" \
  -H "Authorization: Bearer $CCSIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Built from the schema’s required members: replace the values.

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

provider
required
pathstring

Provider connection identifier: mp- and 26 lowercase Crockford base32 characters.

Request body application/json

UpdateModelProviderRequest
  • display_namestringoptional

    1 to 80 characters

  • base_urlstringoptional

    The provider's base URL: https on a public DNS name (never an address, localhost or an internal-looking zone), at most 100 characters of letters, digits and . _ : / -, no userinfo, query or fragment, no trailing slash, and not on or under a host of CONTROL_PROVIDER_DENY_HOSTS. A deployment of the connection calls the base URL plus /chat/completions, /responses or /embeddings.

    at most 100 characters

  • api_keystringoptional

    The provider's API key: 8 to 512 printable ASCII characters without spaces. Write-only: it is sealed in the database and no route, log, event or error ever returns it.

    8 to 512 characters · pattern ^[\x21-\x7E]{8,512}$

  • processing_locationstringoptional

    Where the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).

    at most 120 characters

  • statestringoptional

    Allowed values: "enabled""disabled"

Responses

  • 200

    The connection after the change.

    Schema
    OrganizationProvider
    • provider_idstringrequired

      pattern ^mp-[0-9a-hjkmnp-tv-z]{26}$

    • organization_idstringrequired

      The organization that owns the connection.

      pattern ^[a-z][a-z0-9._-]{0,63}$

    • display_namestringrequired

      1 to 80 characters

    • base_urlstringrequired

      The provider's base URL: https on a public DNS name (never an address, localhost or an internal-looking zone), at most 100 characters of letters, digits and . _ : / -, no userinfo, query or fragment, no trailing slash, and not on or under a host of CONTROL_PROVIDER_DENY_HOSTS. A deployment of the connection calls the base URL plus /chat/completions, /responses or /embeddings.

      at most 100 characters

    • protocolstringrequired

      always "openai-compat"

    • statestringrequired

      Allowed values: "enabled""disabled"

    • processing_locationstringrequired

      Where the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).

      at most 120 characters

    • credentialobjectrequired

      The status of a connection's API key, and the only thing any route says about it. `set` is false when the connection has no key; the other members are present exactly when it has one.

      • setbooleanrequired
      • versionintegeroptional

        The version of the stored key, from one global sequence that never issues a number twice.

        at least 1

      • fingerprintstringoptional

        An ellipsis and the last four characters of the key, or the ellipsis alone for a key shorter than twelve characters.

        1 to 8 characters

      • updated_atstring (date-time)optional
      • updated_bystringoptional
    • data_processing_acknowledged_bystringrequired

      Who acknowledged, when the connection was created, that requests to its models are processed by the provider.

    • data_processing_acknowledged_atstring (date-time)required
    • modelsarray of OrganizationProviderModelrequired

      The models added to the connection, sorted by name.

      • namestringrequired

        The name the organization gave the model, unique in the organization.

        pattern ^[a-z0-9][a-z0-9._-]{0,47}$

      • model_refstringrequired

        The model ref a request names in its model field: `byo:<org_id>:<name>`.

        pattern ^byo:[a-z][a-z0-9._-]{0,63}:[a-z0-9][a-z0-9._-]{0,47}$

      • upstream_modelstringrequired

        The model name the provider expects; the platform sends it as the request's model.

        1 to 128 characters · pattern ^[A-Za-z0-9][A-Za-z0-9._:/@-]*$

      • capabilitiesarray of stringrequired

        What the model serves: one to three of chat-completions, responses and embeddings (a value outside those three is never rendered).

        Allowed values: "chat-completions""embeddings""responses""audio-speech""audio-transcriptions""image-generations""decisions"

        at least 1 items · at most 3 items

      • statestringrequired

        `active` while the model can be called; `disabled` while its connection is disabled or holds no key.

        Allowed values: "active""disabled"

      • created_atstring (date-time)required
      • created_bystringrequired
    • created_atstring (date-time)required
    • updated_atstring (date-time)required
    • created_bystringrequired
    • updated_bystringrequired
  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

DELETE/models/v1/organizations/{org}/providers/{provider}

Delete one of the organization's provider connections

Credential
API key
Permission
model-providers.manage

Deletes a connection: its key is removed for good, the connection is marked deleted (the row stays: usage facts and deployments name it), every model added to it stops serving and the organization's access to those models, and every team's, is revoked.

Read more

Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default. It is an audited management fact (security event `model_provider.deleted`) and the event never carries the key.

curl
curl -X DELETE "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}" \
  -H "Authorization: Bearer $CCSIO_API_KEY"

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

provider
required
pathstring

Provider connection identifier: mp- and 26 lowercase Crockford base32 characters.

Responses

  • 204

    The connection was deleted.

  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

PUT/models/v1/organizations/{org}/providers/{provider}/credential

Set or rotate the API key of one of the organization's connections

Credential
API key
Permission
model-providers.manage
Request body
Body up to 65536 bytes

Stores a new API key for the connection under a new version (the version comes from one global sequence and is never reused); the next request carries it and the old value is never asked for again.

Read more

The answer is the status of the key: whether one is set, its version and a fingerprint (an ellipsis and the last four characters, or the ellipsis alone for a key shorter than twelve characters). Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default. It is an audited management fact (security event `model_provider.credential_set`) and the event never carries the key. The key is write-only: it is sealed in the database, never returned by any route, never logged and never part of an event or an error. Request body capped at 65536 bytes and decoded strictly: an unknown member or trailing data is a 400 invalid-request.

curl
curl -X PUT "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}/credential" \
  -H "Authorization: Bearer $CCSIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "string"
}'
Built from the schema’s required members: replace the values.

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

provider
required
pathstring

Provider connection identifier: mp- and 26 lowercase Crockford base32 characters.

Request body application/json

SetModelProviderCredentialRequest
  • api_keystringrequired

    The provider's API key: 8 to 512 printable ASCII characters without spaces. Write-only: it is sealed in the database and no route, log, event or error ever returns it.

    8 to 512 characters · pattern ^[\x21-\x7E]{8,512}$

Responses

  • 200

    The key was stored.

    Schema
    ModelProviderCredentialStatus
    • setbooleanrequired
    • versionintegeroptional

      The version of the stored key, from one global sequence that never issues a number twice.

      at least 1

    • fingerprintstringoptional

      An ellipsis and the last four characters of the key, or the ellipsis alone for a key shorter than twelve characters.

      1 to 8 characters

    • updated_atstring (date-time)optional
    • updated_bystringoptional
  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

POST/models/v1/organizations/{org}/providers/{provider}/models

Add a model to one of the organization's connections

Credential
API key
Permission
model-providers.manage
Request body
Body up to 65536 bytes

Adds a model the connection serves.

Read more

In one transaction core creates the catalog model `byo:<org_id>:<name>` in the organization's own placement, one deployment of it per capability (provider class CUSTOMER_HOSTED, reached over the public egress with the connection's stored key, active at once) and, through the entitlement mechanism, gives the ORGANIZATION access to the model: every member that belongs to the organization directly may call it by its `model_ref`, and a member that belongs to a team is admitted too. To restrict it to teams the organization uses the existing team entitlement routes (`POST /identity/v1/organizations/{org}/teams/{team}/entitlements`); a member that belongs to the organization directly, and not through a team, is never restricted by them. The model is visible to the organization alone: no other organization sees or calls it, and the name of another organization's model is not found. `name` is `^[a-z0-9][a-z0-9._-]{0,47}$`, `upstream_model` is the model name the provider expects, and `capabilities` lists one to three of chat-completions, responses and embeddings (a deployment per capability; any other value is refused 400 provider-invalid). A connection holds at most 50 models (409 provider-model-limit) and a name is unique in the organization (409 provider-model-exists). Requests to the model are recorded with provider class CUSTOMER_HOSTED and are never charged. Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default. It is an audited management fact (security event `model_provider.model_added`). Request body capped at 65536 bytes and decoded strictly: an unknown member or trailing data is a 400 invalid-request.

curl
curl -X POST "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}/models" \
  -H "Authorization: Bearer $CCSIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "upstream_model": "string",
  "capabilities": [
    "chat-completions"
  ]
}'
Built from the schema’s required members: replace the values.

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

provider
required
pathstring

Provider connection identifier: mp- and 26 lowercase Crockford base32 characters.

Request body application/json

AddOrganizationProviderModelRequest
  • namestringrequired

    pattern ^[a-z0-9][a-z0-9._-]{0,47}$

  • upstream_modelstringrequired

    1 to 128 characters · pattern ^[A-Za-z0-9][A-Za-z0-9._:/@-]*$

  • capabilitiesarray of stringrequired

    One to three of chat-completions, responses and embeddings, with no duplicate; any other value is refused 400 provider-invalid.

    Allowed values: "chat-completions""embeddings""responses""audio-speech""audio-transcriptions""image-generations""decisions"

    at least 1 items · at most 3 items

Responses

  • 201

    The model was added.

    Schema
    OrganizationProviderModel
    • namestringrequired

      The name the organization gave the model, unique in the organization.

      pattern ^[a-z0-9][a-z0-9._-]{0,47}$

    • model_refstringrequired

      The model ref a request names in its model field: `byo:<org_id>:<name>`.

      pattern ^byo:[a-z][a-z0-9._-]{0,63}:[a-z0-9][a-z0-9._-]{0,47}$

    • upstream_modelstringrequired

      The model name the provider expects; the platform sends it as the request's model.

      1 to 128 characters · pattern ^[A-Za-z0-9][A-Za-z0-9._:/@-]*$

    • capabilitiesarray of stringrequired

      What the model serves: one to three of chat-completions, responses and embeddings (a value outside those three is never rendered).

      Allowed values: "chat-completions""embeddings""responses""audio-speech""audio-transcriptions""image-generations""decisions"

      at least 1 items · at most 3 items

    • statestringrequired

      `active` while the model can be called; `disabled` while its connection is disabled or holds no key.

      Allowed values: "active""disabled"

    • created_atstring (date-time)required
    • created_bystringrequired
  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 409

    The request conflicts with what the organization holds and nothing was changed. Codes: model-provider-limit (the organization holds 10 connections), provider-model-limit (the connection holds 50 models), provider-model-exists (the model name is taken in the organization).

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

DELETE/models/v1/organizations/{org}/providers/{provider}/models/{name}

Remove a model from one of the organization's connections

Credential
API key
Permission
model-providers.manage

Removes a model: its deployments stop serving and are disabled, and the organization's access to it, with every team's, is revoked. The name may then be added again.

Read more

Organization-scoped: the organization in the path must be the caller's own, and the caller must hold `model-providers.manage` there (root, organization_admin, or a custom role that carries it); a platform operator holds no access to an organization's provider connections, and any other caller is refused 403 `policy-denied` at the request boundary. The operations answer 503 `model-providers-disabled` while the plane's switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off, which is the default. It is an audited management fact (security event `model_provider.model_removed`).

curl
curl -X DELETE "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}/models/{name}" \
  -H "Authorization: Bearer $CCSIO_API_KEY"

Parameters

NameInDescription
X-Request-ID
optional
headerstring

Optional request ULID. A valid ULID (upper or lowercase) is honored; when the header is absent or invalid, the runtime mints the id. The response X-Request-ID header carries the canonical uppercase form.

org
required
pathstring

Organization identifier (C7 identifier). It must be the caller's own organization.

provider
required
pathstring

Provider connection identifier: mp- and 26 lowercase Crockford base32 characters.

name
required
pathstring

The name of a model added to a provider connection, the last part of its model ref `byo:<org_id>:<name>`.

Responses

  • 204

    The model was removed.

  • 400

    Client refusal unrelated to authentication, including malformed input, a denied or failed request.

  • 401

    The request carries no credential, more than one, or one the platform does not accept, and is refused before the operation runs; `error.code` says why. Supply exactly one credential. Codes: invalid-request (no credential, or both Authorization:

    Read more

    Bearer and x-api-key), api-key-invalid (a value that is not a platform API key, or a key of a kind the platform does not accept), api-key-unknown, api-key-revoked, api-key-expired, bootstrap-disabled (the one-shot installation credential, once a key exists), token-malformed (a bearer token that is not a JWT), token-algorithm-unsupported, token-signature-invalid, token-claim-invalid, token-issuer-mismatch, token-audience-mismatch, token-expired, token-not-yet-valid, issuer-untrusted, issuer-residency-mismatch (the issuer belongs to another plane), issuer-resolution-unknown, jwks-unavailable, jwks-key-not-found, staff-token-inactive (a platform operator's token), staff-not-operator, staff-directory-unavailable, identity-not-provisioned (a verified identity with no account on this plane), organization-not-found (a verified identity or key whose organization this plane does not know), internal-error (a fault while the credential is checked is refused too, fail closed), context-cancelled

  • 402

    The organization has to pay first: its standing is payment_required.

    Read more

    The request boundary applies this payment gate to every route except an organization's billing routes, the caller's own context, organization list, onboarding, session report and personal keys, the public routes, and the routes of platform operators, who administer an organization that has to pay. The operations the gate covers declare this response. On /v1 the refusal is rendered in the OpenAI error format. Code: payment-required

  • 403

    The credential is valid but may not do this here; the request is refused by the request boundary before the handler runs, and `error.code` says which refusal. An operation may add codes of its own.

    Read more

    Codes: policy-denied (no role of the caller holds the permission the operation needs, or the credential class may not call it: a personal API key outside inference and MCP, a route that needs a signed-in person, the one-shot installation credential outside its three steps), tenant-mismatch (the organization a path, query, body or X-Tenant header names is not the caller's own), organization-provisioning, organization-suspended, organization-disabled, organization-deleted (the state of the caller's organization), user-disabled, residency-mismatch (the organization lives on another plane), organization-selection-required (a caller with more than one organization, or a platform operator, must name one in X-Organization-Id), organization-not-selectable, no-active-organization-membership, team-not-selectable (the X-Organization-Id or X-Team-Id the caller sent does not name an organization or team it may act in), identity-managed-by-provider (a person who is not a platform operator changes an organization's status, which belongs to the identity provider), support-session-required (a platform operator reads an organization's data without an open support session)

  • 404

    The connection holds no model of that name. Code: provider-model-not-found.

  • 405

    The path is claimed but the request method is not allowed. Go ServeMux returns its standard plain-text response and lists permitted methods in Allow.

  • 500

    Platform failure, rendered without internal cause details.

  • 503

    The organization's provider connections cannot be used on this deployment. Codes: model-providers-disabled (the switch CONTROL_ORGANIZATION_MODEL_PROVIDERS is off; nothing was read or written), credential-store-unavailable (no encryption keyring is configured, so a key cannot be sealed), provider-deny-hosts-unset (CONTROL_PROVIDER_DENY_HOSTS is unset, so a base URL cannot be checked), providers-unavailable (the connection store is not composed).

Generated from the platform contracts at commit 5f833620.

Explore the platform

Get your first API key

Registration is open. Four steps to your first call: create your account, create your organization, create your API key, and start using it.

  1. 01Create your account
  2. 02Create your organization
  3. 03Create your API key
  4. 04Start using it