create_booking
Create a real event booking on an existing event, without collecting card payment.
This writes live data and has customer-visible side effects - it is not a dry run or a preview. Tickets are issued, a confirmation email with the ticket PDF is sent to the customer, live-mode bookings decrement the ticket type's remaining capacity (test-mode bookings do not), the booking.paid webhook fires, and an invoice may be generated. There is no undo through this API: cancellations, refunds and ticket transfers must be done in the Checkout Page dashboard. Confirm the event, the ticket quantities and the customer's email with the merchant before calling it.
Not idempotent - never retry blindly. Every call creates a new booking, so calling again after a timeout or an unclear error can issue duplicate tickets and send a second confirmation email. If the outcome of a call is uncertain, check list_bookings (search by the customer's email) before trying again.
No card payment is collected. There are two booking strategies, and exactly one of them must be supplied:
paymentOption.manualTyperecords the booking asunpaidwith the full amount as its balance due, settled outside checkout by invoice (invoice) or on arrival (cash_on_delivery); a free booking simply has nothing due. Use it for box-office and phone bookings, invoiced corporate registrations, and migrating bookings in.complimentary: truerecords the booking aspaidwithamount,amountPaidandamountDueof 0 andisComplimentary: true. The ticket lines keep their face value and a matchingcomplimentaryDiscountAmountbrings the total to 0, so the forgone revenue stays visible on the booking and its invoice. Use it for comped guests, speakers, staff and press. No coupon can be applied.
Neither strategy takes a card payment: that belongs on the event's own checkout.
The storefront guards still apply, exactly as they would for a buyer checking out:
409 — the ticket type or its ticket group is sold out, or the requested quantity exceeds remaining capacity.
409 - tickets are not on sale: the sale window has not opened or has closed, or the ticket type or its ticket group is disabled. A disabled ticket cannot be booked by any strategy, complimentary included.
403 — the event's registration limit has been reached.
400 — a required field is missing, a required address sub-field is missing, or the email value is not a valid address.
400 — the seller account is not connected to Stripe.
429 - the store has reached its daily limit on added bookings.
400 - both
paymentOptionandcomplimentary: truewere supplied, or neither was. Exactly one is required.400 - a
couponIdwas supplied on a complimentary booking. A comp is already at zero, so no coupon can be applied.
Example uses:
"Comp two VIP tickets for jane@example.com on the Summer Gala" →
complimentary: true"Register Acme Corp for 10 standard tickets to the conference and invoice them" →
paymentOption: { manualType: 'invoice' }"Add a walk-in booking for the Tuesday workshop, paying cash on arrival" →
paymentOption: { manualType: 'cash_on_delivery' }
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Values for the event's fields. Must include a value for the event's email field - the booking's customer is created from it. | |
| eventId | Yes | The ID of the event to book onto. | |
| tickets | Yes | Ticket types to book, keyed by ticket type ID with the quantity as the value. Use the event to discover ticket type IDs. A disabled ticket type, or one in a disabled ticket group, cannot be booked. | |
| couponId | No | A coupon to apply to the booking. | |
| complimentary | No | Issue the tickets at no charge. The booking is recorded as `paid` with `amount`, `amountPaid` and `amountDue` of 0, `isComplimentary: true`, and the ticket lines at their face value with a matching complimentary discount. Mutually exclusive with `paymentOption` and `couponId`. | |
| paymentOption | No | How a manually settled booking is paid for. This endpoint never collects card payment: the booking is recorded as unpaid with the amount as its balance due - for a free booking that balance is zero. Settlement happens outside checkout. Omit it and pass `complimentary: true` instead to issue the tickets at no charge. | |
| queryParameters | No | Attribution or tracking parameters to record against the booking, mirroring the query string a storefront checkout captures from its page link. Stored on the booking and included in exports; not used in pricing. | |
| ticketPwywAmounts | No | Chosen amounts for pay-what-you-want ticket types, keyed by ticket type ID, in the smallest currency unit. Required for any pay-what-you-want ticket type included in `tickets`. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes |