The descriptions of the operations and fields are the contract’s own, in English.
/models/v1/organizations/{org}/providersList 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 "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers" \
-H "Authorization: Bearer $CCSIO_API_KEY"Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
Responses
- 200
Success.
Schema
ListOrganizationProvidersResponseprovidersarray of OrganizationProviderrequiredprovider_idstringrequiredpattern ^mp-[0-9a-hjkmnp-tv-z]{26}$
organization_idstringrequiredThe organization that owns the connection.
pattern ^[a-z][a-z0-9._-]{0,63}$
display_namestringrequired1 to 80 characters
base_urlstringrequiredThe 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
protocolstringrequiredalways "openai-compat"
statestringrequiredAllowed values:
"enabled""disabled"processing_locationstringrequiredWhere the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).
at most 120 characters
credentialobjectrequiredThe 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.
setbooleanrequiredversionintegeroptionalThe version of the stored key, from one global sequence that never issues a number twice.
at least 1
fingerprintstringoptionalAn 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)optionalupdated_bystringoptional
data_processing_acknowledged_bystringrequiredWho acknowledged, when the connection was created, that requests to its models are processed by the provider.
data_processing_acknowledged_atstring (date-time)requiredmodelsarray of OrganizationProviderModelrequiredThe models added to the connection, sorted by name.
created_atstring (date-time)requiredupdated_atstring (date-time)requiredcreated_bystringrequiredupdated_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).
/models/v1/organizations/{org}/providersConnect 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 -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"
}'Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
Request body application/json
display_namestringrequired1 to 80 characters
base_urlstringrequiredThe 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_keystringrequiredThe 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_locationstringoptionalWhere the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).
at most 120 characters
data_processing_acknowledgedbooleanoptionalMust 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
OrganizationProviderprovider_idstringrequiredpattern ^mp-[0-9a-hjkmnp-tv-z]{26}$
organization_idstringrequiredThe organization that owns the connection.
pattern ^[a-z][a-z0-9._-]{0,63}$
display_namestringrequired1 to 80 characters
base_urlstringrequiredThe 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
protocolstringrequiredalways "openai-compat"
statestringrequiredAllowed values:
"enabled""disabled"processing_locationstringrequiredWhere the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).
at most 120 characters
credentialobjectrequiredThe 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.
setbooleanrequiredversionintegeroptionalThe version of the stored key, from one global sequence that never issues a number twice.
at least 1
fingerprintstringoptionalAn 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)optionalupdated_bystringoptional
data_processing_acknowledged_bystringrequiredWho acknowledged, when the connection was created, that requests to its models are processed by the provider.
data_processing_acknowledged_atstring (date-time)requiredmodelsarray of OrganizationProviderModelrequiredThe models added to the connection, sorted by name.
namestringrequiredThe name the organization gave the model, unique in the organization.
pattern ^[a-z0-9][a-z0-9._-]{0,47}$
model_refstringrequiredThe 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_modelstringrequiredThe 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 stringrequiredWhat 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)requiredcreated_bystringrequired
created_atstring (date-time)requiredupdated_atstring (date-time)requiredcreated_bystringrequiredupdated_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).
/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 "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}" \
-H "Authorization: Bearer $CCSIO_API_KEY"Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
providerrequired | path | string Provider connection identifier: mp- and 26 lowercase Crockford base32 characters. |
Responses
- 200
Success.
Schema
OrganizationProviderprovider_idstringrequiredpattern ^mp-[0-9a-hjkmnp-tv-z]{26}$
organization_idstringrequiredThe organization that owns the connection.
pattern ^[a-z][a-z0-9._-]{0,63}$
display_namestringrequired1 to 80 characters
base_urlstringrequiredThe 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
protocolstringrequiredalways "openai-compat"
statestringrequiredAllowed values:
"enabled""disabled"processing_locationstringrequiredWhere the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).
at most 120 characters
credentialobjectrequiredThe 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.
setbooleanrequiredversionintegeroptionalThe version of the stored key, from one global sequence that never issues a number twice.
at least 1
fingerprintstringoptionalAn 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)optionalupdated_bystringoptional
data_processing_acknowledged_bystringrequiredWho acknowledged, when the connection was created, that requests to its models are processed by the provider.
data_processing_acknowledged_atstring (date-time)requiredmodelsarray of OrganizationProviderModelrequiredThe models added to the connection, sorted by name.
namestringrequiredThe name the organization gave the model, unique in the organization.
pattern ^[a-z0-9][a-z0-9._-]{0,47}$
model_refstringrequiredThe 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_modelstringrequiredThe 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 stringrequiredWhat 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)requiredcreated_bystringrequired
created_atstring (date-time)requiredupdated_atstring (date-time)requiredcreated_bystringrequiredupdated_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).
/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 -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 '{}'Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
providerrequired | path | string Provider connection identifier: mp- and 26 lowercase Crockford base32 characters. |
Request body application/json
display_namestringoptional1 to 80 characters
base_urlstringoptionalThe 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_keystringoptionalThe 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_locationstringoptionalWhere the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).
at most 120 characters
statestringoptionalAllowed values:
"enabled""disabled"
Responses
- 200
The connection after the change.
Schema
OrganizationProviderprovider_idstringrequiredpattern ^mp-[0-9a-hjkmnp-tv-z]{26}$
organization_idstringrequiredThe organization that owns the connection.
pattern ^[a-z][a-z0-9._-]{0,63}$
display_namestringrequired1 to 80 characters
base_urlstringrequiredThe 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
protocolstringrequiredalways "openai-compat"
statestringrequiredAllowed values:
"enabled""disabled"processing_locationstringrequiredWhere the provider processes the data, as declared by whoever configured the connection (free text, up to 120 characters).
at most 120 characters
credentialobjectrequiredThe 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.
setbooleanrequiredversionintegeroptionalThe version of the stored key, from one global sequence that never issues a number twice.
at least 1
fingerprintstringoptionalAn 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)optionalupdated_bystringoptional
data_processing_acknowledged_bystringrequiredWho acknowledged, when the connection was created, that requests to its models are processed by the provider.
data_processing_acknowledged_atstring (date-time)requiredmodelsarray of OrganizationProviderModelrequiredThe models added to the connection, sorted by name.
namestringrequiredThe name the organization gave the model, unique in the organization.
pattern ^[a-z0-9][a-z0-9._-]{0,47}$
model_refstringrequiredThe 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_modelstringrequiredThe 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 stringrequiredWhat 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)requiredcreated_bystringrequired
created_atstring (date-time)requiredupdated_atstring (date-time)requiredcreated_bystringrequiredupdated_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).
/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 -X DELETE "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}" \
-H "Authorization: Bearer $CCSIO_API_KEY"Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
providerrequired | path | string 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).
/models/v1/organizations/{org}/providers/{provider}/credentialSet 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 -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"
}'Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
providerrequired | path | string Provider connection identifier: mp- and 26 lowercase Crockford base32 characters. |
Request body application/json
api_keystringrequiredThe 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
ModelProviderCredentialStatussetbooleanrequiredversionintegeroptionalThe version of the stored key, from one global sequence that never issues a number twice.
at least 1
fingerprintstringoptionalAn 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)optionalupdated_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).
/models/v1/organizations/{org}/providers/{provider}/modelsAdd 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 -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"
]
}'Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
providerrequired | path | string Provider connection identifier: mp- and 26 lowercase Crockford base32 characters. |
Request body application/json
namestringrequiredpattern ^[a-z0-9][a-z0-9._-]{0,47}$
upstream_modelstringrequired1 to 128 characters · pattern ^[A-Za-z0-9][A-Za-z0-9._:/@-]*$
capabilitiesarray of stringrequiredOne 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
OrganizationProviderModelnamestringrequiredThe name the organization gave the model, unique in the organization.
pattern ^[a-z0-9][a-z0-9._-]{0,47}$
model_refstringrequiredThe 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_modelstringrequiredThe 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 stringrequiredWhat 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)requiredcreated_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).
/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 -X DELETE "https://console.us.ccsio.ai/models/v1/organizations/{org}/providers/{provider}/models/{name}" \
-H "Authorization: Bearer $CCSIO_API_KEY"Parameters
| Name | In | Description |
|---|---|---|
X-Request-IDoptional | header | string 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. |
orgrequired | path | string Organization identifier (C7 identifier). It must be the caller's own organization. |
providerrequired | path | string Provider connection identifier: mp- and 26 lowercase Crockford base32 characters. |
namerequired | path | string 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.