KeepFace · Authentication Profile

Keepface Authentication

Authentication

KeepFace secures its APIs with hmac, bearer, origin-allowlist, and none across 5 declared security schemes, as derived from its OpenAPI definitions.

CompanyInfluencer MarketingCreator EconomyMarketingSocial MediaAffiliate MarketingAdvocacyCampaign ManagementMCPAI AgentsAttributionWebhooks
Methods: hmac, bearer, origin-allowlist, none Schemes: 5 OAuth flows: API key in: header

Security Schemes

hmac-body-signature hmac
shopify-webhook-hmac hmac
pixel-origin-allowlist origin-allowlist
none-public-resolve none
mcp-bearer-token http
scheme: bearer · in: header ()

Source

Authentication Profile

keepface-authentication.yml Raw ↑
generated: '2026-08-13'
method: searched
source: https://help.keepface.com/brand/affiliate-program/api-reference/
docs:
- https://help.keepface.com/brand/affiliate-program/api-reference/
- https://help.keepface.com/brand/affiliate-program/postback-hmac-integration/
- https://help.keepface.com/brand/integrations/manage-with-claude-code/

# Derived from the provider's published documentation, not from an OpenAPI —
# Keepface publishes no machine-readable spec. Every scheme below is quoted from
# a help-centre page and, where noted, confirmed against a live response.

summary:
  types: [hmac, bearer, origin-allowlist, none]
  oauth2: false
  openid_connect: false
  api_key_in: [header]
  oauth2_flows: []
  note: >-
    Keepface runs two distinct auth models on two distinct surfaces. The public
    Affiliate API v2 is machine-to-machine and authenticates each request by
    HMAC-SHA256 body signature with a per-brand shared secret; there is no
    bearer token and no OAuth. The MCP server authenticates with a static,
    workspace-pinned bearer token created by a human in the panel. Neither
    surface implements OAuth 2.0 or OIDC, and no /.well-known/ auth metadata is
    served on any host.

schemes:

- name: hmac-body-signature
  surface: Affiliate API v2 — postback and refund
  type: hmac
  algorithm: HMAC-SHA256
  applies_to:
  - POST /api/v2/affiliate/postback/{brand_id}
  - POST /api/v2/affiliate/postback/{brand_id}/refund
  headers:
    signature: X-KF-Signature
    timestamp: X-KF-Timestamp
  signature_encoding: lowercase hex
  signed_payload: '<timestamp> + "." + <raw_body>'
  construction: 'signature = lowercase(hex(HMAC-SHA256(brand_secret, signed_payload)))'
  replay_protection:
    enabled: true
    header: X-KF-Timestamp
    format: unix epoch seconds
    tolerance_seconds: 300
    on_violation: '401 {"error":"stale_timestamp"}'
    remediation: sync the calling server clock to NTP
  secret:
    name: brand secret
    env_var_convention: KF_AFFILIATE_SECRET
    location: Brands > Edit > Affiliate > Tracking tab > Generate secret
    shown_once: true
    rotatable: true
    overlap_on_rotation_days: 7
    note: after rotation the previous secret stays valid for 7 days so the caller can
      roll without downtime
  failure: '401 {"error":"invalid_signature"}'

- name: shopify-webhook-hmac
  surface: Affiliate API v2 — Shopify receiver
  type: hmac
  algorithm: HMAC-SHA256
  applies_to:
  - POST /api/v2/affiliate/shopify/{brand_id}
  headers:
    signature: X-Shopify-Hmac-Sha256
  signature_encoding: base64
  construction: 'base64(hmac_sha256(shopify_secret, raw_body))'
  note: standard Shopify webhook verification; the shared secret is the Shopify app
    secret configured per brand
  failure: '412 {"error":"shopify_not_configured"} when the brand has no Shopify secret
    set'

- name: pixel-origin-allowlist
  surface: Affiliate API v2 — browser JS pixel
  type: origin-allowlist
  applies_to:
  - OPTIONS /api/v2/affiliate/pixel/{brand_id}
  - POST /api/v2/affiliate/pixel/{brand_id}
  mechanism: browser Origin header checked against a per-brand allowlist
  configuration: Brands > Edit > Affiliate > Tracking > Allowed pixel origins
  note: >-
    Deliberately not a shared secret — the pixel runs in the buyer's browser, so
    the origin allowlist plus server-side anti-fraud is the control. Brands that
    need stronger assurance are directed to the server-side postback instead.

- name: none-public-resolve
  surface: Affiliate API v2 — click resolve
  type: none
  applies_to:
  - GET /api/v2/affiliate/resolve/{token}
  mechanism: unauthenticated; the 8-character affiliate token in the path is itself
    the capability
  token_format: mixed-case base62, 8 characters, case-sensitive
  verified: >-
    probed anonymously 2026-08-13; a well-formed unknown token returns 404
    (cached 60s) and a malformed token returns 400 (cached 300s), both as JSON,
    with X-RateLimit-Limit 600 present on the response.

- name: mcp-bearer-token
  surface: MCP server (https://mcp.keepface.com/mcp)
  type: http
  scheme: bearer
  header: Authorization
  format: 'Bearer kf_<token>'
  token_prefix: kf_
  in: header
  issued_by: Settings, API Tokens (per brand workspace)
  shown_once: true
  default_expiry_days: 90
  expiry_configurable: true
  revocable: true
  scoped: true
  scopes_file: ../scopes/keepface-scopes.yml
  workspace_pinned: true
  oauth: false
  discovery_metadata: none (no /.well-known/oauth-protected-resource, HTTP 404)
  failure: '401 {"error":"missing bearer token"} — observed live on an anonymous
    tools/list POST, 2026-08-13'
  note: >-
    Static long-lived credential, not an OAuth access token. There is no
    authorization endpoint, no refresh, and no dynamic client registration; a
    human must create the token in the panel and paste it into the agent's MCP
    configuration.

not_supported:
- oauth2
- openid-connect
- mutual-tls
- basic-auth
- api-key-query-parameter

x-evidence:
- {url: 'https://api.keepface.ai/api/v2/affiliate/resolve/zzzz', http_status: 400,
  note: anonymous, JSON body, x-ratelimit-limit 600, fetched '2026-08-13'}
- {url: 'https://mcp.keepface.com/mcp', http_status: 401, note: 'anonymous POST tools/list
    returns {"error":"missing bearer token"}', fetched: '2026-08-13'}
- {url: 'https://help.keepface.com/brand/affiliate-program/api-reference/', http_status: 200,
  fetched: '2026-08-13'}