locality.seating === "NUMBERED"): its ticket types sell
specific seats. General-admission localities ("GENERAL", the default) are untouched by
everything on this page.
You can support numbered seating at two levels:
- Zero effort. Send items without seats. The hold (or checkout) assigns the best
available contiguous seats for that ticket type: front rows first, never leaving a single
orphan seat. Tickets come back with a
seat_labelsuch asPlatea · Fila C · Silla 12. - A seat picker. Read the plan, draw it, let the buyer click seats, send
seat_ids.
Endpoints
All three are public and need no authentication.The plan
- Coordinates are in chart units on a
width × heightcanvas; draw seats as circles at(x, y).elevationandtiltexist for 3D renderings and can be ignored in 2D. - A seat’s zone is
seat.zone_key ?? section.zone_key. The zone’sticket_type_idis the ticket type that sells it. Colour seats by zone. stateother thanAVAILABLE(BLOCKED,HOUSE) is never sellable.takenlists seats someone currently holds or bought for this performance; free seats are absent from it.- Poll
/seating/occupancyevery few seconds while the picker is open. Re-draw fromtaken.
?performance_id=; occupancy is per date.
Picking seats
Addseat_ids to the item, exactly quantity × group_size of them, all in the zone of that
ticket type:
409 SEAT_TAKEN with detail.seat_ids: drop those seats, refresh
occupancy, ask the buyer to pick again.
Other seat errors are 400: SEAT_COUNT_MISMATCH (wrong number of seats),
SEAT_NOT_IN_TICKET_TYPE (a seat from another zone), SEAT_NOT_SELLABLE (blocked or house
seat), SEAT_NOT_FOUND.
Best available
seat_ids on the hold
does the same thing in one step.
After the sale
checkout/status tickets and the ticket email carry seat_label. A hold that changes seats
at checkout (the buyer picked different ones) frees the old seats; cancelling an order frees
its seats.
