Season ticket API: build a season end to end.
A season ticket API lets your own site or app sell one seat across many dates, then renew it next year. Ours is the same public API our ticket pages run on. Follow eight steps, from the first date to the next renewal.
Public docs and test mode. No partner approval.
What a season is made of.
Six words you will meet in the docs. This is an event ticketing API for reserved seats, not a help desk API.
- Season
- The whole product: a set of dates on one seat map, sold as one thing.
- Plan
- What a buyer gets inside a season: which dates, at which prices.
- Holder
- Your customer, known by your own holder reference, so you keep your login.
- Seat right
- A holder's claim on a seat, kept for them until a renewal deadline.
- Renewal offer
- A time-limited offer to keep that seat next season.
- Amendment
- A recorded change to a date: moved, postponed, added or cancelled.
Our checkout, or yours?
This one choice sets who owns payment, tickets and refunds. Most teams pick our checkout and build their own pages around it.
| Who owns this | With our checkout | With your checkout |
|---|---|---|
| Customer login and customer pages | You | You |
| Seats, holds and same-seat rules | SeatLayer | SeatLayer |
| Season plans, renewals and seat rights | SeatLayer | SeatLayer |
| Payment | SeatLayer checkout, paid to your gateway | You |
| Orders and tickets with a QR | SeatLayer | You |
| Send a game, give back a game | SeatLayer | You. These calls answer 409 own_checkout |
| Refunds | SeatLayer | You |
| Door scanning | SeatLayer | You |
Build a season, step by step.
Every call below is public, with an idempotency key on anything that changes data.
- Step 1
Make the dates
Create every date in one call. Add
dryRunto preview them first. It runs as a job, and each date stays a normal event with its own key, so anything you built on events keeps working. - Step 2
Create the season
A season links the dates, and a plan sets who gets what. Activate it, publish the plan, then open sales. Each step sends the revision it read. Test mode runs the same calls with no real money.
- Step 3
Sell on your page
SeasonPicker holds the same seat on every date while the buyer pays. It ships for JavaScript, React, Vue, Angular, iOS, Android, React Native and Flutter, and Best Available finds seats together.
- Step 4
Bring in holders
Import last season's holders with a file-hash key, 100 rows a call. Check every row with a dry run, then commit. If chunk 37 fails, send it again and nothing doubles.
- Step 5
Show their tickets
A secret key acts for a holder reference, so you keep your own login. List their seasons, tickets and offers, and draw them in your own design.
- Step 6
Send or give back
A holder can send one game to a friend, or give it back to the club. The ticket gets a new token, so the old QR is refused at the door, and the holder keeps their season.
- Step 7
Renew
Make the offers, send them your way, then inspect and commit on your own screens once you have taken payment. No hosted page needed.
- Step 8
Change a date
Move, postpone, add or cancel a date. Tickets follow, and webhooks tell your system. Bulk actions run as jobs, so a retry never pays or emails twice.
How to build a ticketing system without starting from zero.
The screens are the easy part. The hard part sits underneath, and it is what you get from the API.
| What a season needs | Build it from scratch | Build on SeatLayer |
|---|---|---|
| Seat holds that never double sell | Months of work to get right | Done. One hold per seat, on every date or none |
| Same seat across every date | Your own locking across events | One hold call |
| Renewals and seat rights | Your own data model and jobs | Offers, deadlines and release built in |
| QR tickets, transfers and door checks | Your own token and scanning system | Ready with our checkout |
| Date changes that fix every ticket | Your own bulk job engine | One call, run as a job |
| Seat map in 2D and 3D | A design tool and a renderer | Designer and picker included |
Four things to get right.
Every ticketing integration lives or dies on these.
Use an idempotency key
Networks fail during big sales. Send a key with every call that changes data, and a retry never charges or emails twice.
Idempotency-Key: season-2627Handle a seat conflict
Two buyers can want one seat. A 409 means it just went, so offer the next best seats.
409 seats_unavailableListen to webhooks
Don't poll. Signed webhooks tell you about sales, renewals, transfers and date changes, with retries.
season.ticket.transferred season.performance.rescheduled season.bulk_action.completedDecide who takes payment
Use our checkout and we keep tickets and refunds. Use yours and you own them, and transfers answer 409.
checkout: "hosted"
Don't want to build the pages?
Keep your own login and use our customer pages. One server call signs the customer in, and the browser never sees a secret.
What developers ask first.
16 questionsEach answer stands alone, so people and AI answers can quote it directly.
The basics
How it fits your product
Running it safely
Didn't find your answer?
Keep reading
- seatlayer.io/season-ticketsSeason ticket softwareWhat a club or theatre gets, on our pages or yours.
- seatlayer.io/developersSDK and APIEvery package, webhook and reference.
- seatlayer.io/guides/javascript-seating-chartJavaScript guideBuild a seating chart in JS and React.
- seatlayer.io/venuesWhite label ticketingYour brand on our ticket pages, for any venue.
- seatlayer.io/arenas-stadiumsArenas and stadiumsSeat maps tested to 200,000 seats, with season tickets.
- seatlayer.io/performing-artsTheatre ticketing softwareSubscriptions, the box office and the door.
Run a test season today.
Get keys from a free account and sell your first season in test mode.