Set up a box office
A hosted storefront per sales channel on its own domain, staff sales through the Backstage carts API, and ticket scanning with a paired device.
Ticketlayer has two ways to sell without writing a website, and a way to scan what was sold.
The hosted box office#
Every sales channel can have a hosted storefront: a complete ticket shop (events, dates, tickets, cart, checkout, account, confirmation) served by Ticketlayer on a hostname you point at it. It is the same code that renders the embedded checkout on your own site.
- In Backstage create a sales channel and list the events it sells.
- Give the channel a storefront domain. Channels are served at
<slug>.checkout.ticketlayer.com; a custom domain is a CNAME to the same place, registered on the channel so the storefront can resolve which channel a request is for (it resolves byHost, so there is no key in the page). - Assign a theme to the channel (logo, colours, fonts). The storefront and every Element on your own site read the same theme.
There is nothing to deploy: the storefront is live when the channel is.
Selling at the counter#
Staff sales go through the Backstage API's cart operations rather than
Live's customer-facing sales surface, so a staff member can sell on a
customer's behalf, take cash, and print. An operator is a named person, so
the credential is their staff token; the box office channel travels as the
X-Ticketlayer-Channel header, because a staff token names an organisation
and not a channel:
POST /v1/cartwithX-Ticketlayer-Channel: <box office slug>creates a staff cart on that channel,POST /v1/cart/{cartId}/itemsadds tickets,POST /v1/cart/{cartId}/checkoutcompletes it.POST /v1/orders/{orderId}/paymentsinitiates the payment andGET /v1/orders/{orderId}/payment-statusreports it.GET /v1/orders/{orderId}/passes/{passId}/ticket.pdfandPOST /v1/orders/{orderId}/passes/{passId}/printproduce the tickets; ticket templates (/v1/ticket-templates) control the layout.
Box office staff sell at channel scope: the app reads GET /v1/my/sales-channels
at sign-in, offers a picker, and sends the chosen slug on every request. An
organisation owner or an event manager holds the same permissions at
organisation scope and needs no header. The whole sequence, with the
credential on every call, is Staff at a box office or a till;
the operations are in the Backstage API reference under
Carts and Orders.
A seated date sells from the seat map: the keypad and Next best choose the best seats for a party, a tap takes one seat, and a held seat or a single seat gap is sold only after a confirm. Sell seats in Box Office is the help article for the counter.
Scanning at the door#
Entry is a device paired to the organisation (a phone or a handheld scanner running the scanning app):
- Pair the device:
POST /v1/devices/pairingstarts a pairing, a staff member claims and confirms it (POST /v1/devices/pairing/claim,POST /v1/devices/pairing/{pairingId}/confirm), and the device receives its credential. - Configure scanning: a scan config (
/v1/scan-configs) says which events and occurrences a device admits and is assigned to devices. - Pick the channel: a device credential names the organisation, not a
sales channel, and the Scanner roles read events per channel. The device
asks
GET /v1/my/sales-channelswhich channels it may work and sends the chosen slug asX-Ticketlayer-ChannelonGET /v1/eventsandGET /v1/events/{id}; without it those answer400 CHANNEL_REQUIRED. The list includes the channel's hidden events (invitation-only, comps-only), flagged, so the door can choose them. A channel created later grants the Scanner role nothing until someone grants it access. Scanning itself needs no channel. - Scan: the device fetches its manifest (
GET /v1/scan/manifest) so it can work offline, and submits scan operations (POST /v1/scan/operations) which redeem passes. Every redemption emits aticket.redeemedwebhook and can be reversed (POST /v1/redemptions/{redemptionId}/reverse).
The full device model (pairing, credentials, commands, events, locations) is under Devices in the Backstage API reference.