ClosedLoop AI · Authentication Profile

Closedloop Authentication

Authentication

ClosedLoop AI secures its APIs with apiKey and oauth2 across 3 declared security schemes, as derived from its OpenAPI definitions.

Product IntelligenceCustomer FeedbackVoice of CustomerProduct ManagementAgentic AIMCPSaaS analyticsA2ASCIMProduct Discovery
Methods: apiKey, oauth2 Schemes: 3 OAuth flows: API key in: header

Security Schemes

ApiKeyAuth apiKey
· in: header (X-API-Key)
MCPOAuth oauth2
· flows: , ,
WebhookSigningSecret hmac

Source

Authentication Profile

Raw ↑
generated: '2026-08-30'
method: searched
source: https://closedloop.sh/docs/account/api-keys,
  https://closedloop.sh/docs/api-reference/conventions,
  https://closedloop.sh/docs/account/mcp-service-clients, and live OAuth metadata probes;
  baseline derived from openapi/closedloop-public-api-openapi.yaml
docs: https://closedloop.sh/docs/account/api-keys
summary:
  types:
  - apiKey
  - oauth2
  api_key_in:
  - header
  note: >-
    ClosedLoop AI runs THREE separate credential systems that are deliberately not interchangeable.
    The published OpenAPI declares only the first of them, which is why a spec-only derivation
    understates this provider's auth posture.
credential_systems:
- id: rest-api-key
  surface: /v1 REST API
  scheme: ApiKeyAuth
  declared_in_openapi: true
- id: mcp-oauth
  surface: MCP servers (mcp.closedloop.sh, eu.mcp.closedloop.sh, api.closedloop.sh/mcp)
  declared_in_openapi: false
- id: webhook-signing-secret
  surface: inbound webhook ingestion
  declared_in_openapi: false
schemes:
- name: ApiKeyAuth
  type: apiKey
  in: header
  parameter: X-API-Key
  alias_parameter: apikey
  description: |-
    Team-scoped API key created in the app (Settings → API Keys).
    Sent as `X-API-Key: <key>` on every request. The header name `apikey`
    is also accepted as an alias.
  key_prefix: clai_live_
  key_prefix_source: published curl examples at
    https://closedloop.sh/docs/api-reference/introduction
  scope: team
  region_bound: true
  region_detail: >-
    Each team lives in exactly one region and each key is scoped to it. An EU key only works against
    https://eu.api.closedloop.sh/v1; a US key only against https://api.closedloop.sh/v1. There is no
    cross-region routing and no fallback.
  lifecycle:
    creation: Settings → API Keys in the app
    display: shown once at creation only
    storage: hashed with SHA-256 before storage; not retrievable by the provider afterwards
    revocation: immediate -- anything using a revoked key receives 401 at once
    rotation_guidance: rotate periodically, especially after team-member departures
    rotation_hazard: >-
      Incremental /insights cursors are bound to the exact key that created them. Rotating a key
      mid-export invalidates the cursor; restart from the last committed sync_until with the new key.
  intended_use: unattended server workloads -- scheduled jobs, ETL, Databricks, agents with no
    person present at run time
  prohibited_use: client-side code, mobile apps, public repositories
  errors:
  - status: 401
    code: NO_API_KEY
  - status: 401
    code: INVALID_API_KEY
  - status: 503
    code: API_KEY_AUTH_UNAVAILABLE
  sources:
  - openapi/closedloop-public-api-openapi.yaml
  - https://closedloop.sh/docs/account/api-keys
