DEVELOPER DOCS

Pounds API

Build loyalty, booking, and rewards experiences on top of the same platform powering thousands of shops. Every admin dashboard action is available as an API — same data, same guarantees, authenticated with a tenant API key that you generate from your shop's settings.

One API, two surfaces

The Pounds API is a single REST surface organized into two logical groups based on how you use it:

Admin API

Server-to-server endpoints for managing everything a shop owner sees in the admin dashboard. Requires write-capable scopes.

  • Create and update bookings
  • Manage customers and loyalty points
  • Configure forms, services, rewards
  • Pull full analytics

Client API

Read-mostly endpoints designed for building customer-facing flows — your own branded booking page, a mobile app, a kiosk UI.

  • Public shop info, services, rewards
  • Customer loyalty balance & history
  • Customer's own bookings
  • Claim a reward on behalf of a customer

Same token, different scopes. Both API surfaces use the same Bearer token format. The difference is which scopes you grant. Never ship a token with:writescopes to a customer-facing browser app — create a separate read-only token for that.

Quickstart

Every request goes to https://pounds.network/api/v1 and is authenticated with a Bearer token from the API Tokens tab in your admin settings.

Try it
curl https://pounds.network/api/v1/bookings \
  -H "Authorization: Bearer pnds_************"

Conventions

  • Base URL: https://pounds.network/api/v1
  • Authentication: HTTP Bearer token in the Authorization header
  • Content type: application/json for all request and response bodies
  • Tenant scoping: Every token is bound to a single tenant. You never need to pass a tenant ID — it's inferred from the token.
  • Timestamps: ISO 8601 UTC strings (2026-04-10T14:23:00.000Z)
  • Errors: Standard HTTP status codes plus a JSON body { error: { code, message } }
  • Rate limits: 60 req/min per token, higher for Pro. Check X-RateLimit-* response headers.

Error format

Error response
{
  "error": {
    "code": "insufficient_scope",
    "message": "This token is missing required scope(s): bookings:write"
  }
}
StatusCodeMeaning
400invalid_requestMalformed body or missing required fields
401missing_token / invalid_tokenNo token, bad token, or revoked token
401expired_tokenToken reached its expiry
403insufficient_scopeToken is valid but lacks a required scope
404not_foundResource does not exist in this tenant
429rate_limitedToo many requests — back off and retry
500internal_errorUnexpected server error — retry with backoff
    Pounds API documentation — Build on the loyalty platform · Pounds