Step-by-step flow for creating and settling bookings with the site owner's credentials — see who that covers, and where visitor-facing code goes instead, immediately below.
Every call below runs with the site owner's credentials — an API key or the site's admin token. That covers two situations, and both are this recipe:
Either way the booking belongs to the site, not to the person being booked.
Building a site or app where a visitor books for themselves? These payloads are right, the identity is not. A visitor's booking and checkout run on an anonymous visitor token minted from the site's OAuth app client id. Using the owner's credentials for a visitor's purchase produces a checkout that belongs to the site: no cart persistence, no abandoned-checkout recovery, and no attribution to the customer. Read these first:
client_id the frontend mints visitor tokens fromMixed apps are normal: the owner's credentials manage the catalog, staff, policies and coupons (the recipes here), while the visitor's own token books and pays.
POST /bookings/v2/services/query.
The three service types and how each one changes the rest of the flow, plus the four fields to
carry forward: id, schedule.id, type, staffMemberIds.POST /_api/service-availability/v2/time-slots.
Time Slots V2 replaces the deprecated Availability Calendar. Dates must be full local
datetimes or the call 400s; availableResources stays empty unless you ask for it by resource
type; the location.locationType a slot returns is not the value Create Booking accepts.
Classes come from a different endpoint and carry an eventId.POST /_api/bookings-service/v2/bookings.
One payload shape per service type: appointments need every slot field spelled out, classes
need only the service and event ids and derive the rest, courses book a whole schedule.
Participants are totalParticipants or participantsChoices, never both. The booking
lands as CREATED and is not on the calendar until step 4.bookedEntity each uses, which availability API feeds it, and what makes it different.13d21c63-b5ec-5912-8397-c3a5ddb27a97)Note: If you receive errors from Bookings APIs, the Wix Bookings app may not be installed on the site. Use List Installed Apps to verify, and Install Wix Apps to install it if missing.
Endpoint: POST https://www.wixapis.com/bookings/v2/services/query
Service Types:
APPOINTMENT — One-on-one sessions with a staff memberCLASS — Group sessions at scheduled timesCOURSE — Multi-session series (customers book the entire course)Save from the response:
id — service IDschedule.id — schedule ID (needed for appointment bookings and course bookings)type — determines the booking flow (slot vs schedule)staffMemberIds — resource IDs of assigned staff (for appointments)Endpoint: POST https://www.wixapis.com/_api/service-availability/v2/time-slots
Important: The old Availability Calendar API (/bookings/v2/availability/query) is deprecated. Always use Time Slots V2.
Dates must be in YYYY-MM-DDThh:mm:ss format (local datetime). Plain dates like 2024-06-15 will be rejected with a 400 error.
| Parameter | Required | Description |
|---|---|---|
serviceId | Yes | From Step 1 |
fromLocalDate | Yes | Start of range in YYYY-MM-DDThh:mm:ss format |
toLocalDate | Yes | End of range in YYYY-MM-DDThh:mm:ss format |
timeZone | Yes | IANA timezone (e.g. America/New_York) |
bookable | No | Set true to only get bookable slots |
includeResourceTypeIds | No | Array of resource type IDs — populates availableResources in response |
serviceId, scheduleId — needed for Create BookinglocalStartDate, localEndDate — slot timesavailableResources[].resources[].id — resource ID (only populated if includeResourceTypeIds was provided)location.locationType — warning: returns BUSINESS but Create Booking requires OWNER_BUSINESS (see Step 3)Use List Event Time Slots instead. Each class session has an eventId — save it for the booking.
Endpoint: POST https://www.wixapis.com/_api/bookings-service/v2/bookings
slot)All slot fields are required for appointments when no eventId is provided:
| Field | Source | Notes |
|---|---|---|
serviceId | Step 1 | Service GUID |
scheduleId | Step 2 | From the time slot response |
startDate / endDate | Step 2 | YYYY-MM-DDThh:mm:ss format |
timezone | Step 2 | IANA tz format |
resource.id | Step 2 | From availableResources in time slot response |
location.locationType | — | Must be OWNER_BUSINESS, OWNER_CUSTOM, or CUSTOM. Time Slots returns BUSINESS but that value is not accepted here |
slot with eventId)When you provide eventId, all other slot fields (startDate, endDate, timezone, resource, location) are auto-derived from the event. You only need serviceId + eventId.
schedule)Specify exactly one of:
totalParticipants — for services with fixed pricing and no variantsparticipantsChoices — for services with variants and optionsBooking is created with status: CREATED. This is not yet visible in the booking calendar. You must either:
Endpoint: POST https://www.wixapis.com/_api/bookings-service/v2/bookings/<BOOKING_ID>/confirm
Use the id and revision from the Create Booking response. Set paymentStatus to EXEMPT for free services or NOT_PAID for pay-at-location.
Result: Booking status changes to CONFIRMED and is visible in the booking calendar.
Cart V2 unifies cart and checkout — there is no separate checkout entity. The created cart's id is what you use for the checkout URL and for placing the order.
4a. Create Cart
Endpoint: POST https://www.wixapis.com/ecom/v2/carts
Use the booking ID as catalogItemId with the Wix Bookings app ID. Save cart.id from the response.
4b. Get Checkout URL
Endpoint: POST https://www.wixapis.com/ecom/v2/carts/{cartId}/get-checkout-url
Redirect the user to the returned checkoutUrl. After payment, the booking is automatically confirmed.
When the person paying is a visitor, create the cart and this URL with their visitor token, not the owner's credentials — see the note at the top. The call succeeds either way, which is what makes it easy to get wrong.
4c. Place Order — no payment page (alternative, server-to-server)
This one only makes sense on the owner's side: it creates the order outright, with nobody visiting a payment page. Right for an operator or backend job booking someone in; not a way to charge a visitor, who still has to be sent to checkout.
First calculate the cart to get a price-verification token:
Endpoint: POST https://www.wixapis.com/ecom/v2/carts/{cartId}/calculate
Save summary.priceVerificationToken from the response, then place the order:
Endpoint: POST https://www.wixapis.com/ecom/v2/carts/{cartId}/place-order
Creates an order directly without redirect.
| Service Type | bookedEntity | Availability API | Key Difference |
|---|---|---|---|
| APPOINTMENT | slot (all fields required) | Time Slots V2 | Single session, specific time, needs resource + scheduleId |
| CLASS | slot (only serviceId + eventId) | Event Time Slots | Group session, auto-derives fields from event |
| COURSE | schedule | Check capacity via Query Extended Bookings | Multi-session, books entire schedule |
Last updated: 18 September 2026