Reserved seating infrastructure
Every seat,
sold once.
Seat maps, live holds and a box-office screen for ticketing companies. Your checkout, payments and customers stay yours. SeatPublic makes sure no seat is ever sold twice.
Test keys are free and work straight away, with a sample theatre to try them on.
Holds are taken in a single atomic step, so two buyers can never hold the same seat.
Every seat change reaches every open map, four times a second.
per chart, with no per-seat work while buyers pan and zoom.
for the whole seat map, gzipped. No dependencies, no framework.
How it works
From floor plan to sold seat in three calls.
Your server creates the event and confirms the sale. The buyer's browser shows the map and holds the seats. That's the whole integration.
// Once per event, from your server const res = await fetch("https://api.seatpublic.com/v1/events", { method: "POST", headers: { "X-Api-Key": process.env.SEATPUBLIC_SECRET_KEY, "Content-Type": "application/json" }, body: JSON.stringify({ venueId: "demo-theatre", startsAt: "2026-12-01T19:30:00Z" }), }); const { eventId } = await res.json(); // "ev_8k2…"
<script type="module" src="https://seatpublic.com/sdk/seatmap/v0/index.js"></script> <seat-map api-base="https://api.seatpublic.com" event-id="ev_8k2…" api-key="pk_live_…" max-selectable="8" no-orphan></seat-map> // at checkout: hold what the buyer picked const hold = await document.querySelector("seat-map").live.holdSelection();
// After the payment succeeds, from your server await fetch(`https://api.seatpublic.com/v1/events/${eventId}/confirm`, { method: "POST", headers: { "X-Api-Key": process.env.SEATPUBLIC_SECRET_KEY, "Content-Type": "application/json" }, body: JSON.stringify({ holdToken, orderRef: order.id }), }); // 200 { status: "sold", seatIds: [...], replayed: false }
Product
Built for everyone who works the room.
Buyers choose seats, not guesses.
Prices come from your event, not the chart, so the map and your checkout always agree. Hover or tap any seat to see exactly what it is.
- Price, category, row and number on every seat
- Wheelchair, companion and easy-access seats marked
- No single empty seat left stranded between bookings
- Works with a keyboard, a screen reader and pinch zoom
Seat card
The box office sees the whole room, live.
Give each staff member a short pass for one event. They block seats for the press or a sound desk, name a hold, move seats between categories and undo, while sales and refunds stay in your system.
- Every change names who made it
- Passes expire on their own and can't sell or refund
- Other staff's changes and buyers' holds appear as they happen
Tonight · Demo Theatre
- Blocked mezzanine A 1–6 as Presskim
- Orchestra row D moved to Premiumsam
- Undid the row D changesam
One chart per venue, kept right by everyone who sells it.
Venue charts are shared between ticketing companies. Changes arrive as reviewed edits and seat ids never change, so events already on sale stay exactly as they were sold.
- Every edit shows what happens to each seat
- Ratings and view-from-seat photos from people who sat there
- Duplicate venues are caught before they're created
Edit · Demo Theatre · version 4 → 5
What stays yours
SeatPublic does seats. Nothing else.
Checkout and payments
Buyers pay through you. SeatPublic only learns that an order bought these seats.
Customers and tickets
No buyer accounts or emails live here. You issue the tickets and own the relationship.
Prices
You set prices per event. A chart only knows its categories, so one venue can be sold by many companies.
For developers
A small API you can read in an afternoon.
- Test and live keys, kept apart from the first call
- Signed webhooks with retries
- An open JSON chart format with a published schema
- Any stack: it's HTTP and one script tag
Get test keys in a minute.
Create an account, name your company and copy your keys. The sample theatre is ready for your first test event.