SEATING CHART API + SDK

Reserved seating SDK and API for your ticketing product.

Browser, server and mobile SDKs, server-authoritative live inventory and signed webhooks. Your checkout, payments, orders and tickets stay yours.

Test mode is free.·100 free credits every month·then prepaid credits from $0.10 down to $0.05 per confirmed sold seat·credits never expire·no subscription

$ npm install @seatlayer/js $ npm install @seatlayer/react
01 CONNECT02 HOLD03 BOOK04 WEBHOOK
free held booked
PUBLIC BROWSER → TRUSTED SERVER → SIGNED DELIVERYlocal example · ready

SeatLayer owns inventory. Your product owns the customer.

The picker hands your server an opaque holdId. Your server prices, charges and books with a stable bookingRef; a signed webhook confirms the outcome. Charts, live availability, holds and inventory booking are SeatLayer’s; checkout, payment, orders and tickets are yours.

import { SeatPicker } from '@seatlayer/js';

const picker = new SeatPicker({
  container: '#seat-picker',
  event: 'ev_9f3a', // change this at runtime
  onCheckout: async (_, __, handoff) => {
    await fetch('/api/checkout', {
      method: 'POST',
      headers: { 'content-type': 'application/json' },
      body: JSON.stringify({ holdId: handoff.holdId }),
    });
  },
});
picker.render();

SeatPicker

Complete buyer surface for the fastest production route.

SeatPicker reference →

SeatingChart

Headless map for products that build their own cart, timer and controls.

Headless reference →

Sales channels

Allocate exact seats to public, sponsor, partner, presale, or box-office audiences with scoped access and durable attribution.

See the allocation workflow →

Optional 3D

Open, restore and deep-link the synchronized venue view without changing the booking boundary.

See the view contract ↓

PerformanceGroupPicker

For a fixed multi-performance run, buyers keep the same assigned seats or choose a matching allocation for each listed date. Your checkout and tickets stay in your product.

Performance Groups guide →
optional buyer 3Dbuyer-view.js
const picker = new SeatPicker({
  container: '#seat-picker',
  event: eventKey,
  enable3D: true,
  seatView: true,
  onBuyerViewChange: ({ view, seatId }) => {
    syncBuyerRoute({ view, seatId });
  },
});

await picker.render();
syncViewToggle(picker.getBuyerView());

// Open 3D and fly to the selected seat; your route restores it.
picker.setBuyerView('venue3d', { flyToSeatId: selectedSeat.id });
RELEASED BUYER-VIEW CONTRACT

3D changes the view—not the inventory owner.

The same picker keeps availability, selection and hold context while your application decides whether the buyer sees Map, 3D overview or a targeted seat.

Complete fallbackDisable 3D or let unsupported contexts stay on the complete Map. Checkout never depends on WebGL.
Host-owned continuityonBuyerViewChange supplies view and optional seat state; your route and history remain yours.
Truth disclosureThe buyer Passport describes the available modeled or authored source. It is not a universal venue-verification or certified-sightline claim.
Open the complete quickstart →

Use your stack. Keep the same platform contract.

Every route is available over REST and the OpenAPI reference; each package links to the registry it ships on.

Web buyer SDKs

SeatPicker, headless SeatingChart, real-time inventory and platform components. PerformanceGroupPicker supports fixed multi-performance runs.

STABLE
RuntimeInstallResources
JavaScript / TypeScript@seatlayer/jsnpm ↗Docs ↗GitHub ↗
React@seatlayer/reactnpm ↗Docs ↗GitHub ↗
Vue 3@seatlayer/vuenpm ↗Docs ↗GitHub ↗
Angular 17+@seatlayer/angularnpm ↗Docs ↗GitHub ↗
Other web frameworks@seatlayer/js lifecycleIntegration guide ↗Source ↗

Server SDKs

Trusted provisioning, inventory inspection, booking, webhooks and operational APIs.

SUPPORTED
RuntimeInstallResources
Node.js@seatlayer/servernpm ↗Docs ↗GitHub ↗
PythonseatlayerPyPI ↗Docs ↗GitHub ↗
PHPseatlayer/seatlayer-phpPackagist ↗Docs ↗GitHub ↗
Javaio.seatlayer:seatlayer-javaMaven Central ↗Docs ↗GitHub ↗
Gogithub.com/seatlayer/seatlayer-gopkg.go.dev ↗Docs ↗GitHub ↗
RubyseatlayerRubyGems ↗Docs ↗GitHub ↗
.NETSeatLayerNuGet ↗Docs ↗GitHub ↗
Any backendREST + OpenAPIAPI reference ↗Guides ↗

Mobile buyer SDKs

