Secret API key
Pass the key via theX-Spree-Api-Key header:
sk_. Create them with the Spree CLI or in the Spree admin under Settings → API Keys:
--scopes read_all for a read-only key that can access everything.
JWT bearer token (admin user)
For interactive admin sessions (the Spree admin SPA, custom dashboards, etc.) authenticate as an admin user and use the returned JWT token for subsequent requests.Login
Token refresh
JWT tokens expire after 1 hour by default. Refresh them with the current token:Permissions
Authorization works differently depending on which credentials you use.Secret API keys: scopes
Each secret API key carries a list of scopes that grant access to specific resources. Scopes follow aread_<resource> / write_<resource> convention; write_<resource> implies read_<resource>.
Custom field values are gated by the resource they’re attached to: a
write_products key can manage custom fields on products, variants, and option types; write_orders covers order custom fields, and so on. Custom field definitions (the schema) are part of settings.
Exports have no scope of their own. An export is a bulk read, so each export type (/exports/*) is gated by the read scope of the resource it exports — read_customers lets a key create and download customer exports, read_promotions covers coupon-code exports, and so on. The exports list only shows the types the key can read, so a key can never export data it couldn’t read through the API directly.
Two scopes are deliberately separate from settings because they’re security-sensitive:
webhooks— webhook endpoints receive event payloads (orders, customers) at whatever URL they point to, so the ability to create them is its own grant.api_keys— credential management. A key holdingwrite_api_keyscan create new keys, but only with scopes it already holds itself; scopes can never be amplified through the API.
read_all— everyread_*scopewrite_all— everyread_*andwrite_*scope (full admin)
403 Forbidden:
details.required_scope field tells you exactly which scope to add — and spree api-key create --type secret --scopes <scope> mints a key that has it. Choose the narrowest set that covers your integration’s needs.
JWT bearer tokens: CanCanCan abilities
JWT-authenticated admin users are authorized via CanCanCan abilities derived from theirSpree::Roles. The SPA uses this fine-grained model to render UI conditionally; partial-permission staff users see only the resources their role grants.
If the caller lacks permission for a specific action, the API returns 403 Forbidden:
Authentication summary
If both headers are present, the JWT token wins: CanCanCan applies and scopes are ignored. This lets you use
sk_xxx to bootstrap a session and then issue per-user JWTs for individual admin actions.