- name: MCPOAuth
  type: oauth2
  declared_in_openapi: false
  discovered_by: probe
  surface: MCP
  endpoints:
    authorization: https://mcp.closedloop.sh/authorize
    token: https://mcp.closedloop.sh/token
    registration: https://mcp.closedloop.sh/register
  issuer: https://mcp.closedloop.sh
  flows:
  - authorization_code
  - refresh_token
  - client_credentials
  pkce: [S256]
  client_auth_methods: [none, client_secret_basic, client_secret_post, private_key_jwt]
  signing_algs: [RS256, ES256]
  scopes:
  - name: mcp:tools
    description: Invoke MCP tools. Scope name published in the authorization-server and
      protected-resource metadata; no per-scope description is published by the provider.
  - name: mcp:read
    description: Read access over the MCP surface. Scope name published in the metadata; no
      per-scope description is published by the provider.
  dynamic_client_registration: true
  dcr_detail: >-
    The provider states clients need not pre-register -- "the OAuth Client ID and Secret are
    optional, and ClosedLoop AI registers your client automatically."
  m2m:
    docs: https://closedloop.sh/docs/account/mcp-service-clients
    methods:
    - private_key_jwt with a registered RSA or P-256 public key (preferred)
    - shared secret, for clients such as LiteLLM that cannot do private_key_jwt
  challenge:
    status: 401
    www_authenticate: Bearer resource_metadata="https://mcp.closedloop.sh/.well-known/oauth-protected-resource"
    rfc9728: true
  regional_variants:
  - host: eu.mcp.closedloop.sh
    issuer: https://eu.mcp.closedloop.sh
  - host: api.closedloop.sh
    issuer: https://api.closedloop.sh/mcp
    documented: false
    difference: does NOT advertise private_key_jwt -- only none, client_secret_basic,
      client_secret_post
  hard_separation: >-
    REST API keys DO NOT work with MCP. The provider states this explicitly on the API Keys page.
    An MCP caller must create an OAuth service client.
  sources:
  - well-known/closedloop-mcp-oauth-authorization-server.json
  - well-known/closedloop-mcp-oauth-protected-resource.json
  - https://closedloop.sh/docs/mcp-server/overview
  - https://closedloop.sh/docs/account/mcp-service-clients
- name: WebhookSigningSecret
  type: hmac
  declared_in_openapi: false
  surface: inbound webhook ingestion
  algorithm: HMAC-SHA256 over the unmodified raw request body
  headers: [x-webhook-signature, x-hub-signature-256, x-signature, typeform-signature]
  encodings: [hex, base64]
  prefix_accepted: 'sha256='
  credential_name: Webhook Key
  credential_location: Settings → API Keys page (same page, different credential)
  explicit_negative: >-
    An x-api-key header does NOT authenticate an inbound webhook. Only the signing secret and the
    configuration confirmed at provisioning are accepted.
  rotation: self-service regenerate; no dual-secret overlap window -- previously-signed requests
    fail immediately
  sources:
  - https://closedloop.sh/docs/integrations/webhooks
  - https://closedloop.sh/docs/account/api-keys
workforce_sso:
  note: >-
    Not an API credential -- this authenticates HUMANS into the app, and is Enterprise-plan gated.
    Recorded because it is part of the provider's overall authentication posture and because the
    SCIM surface it drives is a live, probeable API.
  protocols:
  - name: OIDC
    idp: Okta
    role: relying-party
    validates: [issuer, audience, signature, state, nonce, email claim]
    jit_provisioning: supported when enabled
    callback: https://api.closedloop.sh/api/okta/oidc/callback
  - name: SAML 2.0
    idps: [Google Workspace, Microsoft Entra ID]
    role: service-provider
    jit_provisioning: supported
  - name: SCIM 2.0
    idps: [Okta, Microsoft Entra ID]
    role: service-provider
    base_url_template: 'https://api.closedloop.sh/api/scim/v2/{team_id}'
    scopes: [scim.read, scim.write, entitlements.read]
    token_model: OAuth 2.0 scoped bearer token
    resources: [Users, Groups, Roles]
    password_sync: not accepted -- must be left disabled
    probe:
      url: https://api.closedloop.sh/api/scim/v2/test/ServiceProviderConfig
      status: 401
      body: '{"schemas":["urn:ietf:params:scim:api:messages:2.0:Error"],"status":"401","detail":"Bearer
        token is required"}'
  - name: Global Token Revocation
    idp: Okta (Universal Logout)
    endpoint: https://api.closedloop.sh/api/okta/universal-logout
    not_supported: OIDC Post Logout / browser Single Logout -- the provider says to leave the Post
      Logout URI blank
mtls: false
openid_connect_provider: false
openid_connect_provider_note: >-
  No host serves /.well-known/openid-configuration -- probed on closedloop.sh, api.closedloop.sh,
  mcp.closedloop.sh, docs.closedloop.sh, eu.api.closedloop.sh and eu.mcp.closedloop.sh, all 404.
  ClosedLoop AI consumes OIDC as a relying party; it does not issue it.

Work with this as data

Every security artifact here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for security posture

4 MCP tools reach this
  • find_securityBrowse and filter every security artifact in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This security artifact
curl "https://apis.io/api/v1/security/closedloop-authentication"
All security posture
curl "https://apis.io/api/v1/security?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.