Skip to content
Gaurav TiwariDocs

REST API

Updated October 22, 2026

Building your own booking front end, a mobile app or an integration? The built-in booking form, manage page and customer dashboard all run on the same REST API you can call. Prices, availability, capacity and payment confirmation stay on the server, so a custom front end can’t book a slot the form couldn’t.

Basics

  • Base: /wp-json/core-bookings/v1/ (or ?rest_route=/core-bookings/v1/ without pretty permalinks).
  • Booking access: a booking’s private token goes in the X-Core-Bookings-Token header. Never put tokens in query strings, analytics or logs.
  • Dashboard access: a customer dashboard session goes in X-Core-Bookings-Portal. Waitlist entries use X-Core-Bookings-Waitlist, review links X-Core-Bookings-Review.
  • Staff and managers: ordinary WordPress REST authentication: a cookie plus X-WP-Nonce, or an Application Password.
  • Rate limits: public and customer routes allow 20 POST and 120 GET requests a minute per visitor address, with a separate bucket of 30 for availability/next. Over the limit returns cb_rate_limited (429).
  • Errors: a WP_Error with a cb_ code and HTTP status, for example cb_slot_taken (409), cb_stale_version (409), cb_request_conflict (409) or cb_login_required (401).
  • Responses are sent with Cache-Control: no-store, private.

Booking Flow

RouteMethodWhat it does
configGETSpam-protection site key and state, and the customer dashboard URL. No secrets.
servicesGETBookable services with staff, payment method, extras, policy, notice and horizon
availabilityGETUTC slots for service_id, staff_id, date (YYYY-MM-DD), optional seats and choices
availability/nextGETNext open dates, with days (1 to 7) and staff_offset for paged searches
quotePOSTPrice preview, same inputs as a booking
bookingsPOSTCreate a booking
invitations/{token}GETRead an invitation link
waitlistPOSTJoin a waitlist
gift-cardsPOSTBuy a gift card (Promotions module)
questions/upload, questions/upload/discardPOSTFile answers for booking questions (Booking questions module)
POST /wp-json/core-bookings/v1/bookings
{
  "service_id": 1,
  "staff_id": 2,
  "start": "2026-11-12T10:00:00Z",
  "timezone": "Europe/London",
  "name": "Example Customer",
  "email": "customer@example.com",
  "seats": 1,
  "consent": true,
  "request_key": "a-new-uuid-for-this-booking-request",
  "turnstile_token": "only-when-spam-protection-is-on"
}

Optional fields include extras, phone, notes, answers, choices, coupon, guests, invitation, locale and create_account. Store the returned id and token securely. Repeating a request with the same request_key and payload returns the same booking instead of a second one; a different payload with that key fails with cb_request_conflict. When spam protection is on, every attempt needs a fresh challenge token.

Routes for One Booking

Unless a row says otherwise, these need the booking’s X-Core-Bookings-Token, or WordPress authentication as a manager or the assigned staff member.

RouteMethodWhat it does
bookings/{id}GETThe booking, including change_until and, while a hold is open, expires_at
bookings/{id}/changePOSTaction (cancel or reschedule), expected_version, start for a reschedule, optional reason
bookings/{id}/checkoutPOSTStart payment. Returns a Stripe or FluentCart URL, or the embedded Stripe details.
bookings/{id}/balancePOSTPay a remaining balance
bookings/{id}/intakePOSTOpen the intake form
bookings/{id}/calendarGETCalendar file data for the booking
payment-rules/bookings/{id}/balancePOSTBalance payment under Payment rules
gift-cards/{id}GETGift card status, with the gift card’s token in X-Core-Bookings-Token (Promotions module)
reviews/{id}GET, POSTRead and submit a review (uses X-Core-Bookings-Review)

Customer Dashboard and Waitlist

RouteMethodAccessWhat it does
portal/requestPOSTPublicEmail a sign-in link (15 minutes, single use)
portal/exchangePOSTPublicExchange the link’s id and token for a one-hour session
portal/accountGETPublicWhether the signed-in WordPress user is linked to a customer
portal/link, portal/link/confirmPOSTSigned-in userLink a WordPress account to its customer profile
portal/profileGETSessionProfile and visible fields
portal/profile/metaPOSTSessionSave registered customer fields
portal/recordsGETSessionBookings and packs, with cursors
portal/packs, portal/pack/{id}POST, GETSessionBuy and read session packs
portal/memberships and /{id}/cancel, /{id}/billingPOSTSessionMemberships module
portal/logoutPOSTSessionEnd the session
waitlist/{entry}/view, verify, claim, cancelGET, POSTX-Core-Bookings-WaitlistManage a waitlist entry and claim an offer

A signed-in WordPress user linked to a customer can call the session routes with WordPress authentication instead of the session header.

Staff, Manager and Transfer Routes

RouteMethodWhoWhat it does
admin/appointments/{id}GETStaffThe appointment panel
admin/appointments/{id}/changePOSTStaffRun an appointment action
admin/appointments/{id}/movePOSTStaffMove an appointment (calendar drag)
admin/appointments/{id}/notesPOSTStaffAdd or delete an internal note
admin/staff/{staff}/blockPOSTStaffBlock time in a schedule
admin/searchGETStaffSearch appointments and customers (q)
admin/customer/metaPOSTManagersSave registered fields on a customer by email
editor/catalogGETPost editorsServices and staff for the block editor
editor/servicesPOSTManagers who can edit postsCreate a service from the block editor
transfers/exportGETManagers with export permissionJSON export; bookings=false for configuration only
transfers/catalog, analyze, preview, applyGET, POSTManagers with export permissionThe import steps behind Import / Export

Staff routes stay inside the staff member’s own appointments. The admin routes return the HTML the workspace renders, so for automation the abilities below are usually the better fit.

Webhook Receivers

Payment, calendar and messaging providers post to these, so you won’t call them yourself: webhooks/stripe, webhooks/paypal, webhooks/polar, webhooks/paddle, webhooks/google, webhooks/microsoft, messaging/twilio/status, messaging/twilio/inbound and messaging/whatsapp. Private calendar feeds are served from calendar-feed/{token}.ics.

Abilities Over REST

With the AI agent abilities module on, every offered ability is also available through the WordPress Abilities API at /wp-json/wp-abilities/v1/abilities/core-bookings/<name>/run. Read-only abilities use GET with ?input[...]; the rest use POST with {"input": {...}}. Authenticate with an Application Password. The same permission rules apply as in wp-admin.

curl -u "alex:xxxx xxxx xxxx xxxx xxxx xxxx" \
  -X POST https://example.com/wp-json/wp-abilities/v1/abilities/core-bookings/update-appointment/run \
  -H "Content-Type: application/json" \
  -d '{"input":{"booking_id":"…","action":"approve","expected_version":3,"reason":"Approved by the owner"}}'

The ability list and who may run each one are in Let AI Agents Manage Your Bookings. For PHP-side changes, see Hooks and Filters.

Share

Was this helpful?

Still stuck? Open a support ticket