BAD_REQUEST400- The body or query failed validation. Read message - it names the field. Check required parameters and value ranges.
EVENT_SOLD_EXTERNALLY400- The event sells its tickets somewhere else, so VenueSpine will not take the booking. Read ticketSales on the event and send the buyer to externalTicketUrl instead of opening your checkout.
API_KEY_MISSING401- No key on the request. Send X-API-KEY, or Authorization: Bearer.
API_KEY_INVALID401- The key does not exist or was revoked. Issue a new key in VenueSpine under the account’s API keys.
API_KEY_INACTIVE401- The key is fine, but the account or organisation that owns it is no longer active. Nothing on your side. The tenant has been suspended or archived in VenueSpine.
CAPTCHA_REQUIRED400- A booking from a publishable key arrived without a valid Turnstile token. Render the Turnstile widget and send its token as captchaToken, or call the endpoint from your server with a secret key.
RETURN_URL_NOT_ALLOWED400- A success, cancel or failure URL points at an origin the key does not allow. Use https, and add your site’s origin under Return origins on the key in VenueSpine.
PROMO_CODE_INVALID400- The promo code does not exist for this event, or it was paused or deleted. Show message next to the code box and let the buyer try again or remove it.
PROMO_CODE_NOT_STARTED400- The code is valid but its window has not opened yet. Show message. The venue sets when a code starts.
PROMO_CODE_EXPIRED400- The code’s window has closed. Show message and book without the code.
PROMO_CODE_EXHAUSTED409- Every ticket the code could discount has been booked. Show message and book without the code. Tickets come back to a code when a checkout lapses or a booking is refunded.
PROMO_CODE_NOT_APPLICABLE400- None of the chosen tickets qualify for the code, for example it covers other ticket types, or only bundles were chosen. Show message so the buyer can change their tickets or remove the code.
BOOKING_HOLD_LIMIT429- This address already holds three open bookings on the event. Let a hold lapse or complete one before starting another. It is per buyer, not per key.
API_KEY_FORBIDDEN403- Wrong key type or wrong scope for this route. Enquiry, customer and ticket-code reads and writes need a secret key. A key scoped to events cannot read the catalogue or the bar.
MODULE_NOT_IN_PLAN403- The account behind the key does not have the feature this route belongs to. Events, bookings and the seat map need Events with Ticketing switched on for that account, on its plan and on its Modules page.
NOT_FOUND404- No such record, or it is not published. Confirm the id, and that the event is published to web.
BOOKING_NOT_FOUND404- No booking with that id on the account behind your key. A booking is only visible through the key of the account it was made on.
IDEMPOTENCY_KEY_REQUIRED400- POST /bar/orders was sent without an Idempotency-Key header. Mint a UUID per order attempt, send it on every retry of that attempt, and mint a new one for a new order.
IDEMPOTENCY_KEY_REUSED422- That Idempotency-Key was already used for a different order body. A key belongs to one order. Retries must send the identical body; a new order needs a new key.
BAR_ORDERING_CLOSED409- The bar is not taking guest orders for this event right now, or not to tables. Check GET /bar/ordering first and show its reason: the venue switched it off, the show window has not opened, no till is trading, or the bar has not opened ordering yet. service: table is refused when tableService is false.
BOOKING_NOT_AT_EVENT409- The booking is not a paid booking on this event through your key. Only a guest with a paid booking on the event can order. Confirm the booking status and that eventId matches.
ITEM_OFF_SALE409- An item on the order is not on sale right now. Refresh GET /bar/menu and let the guest pick again.
UNKNOWN_ITEM400- An itemId is not on this account’s menu. Item ids come from GET /bar/menu on the same key.
SERVING_NOT_SOLD400- saleUnit was serving for an item that is only sold by the unit. Offer the serving option only where GET /bar/menu shows a serving price for the item.
GUEST_ORDER_NOT_FOUND404- No order with that id and token on the account behind your key. The token that came back on create is the only way to read an order; a wrong token reads as no order, never as forbidden.
GUEST_ORDER_STATUS409- The order is in a state the action does not apply to, for example cancelling one the bar already declined. Refresh the order and show its status.
GUEST_ORDER_LIMIT429- The booking already has three orders waiting at the bar. Wait for one to be accepted or delivered before letting the guest order again.
GUEST_ORDER_CANCEL_WINDOW409- More than two minutes have passed since the order was placed. Hide the cancel button once cancellableUntil passes; after that the guest asks at the bar.
GUEST_ORDER_DELIVERED409- The order has already been delivered, so there is nothing to cancel. Refresh the order and show its status.
GUEST_ORDER_PAID409- The bar has already taken payment for this order. Nothing to do from the app; the bar can void the receipt if it was a mistake.
SSE_LIMIT429- Too many open order streams from one address. Close streams for orders that are delivered or declined, and the ordering stream when the screen closes. Eight per address are allowed.
CONFLICT409- Someone took the seat while your buyer was typing. Re-read /seats, repaint, and ask the buyer to choose again.
RESERVATION_NO_CAPACITY409- The floor is full at that time for a party of that size. Re-read /reservations/availability and offer the slots still marked open.
RESERVATION_OUTSIDE_SERVICE400- The time or the day is outside the service window, or past its last seating. Only offer the slots the availability call returns for that date.
RESERVATION_PARTY_TOO_LARGE400- The party is bigger than the service takes. Show the service’s maxPartySize and ask larger parties to call.
RESERVATION_IN_PAST400- date is before today where the venue is, on the availability call or the request, or the request is for a time today that has already come. Start your date picker on the venue’s today, offer only the slots the availability call still marks open, and read it again if the guest takes a while to choose.
RESERVATION_LIMIT429- That email already has three requests waiting or confirmed. Ask the guest to call to change an existing booking rather than request another.
STAY_NO_AVAILABILITY409- Every room of that type is taken on one of the nights. Re-read /rooms/availability and offer the types still showing rooms free.
STAY_PARTY_TOO_LARGE400- Adults plus children is more than the room type sleeps. Show sleeps from the availability call and offer a bigger type.
STAY_TOO_LONG400- The stay runs for more than 365 nights, on the availability call or the booking. Keep checkOut within 365 nights of checkIn, and ask for a longer stay to be booked with the property.
STAY_IN_PAST400- checkIn is before today where the property is, on the availability call or the booking. Start your date picker on the property’s today, and ask a guest who has already arrived to book with the desk.
STAY_LIMIT429- That email already has three stays reserved. Ask the guest to call to change an existing stay rather than book another.
RESERVATION_BUSY409- The floor is being booked at that moment and the lock could not be taken. Retry once after a short pause.
RATE_LIMITED429- Too many requests for this key. Back off for the seconds given in the Retry-After header.