Skip to main content
DocumentationIdentity and access · console.us.ccsio.ai

Support access

Operator support mode: a time-boxed, read-only session of a platform operator in one organization, and the organization's switch for it.

Documentation menu

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

GET/identity/v1/organizations/{org}/support-sessions

List the support sessions of an organization

Credential
API key
Permission
Any ofaudit.readsupport-sessions.manage

Needs audit.read in the organization (root and organization_admin hold it) or, from the backoffice, support-sessions.manage. Lists the organization's support sessions newest first, the active ones and the ended ones, with the operator's name and email as recorded when the session started. state narrows to active or ended (default: both); limit is 1 to 200 (default 50). Failures: 400 invalid-request (a query value out of range); 403 policy-denied; 500 server faults.

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

Parameters

NameInDescription
X-Request-ID
optional
headerstring

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

org
required
pathstring

The organization id (C7 identifier). A value outside the pattern is refused with 400 name-invalid.

state
optional
querystring

active or ended; absent lists both.

limit
optional
queryinteger

Page size, 1 to 200. Default 50.

Responses

  • 200

    The organization's support sessions.

    Schema
    SupportSessionList
    • sessionsarray of SupportSessionrequired

      Newest first by started_at, then session_id.

      • session_idstringrequired

        pattern ^[0-9A-HJKMNP-TV-Z]{26}$

      • organization_idstringrequired

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

      • operatorobjectrequired

        The operator who holds the session, as the plane recorded the person when the session started (their name and email are frozen on the session, so the record survives a later rename or a change of identity provider). display_name and email are null only when the staff directory gave none; every caller who may list the sessions (audit.read in the organization, support-sessions.manage in the plane) reads them, because they are the record of who accessed the organization.

        • user_refstringrequired

          The operator's user_ref in this plane (user/staff/...), the value GET /identity/v1/context reports as identity.ref for that person's session.

          pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$

        • display_namestring or nullrequired

          The operator's display name; null when the staff directory gave none.

          at most 128 characters

        • emailstring or nullrequired

          The operator's email address; null when the staff directory gave none.

          at most 254 characters

      • reasonstringrequired

        Why the operator opened the session, as they wrote it: one line, shown to the organization.

        10 to 128 characters

      • statusstringrequired

        Allowed values: "active""ended"

      • started_atstring (date-time)required

        When the session was opened. RFC 3339, second precision, UTC. Set by the database clock.

      • expires_atstring (date-time)required

        When the access stops. started_at plus the duration; never later than four hours after started_at. A session is never extended: a new one needs a new reason.

      • remaining_secondsintegerrequired

        Seconds of access left, computed by the database clock; 0 once the session ended. A client counts down from this value and not from its own clock.

        at least 0

      • ended_atstring (date-time) or nullrequired

        When the access stopped (expires_at for an expiry); null while the session is active.

      • end_reasonstring or nullrequired

        Why it ended. operator: the operator ended it; platform: another operator did; organization: an administrator of the organization did; access_disabled: the organization turned support access off; operator_signed_out: the operator signed out of the backoffice (best effort); expired: the time box ran out; start_failed: the session could not be recorded when it started and never gave access. null while active.

        Allowed values: "operator""platform""organization""access_disabled""operator_signed_out""expired""start_failed"null

      • ended_bystring or nullrequired

        The user_ref of the person who ended it; null while active, and for an expiry or a session that never started.

        pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$

  • 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)

POST/identity/v1/organizations/{org}/support-sessions/{id}/end

End a support session

Credential
API key
Permission
Any oforganization.updatesupport-sessions.manage

Needs organization.update in the organization (an administrator ends a session of their own organization at any time) or support-sessions.manage (a platform operator ends any session, their own included). Ends the session at once: the operator's next read is 403 support-session-required.

Read more

Sensitive: recorded as support.session_ended, with who ended it. No request body. Failures: 403 policy-denied; 404 support-session-not-found (an unknown id, or one of another organization); 409 support-session-ended (it already ended or its time ran out); 500 server faults.

curl
curl -X POST "https://console.us.ccsio.ai/identity/v1/organizations/{org}/support-sessions/{id}/end" \
  -H "Authorization: Bearer $CCSIO_API_KEY"

Parameters

NameInDescription
X-Request-ID
optional
headerstring

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

org
required
pathstring

The organization id (C7 identifier). A value outside the pattern is refused with 400 name-invalid.

id
required
pathstring

The support session id (a ULID). An unknown id, or one of another organization, is 404 support-session-not-found.

