The descriptions of the operations and fields are the contract’s own, in English.
/identity/v1/api-keysList the organization's API keys
- Credential
- API key
- Permission
- Any of
api-keys.readsupport-access.read
Lists the organization's key views WITHOUT raw, deterministic by key id. The org id is the required org query parameter. A deleted key is not listed.
curl "https://console.us.ccsio.ai/identity/v1/api-keys?org=<org>" \
-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 | query | string The organization whose API keys or eligible service-account principals are listed (C7 identifier). |
Responses
- 200
The API-key list (views without raw).
Schema
ListAPIKeysResponseapi_keysarray of APIKeyrequiredkey_idstringrequiredThe platform-minted key id (uppercase ULID).
pattern ^[0-9A-HJKMNP-TV-Z]{26}$
org_idstringrequiredpattern ^[a-z][a-z0-9._-]{0,63}$
namestringrequired1 to 128 characters
principal_refstringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
prefixstringrequiredThe display prefix (ccsio_ plus the first 8 entropy characters) — never the raw value, never a digest.
pattern ^ccsio_[A-Za-z0-9_-]{8}$
created_bystringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
created_atstring (date-time)requiredRFC 3339, second precision, UTC.
expires_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null when the key has no expiry.
statestringrequiredThe key state; revoked is terminal.
Allowed values:
"active""revoked"revoked_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null while active.
kindstringrequiredThe persisted credential type; existing service-account keys retain service_account.
Allowed values:
"personal""service_account"ownerobjectoptionaldisplay_namestringrequiredReadable owner name from the identity profile.
emailstringoptionalOwner email when known; presentation only, never an authorization identifier.
kindstringrequiredAllowed values:
"human""service_account"
- 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 requested resource or path was 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
A dependency the operation needs is not configured on this plane or could not be reached, and nothing was changed. `error.code` names it; an operation lists the ones it can answer besides the boundary's. Retry later. Codes: support-audit-unavailable (the request boundary: an operator's read under an open support session could not be recorded, so nothing was served)
/identity/v1/api-keysIssue a new API key for the organization
- Credential
- API key
- Permission
api-keys.manage- Request body
- Body up to 1 MiB
org_id, name, and principal_ref are required; created_by is an optional compatibility field that is ignored: the server records the verified actor as the creator. principal_ref must identify an active service account with an active membership in the same organization.
Read more
Requires api-keys.manage in that organization; expires_at (RFC 3339) is optional — absent or an empty string means no expiry, and an expiry not after creation is refused with 400 api-key-invalid. The 200 response carries the raw key exactly once — on successful issuance; every later key view carries the ccsio_ display prefix and never the raw value or a digest. No idempotency: the key id is platform-minted, so a redelivered issue mints a second key (the operator revokes the unneeded one) — pinned deliberately.
curl -X POST "https://console.us.ccsio.ai/identity/v1/api-keys" \
-H "Authorization: Bearer $CCSIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"org_id": "acme",
"name": "billing-app production",
"principal_ref": "svc/01K7YP2C9W4X5E8H3J6M0N1Q2R",
"expires_at": "2027-01-31T00:00:00Z"
}'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. |
Request body application/json
org_idstringrequiredThe organization id (C7 identifier) the key belongs to.
pattern ^[a-z][a-z0-9._-]{0,63}$
namestringrequiredThe operator-facing key name.
1 to 128 characters
principal_refstringrequiredAn active service account in this organization, selected from GET /identity/v1/api-key-principals.
pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
created_bystringoptionalIgnored compatibility field. The server always records the verified actor as created_by; clients should omit this field.
expires_atstring (date-time) or nulloptionalOptional RFC 3339 expiry, second precision, UTC; absent or an empty string (or null) means no expiry. A non-empty value not after the creation instant is refused (api-key-invalid).
Responses
- 200
The issued service-account key view, including its raw value exactly once.
Schema
IssuedAPIKeykey_idstringrequiredThe platform-minted key id (uppercase ULID).
pattern ^[0-9A-HJKMNP-TV-Z]{26}$
org_idstringrequiredpattern ^[a-z][a-z0-9._-]{0,63}$
namestringrequired1 to 128 characters
principal_refstringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
prefixstringrequiredThe display prefix (ccsio_ plus the first 8 entropy characters) — never the raw value, never a digest.
pattern ^ccsio_[A-Za-z0-9_-]{8}$
created_bystringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
created_atstring (date-time)requiredRFC 3339, second precision, UTC.
expires_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null when the key has no expiry.
statestringrequiredA freshly issued key is always active.
Allowed values:
"active"revoked_atnull or nullrequiredA freshly issued key is never revoked; renders null.
rawstringrequiredThe raw key value, returned exactly once on successful issuance (service-account or personal): ccsio_ followed by 32 alphanumeric characters. Never returned by list, read or revoke operations, or included in errors or logs. Keys issued before this form (ccsio_ plus 43 base64url characters) remain valid credentials but are never minted again.
pattern ^ccsio_[A-Za-z0-9]{32}$
kindstringrequiredThe persisted credential type; existing service-account keys retain service_account.
Allowed values:
"personal""service_account"ownerobjectoptionaldisplay_namestringrequiredReadable owner name from the identity profile.
emailstringoptionalOwner email when known; presentation only, never an authorization identifier.
kindstringrequiredAllowed values:
"human""service_account"
- 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 requested resource or path was 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.
{
"key_id": "01K7YQ4D8M2P6S9V3X5Z7B1C4F",
"kind": "service_account",
"owner": {
"display_name": "billing-app",
"kind": "service_account"
},
"org_id": "acme",
"name": "billing-app production",
"principal_ref": "svc/01K7YP2C9W4X5E8H3J6M0N1Q2R",
"prefix": "ccsio_ExampleK",
"created_by": "user/onboard/01K7YN1B3C5D7F9H2K4M6P8R0T",
"created_at": "2026-10-14T09:30:00Z",
"expires_at": "2027-01-31T00:00:00Z",
"state": "active",
"revoked_at": null,
"raw": "ccsio_ExampleKeyShownOnceAtCreation000"
}/identity/v1/api-keys/{id}Read one API key
- Credential
- API key
- Permission
- Any of
api-keys.readsupport-access.read
The key view WITHOUT raw. The path is the platform-minted key id (ULID). A deleted key is gone: 404 api-key-not-found.
curl "https://console.us.ccsio.ai/identity/v1/api-keys/{id}" \
-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. |
idrequired | path | string The platform-minted API-key id (uppercase ULID). |
Responses
- 200
The key view (without raw).
Schema
APIKeykey_idstringrequiredThe platform-minted key id (uppercase ULID).
pattern ^[0-9A-HJKMNP-TV-Z]{26}$
org_idstringrequiredpattern ^[a-z][a-z0-9._-]{0,63}$
namestringrequired1 to 128 characters
principal_refstringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
prefixstringrequiredThe display prefix (ccsio_ plus the first 8 entropy characters) — never the raw value, never a digest.
pattern ^ccsio_[A-Za-z0-9_-]{8}$
created_bystringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
created_atstring (date-time)requiredRFC 3339, second precision, UTC.
expires_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null when the key has no expiry.
statestringrequiredThe key state; revoked is terminal.
Allowed values:
"active""revoked"revoked_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null while active.
kindstringrequiredThe persisted credential type; existing service-account keys retain service_account.
Allowed values:
"personal""service_account"ownerobjectoptionaldisplay_namestringrequiredReadable owner name from the identity profile.
emailstringoptionalOwner email when known; presentation only, never an authorization identifier.
kindstringrequiredAllowed values:
"human""service_account"
- 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 requested resource or path was 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
A dependency the operation needs is not configured on this plane or could not be reached, and nothing was changed. `error.code` names it; an operation lists the ones it can answer besides the boundary's. Retry later. Codes: support-audit-unavailable (the request boundary: an operator's read under an open support session could not be recorded, so nothing was served)
/identity/v1/api-keys/{id}Delete a revoked API key
- Credential
- API key
- Permission
api-keys.manage
Requires api-keys.manage, the permission revoking a key needs.
Read more
Deletes a key of the caller's organization, and only once it is revoked: the key then disappears from every list and read (GET /identity/v1/api-keys, GET /identity/v1/api-keys/{id}, a personal key list) and from the console, and can never authenticate - it was revoked already. The record itself is kept, so audit references keep resolving: a security event's item label and actor.key_id still name the key. An ACTIVE key is refused 409 api-key-active (revoke it first); an unknown id, another organization's key and an already deleted key are all 404 api-key-not-found. Sensitive: audited as api_key.deleted. No request body.
curl -X DELETE "https://console.us.ccsio.ai/identity/v1/api-keys/{id}" \
-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. |
idrequired | path | string The platform-minted API-key id (uppercase ULID). |
Responses
- 204
The key is deleted. No body.
- 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 requested resource or path was 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.
- 409
The request conflicts with the current state of the resource or with an invariant it protects (a taken name, a role still in use, an organization that must not be deleted, an archived team, the last active root, a seat or service account limit).
- 500
Platform failure, rendered without internal cause details.
/identity/v1/api-keys/{id}/revokeRevoke an API key (terminal)
- Credential
- API key
- Permission
api-keys.manage
Revokes the key (the revoked state is terminal). Re-revoking returns the stored revoked key (idempotent). No request body. A deleted key is 404 api-key-not-found like an unknown one.
curl -X POST "https://console.us.ccsio.ai/identity/v1/api-keys/{id}/revoke" \
-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. |
idrequired | path | string The platform-minted API-key id (uppercase ULID). |
Responses
- 200
The key view, state revoked, with revoked_at.
Schema
APIKeykey_idstringrequiredThe platform-minted key id (uppercase ULID).
pattern ^[0-9A-HJKMNP-TV-Z]{26}$
org_idstringrequiredpattern ^[a-z][a-z0-9._-]{0,63}$
namestringrequired1 to 128 characters
principal_refstringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
prefixstringrequiredThe display prefix (ccsio_ plus the first 8 entropy characters) — never the raw value, never a digest.
pattern ^ccsio_[A-Za-z0-9_-]{8}$
created_bystringrequiredpattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
created_atstring (date-time)requiredRFC 3339, second precision, UTC.
expires_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null when the key has no expiry.
statestringrequiredThe key state; revoked is terminal.
Allowed values:
"active""revoked"revoked_atstring (date-time) or nullrequiredRFC 3339, second precision, UTC; null while active.
kindstringrequiredThe persisted credential type; existing service-account keys retain service_account.
Allowed values:
"personal""service_account"ownerobjectoptionaldisplay_namestringrequiredReadable owner name from the identity profile.
emailstringoptionalOwner email when known; presentation only, never an authorization identifier.
kindstringrequiredAllowed values:
"human""service_account"
- 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 requested resource or path was 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.
/identity/v1/api-key-principalsList service accounts available for API-key issuance
- Credential
- API key
- Permission
api-keys.manage
Requires api-keys.manage in the requested organization. Returns active service accounts with an active organization membership, ordered by stable principal reference. Human users and principals from other organizations are excluded. The cursor is opaque and bound to the organization.
curl "https://console.us.ccsio.ai/identity/v1/api-key-principals?org=<org>" \
-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 | query | string The organization whose API keys or eligible service-account principals are listed (C7 identifier). |
limitoptional | query | integer |
cursoroptional | query | string Opaque next_cursor from the preceding page for this organization. |
Responses
- 200
The eligible service-account page.
Schema
ListAPIKeyPrincipalsResponseprincipalsarray of APIKeyPrincipalrequiredprincipal_refstringrequiredStable service-account reference sent as principal_ref when issuing a key.
pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$
display_namestringrequiredkindstringrequiredalways "service_account"
next_cursorstring or nullrequiredOpaque continuation cursor; null at the end of the result set.
- 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 requested resource or path was 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.
Generated from the platform contracts at commit 5f833620.