Optimizely · Authentication Profile

Optimizely Authentication

Authentication

Optimizely has no single authentication model. Seven distinct credential schemes are in production across the estate, a direct consequence of a decade of acquisitions (Episerver, Insite/Configured Commerce, Zaius/ODP, optivo/Campaign, Idio) each keeping its own auth. An agent must resolve the scheme per product, and a credential for one product is useless against another.

Optimizely secures its APIs with oauth2, http, and apiKey across 10 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode and clientCredentials flow(s).

A/B TestingContent ManagementCustomer DataE-CommerceExperimentationFeature FlagsMarketing
Methods: oauth2, http, apiKey Schemes: 10 OAuth flows: authorizationCode, clientCredentials API key in: header, query

Security Schemes

OAuth2 (Experimentation) oauth2
Bearer / personal access token (Experimentation) http
scheme: bearer
OAuth2 (Content Marketing Platform) oauth2
· flows: ,
x-api-key (Optimizely Data Platform) apiKey
· in: header (x-api-key)
Optimizely Graph credentials multiple
access_token (Configured Commerce) apiKey
· in: query (access_token)
Authorization apiKey (Campaign) apiKey
· in: header (Authorization)
key (Content Recommendations) apiKey
· in: query (key)
SDK key (Optimizely Agent) apiKey
· in: header (X-Optimizely-SDK-Key)
MCP OAuth (Opal MCP platform) oauth2
· flows: ,

Source

Authentication Profile

Raw ↑
generated: '2026-08-13'
method: searched
source: >-
  openapi/_original/ (28 provider-published OpenAPI documents harvested 2026-08-13) plus
  https://docs.developers.optimizely.com/web-experimentation/docs/authentication,
  https://docs.developers.optimizely.com/web-experimentation/docs/personal-access-token,
  https://auth.mcp.opal.optimizely.com/.well-known/oauth-authorization-server
docs: https://docs.developers.optimizely.com/web-experimentation/docs/authentication
description: >-
  Optimizely has no single authentication model. Seven distinct credential schemes are in
  production across the estate, a direct consequence of a decade of acquisitions
  (Episerver, Insite/Configured Commerce, Zaius/ODP, optivo/Campaign, Idio) each keeping
  its own auth. An agent must resolve the scheme per product, and a credential for one
  product is useless against another.
note: >-
  This file supersedes an earlier derived pass that read only the refined per-tag specs in
  openapi/ and reported a single basicAuth scheme. Those refined files carry contaminated
  info/servers metadata inherited from a merge; the schemes below are read from the
  provider's own published documents in openapi/_original/.
summary:
  types: [oauth2, http, apiKey]
  api_key_in: [header, query]
  http_schemes: [bearer, basic]
  oauth2_flows: [authorizationCode, clientCredentials]
  scheme_count: 7
  single_sign_on: false

schemes:
- name: OAuth2 (Experimentation)
  type: oauth2
  flow: authorizationCode
  authorizationUrl: https://app.optimizely.com/oauth2/authorize
  tokenUrl: https://app.optimizely.com/oauth2/token
  scopes: {all: Full access to your account}
  products: [Web Experimentation, Feature Experimentation]
  sources:
  - openapi/_original/optimizely-web-experimentation-optimizely-api-openapi.json
  - openapi/_original/optimizely-feature-experimentation-optimizely-feature-experimentation-api-openapi.json
  warning: >-
    A single `all` scope. There is no read-only grant — a token that can list experiments
    can also start, stop and delete them. This is the single most important fact for an
    agent operating on Optimizely: least privilege is not expressible in the token.
- name: Bearer / personal access token (Experimentation)
  type: http
  scheme: bearer
  header: 'Authorization: Bearer <token>'
  products: [Web Experimentation, Feature Experimentation, Flags Scheduling, Permission Service]
  sources:
  - openapi/_original/optimizely-web-experimentation-optimizely-api-openapi.json
  - openapi/_original/optimizely-feature-experimentation-optimizely-feature-experimentation-api-openapi.json
  - openapi/_original/optimizely-feature-experimentation-optimizely-flags-scheduling-api-openapi.json
  - openapi/_original/optimizely-feature-experimentation-permission-service-openapi.json
  docs: https://docs.developers.optimizely.com/web-experimentation/docs/personal-access-token
  note: >-
    Personal access tokens are generated in the Optimizely app and carry the generating
    user's permissions. The docs are explicit that a 403 can mean the user revoked
    application access or the token expired, not only a missing permission — an agent must
    re-run the authorization flow rather than assume a permission problem.
    Older documentation shows a `Token: <token>` header form; the current documented form is
    `Authorization: Bearer <token>`.
- name: OAuth2 (Content Marketing Platform)
  type: oauth2
  flows: [authorizationCode, clientCredentials]
  tokenUrl: https://api.cmp.optimizely.com/oauth/token
  products: [Content Marketing Platform]
  sources: [openapi/_original/optimizely-content-marketing-platform-optimizely-cmp-open-api-documentation-openapi.json]