Responses

  • 200

    The ended session.

    Schema
    SupportSession
    • session_idstringrequired

      pattern ^[0-9A-HJKMNP-TV-Z]{26}$

    • organization_idstringrequired

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

    • operatorobjectrequired

      The operator who holds the session, as the plane recorded the person when the session started (their name and email are frozen on the session, so the record survives a later rename or a change of identity provider). display_name and email are null only when the staff directory gave none; every caller who may list the sessions (audit.read in the organization, support-sessions.manage in the plane) reads them, because they are the record of who accessed the organization.

      • user_refstringrequired

        The operator's user_ref in this plane (user/staff/...), the value GET /identity/v1/context reports as identity.ref for that person's session.

        pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$

      • display_namestring or nullrequired

        The operator's display name; null when the staff directory gave none.

        at most 128 characters

      • emailstring or nullrequired

        The operator's email address; null when the staff directory gave none.

        at most 254 characters

    • reasonstringrequired

      Why the operator opened the session, as they wrote it: one line, shown to the organization.

      10 to 128 characters

    • statusstringrequired

      Allowed values: "active""ended"

    • started_atstring (date-time)required

      When the session was opened. RFC 3339, second precision, UTC. Set by the database clock.

    • expires_atstring (date-time)required

      When the access stops. started_at plus the duration; never later than four hours after started_at. A session is never extended: a new one needs a new reason.

    • remaining_secondsintegerrequired

      Seconds of access left, computed by the database clock; 0 once the session ended. A client counts down from this value and not from its own clock.

      at least 0

    • ended_atstring (date-time) or nullrequired

      When the access stopped (expires_at for an expiry); null while the session is active.

    • end_reasonstring or nullrequired

      Why it ended. operator: the operator ended it; platform: another operator did; organization: an administrator of the organization did; access_disabled: the organization turned support access off; operator_signed_out: the operator signed out of the backoffice (best effort); expired: the time box ran out; start_failed: the session could not be recorded when it started and never gave access. null while active.

      Allowed values: "operator""platform""organization""access_disabled""operator_signed_out""expired""start_failed"null

    • ended_bystring or nullrequired

      The user_ref of the person who ended it; null while active, and for an expiry or a session that never started.

      pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$

  • 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.

  • 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)

GET/identity/v1/organizations/{org}/support-access

Read whether support may open a session

Credential
API key
Permission
Any oforganization.updatesupport-sessions.manage

Needs organization.update in the organization or support-sessions.manage. Answers the organization's setting: allowed (the default for an organization that never set it) or denied. Failures: 403 policy-denied; 500 server faults.

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

Parameters

NameInDescription
X-Request-ID
optional
headerstring

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

org
required
pathstring

The organization id (C7 identifier). A value outside the pattern is refused with 400 name-invalid.

Responses

  • 200

    The organization's support access setting.

    Schema
    SupportAccessSetting
    • modestringrequired

      Allowed values: "allowed""denied"

    • updated_atstring (date-time) or nullrequired

      When the setting was last changed; null if it never was.

    • updated_bystring or nullrequired

      The user_ref of who changed it last; null if it never was.

      pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$

  • 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)

PUT/identity/v1/organizations/{org}/support-access

Allow or deny support sessions

Credential
API key
Permission
organization.update
Request body
Body up to 1 MiB

Needs organization.update in the organization. mode=denied refuses every new session (403 support-access-disabled) and ends every open one at once, in the same transaction (each is recorded as support.session_ended with end_reason access_disabled); mode=allowed lets support start sessions again. Sensitive: recorded as support.access_changed. Failures: 400 invalid-request (an unknown mode); 403 policy-denied; 500 server faults.

curl
curl -X PUT "https://console.us.ccsio.ai/identity/v1/organizations/{org}/support-access" \
  -H "Authorization: Bearer $CCSIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "mode": "allowed"
}'
Built from the schema’s required members: replace the values.

Parameters

NameInDescription
X-Request-ID
optional
headerstring

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

org
required
pathstring

The organization id (C7 identifier). A value outside the pattern is refused with 400 name-invalid.

Request body application/json

PutSupportAccessRequest
  • modestringrequired

    Allowed values: "allowed""denied"

Responses

  • 200

    The setting after the change.

    Schema
    SupportAccessSetting
    • modestringrequired

      Allowed values: "allowed""denied"

    • updated_atstring (date-time) or nullrequired

      When the setting was last changed; null if it never was.

    • updated_bystring or nullrequired

      The user_ref of who changed it last; null if it never was.

      pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$

  • 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)

Generated from the platform contracts at commit 5f833620.

Explore the platform

Get your first API key

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

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