Create a booking
Creates a booking on an area (e.g. a padel court), optionally with an instructor leading the session. Identify the customer with contactId (resolve it via GET /v1/platform/contacts) or, for callers that do not track 1club ids, with an inline customer matched to a contact by email and created if new - exactly one of the two.
A booking transaction is recorded so the booking counts for revenue: paid marks it settled against the External / API payment method (no gateway call), unpaid leaves it outstanding. amount defaults to the computed price for the slot - the area’s price, plus the instructor’s hourly rate when one is attached.
This API assumes the calling system enforces its own booking rules, so 1club’s member-facing policy (minimum notice, maximum days in advance, operating-hours envelope, slots that have already ended, instructor availability) is not applied - which is what lets an existing schedule be recorded as-is.
What the club physically has is never overridden, and a booking that breaks one of these is refused with 400 and a populated details.conflicts[]: the area’s concurrency capacity (AREA_AT_CAPACITY), a court the club has blocked for maintenance or a private hire (AREA_BLOCKED), a live event on the court (AREA_RUNNING_EVENT), the instructor already booked or teaching (INSTRUCTOR_AT_CAPACITY, INSTRUCTOR_TEACHING_CLASS, INSTRUCTOR_RUNNING_EVENT), whether an instructor takes one-on-one bookings, and the slot alignment the area requires. There is no override parameter: a conflict is a refusal, not a warning.
Authorizations
Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.
Headers
Retry-safe key; a repeat of the same request replays the first response instead of creating a second booking
255Body
Area id (from GET /v1/platform/areas)
Existing contact to book for (from GET /v1/platform/contacts). Mutually exclusive with customer.
Inline find-or-create by email. Mutually exclusive with contactId.
Instructor leading the session (from GET /v1/platform/instructors). Must be bookable for one-on-one sessions.
Optional channel label, stored for attribution
Send the customer a 1club booking confirmation email. Off by default - callers normally send their own.
Response
Booking created
A booking created through the platform API. Recorded with a booking transaction so it counts for revenue, marked paid (settled against the External / API payment method) or unpaid (outstanding) per the caller. Refunds and collection stay with the caller.
1club booking id
Stable unguessable identifier. Prefer this over bookingId when storing a reference.
Booking status (e.g. confirmed, cancelled)
Area id
The class occurrence this booking attends, when it is a class booking. Every attendee holds their own booking row against the same classId, and classes rows are per-occurrence - so this is what tells two classes running in the same hour apart. Join it against GET /v1/platform/classes, or read the roster with GET /v1/platform/classes/{id}/bookings.
The event this booking attends, when it is an event booking
Instructor leading the session, when one is attached
Contact the booking is for
The booking's customer, identical to what GET /v1/platform/contacts/{id} returns. Present only when the request passes include=customer, which additionally requires the contacts:read scope; null when the booking has no contact. Use it to import a window of bookings without a contact lookup per row.