[SeatLayer](https://seatlayer.io/)

[Sign in](https://app.seatlayer.io/login)

[Get API keys](https://app.seatlayer.io/signup?goal=sdk)

# 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.

[Get API keys](https://app.seatlayer.io/signup?goal=sdk)

[Open the Seasons API](https://docs.seatlayer.io/server-api/seasons/)

Public docs and test mode. No partner approval.

1. Make the dates Step 1
2. Create the season Step 2
3. Sell on your page Step 3
4. Bring in holders Step 4
5. Show their tickets Step 5
6. Send or give back Step 6
7. Renew Step 7
8. Change a date Step 8

## 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.

1. **Make the dates** Create every date in one call. Add dryRun to 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.
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.
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.
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.
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.
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.
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.
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.
- **Handle a seat conflict** Two buyers can want one seat. A 409 means it just went, so offer the next best seats.
- **Listen to webhooks** Don't poll. Signed webhooks tell you about sales, renewals, transfers and date changes, with retries.
- **Decide who takes payment** Use our checkout and we keep tickets and refunds. Use yours and you own them, and transfers answer 409.

## 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.

_Your server_

```
# A handoff key can do nothing else POST /v1/customer-handoffs Authorization: Bearer shk_live_8f2c... {"holderRef": "club-customer-8821",  "email": "priya.shah@example.com",  "returnPath": "/games"} # 201. The link works once, for 60 seconds {"url": "https://tickets.wrenmoorfc.example/account/handoff#t=fho_..."}
```

## What developers ask first.

Each answer stands alone, so people and AI answers can quote it directly.

### The basics

### What is a season ticket API?

A season ticket API lets your own site or app sell one seat across many dates and keep that holder for next year. It covers dates, plans, same-seat holds, holders, tickets, transfers, renewals and date changes. SeatLayer publishes its season ticket API as open docs.

### Do I need partner approval to use it?

No. The docs are public, and you can get test keys from a free account without a sales call.

### Can I build my own ticketing system on it?

Yes. You build the screens, and SeatLayer runs seats, holds, seasons and renewals. With our checkout it also runs payment pages, tickets and refunds.

### Is this an event ticketing API or a help desk API?

It is an event ticketing API for reserved seats. It has nothing to do with IT support tickets.

### How much does it cost?

With our checkout, [$0.50 per seat per date](https://seatlayer.io/pricing/). With your own checkout, you pay in SDK credits, and 100 sold seats are free every month. There is no subscription.

### How it fits your product

### Can I use my own checkout?

Yes, for selling and renewing. With your own checkout you also own tickets, refunds and the door. Transfers and give backs need our checkout, because we hold the ticket.

### Do I have to use your seat map?

Yes. A season runs on a published SeatLayer chart. You can draw it in the Designer, or embed the Designer in your own product.

### Can AI coding tools build with it?

Yes. The docs are public, with Markdown versions and an llms.txt file, so a coding agent can read the whole contract.

### Can I keep my own customer login?

Yes. A secret key acts for your own holder reference, so you never move your customers into our login.

### Which languages are supported?

REST with OpenAPI covers every call. Seven server SDKs, for Node, Python, PHP, Java, Go, Ruby and.NET, carry the core season calls; holders and event series use REST. Season pickers ship for JavaScript, React, Vue, Angular, iOS, Android, React Native and Flutter.

### Running it safely

### Is there a test mode?

Yes. Test keys run the same calls with no real money, and you can copy a tested setup to live.

### What happens when two buyers want the same seat?

One gets the hold and the other gets a 409. Your page can then offer the next best seats.

### Can it handle a big on-sale?

No seat sells twice: a season hold takes the same seat on every date at once, or none of them. Long actions, such as renewal runs and bulk refunds, run as jobs you can follow.

### How do I avoid double charges and double emails?

Send an idempotency key with every call that changes data. A retry returns the first result and does nothing twice.

### How do I know when something changes?

Signed webhooks fire on every change that matters, with retries and a delivery log you can read.

### How do I bring in holders from another system?

Send them to the import call in chunks of 100 rows, with a dry run first. If a chunk fails, send it again and nothing doubles.

Didn't find your answer?

- Contact us
- hello@seatlayer.io

## Keep reading

- seatlayer.io/season-tickets Season ticket software What a club or theatre gets, on our pages or yours.
- seatlayer.io/developers SDK and API Every package, webhook and reference.
- seatlayer.io/guides/javascript-seating-chart JavaScript guide Build a seating chart in JS and React.
- seatlayer.io/venues White label ticketing Your brand on our ticket pages, for any venue.
- seatlayer.io/arenas-stadiums Arenas and stadiums Seat maps tested to 200,000 seats, with season tickets.
- seatlayer.io/performing-arts Theatre ticketing software Subscriptions, 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.

[Get API keys](https://app.seatlayer.io/signup?goal=sdk)

[Talk to an engineer](https://seatlayer.io/contact/)

---

_Machine-readable site index: [/llms.txt](https://seatlayer.io/llms.txt) · full corpus: [/llms-full.txt](https://seatlayer.io/llms-full.txt)_
_Source page: [https://seatlayer.io/guides/season-ticket-api/](https://seatlayer.io/guides/season-ticket-api/) · Questions: [Contact SeatLayer](https://seatlayer.io/contact/) · hello@seatlayer.io_
