Skip to main content
The Storefront API uses two layers of authentication: a Storefront API key that identifies your store on every request, and optional customer tokens (JWTs) for endpoints that act on behalf of a logged-in customer.

Storefront API key

Every request must include your Storefront API key in the X-Api-Key header:
curl "https://api.opencals.com/storefront/products" \
  -H "X-Api-Key: sfk_your_key_here"
Keys are created in the dashboard under Settings → API Keys, are scoped to a single store, and start with sfk_.
Treat the key like a secret: keep it in server-side environment variables and proxy requests through your own backend rather than calling the API directly from the browser.

Customer authentication

Endpoints that read or modify a specific customer’s data — their appointments, orders, and profile — additionally require a customer access token as a Bearer token:
Authorization: Bearer <customer_access_token>
X-Api-Key: sfk_your_key_here

Sign in

Exchange a customer’s credentials for a token pair:
curl -X POST "https://api.opencals.com/storefront/auth/sign-in" \
  -H "X-Api-Key: sfk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "customer@example.com",
    "password": "securepassword"
  }'

Refresh tokens

Access tokens expire. Get a fresh pair by calling the refresh endpoint with the refresh token as the Bearer token:
curl "https://api.opencals.com/storefront/auth/refresh" \
  -H "X-Api-Key: sfk_your_key_here" \
  -H "Authorization: Bearer <customer_refresh_token>"

All auth endpoints

MethodEndpointDescription
POST/storefront/auth/sign-upRegister a new customer (sends a verification email)
POST/storefront/auth/sign-inSign in with email and password
POST/storefront/auth/oauthSign in or register via an OAuth provider
GET/storefront/auth/refreshRefresh tokens (pass the refresh token as Bearer)
POST/storefront/auth/request-email-verificationResend the verification email
POST/storefront/auth/verify-emailVerify an email with the emailed token
POST/storefront/auth/request-password-resetSend a password reset email
POST/storefront/auth/reset-passwordReset a password with the emailed token
See the API reference for full request and response shapes.

Which endpoints need a customer token?

Customer-scoped endpoints — appointments, orders, and self-service profile management — require a customer Bearer token. Catalog endpoints (products, availability, staff members, locations, collections, store settings) need only the API key.
Cart and checkout endpoints accept an optional customer token: guests can book without an account, and checkout can return auth tokens for new customers so they’re signed in automatically after their first booking.

Error responses

Errors use conventional HTTP status codes with a JSON body:
{
  "statusCode": 400,
  "message": "Validation failed",
  "errors": [
    { "property": "email", "messages": ["Email is required"] }
  ]
}
StatusMeaning
400Validation error — check the errors array for per-field details
401Invalid or missing API key or customer token
404Resource not found
429Rate limit exceeded — see rate limits

Security checklist

  • Store sfk_ keys in environment variables, never in client bundles or repositories.
  • Call the Storefront API from your server (API routes, server components, edge functions) and keep the key out of browser network requests.
  • Store customer refresh tokens in httpOnly cookies rather than localStorage where possible.
  • Rotate API keys from the dashboard if a key is ever exposed.
Last modified on June 13, 2026