Open the purchase session (only one live per buyer)
Requires the X-Customer-Session header. The enterprise service API key is OPTIONAL (with a key, the event date must belong to the workspace pinned to it; otherwise 404). Opens THE buyer purchase session: there is ONLY one live per buyer across any tab or device, and the latest wins — the previous one becomes superseded (it can no longer create an order or start a new payment) and its seats.io hold is released, unless it backs a live sale. On seated event dates the server ISSUES the holdToken (mount the chart with session: "manual") and sets seatsDeadline: each session gets up to 3 minutes and the budget is 3 attempts (9 CUMULATIVE minutes) per buyer and event date, summing all of their sessions within a 30-minute window, and it only runs while no order has been created. Once exhausted, it responds 429 with error.code SEAT_BUDGET_EXHAUSTED, error.details.reason seat_budget_exhausted and error.details.retryAfterSeconds (10-minute cooldown; also in the Retry-After header). If the SAME browser (deviceKey) reopens the SAME event date with its session alive, it gets that same session with 200 instead of 201. Only event dates on sale: published event and current event date (otherwise 404). Limits: 10 creations per minute per buyer, 30 per minute per IP when called without an API key, and a global ceiling per event date (429 RATE_LIMITED). Once the session is created, POST /customer/orders and the payment POSTs carry the X-Purchase-Session: <id> header; when the clock runs out, call POST /customer/purchase-sessions/{id}/release.
/customer/purchase-sessionsAuthorizationAPI key · headerrequiredAPI key prefixed with Bearer . Alternative: the x-api-key header with the raw key. Available scopes: read and write (see /.well-known/oauth-protected-resource).
x-api-keyAPI key · headerrequiredRaw API key (without Bearer ), alternative to Authorization.
X-Workspace-IdstringActive workspace to operate on. Optional: when omitted, the default workspace of the user who owns the key is used (pickActiveOrg).
application/jsoneventDateIdstringrequireddeviceKeystringrequiredStable browser identifier (e.g. stored in localStorage). If the SAME browser reopens the SAME event date while its session is still alive, it gets that same session (same holdToken, same clock) instead of a new one.
The SAME browser (deviceKey) reopened the SAME event date while its session was still alive: that session is returned (same holdToken, same clock) and nothing was created.
dataPurchaseSessionCreatedrequiredShow propertiesHide properties
idstringrequiredeventDateIdstringrequiredstatestringrequiredseatedbooleanrequiredtrue = the event date has a seats.io map.
holdTokenstring | nullrequiredseats.io hold token ISSUED BY THE SERVER. Mount the chart with session: "manual" and this holdToken (https://docs.seats.io/docs/renderer/config-session/), never with session: "continue". It is the ONLY token POST /customer/orders accepts for this session. null for event dates without a map.
Show propertiesHide properties
stringnullseatsDeadlinestring | nullrequiredInstant (ISO 8601 UTC) until which the order with seats can be created. This is the clock to display over the map. The seats.io hold expires AFTER this instant, never before. null for event dates without a map.
Show propertiesHide properties
stringnullbudgetSecondsinteger | nullrequiredBudget seconds granted to this session (= seatsDeadline − now). The budget is CUMULATIVE per buyer and event date: opening another tab does not reset it.
Show propertiesHide properties
integernullreplacedSessionIdstring | nullrequiredLive session that this one replaced (now superseded), or null. That tab can no longer create an order or start a new payment.
Show propertiesHide properties
stringnullOK
dataPurchaseSessionCreatedrequiredShow propertiesHide properties
idstringrequiredeventDateIdstringrequiredstatestringrequiredseatedbooleanrequiredtrue = the event date has a seats.io map.
holdTokenstring | nullrequiredseats.io hold token ISSUED BY THE SERVER. Mount the chart with session: "manual" and this holdToken (https://docs.seats.io/docs/renderer/config-session/), never with session: "continue". It is the ONLY token POST /customer/orders accepts for this session. null for event dates without a map.
Show propertiesHide properties
stringnullseatsDeadlinestring | nullrequiredInstant (ISO 8601 UTC) until which the order with seats can be created. This is the clock to display over the map. The seats.io hold expires AFTER this instant, never before. null for event dates without a map.
Show propertiesHide properties
stringnullbudgetSecondsinteger | nullrequiredBudget seconds granted to this session (= seatsDeadline − now). The budget is CUMULATIVE per buyer and event date: opening another tab does not reset it.
Show propertiesHide properties
integernullreplacedSessionIdstring | nullrequiredLive session that this one replaced (now superseded), or null. That tab can no longer create an order or start a new payment.
Show propertiesHide properties
stringnullMissing or invalid credential.
errorobjectrequiredShow propertiesHide properties
codestringrequiredmessagestringrequiredretryablebooleanrequireddetailsanyInsufficient role or resource not accessible.
errorobjectrequiredShow propertiesHide properties
codestringrequiredmessagestringrequiredretryablebooleanrequireddetailsanyResource does not exist or is out of scope.
errorobjectrequiredShow propertiesHide properties
codestringrequiredmessagestringrequiredretryablebooleanrequireddetailsanyRequest body/parameter validation failed.
errorobjectrequiredShow propertiesHide properties
codestringrequiredmessagestringrequiredretryablebooleanrequireddetailsanyToo many requests: rate limit exceeded.
errorobjectrequiredShow propertiesHide properties
codestringrequiredmessagestringrequiredretryablebooleanrequireddetailsanyService unavailable: an external dependency is down or initialization failed.
errorobjectrequiredShow propertiesHide properties
codestringrequiredmessagestringrequiredretryablebooleanrequireddetailsany
