Criteo · Authentication Profile

Criteo Authentication

Authentication

Criteo secures its APIs with oauth2 across 1 declared security scheme, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the clientCredentials and authorizationCode flow(s).

AdvertisingAgent SkillsAnalyticsAudiencesCampaignsCatalogCommerceCommerce MediaDisplay AdvertisingMarketingMCPMediaAuthenticationOpenAPIReportingRetailRetail MediaSponsored Products
Methods: oauth2 Schemes: 1 OAuth flows: clientCredentials, authorizationCode API key in:

Security Schemes

oauth oauth2
· flows: clientCredentials, authorizationCode

Source

Authentication Profile

Raw ↑
generated: '2026-08-13'
method: searched
source: openapi/criteo-retail-media-api-openapi.yml, openapi/criteo-marketing-solutions-api-openapi.yml, openapi/criteo-commerce-grid-api-openapi.yml
docs: https://developers.criteo.com/criteo-apis/docs/api-authorization
supersedes: >-
  Rewritten 2026-08-13 against Criteo's real published OpenAPI. The prior version was derived
  from a hand-authored scaffold and carried an authorizationUrl of
  https://consent.criteo.com/authorize; the real spec and the real RFC 8414 metadata both
  give different values, recorded below.

summary:
  types: [oauth2]
  oauth2_flows: [clientCredentials, authorizationCode]
  api_key_in: []
  scope_count: 22
  token_transport: Bearer token in the Authorization header
  token_lifetime_seconds: 900
  anonymous_operations: 0
  security_coverage: >-
    All 219 operations across the three specs declare a security requirement — there are no
    unauthenticated operations. Four of them require a valid token but no specific scope
    (empty scope array): GetCurrentApplication in each of the three services, and
    ListAdvertisers in Marketing Solutions.
  token_endpoint_not_in_spec: >-
    POST https://api.criteo.com/oauth2/token is NOT declared in any of the three published
    OpenAPI documents. The one operation every client must call first is absent from the
    machine-readable contract and exists only in prose. An agent bootstrapping purely from
    the spec cannot obtain a token.

schemes:
- name: oauth
  type: oauth2
  flows:
  - flow: clientCredentials
    tokenUrl: https://api.criteo.com/oauth2/token
    declared_scopes: 0
  - flow: authorizationCode
    authorizationUrl: https://api.criteo.com/oauth2
    tokenUrl: https://api.criteo.com/oauth2/token
    declared_scopes: 0
  sources:
  - openapi/criteo-retail-media-api-openapi.yml
  - openapi/criteo-marketing-solutions-api-openapi.yml
  - openapi/criteo-commerce-grid-api-openapi.yml
  note: >-
    The flow `scopes` maps are empty in all three specs; the 22 real scope strings live on
    per-operation security requirements. See scopes/criteo-scopes.yml.

grants:
- grant: client_credentials
  audience: Server-to-server integrations acting for the app owner
  rate_limit: 250 calls/min default, 40 calls/min on reporting endpoints
  rate_limit_applies_at: application level
  consent_required: false
  note: >-
    A single shared access token per application. Criteo's own rate-limit guidance warns that
    this is the constraining choice for multi-tenant platforms: ten concurrent users share
    one 250/min budget.
- grant: authorization_code
  audience: Self-service platforms acting on behalf of a consenting advertiser
  rate_limit: 10 calls/min per consented account, scaling linearly with accounts consented
  rate_limit_applies_at: account level
  consent_required: true
  consent_url: https://consent.criteo.com/request
  revocable: true
  revocation_note: >-
    Advertisers manage and revoke app access from a consent dashboard. A revoked grant
    surfaces as HTTP 403 on subsequent calls, not 401.
- grant: refresh_token
  audience: Authorization Code applications refreshing an expired access token
  source: https://mcp.criteo.com/.well-known/oauth-authorization-server

discovery:
  rfc8414_metadata: https://mcp.criteo.com/.well-known/oauth-authorization-server
  rfc9728_metadata: https://mcp.criteo.com/.well-known/oauth-protected-resource
  issuer: https://api.criteo.com
  authorization_endpoint: https://consent.criteo.com/request
  token_endpoint: https://api.criteo.com/oauth2/token
  grant_types_supported: [authorization_code, refresh_token]
  response_types_supported: [code]
  bearer_methods_supported: [header]
  saved_to: [well-known/criteo-oauth-authorization-server.json, well-known/criteo-oauth-protected-resource.json]
  finding: >-
    Criteo publishes RFC 8414 authorization-server metadata, but ONLY on the MCP host
    (mcp.criteo.com). The same path returns 404 on api.criteo.com and developers.criteo.com,
    so a client that discovers Criteo through the REST API or the docs cannot find it. The
    metadata it publishes also omits client_credentials from grant_types_supported even
    though the REST API's primary grant IS client_credentials — the document describes the
    MCP server's grants, not the platform's.

application_model:
  docs: https://developers.criteo.com/criteo-apis/docs/create-your-app
  credentials_docs: https://developers.criteo.com/criteo-apis/docs/get-credentials
  steps:
  - Create a partner account on the developer portal
  - Create an organization
  - Create an API application, choosing a service and a per-domain authorization level
  - Retrieve client_id and client_secret
  - For Authorization Code apps, generate a consent URL and have the advertiser grant access
  note: >-
    Credentials are issued per application, not per user, and the permission set is fixed at
    app-configuration time rather than requested per token.

errors:
  '401': Missing, malformed or expired token
  '403': >-
    Valid token, but the application lacks permission on the advertiser or domain, or consent
    was never granted or has been revoked. Criteo's guidance is to relaunch the OAuth2 flow.
  caveat: >-
    On BULK endpoints a missing resource or an insufficient permission returns HTTP 200 with
    an empty response rather than 403 — documented by Criteo and important for any agent that
    treats 200 as success.
  reference: https://developers.criteo.com/criteo-apis/docs/api-error-codes