Antavo · Authentication Profile

Antavo Authentication

Authentication

Antavo runs three distinct authentication models side by side, split by API rather than negotiated per request. The spec-derived scheme list below was produced mechanically from the harvested OpenAPI, then upgraded from Antavo's own API security and API signing documentation - the specs alone materially understate the model, because the Escher request signature that actually authenticates most calls is invisible to OpenAPI (it is a computed `Authorization` header, not a declared securityScheme).

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

LoyaltyCustomer LoyaltyRewardsEnterpriseHeadlessRetailMarketingEngagementPromotionsGamificationEventE-CommerceCouponsPointsMembership
Methods: apiKey, http, oauth2 Schemes: 5 OAuth flows: clientCredentials API key in: query

Security Schemes

api_key apiKey
· in: query (api_key)
escher-signature http-signature
basicAuth http
scheme: basic
bearerAuth http
scheme: bearer
oauth2-client-credentials oauth2

Source

Authentication Profile

Raw ↑
generated: '2026-08-13'
method: searched
source: openapi/ (18 harvested OpenAPI documents)
docs: https://developers.antavo.com/docs/api-security
docs_signing: https://developers.antavo.com/docs/api-signing
docs_credentials: https://docs.antavo.com/docs/api-settings
docs_postman: https://developers.antavo.com/docs/signing-api-requests-in-postman
description: >-
  Antavo runs three distinct authentication models side by side, split by API
  rather than negotiated per request. The spec-derived scheme list below was
  produced mechanically from the harvested OpenAPI, then upgraded from Antavo's
  own API security and API signing documentation - the specs alone materially
  understate the model, because the Escher request signature that actually
  authenticates most calls is invisible to OpenAPI (it is a computed
  `Authorization` header, not a declared securityScheme).

summary:
  types: [apiKey, http, oauth2]
  api_key_in: [query]
  http_schemes: [basic, bearer]
  oauth2_flows: [clientCredentials]
  signing: escher
  credential_scope: one workspace, one environment

schemes:
- name: api_key
  type: apiKey
  in: query
  parameter: api_key
  description: >-
    Workspace API key, passed as a query parameter. Generated in Management UI >
    API settings. The paired API SECRET is displayed only once at generation and
    is never retrievable afterwards; it is used to compute the Escher signature,
    not sent on the wire.
  applies_to:
  - Events, Async (submission side), Display, Customer, Entities, Rewards
  - Coupons, Coupon Pools, Offers, FAQ, Leaderboard, Clubs, Bulk Operations
  - Points Preview, Social Share Campaigns
  sources:
  - openapi/antavo-bulk-operations-openapi.yml
  - openapi/antavo-clubs-openapi.yml
  - openapi/antavo-coupon-pools-openapi.yml
  - openapi/antavo-coupons-openapi.yml
  - openapi/antavo-customer-openapi.yml
  - openapi/antavo-display-openapi.yml
  - openapi/antavo-entities-openapi.yml
  - openapi/antavo-events-openapi.yml
  - openapi/antavo-faq-openapi.yml
  - openapi/antavo-leaderboard-openapi.yml
  - openapi/antavo-offers-openapi.yml
  - openapi/antavo-rewards-openapi.yml
  - openapi/antavo-social-share-campaigns-openapi.yml
  spec_names_observed: [api_key, ApiKeyAuth]
  warning: >-
    The key travels in the QUERY STRING on every one of these APIs. Query
    parameters are routinely written to proxy, CDN and web-server access logs, so
    the key must be treated as observable in transit infrastructure. It is the
    signature, not the key, that provides authentication integrity.
