Credo AI · Authentication Profile

Credo Ai Authentication

Authentication

Credo AI secures its APIs with apiKey and http across 2 declared security schemes, as derived from its OpenAPI definitions.

Companyai-governanceai-risk-managementresponsible-aicomplianceregulatory-technologymodel-registryvendor-riskeu-ai-actnist-ai-rmfiso-42001shadow-aiagent-governanceauditjson-apiagent-skills
Methods: apiKey, http Schemes: 2 OAuth flows: API key in: header

Security Schemes

BearerAuth http
scheme: bearer
Bearer apiKey
· in: header (Authorization)

Source

Authentication Profile

Raw ↑
generated: '2026-08-11'
method: searched
source: >-
  https://docs.sdk.credo.ai/docs/getting-started, https://api.credo.ai/openapi,
  openapi/credo-ai-governance-platform-swagger.json, live 401 probe of
  https://api.credo.ai/api/v2/credoai/industries on 2026-08-11
docs: https://docs.sdk.credo.ai/docs/getting-started
summary:
  types:
  - apiKey
  - http
  api_key_in:
  - header
  model: >-
    Two-step: a long-lived tenant API token is exchanged for a short-lived JWT
    access token, which is then sent as an Authorization: Bearer header. Every
    request is additionally scoped by a {tenant} path segment. There are no OAuth
    scopes and no per-token permission model in either published contract.
  oauth2: false
  scopes: false
  self_serve: false
schemes:
- name: BearerAuth
  type: http
  scheme: bearer
  bearerFormat: JWT
  description: |-
    JWT access token obtained from POST /auth/exchange
    (CredoAIWeb.Auth.TokenController.exchange).

    Include in the Authorization header: Authorization: Bearer <token>
  sources:
  - openapi/credo-ai-audit-logs-shadow-ai-openapi.json
  applied: 'globally — top-level security: [{BearerAuth: []}]'
- name: Bearer
  type: apiKey
  in: header
  parameter: Authorization
  sources:
  - openapi/credo-ai-governance-platform-swagger.json
  applied: >-
    Declared in securityDefinitions but NEVER applied — the Swagger document has
    no top-level `security` block and no operation-level security. All 300
    operations nevertheless declare a 401 AuthError response, so the requirement
    is real and the contract simply fails to express it.
token_exchange:
  operation: POST /auth/exchange
  operationId: CredoAIWeb.Auth.TokenController.exchange
  input:
  - tenant API token
  - tenant identifier
  output: JWT access token
  documented_in: 'info.description and securitySchemes.BearerAuth description of the OpenAPI 3.0.0 document'
  gap: >-
    The /auth/exchange path is described in prose and deep-linked by anchor from
    the security scheme, but it is NOT a path in EITHER published contract. Neither
    document describes the request body, the response shape, or the token
    lifetime. A developer working from the specs alone cannot authenticate.
tenancy:
  required: true
  placement: path segment
  pattern: /api/v2/{tenant}
  obtaining: >-
    "Your tenant identifier (contact support@credo.ai to get yours)" — servers[]
    variable description in the OpenAPI 3.0.0 document.
  note: >-
    The tenant default in the published production server is an EMPTY string, so
    the spec cannot be used to make a call as written. The Swagger document
    hard-codes basePath /api/v2/credoai, Credo AI's own tenant.
sdk_configuration:
  source: https://docs.sdk.credo.ai/docs/getting-started
  constructor: 'Credoai(base_url="https://api.credo.ai", api_key="your-api-key")'
  env_vars:
  - CREDOAI_BASE_URL
  - CREDOAI_API_KEY
  key_source: >-
    "You can obtain an API key from your account dashboard." No self-serve signup
    exists; a tenant must be provisioned first.
  sdk_auth_method: client.authentication.token()
  note: >-
    The SDK exposes the exchange as client.authentication.token() ("Exchange API
    Key for Access Token"), confirming the two-step flow.
web_application_identity:
  provider: Auth0
  tenant: credoai-cs.us.auth0.com
  discovery: https://credoai-cs.us.auth0.com/.well-known/openid-configuration
  status: 200
  note: >-
    Governs the Credo AI web app and Knowledge Center login, NOT the v2 API. Its
    scopes_supported are the stock Auth0 OIDC profile claims, not API permissions.
    Recorded so the two identity systems are not conflated. See
    well-known/credo-ai-well-known.yml.
observed:
  url: https://api.credo.ai/api/v2/credoai/industries
  status: 401
  body: >-
    {"errors":[{"code":1000,"title":"Unauthenticated","detail":"User is not
    authenticated, maybe invalid or expired token."}]}
  fetched: '2026-08-11'
gaps:
- 'No /auth/exchange path in either published contract.'
- 'No scopes, roles or permission model published for API tokens.'
- 'Swagger securityDefinitions declared but never applied to any operation.'
- 'No token lifetime, refresh or revocation documented.'
- 'No self-serve key issuance — tenant provisioning goes through support@credo.ai.'