Skip to content

Powered by Grav CMS + Helios Theme

Storefront booking routes (add-on)

The unauthenticated routes a booking page and a customer's own booking link call.

These answer without a session. A browser identifies itself with a visitor id it made up, and a customer identifies a booking with the token that was emailed to them. Neither is a login, and neither reads anything that was not already theirs. Writes check the request's origin against the store's own, plus anything listed under Other sites that may book.

None of them is an MCP tool. Each works off a browser's visitor id or a customer's own token, which an assistant has no business holding, and each has an admin route beside it that does the same job with a permission behind it. See Developers.

List what the shop books

GET /api/v1/kahunacart/bookings/public/services No permission

What the shop books, what each one costs, and how the shop writes a time of day (time_format)

Read the times on offer

GET /api/v1/kahunacart/bookings/public/availability No permission

The times on offer for a product over a range of days, with the blocked ones and their reasons when asked for

Hold a time

POST /api/v1/kahunacart/bookings/public/holds No permission

Stand on a time while the customer decides

Let a hold go

DELETE /api/v1/kahunacart/bookings/public/holds/{id} No permission

Let it go

Book something with nothing to pay

POST /api/v1/kahunacart/bookings/public/book No permission

Book something there is nothing to pay for. Answers 409 with add_to_cart: true when there is

Read the signed-in customer for the booking form

GET /api/v1/kahunacart/bookings/public/me No permission

The name, email and phone a signed-in customer's booking form starts with, or customer: null for a guest. It answers only for the session cookie that asked, carries no ids, and is never cached.

Read a customers own booking

GET /api/v1/kahunacart/bookings/public/manage/{token} No permission

What a customer can see of their own booking, and — where it is a place on a waiting list — where they stand in the queue and what is being held for them

Cancel a customers own booking

POST /api/v1/kahunacart/bookings/public/manage/{token}/cancel No permission

Call it off

Move a customers own booking

POST /api/v1/kahunacart/bookings/public/manage/{token}/reschedule No permission

Move it

List the classes

GET /api/v1/kahunacart/bookings/public/sessions No permission

Every class the shop runs, with the dates coming up and the places left on each

Claim a place held from the waiting list

POST /api/v1/kahunacart/bookings/public/manage/{token}/claim-offer No permission

Take up the place that was held for somebody on a waiting list, and get the cart line that buys it

availability takes a number of seats and answers for that many, so a date with two places left comes back full to a party of three. book answers 409 with add_to_cart: true when there is money due, so the page can put the line in the basket instead of showing an error nobody can act on. Tokens are 32 hex characters and the route pattern says so, so a booking id in the URL is a 404 rather than somebody else's appointment.