An event is an immutable seating snapshot plus live inventory. Create it from a published chart, sell against its event key, and update the snapshot deliberately when the source chart changes.
Create an event
/v1/eventsSecret key or dashboard sessioncurl -sX POST "https://api.seatlayer.io/v1/events" \
-H "authorization: Bearer $SEATLAYER_SECRET_KEY" \
-H "content-type: application/json" \
-H "idempotency-key: event_order_8271" \
-d '{
"chartId": "chart_abc",
"name": "Opening Night",
"slug": "opening-night",
"startsAt": 1767204000000,
"venue": "Main Hall",
"externalRef": "show_8271",
"currency": "GBP"
}'The chart must be published and belong to an active workspace. A live event requires a positive credit balance; test events do not consume credits.
| Field | Type | Required | Behavior |
|---|---|---|---|
chartId |
string |
Yes | Published source chart |
name |
string |
No | Defaults to chart name |
slug |
string |
No | 3–64 lowercase letters, digits, _, or -; becomes event key |
startsAt |
number |
No | Epoch milliseconds |
venue |
string |
No | Venue label |
mode |
"live" | "test" |
No | Session calls only; a secret key’s mode wins |
externalRef |
string |
No | Host identifier, at most 128 characters |
currency |
string | null |
No | Three-letter event override; otherwise org currency |
A successful response is 201 {"meta": EventMeta}. Event creation supports
Idempotency-Key; retry the same logical create with the same key and body.
List and retrieve
/v1/eventsSecret key or dashboard sessionUse workspaceId to select an active workspace and externalRef to find the
event belonging to a host record:
curl -s \
"https://api.seatlayer.io/v1/events?workspaceId=ws_main&externalRef=show_8271" \
-H "authorization: Bearer $SEATLAYER_SECRET_KEY"The response includes events[], with cached metadata, mode, sold, and live
counts where available.
/v1/events/:keySecret key or dashboard sessionThe detail response contains:
{
"meta": {
"key": "opening-night",
"name": "Opening Night",
"chartId": "chart_abc",
"status": "active",
"seatTotal": 1200,
"mode": "live",
"workspaceId": "ws_main",
"externalRef": "show_8271",
"currency": "GBP",
"sold": 412,
"inventoryModelVersion": 2
},
"counts": {
"free": 760,
"held": 8,
"booked": 412,
"blocked": 20
},
"holdTtlMs": null,
"chartUpdate": {
"behind": false,
"canAutoUpdate": false
}
}holdTtlMs: null means the default 15-minute hold window applies.
Update metadata and section state
/v1/events/:keySecret key or dashboard sessionSend only the fields to change:
{
"name": "Opening Night — Rescheduled",
"startsAt": 1767290400000,
"venue": "Main Hall",
"externalRef": "show_8271",
"currency": "GBP",
"sectionStates": {
"sec-balcony": "hidden",
"sec-stalls": "open"
}
}startsAt, venue, externalRef, and currency can be cleared with null.
Section and zone states are open, closed, or hidden; unknown ids return
422. An empty patch returns 400 nothing_to_update.
For timed and demand-triggered section release, use inventory and availability.
Update an event to the latest chart
Publishing a changed chart reports whether existing events refreshed automatically or need a manual update. Pristine events can refresh without inventory risk. Events with live state require the explicit route:
/v1/events/:key/update-chartSecret key or dashboard sessioncurl -sX POST \
"https://api.seatlayer.io/v1/events/opening-night/update-chart" \
-H "authorization: Bearer $SEATLAYER_SECRET_KEY"If a booked or held label would disappear, the update fails atomically:
{
"error": "seats_would_vanish",
"code": "seats_would_vanish",
"missingLabels": ["A-12"],
"message": "The update would remove booked or held seats."
}Archived and deleted events are not mutable. Never work around a conflict by recreating the event; reconcile the affected chart labels and retry.
Lifecycle
| Operation | Route | Buyer sales | Organizer reads/actions |
|---|---|---|---|
| Close | POST /:key/close |
Stopped | Available |
| Reopen | POST /:key/reopen |
Resumed | Available |
| Archive | POST /:key/archive |
Stopped | Reports remain available |
| Soft delete | DELETE /:key |
Stopped | Removed from normal event list |
Use close for a reversible pause. Archive after the event ends; SeatLayer writes a durable inventory snapshot and keeps the live store for reports. Delete is a soft delete rather than immediate physical erasure.
Supported application transitions are:
active -> closed -> active
active or closed -> archived
active, closed, or archived -> deletedErrors to handle
| Status | Code | Action |
|---|---|---|
402 |
insufficient_credits |
Top up before creating a new live event |
404 |
chart_not_found / not_found |
Check org, workspace, and resource id |
409 |
event_exists |
Use a new slug or replay the original idempotent request |
409 |
seats_would_vanish |
Reconcile protected labels |
422 |
chart_not_published |
Publish the chart first |
422 |
invalid_event_inventory |
Fix the chart validation issue |
422 |
workspace_not_found_or_disabled |
Select or enable the workspace |
Verification
- Event creation has a stable idempotency key.
- Host records store the returned event key and workspace id.
- Test and live resources use matching secret-key modes.
- The event’s currency, name, start time, and external reference are checked.
- Chart updates are tested with booked and held inventory.
- Close, archive, and delete are explicit operator actions.