- name: x-api-key (Optimizely Data Platform)
  type: apiKey
  in: header
  parameter: x-api-key
  products: [Optimizely Data Platform]
  sources:
  - openapi/_original/optimizely-data-platform-advanced-openapi.json
  - openapi/_original/optimizely-data-platform-customers-openapi.json
  - openapi/_original/optimizely-data-platform-events-openapi.json
  - openapi/_original/optimizely-data-platform-lists-openapi.json
  - openapi/_original/optimizely-data-platform-objects-openapi.json
  - openapi/_original/optimizely-data-platform-orders-openapi.json
  - openapi/_original/optimizely-data-platform-products-openapi.json
  - openapi/_original/optimizely-data-platform-consent-openapi.json
  - openapi/_original/optimizely-data-platform-exports-openapi.json
  - openapi/_original/optimizely-data-platform-realtimesegments-openapi.json
  - openapi/_original/optimizely-data-platform-recommendations-openapi.json
  note: >-
    Region-scoped. A key issued for us1 does not authenticate against eu1 or au1. The
    scheme is declared as both `x-api-key` and `ApiKeyAuth` across the 11 ODP documents —
    the same header, two names.
- name: Optimizely Graph credentials
  type: multiple
  variants:
  - {name: epi-single, type: apiKey, in: query, parameter: auth, note: 'Single key in the query string — appears in logs and referrers.'}
  - {name: epi-hmac, type: apiKey, in: header, parameter: Authorization, note: HMAC-signed request; the server-side credential.}
  - {name: Basic, type: http, scheme: basic}
  - {name: Bearer, type: http, scheme: bearer}
  products: [Optimizely Graph]
  sources:
  - openapi/_original/optimizely-platform-optimizely-optimizely-graph-api-openapi.json
  - openapi/_original/optimizely-platform-optimizely-swagger-openapi.json
- name: access_token (Configured Commerce)
  type: apiKey
  in: query
  parameter: access_token
  products: [Configured Commerce Admin V1, Configured Commerce Storefront V1, Configured Commerce Storefront V2]
  sources:
  - openapi/_original/optimizely-configured-commerce-admin-api-v1-openapi.json
  - openapi/_original/optimizely-configured-commerce-storefront-api-v1-openapi.json
  - openapi/_original/optimizely-configured-commerce-storefront-api-v2-openapi.json
  warning: >-
    The bearer token travels as a QUERY PARAMETER across 1,760 operations. Tokens land in
    server logs, proxy logs, browser history and Referer headers. Treat every Configured
    Commerce URL as a secret.
- name: Authorization apiKey (Campaign)
  type: apiKey
  in: header
  parameter: Authorization
  products: [Optimizely Campaign]
  sources: [openapi/_original/optimizely-campaign-optimizely-campaign-rest-api-openapi.json]
- name: key (Content Recommendations)
  type: apiKey
  in: query
  parameter: key
  products: [Content Recommendations]
  sources: [openapi/_original/optimizely-recommendations-public-api-spec-openapi.yaml]
- name: SDK key (Optimizely Agent)
  type: apiKey
  in: header
  parameter: X-Optimizely-SDK-Key
  products: [Optimizely Agent]
  sources: [openapi/_original/optimizely-feature-experimentation-optimizely-agent-api-openapi.json]
  companion: {name: TokenAuth, type: http, scheme: bearer, note: 'Agent also issues its own tokens at POST /oauth/token when secured mode is enabled.'}
- name: MCP OAuth (Opal MCP platform)
  type: oauth2
  flows: [authorizationCode, refreshToken]
  issuer: https://auth.mcp.opal.optimizely.com
  authorizationUrl: https://auth.mcp.opal.optimizely.com/oauth/authorize
  tokenUrl: https://auth.mcp.opal.optimizely.com/oauth/token
  registrationUrl: https://auth.mcp.opal.optimizely.com/oauth/register
  revocationUrl: https://auth.mcp.opal.optimizely.com/oauth/revoke
  jwks_uri: https://auth.mcp.opal.optimizely.com/.well-known/jwks.json
  pkce: [S256]
  scopes: [openid, profile, email, offline_access, 'mcp:tools']
  products: [MCP — Experimentation, MCP — Analytics, MCP — CMS/Graph]
  sources: [well-known/optimizely-mcp-oauth-authorization-server.json]
  note: >-
    The most modern auth surface Optimizely runs — RFC 8414 metadata, RFC 9728 protected
    resource, RFC 7591 dynamic client registration, RFC 7009 revocation and PKCE S256.
    Identity is Opti ID and permissions are inherited from the user's UI permissions.

unauthenticated:
- {spec: 'openapi/_original/optimizely-experimentation-data-optimizely-event-api-openapi.json', note: 'The Event API declares no securityScheme; ingestion is keyed by the account/project identifiers in the payload.'}
- {spec: 'openapi/_original/optimizely-performance-edge-optimizely-edge-decider-openapi.json', note: No securityScheme declared.}
- {spec: 'openapi/_original/optimizely-content-management-system-episervercontentapidocs-openapi.json', note: 'CMS Content Delivery declares no securityScheme; the deployed API is configured per site.'}
- {spec: 'openapi/_original/optimizely-digital-experience-platform-episerver-cloud-api-1-openapi.json', note: No securityScheme declared in the DXP Cloud API document.}

cross_reference:
  scopes: scopes/optimizely-scopes.yml
  conventions: conventions/optimizely-conventions.yml
  mcp: mcp/optimizely-mcp.yml