Supported native and cross-platform packages for production reserved seating in mobile products.

PRODUCTION
RuntimeInstallResources
React Native@seatlayer/react-nativenpm ↗Docs ↗GitHub ↗
FlutterseatlayerPackage ↗GitHub ↗
iOS / Swiftseatlayer-ios.git via Swift Package ManagerDocs ↗GitHub ↗
Android / Kotlincom.github.seatlayer:seatlayer-android via JitPackDocs ↗GitHub ↗

Inspect every public SDK, example and integration tool from the SeatLayer organization. The inventory service itself remains private.

VIEW ALL ON GITHUB ↗

Snapshot first. Deltas after. Trusted decisions stay server-side.

Each buyer session subscribes at /pub/events/:key/subscribe, receives a seat-status snapshot, then applies deltas for holds, bookings, releases, blocks and expiry. Trusted booking and operations use a mode-scoped secret.

  • Reconnect from truthA reconnect starts with a fresh event snapshot before new deltas arrive.
  • Serialized transitionsOne state owner orders inventory changes for each event.
  • Scoped race evidenceIn the released 30-way test for one contested seat, one hold succeeded and the other requests received conflicts.
wss://api.seatlayer.io/pub/events/ev_9f3a/subscribe
// on connect
{ "type": "snapshot", "seats": {
  "A-1": "free", "A-2": "booked",
  "C-14": "free" } }

// then, as buyers act
{ "type": "delta", "changes": [
  { "label": "C-14", "status": "held" } ] }
WSS://API.SEATLAYER.IO · SPRING GALA · SEAT C-3INTERACTIVE EXAMPLE

This is an illustrated concurrency contract, not a live external transaction. Read the live-inventory guide.

A compact API surface with signed delivery.

Public buyer routes use the event key. Trusted routes use Authorization: Bearer with a mode-scoped secret. Reuse the same bookingRef when a booking result is unknown.

credentialswho may do what
CredentialWhere it livesCanCannot
Event keyBrowser, mobile appRender, subscribe, select, hold, releaseBook, read other events
sk_test_Your serverEverything on sandbox events; livemode: false, no credits usedTouch a live event (403 mode_mismatch)
sk_live_Your serverInspect holds, book, block, provision, report on live eventsTouch a sandbox event
dse_ mse_ bse_Browser, minted by your serverOne origin, short-lived: designer session, operator board, buyer audienceBook; stand in for a secret key
EndpointAuthDoes
WS/pub/events/:key/subscribeevent keySnapshot + delta stream
POST/pub/events/:key/holdevent keyHold seats or GA atomically
POST/pub/events/:key/releaseevent keyRelease a hold
POST/pub/events/:key/best-availableevent keyFind and hold seats together
POST/v1/events/:key/booksecret keyFinalize a sale idempotently
POST/v1/events/:key/blocksecret keyBlock or unblock house seats
POST/v1/webhookssessionManage webhook endpoints
POST/v1/keyssessionCreate, rotate or revoke keys
errors + retries409 · 429 · timeouts
// POST /v1/events/:key/book with a different bookingRef,
// an expired hold or missing inventory: nothing is newly booked
HTTP 409
{ "error": "conflict",
  "conflicts": [ { "label": "A-12", "status": "booked" } ] }

// same holdId + bookingRef after a timeout: idempotent replay
HTTP 200
{ "ok": true, "booked": [] }
  • bookingRefis the idempotency key. One immutable reference per order; a replay never books or charges twice.
  • 409is a real answer, not a retry. Refresh, reselect, or surface the conflicting labels. Mutations are atomic.
  • 429on holds carries retryAfterSeconds. Budgeted per secret key, not per IP; releases are never rate-limited. Server SDKs throw a typed RateLimitError.

Eight published event types

  • seat.bookeda seat sold
  • seat.releasedhold released
  • seat.blockedheld back
  • hold.createdbuyer selected
  • hold.extendedexpiry moved
  • hold.expiredtimed out
  • event.createdevent opened
  • event.soldoutlast seat gone
  • SignatureX-SeatLayer-Signature: sha256=<hex>
  • AlgorithmHMAC-SHA256 over the raw body
  • Attempt10-second attempt timeout
  • Retriesfirst attempt plus up to three retries
  • Lognewest 200 attempts · 30-day cleanup
Open the API reference →

Let people and agents help without handing over the keys.

Embed the venue workflows your product needs, give coding agents the same canonical documentation humans read, or connect a compatible MCP client to one authorized chart. The API still owns policy, confirmation, chart writes, revisions, and evidence.

EMBEDDED DESIGNER · ORGANIZER SCOPE

Create and publish charts inside your product