- name: escher-signature
  type: http-signature
  header: Authorization
  specification: https://escherauth.io/
  derived_from: AWS Signature Version 4
  declared_in_openapi: false
  description: >-
    "Antavo enhances HTTPS security by requiring every request to be signed with
    an API signature ... The Antavo Loyalty Cloud uses Escher, a stateless HTTP
    request signing specification based on an enhanced version of the AWS
    Signature Version 4 protocol." Antavo recomputes the signature server-side
    and rejects the request when the two do not match.
  procedure:
  - Build the Canonical Request (HTTPRequestMethod, CanonicalURI, CanonicalQueryString, CanonicalHeaders, blank line, SignedHeaders, HashedRequestPayload) joined by LF.
  - Build the String to Sign from the hashed Canonical Request plus metadata.
  - Sign it with a Signing Key derived from the Antavo API secret.
  - Place the resulting signature in the Authorization header.
  required_headers: [Host, Date]
  encoding: RFC 3986; spaces as %20 never +; commas as %2C; '+' and %2B rewritten to %20 outside the PHP SDK
  guarantees:
  - the request originates from an authorized client
  - the transmitted data was not modified in transit
  - the request is accepted only once within a defined time window
  enforcement:
    production: required today
    all_environments: required from 2026-12-31
    source: https://developers.antavo.com/changelog/discontinuing-unsigned-api-requests
    per_endpoint_toggle: >-
      Management UI > API settings > Signature enforcement, available when the
      API signature check module is enabled. Toggleable per API - Challenges
      (legacy), Clubs, Coupons, Customer, Display, Entities, Events, FAQ, Offers,
      Rewards, Points preview. With enforcement on, a plain-key request is
      rejected with an authentication error.
  libraries:
  - {language: php, name: antavo/escher-php, url: https://github.com/antavo/escher-php, first_party: true}
  - {language: javascript, name: '@antavo/api-signature-node', url: https://www.npmjs.com/package/@antavo/api-signature-node, first_party: true}
  - {language: java, name: escher-java, url: https://github.com/emartech/escher-java, first_party: false}
  - {language: csharp, name: escher-csharp, url: https://github.com/emartech/escher-csharp, first_party: false}
  - {language: go, name: EscherAuth/escher, url: https://github.com/EscherAuth/escher, first_party: false}
  - {language: other, name: Escher implementations index, url: https://escherauth.io/implementations.html, first_party: false}
  constraint: >-
    "API signatures should not be generated on front-end implementations as this
    could potentially expose API keys and secrets." Signing must happen
    server-side, which is the central design constraint on any Antavo client,
    MCP server or agent integration.
- name: basicAuth
  type: http
  scheme: basic
  description: >-
    HTTP Basic with the Authentication Manager client_id as username and
    client_secret as password. Used ONLY to authenticate the OAuth token request
    itself (client_secret_basic).
  applies_to: POST /v1/auth/token
  sources: [openapi/antavo-authentication-openapi.yml]
- name: bearerAuth
  type: http
  scheme: bearer
  bearerFormat: JWT
  description: >-
    Bearer presentation of the access token issued by POST /v1/auth/token.
    'Authorization: Bearer <access_token>'.
  applies_to: Async Events API; also declared in the Promotion Engine spec
  token_lifetime_seconds: {minimum: 300, maximum: 3600}
  sources:
  - openapi/antavo-async-events-openapi.yml
  - openapi/antavo-promotion-engine-openapi.yml
- name: oauth2-client-credentials
  type: oauth2
  declared_in_openapi: false
  flow: clientCredentials
  token_url: /v1/auth/token
  token_endpoint_auth_method: client_secret_basic
  request_content_type: application/x-www-form-urlencoded
  parameters: [grant_type=client_credentials, scope]
  scopes: [loyalty.async_events]
  description: >-
    "Access tokens are issued via an OAuth 2.0 token endpoint using the Client
    Credentials grant type." Clients are created in Management UI > API settings
    > Authentication Manager with a name, purpose, expiration date, scope and
    token audience.
  note: >-
    Antavo does not model this as an OpenAPI oauth2 securityScheme, so a
    spec-only reader sees only basicAuth + bearerAuth and cannot discover the
    flow, the token URL or the scope. This is why derive-oauth-scopes.py returned
    nothing for this provider.
  see: scopes/antavo-scopes.yml

credential_management:
  location: Management UI > API settings
  api_key: visible on the settings page at any time
  api_secret: displayed once at generation, never retrievable
  rotation_warning: >-
    "Generating new API credentials will deactivate all existing connections
    until the new credentials are entered." There is no overlap window and no
    multi-key rotation - key rotation is a hard cutover with downtime.
  oauth_client_secret: displayed once at creation, never retrievable
  oauth_client_statuses: [active, revoked, expired]
  oauth_revocation: irreversible
  audit_log: >-
    The Authentication Manager audit log records client creation, revocation, and
    every access token issued or rejected by the token endpoint.

network_authorization:
  ip_filter:
    supported: true
    notation: CIDR
    granularity: per API endpoint
    module_gated: true
    on_violation: forbidden exception (HTTP 403)
    source: https://docs.antavo.com/docs/api-settings
    note: >-
      Requires the IP filter module to be enabled by the Antavo Service Desk. The
      allow-list is per endpoint, not per key, so an agent or server calling from
      dynamic egress addresses must be allow-listed before any call succeeds.

transport:
  https_required: true
  http_behaviour: redirected to HTTPS, but relying on the redirect is discouraged
  tls_minimum: TLS 1.2
  observed_tls: TLSv1.3 on antavo.com, developers.antavo.com and api.antavo.com (2026-08-13)
  see: security/antavo-domain-security.yml

authorization_model:
  scopes: >-
    Only the OAuth surface has scopes, and only one exists
    (loyalty.async_events). Key-authenticated APIs have no scope dimension at
    all - a workspace key is authorised for every enabled endpoint in that
    workspace, constrained only by the per-endpoint IP filter and signature
    enforcement toggles.
  least_privilege: >-
    There is no read-only key, no per-resource key and no delegation model. This
    is the most significant authorisation gap on the platform: any integration
    holding a workspace key can write loyalty events, claim rewards and read
    every member profile.
  end_user_auth:
    note: >-
      Separate from API-client auth. Loyalty members authenticate through the
      Custom login module - POST /customers/-/login, POST /customers/{id}/opt-in,
      POST /customers/-/password/request, POST /customers/-/password/reset,
      GET /customers/-/verify/ - which returns the customer object and its
      Antavo ID for subsequent Display API calls. A successful login also writes
      a daily_login event, once per calendar day.
    module_gated: true

cross_links:
  scopes: scopes/antavo-scopes.yml
  conventions: conventions/antavo-conventions.yml
  errors: errors/antavo-problem-types.yml
  sandbox: sandbox/antavo-sandbox.yml
  domain_security: security/antavo-domain-security.yml

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/antavo-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.