Build on PraxBook — read your services and availability, list
bookings, and react to events in real time. A small, predictable REST API
over HTTPS that returns JSON.
Pro API access is a Pro feature. Create and
manage keys in the console under Settings → Embed & API.
Machine-readable OpenAPI 3.0 — generate a typed client
SDK from it (e.g. with openapi-generator).
Authentication
Every request to /api/ext/v1 is authenticated with an
API key sent as a Bearer token in the
Authorization header.
Mint an API key in the console under Settings → Embed & API (Pro plan). The raw key is shown exactly once at creation — store it securely, as it can't be recovered later. Send it on every /api/ext/v1 request as 'Authorization: Bearer <api_key>'. Each key is scoped to a single salon account and only ever sees that account's own data.
The API is intended for back-office integrations, not high-volume traffic. Keep to a few requests per second per key; sustained bursts may be throttled (HTTP 429). Booking creation is additionally guarded against double-booking the same staff member.
Bookings
Read, create and cancel appointments for your salon. Times in responses are UTC, marked with a trailing 'Z'. Times you SEND (create/reschedule start) may carry an explicit offset or 'Z'; a bare string like '2026-06-01T10:00:00' is read as your salon's local wall-clock time.
GET/api/ext/v1/bookings
List your bookings, scoped to your team, ordered by id. Cursor-paginated: pass starting_after with the previous page's nextCursor to fetch the next page; stop when hasMore is false.
Query parameters
limit
Max rows to return (default 50, max 200).
starting_after
Booking id cursor — return rows after this id. Use the nextCursor from the previous page.
Create a booking. Identify the service by serviceSlug OR eventTypeId. The end time is computed from durationMin, or the service's default length when omitted. staffId and note are optional.
Fetch a single service's detail by slug, including its specific bookingFields.
Example response
{
"slug": "epilation-sourcils",
"title": "Épilation Sourcils",
"durationMinutes": 30,
"price": 30.0,
"currency": "CHF",
"description": "Mise en forme des sourcils à la cire.",
"bookingFields": [
{
"name": "notes",
"type": "textarea",
"required": false,
"label": {
"en": "Notes",
"fr": "Notes / Précisions"
}
}
]
}
PATCH/api/ext/v1/services/{slug}
Update a service's price, duration and/or title. Send only the fields you want to change (at least one is required). price is in your salon's currency; duration is in minutes.
Your CRM — client profiles and their visit history.
GET/api/ext/v1/clients
List your clients with visit counts and last-visit dates, ordered by id. Cursor-paginated: pass starting_after with the previous page's nextCursor to fetch the next page; stop when hasMore is false.
Query parameters
limit
Max rows to return (default 50, max 200).
starting_after
Client id cursor — return rows after this id. Use the nextCursor from the previous page.
Send a styled (branded HTML) email to a customer — via one of your templates ('event') or a custom subject/body wrapped in your salon's branded shell. Sent on demand (transactional).
["Your next visit is coming up.", "See you soon!"]
ctaLabel
Book again
ctaUrl
https://booking.thenextbeacon.com/book/your-salon
locale
fr
Example response
{
"ok": true,
"delivered": true
}
POST/api/ext/v1/reviews/request
Send a styled review-request email (uses your configured review URL + copy). Trigger it from your POS/CRM after a visit. delivered=false if no review URL is configured.
Subscribe to events; payloads are POSTed to your URL, signed with HMAC-SHA256 in the X-PraxBook-Signature header. Verify the signature against your webhook secret before trusting a payload.