Monetate · Authentication Profile
Monetate Authentication
Authentication
Monetate secures its APIs with apiKey across 3 declared security schemes, as derived from its OpenAPI definitions.
CompanyPersonalizationExperience OptimizationA/B TestingEcommerceProduct RecommendationsPersonalized SearchMarketingCustomer DataRetailDecision Engine
Methods: apiKey
Schemes: 3
OAuth flows:
API key in: header
Security Schemes
JWTAuthentication apiKey
· in: header (Authorization)
TokenAuthentication apiKey
· in: header (Authorization)
Token Authentication apiKey
· in: header (Authorization)
Source
Authentication Profile
generated: '2026-08-12'
method: searched
source: https://developer.monetate.com/auth-api
docs:
- https://developer.monetate.com/auth-api
- https://developer.monetate.com/auth-api/token
- https://developer.monetate.com/auth-api/refresh-token
- https://developer.monetate.com/metadata-api/get-interpretable-values-with-the-metadata-api
- openapi/monetate-auth-api-openapi.yml
- openapi/monetate-data-api-openapi.yml
- openapi/monetate-metadata-api-openapi.yml
summary:
types:
- apiKey
api_key_in:
- header
oauth2: false
openid_connect: false
mutual_tls: false
scopes: false
note: >-
Two different Authorization header schemes are in play and the specs do not make that obvious. A
caller first signs a JWT with an RSA private key and sends `Authorization: JWT <jwt>` to the Auth API;
the Auth API returns an opaque bearer token, which is then sent as `Authorization: Token <token>` to
the Data API and Metadata API. The Engine API is different again — it is unauthenticated at the
transport level and identifies the caller by the retailer shortname in the path plus the account
fields in the request body.
schemes:
- name: JWTAuthentication
api: Monetate Auth API
type: apiKey
in: header
parameter: Authorization
value_format: JWT <signed_jwt>
description: >-
A signed JSON Web Token proves possession of a private key whose public half was uploaded in the
Monetate platform (Settings > Sites > API Keys tab). The JWT payload must carry an `iat` claim (Unix
timestamp of the request; 60 seconds of clock skew allowed) and a `username` claim matching the API
username generated on that API Keys tab.
algorithms:
- RS256
- RS384
- RS512
credential_provisioning: >-
Self-service inside the Monetate platform UI — generate an API key/username on the API Keys tab of the
Sites page under Settings, and upload the matching RSA public key. Requires an existing Monetate
account; there is no public signup.
revocation: Deactivate the public key in the UI; every token issued against it stops working (403).
source: openapi/monetate-auth-api-openapi.yml
- name: TokenAuthentication
api: Monetate Metadata API
type: apiKey
in: header
parameter: Authorization
value_format: Token <token_string>
description: >-
Opaque bearer token obtained from GET /api/auth/v0/refresh/. Sent on every Metadata API request.
source: openapi/monetate-metadata-api-openapi.yml
- name: Token Authentication
api: Monetate Data API
type: apiKey
in: header
parameter: Authorization
value_format: Token <token_string>
description: >-
Same opaque bearer token as the Metadata API. Note the securityScheme key in the Data API spec
contains a space ("Token Authentication") while the Metadata API spec uses "TokenAuthentication" —
the same mechanism named two ways across two published specs.
source: openapi/monetate-data-api-openapi.yml
token_flow:
step_1:
request: GET https://api.monetate.net/api/auth/v0/refresh/?ttl=3600
headers:
Authorization: JWT <signed_jwt>
query:
ttl:
description: Requested token lifetime in seconds.
default: 3600
minimum: 600
maximum: 43200
step_2:
response_body_path: data.token
also_returns:
- data.expires_in
- data.expires_at
note: >-
`expires_in` always equals the requested `ttl`; `expires_at` is seconds since epoch, so a client can
pre-emptively refresh rather than waiting for a 401.
step_3:
request: Any Data API or Metadata API call
headers:
Authorization: Token <token_string>
unauthenticated_surfaces:
- api: Monetate Engine API
endpoint: POST https://engine.monetate.net/api/engine/v1/decide/{retailerShortname}
note: >-
The published Swagger 2.0 document declares no securityDefinitions and no security requirement. The
caller is identified by the retailer shortname path parameter and the channel/instance/domain values
in the request body. This is deliberate — the endpoint is designed to be called from a browser or a
mobile app where no secret can be held — but it means the Engine API's access model is not described
in machine-readable form anywhere.
gaps:
- >-
The Auth API spec declares JWTAuthentication as `type: apiKey` rather than `type: http, scheme: bearer,
bearerFormat: JWT`, so tooling cannot tell it is a JWT from the spec alone.
- No `security` block is applied per-operation in the Engine API spec.
- No OAuth 2.0, no OpenID Connect, no scopes anywhere in the product APIs. (The only OAuth surface Monetate
publishes is on the WordPress marketing site's MCP server — see mcp/monetate-mcp.yml.)