Your backend checks workspace and chart ownership, then mints a short-lived dse_… session for an exact origin. EmbeddedDesigner handles iframe lifecycle, validated messages, relaunch and teardown.

READ EMBEDDED DESIGNER DOCS ↗
SEATMANAGER · EVENT SCOPE

Run live inventory tools inside your admin

Your backend mints an event-scoped mse_… token with explicit capabilities. SeatManager supplies the packaged board; ManageApi exposes the same scoped operations for custom interfaces.

READ CONTROL ROOM DOCS ↗
agent-ready integrationseatlayer-ai-toolkit
# Portable workflow for Codex
git clone https://github.com/seatlayer/seatlayer-ai-toolkit.git
cd seatlayer-ai-toolkit
node scripts/install.mjs --target codex

# Read-only integration diagnostics
node scripts/doctor.mjs /path/to/project

# Canonical context for any coding agent
https://docs.seatlayer.io/llms.txt
The Markdown documentation is the source of truth. Agent tooling does not replace authorization, testing or the API reference.
From your agent to one chartDesigner MCP · Preview
SeatLayer Designer MCP authority flow A compatible agent connects through OAuth, receives one-chart scope, discovers allowed tools, sends work through Designer MCP, and returns revision-bound evidence for human review. The SeatLayer API remains authoritative. AGENT HOSTCompatibleMCP client OAUTHUser approvaland revocation ONE CHARTCapabilitydiscovery DESIGNER MCPTransportRead · previewbounded toolsPREVIEW SEATLAYER APIPolicy · confirmationcanonical revisionvalidation · evidenceAUTHORITATIVE HUMAN REVIEW · PUBLISH REMAINS SEPARATE
SELECT A BOUNDARY

Connect

A compatible MCP client begins at SeatLayer’s authorization screen. The agent does not receive an organization API key.

The agent reasonsIt interprets the request and chooses among tools that are actually available.
The API authorizesIt checks identity, scope, capability state, confirmation, and the exact chart revision.
The user publishesAn agent response is never its own permission to publish or change commercial inventory.

Build and test for nothing. Pay when a seat sells.

Test mode is free, with no time limit and no card. On a live account, rendering charts, holds, releases, house blocks and unsold inventory never consume a credit — only a confirmed sold seat does. Your product keeps its own checkout, payments and orders, so no revenue share applies.

See the complete credit ladder →

Need something that is not listed? If you need a payment provider we do not support yet, or an API capability you cannot find here, tell us — gateway and feature requests come straight to the team. Send a request →

TEST MODE Free

No time limit and no card. Prove the complete integration before switching to live.

EVERY MONTH 100 free credits

Included on every live account, with no subscription and no minimum commitment.

BEYOND THE ALLOWANCE $0.10 → $0.05

Per confirmed sold seat. $50 buys 500 credits; the rate falls to a $0.05 floor at volume.

UNUSED BALANCE Never expires

Purchased credits stay available until a confirmed sold seat uses them.

Questions before you integrate.

Which frameworks and languages does the SeatLayer SDK support?

Stable web packages cover JavaScript and TypeScript, React, Vue 3 and Angular 17+. Official server SDKs cover Node.js, Python, PHP, Java, Go, Ruby and .NET, while REST and OpenAPI support other backends. Supported production mobile SDKs cover React Native, Flutter, iOS and Android.

What is the difference between SeatPicker and SeatingChart?

SeatPicker is the complete buyer surface: map, selection, cart, tiers and GA, hold timer, responsive UI, optional 3D and onCheckout handoff. SeatingChart is the headless map for a product that wants to build its own cart, timer, confirmation and surrounding controls.

Can a coding agent help integrate SeatLayer?

Yes. SeatLayer publishes LLM-readable Markdown documentation and an open-source AI Toolkit with live-doc routing, a read-only integration doctor and verification guidance. The canonical documentation, your repository architecture and production testing remain the source of truth.

Can an external AI agent work on a SeatLayer chart?

Designer MCP Preview lets a compatible MCP client work through one authorized chart scope. SeatLayer's API still controls permissions, confirmation, chart writes, canonical revisions, validation, and evidence; publication remains a separate human-controlled action.

Is there a real-time seat inventory API?

Yes. Each connected buyer session receives an event-scoped snapshot followed by inventory deltas. One state owner per event serializes transitions; in the released 30-way race test for one contested seat, one hold succeeded and the other requests received conflicts.

Prove your complete integration in test mode.

Create credentials, connect one event, run a hold through your backend, confirm inventory booking and verify a signed webhook before switching to live mode. Prefer to inspect first? Explore all demos, or hold a run of performances together in the Performance Group demo.

Create test credentials Discuss your integration