Authorization header: POST /v2/giftcards/customer/balance-check and POST /v2/giftcards/programs/{programId}/balance-check. Everything else in the public schema requires a Bearer secret.
Production base URL: https://api.loyalty.dog. Public product routes are under /v2.
The machine-readable public schema is openapi.public.json (SWE-1133). /openapi.json is the full app schema (login, MFA, API Keys, signup) and is not the public product.
Two credential kinds
There is no public issuance API. Dashboard create/rotate/revoke are not on the public OpenAPI.
Merchants subscribe to API Access from the same API Keys page (Stripe Checkout / Customer Portal). That plan does not change JWT or
legacyToken behavior. Freeze and metering apply only to hashed ld_* keys.
Scopes (ld_* only)
JWT App Keys have implicit merchant access. A hashed key is least-privilege (default: no scopes). Typical public reads need loyalty:read. Gift-card redeem needs giftcards:redeem — fullAccess on a public key does not grant it.
Missing scope → 403 with code: forbidden naming the missing scope.
Identity ping
GET /v2/token with a valid Bearer returns the caller. Unscoped ld_* keys can ping identity; product routes still need scopes.
Rotating tokens
Treat tokens like passwords.- Create a new API Key in the dashboard.
- Deploy the new secret to your services.
- Revoke the old key.
Common errors
Next steps
Quickstart
Walk through your first authenticated request.
API playground
Try endpoints in Mintlify from the public OpenAPI.
