Notable changes to the SeatLayer API, embed SDK, and webhooks, newest first.
2026-08-23
- Partner access for sales channels. An organizer can hand one private channel to an external partner organisation. Each invited person accepts with their own SeatLayer account and sees the channel as a partner context in the workspace switcher — Overview, Allocations, Distribution, Reports, and Team — never as membership of the organizer’s workspace. Roles are Viewer, Coordinator, and Partner manager; per-assignment permissions cover buyer links, free-seat returns, and inventory requests; a release date returns still-free seats to Public sale automatically; every action on both sides is audited. See Partner access.
2026-08-21
- Performance Groups are available with Buyer SDK 0.64.0.
A Platform integration can present one fixed run of two to eight compatible
dated performances with
PerformanceGroupPicker. Buyers choose the same assigned seats for every included date or an equal-size allocation per date; SeatLayer makes one recoverable all-or-nothing hold and the host retains checkout, payment, commercial order, and fulfilment ownership. This is not a season ticket, subscription, pass, or buyer-selectable date bundle. Start at Integrate a Performance Group.
2026-08-16
- Sales channels can now carry authoritative sparse prices. Each channel
exposes
priceOverridesand an independentpricingVersion; PATCH writes use optimistic concurrency and reject unknown category/tier shapes. Scoped buyers see the channel price throughout SeatPicker, while the server resolves and freezes the same value on the hold. Existing holds and booked lines do not change after a price edit. - Pricing precedence is explicit. A channel override wins over an ordinary active ticket release and does not consume its quota. A Box Office operator’s deliberate named-release choice wins over the channel override and keeps the release attribution.
- Control Room remains lightweight. Channel details now contain one compact price editor; blank fields inherit event pricing, and a concurrent save refreshes the latest values for review instead of silently overwriting them.
2026-08-13
- Manage sessions now default to least privilege. Omitting
capabilitieswhen minting anmse_…token is still accepted, but the effective grant is now exactlyevent:view. Blocking, cancellation, reporting, channels, and Managed Ticketing authority must be requested explicitly. Empty, malformed, and unknown capability lists remain invalid. - Manage-session revocation is exact-event scoped. A session ID can be
revoked only under the event that minted it. Cross-event IDs are
non-disclosing
404responses, and live/test key mismatch returns the documented403 mode_mismatchwithout revoking the session. event:boxofficebrowser grants are effective. A correctly scoped manage-session token can now use the Managed counter read and sale routes; the previous auth dispatcher incorrectly treated it as a secret key.
2026-08-10
-
The Platform/SDK booking boundary is inventory-only. A platform owns its event catalogue, buyer, checkout/payment, commercial Order, ticket/QR/PDF creation and delivery, email, refunds, scanning, and support. SeatLayer owns seating inventory, holds, idempotent inventory booking, audit/reporting, and webhooks.
bookingReflinks the systems; it is not a SeatLayer commerce Order.The short-lived behavior announced on 2026-08-06—creating an internal
externalOrder, tickets, PDF/email, attendance, and Door artifacts afterPOST /book—has been removed. Existing historical artifacts are retained for migration/audit, but new Platform bookings create inventory records only. SeatLayer-managed checkout and box-office fulfilment are unaffected. -
Inventory cancellation and direct booking now enforce the same product boundary. Generic
POST /v1/events/:key/unbookand legacyPOST /v1/events/:key/box-bookare available only for explicit Platform/SDK events. Managed Ticketing cancellation stays coordinated through its Order/refund workflow, and Managed counter sales use/box-office/sale, so neither path can leave a live Order or ticket detached from its inventory. Organizer lifecycle, Control Room, object, report, and realtime-ticket routes also reject a live/test secret key used against the opposite event mode before reading or mutating its Durable Object.
2026-08-06
-
The confirmation email and ticket PDF now wear the organizer’s brand. The logo and accent an organizer sets for their event pages now appear on the buyer’s confirmation email — logo in the header, accent on the card — and the accent colours the printed ticket’s rules. Sending stays under SeatLayer’s authenticated domain with the organizer’s name and reply-to, so deliverability is unaffected. Organizers who have set no branding see no change.
-
Historical implementation note — superseded: a server booking also created hosted fulfilment artifacts. For a short period,
POST /v1/events/:eventKey/bookwith aholdIdcreated a first-class order and issued real tickets — one QR per seat, the buyer’s ticket page, a printable PDF, and (when you pass the new optionalbuyer.email) the confirmation email. The response gains anorderobject carrying the order id, the human reference, and one scannable URL per seat so you can render your own tickets instead. The sale appears on the organizer’s Orders screen, the timeline, attendance, and the door list, exactly like a hosted-checkout sale. Retries with the samebookingRefreturn the original order and never email the buyer twice. Direct label bookings (no hold) get the same sale — they are priced through an internal hold — and in the rare case the sale cannot be priced, the seats still book and the response statesorderUnavailableinstead of silently issuing nothing. SeatLayer still never touches your money on this route — refunds stay in your own payment account, and the organizer’s refund button on such an order says so. See booking. -
Every order now has a human reference:
#7284 7528. Eight digits with a check digit that rejects a misheard or transposed digit rather than matching someone else’s order. It appears on the buyer’s confirmation, the tickets and PDF, the confirmation email, the organizer’s Orders screen and the door list, and the Orders search accepts it however it is typed —#7284 7528,72847528,7284-7528— alongside buyer name, email, and pasted order ids. It authorises nothing: ticket pages and PDFs are still addressed only by the longord_…id. Orders that predate the change gain numbers automatically.
2026-08-01
-
Behavior change: a bare secret key can no longer touch private inventory. This affects you only if your server calls SeatLayer with an
sk_…key to book seats and you start using sales channels on that event. An event with no channels behaves exactly as it did before.Once a seat is assigned to a private channel, a direct label booking — one without a
holdId— fails on that seat with403 channel_access_deniedunless the request says which channel it is acting for. A secret key proves which organization you are, not which allocation you may spend; without this rule the key that runs your public checkout could quietly drain a sponsor’s reserved block, and nothing but the audit log would say who did it.Three ways forward: send
channelIds: ["chn_…"]and the sale is scoped and attributed to that channel; do nothing if the seats you book are all Public sale; or sendignoreChannelRestrictions: truewith areasonfor genuine back-office work, which reaches everything and writes every private seat it reaches to the channel audit log. Booking a hold is unaffected — a hold already captured its authorization when the seats were taken. See booking. -
Sales channels. Split one event’s inventory into named allocations — partner allocations, presale access, sponsor blocks, box office — and decide who may select each one, without splitting the event, the chart, or the seat count. Assignment never changes whether a seat is free, held, booked or blocked; it only changes who may pick it before it sells. Every event you already have is entirely Public sale and stays that way; there is no migration. Start at sales channels.
-
New API: channels and buyer access sessions. Channel create, list, rename, versioned assignment, allocation paging, access preview, pause/unpause and archive-with-destination are on
/server-api/channels. Buyer access sessions — the short-lived, opaque, origin-boundbse_…bearer your backend mints for one buyer — are on/server-api/buyer-access-sessions. Assignment is versioned and non-destructive: seats in someone’s checkout and seats already sold are never moved. New in the generated OpenAPI spec and the server SDKs. -
Channel reporting separates allocation from attribution.
GET /v1/events/:key/channels/reportreports what each channel holds now beside what it sold, which are two different columns that move independently. Sell-through is attributed-sold over current-allocated, and the response says so in amethodologyfield rather than leaving you to guess. Revenue requiresevent:reportson top ofevent:channels:view; a caller without it sees every operational figure withrevenue: null. See reports. -
seat.bookedwebhooks carry sale attribution. Booked line items gainchannelId(null= Public sale),channelExternalRef,accessSource, andpartnerRefwhere the buyer’s grant carried one. Attribution is per item, not per delivery, and it is recorded at booking time and never rewritten, so it is safe to reconcile against. Payloads never contain a bearer token, session id, link capability, or secret key. See webhook events. -
Two new least-privilege capabilities for event manage tokens:
event:channels:view(names, allocations, counts) andevent:channels:manage(create, assign, pause, archive). Neither implies the other, andevent:blockgains nothing. Tokens minted before this release keep exactly the capabilities they had — channel access is opt-in by name.
2026-07-28
-
Template capacities changed for 17 of the 50 catalog templates. The published catalog had been serving a snapshot taken on 2026-07-17, and this is the first full reprint since, so the change carries eleven days of accumulated geometry work rather than a single fix. If you size events, price tiers or reconcile inventory against a template’s published seat count, re-read it. Existing charts you have already created are untouched — this affects the template you instantiate from, not anything you have saved.
The largest movements, measured against the versions they replace:
Template Before After Change esports-arena864 3,666 +2,802 amphitheatre864 3,605 +2,741 arena-round2,364 3,684 +1,320 west-end1,584 922 −662 small-theatre198 788 +590 concert-hall663 1,119 +456 uber-arena14,142 13,784 −358 Increases are mostly sections that the archetype compiler had already learned to build but that had never been printed. Decreases are corrections: rows that were being counted where the geometry could not actually seat them. A separate fix to arc-row placement — rows were deriving their radius from a rounded seat count and landing up to 30 chart units off their own circle — accounts for the
uber-arenareduction and several smaller ones. -
Venue relief now renders in 3D across 34 of 50 templates. Sections carry real front-edge heights and rake, so raked stalls, stacked terraces and balcony tiers read as physical structure instead of flat plates at stepped heights.
arena-sectionpreviously authored no sections at all and now builds three terraces rising to 4.92 m. The remaining 16 templates are flat because the rooms are flat — banquet floors, booth halls, GA lawns, a conference room, a runway, a black-box studio — and are deliberately not badged 3D. -
Web SDK 0.32.0. Seats render as chairs with backs at close range rather than dots, and label emphasis is reduced at seat level. The 3D renderer is still loaded only when a buyer opens 3D.
@seatlayer/core,@seatlayer/jsand@seatlayer/reactare on npm; the CDNseatlayer-js@0alias resolves to the new version. -
GET /v1/charts/:idreturnscategorySeats. A map of category key to the number of seats that category actually sells, derived from the document on every read and never stored. It resolves per-seat category overrides, so it agrees with what the map sells rather than with what the row objects declare. Categories that sell nothing are present with0, so “sells nothing” stays distinguishable from “does not exist”.
2026-07-26
- Native Android SDK 0.1.0 enters public preview. The official Kotlin SDK
provides
SeatLayerView, coroutine commands, typed state and event flows, structured errors, a secure origin-restricted AndroidX WebKit bridge, and a runnable sample app. Install the exact JitPack tag or inspect source at seatlayer/seatlayer-android. - React Native SDK 0.1.0 enters public preview. The official
@seatlayer/react-nativepackage provides an Expo-compatible view, typed controller, versioned bridge, structured errors, and an independently vendored buyer runtime for iOS and Android. Source and the runnable example are available at seatlayer/seatlayer-react-native. - Web SDK 0.30.0. The public SDK now includes the current 3D venue structure, section rake, geometry, labels, and buyer-view renderer. The npm package pages also gain complete package-level guides, exact documentation routes, live demos, mobile SDKs, agent resources, and registry metadata.
- Web SDK 0.29.0 published.
@seatlayer/jsand@seatlayer/react0.29.0are available from npm. The release includes the reconciled buyer widget and versioned mobile bridge behavior described below. - Flutter SDK 0.1.0 enters public preview. The official
seatlayerpackage is available from pub.dev, with source in seatlayer/seatlayer-flutter. - iOS SDK source is public. The Swift package is available at seatlayer/seatlayer-ios for branch-pinned evaluation while its first semantic release is qualified.
2026-07-23
- Native SDK release candidates. The iOS and Flutter
0.1.0packages now share the versioned bridge protocol and pin their vendored buyer bundles independently. Their typed APIs cover holds, GA quantities, tiers, floors, accessibility color, best-available zone/premium/TTL controls, and flat/isometric/Perspective 2.5D view modes. They remain unpublished until the immutable web artifact, hosted/device smoke tests, and public-package checks pass. - Web SDK 0.29.0 release candidate. The app and public SDK widget sources are reconciled.
The bridge adds initial and runtime view-mode control while retaining the hold-TTL and
correlated command-error behavior. Existing public installation guidance remains pinned
to the currently published
0.28.4packages until the release gate completes.
2026-07-22
- Reference and vector import boundaries. The Designer can use PNG/JPEG/WebP as a
private trace reference or rasterize one selected page from a PDF source up to 15 MB
and 100 pages. It can also sanitize a bounded SVG/DXF subset into ordinary editable
Shape objects. PDF export, native PDF/vector fidelity, arbitrary SVG/full CAD support,
and SVG export remain outside the contract. Private
referenceImagebytes and provenance are removed from buyer documents; the optional URL-onlybackgroundImageis a separate buyer presentation layer. - Eight accessibility accommodations. CART live-caption view is now first-class alongside wheelchair, companion, semi-ambulatory, hearing, sign-language, plus-size, and lift-up armrest. Wheelchair inventory distinguishes an accessible physical seat from an empty selectable bay across the Designer, picker, event capacity, and JSON reporting.
- Per-zone focal points. Venue zones can face distinct stages or field centres.
Designer authors can place the point on the map or copy the active floor focal;
generated seat views and best-available ranking consume the owning zone’s point.
The buyer’s best-seats panel offers an accessible zone choice when applicable, and
bestAvailableaccepts an optional stablezoneId. Legacy charts still preview with floor/chart fallback, but used zones must be explicit before publication.
2026-07-21
- SDK 0.23.0 — “Best seats” premium quick-pick. In charts with premium-flagged seats, the picker’s find-best-seats panel gains a ★ toggle that biases the search to an all-premium block, with an honest fallback note when no premium block of the requested size exists. Charts without premium seats are unchanged, and the default best-available ordering is identical when the toggle is off. Localized in English, Spanish, German, and French.
- Designer loading skeleton. Opening a chart now shows a ghost of the designer chrome and canvas instead of a text placeholder while the document loads.
2026-07-20
- SDK 0.22.0 — the embedded Designer fills the viewport.
EmbeddedDesignerdefaults toheight: 'fill': the iframe always reaches the bottom of the browser window (recomputed on resize and scroll, floor ofminHeight: 480), instead of the old content-height auto-grow that could leave the editor short inside a host page. NumericheightplusautoResizeremains for hosts that manage sizing themselves, and the Designer’s new full-screen button asks the host to pin the iframe over the page viaseatlayer.designer.fullscreen. See Embed the chart Designer. - SDK 0.22.0 — buyers see seat flags. Seats marked in the Designer as restricted view, obstructed, or premium now surface in the picker: a caution note (with the organizer’s own wording) on the seat details card and hover tooltip, markers on cart chips, and a Hide limited-view seats filter that dims flagged seats — localized in English, Spanish, German, and French.
- White-label enforcement.
theme.hideBadge(“Hide Powered by SeatLayer”) is now honored only for accounts with the white-label add-on; the flag is ignored at buyer-serve time otherwise. Existing charts are unaffected in the dashboard — contact support to enable the add-on.
2026-07-19
- SDK 0.21.0 — denser buyer panel and cross-floor category focus. Ticket-type rows now filter and frame their category, including categories on another floor; long section names wrap cleanly; low-value availability chrome stays quiet until there is real news; and all four sightline translations use the correct distance copy.
- SDK 0.20.0 — complete React option forwarding.
<SeatPicker />now forwards every typed core option, includingpricing,hideBadge, andtransport, instead of silently dropping newer options. React hosts can also importattachPickerFramedirectly from@seatlayer/react. - SDK 0.19.0 — embedded control room.
@seatlayer/jsnow exportsSeatManagerand@seatlayer/reactexports<SeatManager />— a live, origin-scoped seat-management board for organizers: realtime seat repaint, KPI + gross-revenue tallies, an activity feed, and bulk block/unblock, all inside your own admin UI. See Embed the control room. - Manage sessions — browser-safe, capability-gated tokens. A secret key or a
dashboard session can mint a short-lived
mse_…token viaPOST /v1/events/:key/manage-sessions, scoped to one event, one exact browser origin, and a chosen subset of capabilities (event:view,event:block,event:cancel,event:reports). Tokens are hash-stored, revocable (DELETE /v1/events/:key/manage-sessions/:id), and the account secret never ships to a browser. Each route is gated by the capability it needs. - Sections availability — the
closedstate. Availability rules (POST /v1/events/:key/availability) add aclosedmode alongsidehidden,timed, andthreshold: a closed section stays visible to buyers but greyed and off sale, where a hidden section vanishes. Operators drive open / closed / hidden / timed / auto-reveal from the control room’s Sections tool. See Inventory control. - Iframe embed docs. The one-iframe
/e/:keybuyer embed — responsive sizing plus theseatlayer:height/seatlayer:fullscreenpostMessage contract and theattachPickerFramehost helper — is now documented in Iframe embedding & sizing. - Embedded Designer host options. Embed the chart Designer
now documents the wrapper’s
autoResize,showLoadingState,loadingTimeoutMs,onRequestRelaunch, and host-managed fullscreen behavior. - Usage-based pricing only. Monthly subscription plans were retired in favor of a single usage-based credit wallet: one credit per sold seat, a free grant of 100 sold seats/month, and prepaid packs from 8¢ down to a 5¢ floor. Every feature is included for every workspace. See Pricing.
hold.extendedwebhook. The extended-hold event is now subscribable, bringing the webhook catalog to eight events.- Docs restructured around personas. These docs are now organized by what you’re doing — embed the picker, wire up booking, build venues in a CMS, run the control room, customize, or run a platform — and the API reference covers the Management, Server, and Designer Embed surfaces. The manage-session token, control-room, availability, event-lifecycle, template-instantiate, and webhook-config operations are now documented.
2026-07-15
- Build with AI — Designer MCP (Preview). An external agent (Claude, ChatGPT, or your own bot) can connect to SeatLayer’s remote, chart-scoped MCP over OAuth 2.1 + PKCE and drive a deterministic reference → design → validate → preview → review loop. SeatLayer hosts no model; your agent supplies vision and semantics while SeatLayer supplies secure reference assets, geometry, validation, and publication gates. Charts stay unpublished drafts until authoritative seat data and human review exist. This surface is a preview — see Build with AI.
2026-07-10
-
Platform API 0.4.0 — embedded chart Designer. Platform backends can mint short-lived
dse_…sessions scoped to one active workspace, one chart, one exact parent origin, expiry, and optional publish permission. Organizers can draw new venue geometry, edit, autosave, upload assets and references, and publish inside the platform CMS without a SeatLayer login or account key in the browser. Sessions are hash-stored, revocable, and disabled automatically when their workspace is disabled. See Embed the chart Designer. -
SDK 0.3.0 — native Designer hosts.
@seatlayer/jsnow exportsEmbeddedDesigner, and@seatlayer/reactexports<EmbeddedDesigner />. Both wrappers mount the scoped Designer iframe, validate message origin/source and optional chart/workspace IDs, and recreate the iframe when a new session URL is supplied. -
Platform API 0.3.0 — organizer workspaces. One SeatLayer account can create an isolated workspace per organizer through
/v1/workspaceswhile retaining account-level billing, keys, and a single webhook subscription. Charts have an immutableworkspaceId; events inherit it from the chart; list routes filter by it; and webhook payloads include it. Existing integrations continue in an automatically-created default workspace.externalRefremains optional routing metadata, not authorization. -
SDK 0.2.0. Atomic cart/tier hold replacement, GA quantity APIs and pricing, per-hold TTL, authoritative hold items, expiry reconciliation, and React parity.
-
Fully key-drivable platform flow —
POST /v1/charts/:id/publishandGET /v1/events(sold counts,externalReffilter,modeon every item) now accept secret-key auth: duplicate → publish → create event → embed without a dashboard visit. -
externalReftagging for platforms. Charts and events accept an optionalexternalRef(your own organiser/tenant id, up to 128 chars) on create and onPOST /v1/charts/:id/duplicate(override wins, explicitnullclears, absent inherits the source’s tag). It’s returned in chart/event meta, updatable viaPUT /v1/charts/:idandPATCH /v1/events/:key, filterable on the list routes (?externalRef=…), and rides every webhook payload alongsidelivemode(additive — only present when set). -
Chart provisioning with secret keys. The chart routes — list, create, get, update, duplicate, archive — now accept
Authorization: Bearer sk_…in addition to a dashboard session, so a platform backend can provision per-organiser charts programmatically. Charts carry no live/test mode (a chart is a design; mode lives on events), so test keys can provision charts too. Delete, unarchive, thumbnail, and asset routes support the same scoped secret-key workflow. -
New guide: Platform integration. The end-to-end recipe for running SeatLayer under a multi-organiser ticketing platform — roles mapping, per-organiser provisioning, webhook routing by
externalRef, and how billing works for platforms. -
Test-mode keys + sandbox events. API keys can now be created in test mode (
pk_test_…/sk_test_…; rotation keeps the mode). An event created with a test key is a sandbox event: bookings are free — no credits, no usage/reports — while holds, best-available, and realtime behave exactly like live. Buyers see an amber TEST MODE ribbon on the chart (localized), and every webhook payload now carrieslivemode: true|falseso receivers can route sandbox traffic. Test and live are strictly isolated — a key used on an event of the other mode gets403 mode_mismatch. See Test mode and the updated Quickstart. -
SDK 0.1.4. New floor API for multi-floor charts —
getFloors()andsetFloor(floorId)let embedders build their own floor switcher (see Multi-floor venues); new colorblind-safe mode — thecolorblindSafeoption (andsetColorblindSafe()) switches categories to an Okabe-Ito palette and renders booked seats as hollow rings, with a matching toggle on the hosted buyer page; newonHintcallback delivers the non-blocking, localized orphan-seat hint (see Holding seats).@seatlayer/reactexposes the new methods on its imperative handle. -
Production launch on seatlayer.io. The API (
api.seatlayer.io), hosted SDK (cdn.seatlayer.io/sdk/v1/seatmap.js), and dashboard are live on the production domain. -
Per-event checkout window. The default hold TTL is now 15 minutes (was 5), configurable per event via
GET/POST /v1/events/:key/hold-ttlor the dashboard’s “Checkout window” field. Precedence: explicitttlMson the hold → event setting → default, all clamped to 60 minutes. See Handling hold expiry. -
SDK 0.1.3.
HoldResultandBestAvailableResultgainseats(the held seats with the buyer’s chosen ticket tier per seat); newsetSeatTier()method andtiers/tierIdonSelectedSeat; newonDeckTapcallback for multi-floor charts. -
Best available respects hidden inventory.
bestAvailable()never auto-picks a seat inside a hidden or not-yet-revealed section.
2026-07-09
- Inventory control + auto-reveal. Set section/zone availability windows that hide
inventory from buyers or reveal it on a schedule or automatically once the rest of the
house sells past a threshold (
GET/POST /v1/events/:key/availability). Cancel bookings withPOST /v1/events/:key/unbook; schedule blocked seats to auto-release withreleaseAtonblock. Reveal changes reach embedded pickers live through the SDK. See Inventory control. - Ticket tiers. Categories can offer named price tiers (Adult / Child / Senior…); buyers choose per seat in the picker, and the chosen tier rides through the hold to your booking flow. See Ticket tiers.
- Multi-floor venues. Charts can carry multiple floors; the designer authors them per floor, and buyers get a floor switcher plus a stacked 3D deck view. See Multi-floor venues.
- Template library. 28 templates: 11 capacity-adjustable venue families (with a continuous capacity slider) plus 17 curated flagships, and an insertable seating-blocks library in the designer. See Templates.
- Big-venue rendering. Section-block overview with level-of-detail — far zoom shows section blocks with availability tint, zooming in melts blocks into individual seats.
- Buyer i18n + dynamic currency. The picker and embed SDK ship in en/es/de/fr
(
locale/messagesoptions), and prices render in the organizer’s workspace currency. See Localization. - Subscription plans. Superseded 2026-07-19. Monthly paid tiers (Studio, Pro, Scale) shipped here were retired in favor of pure usage-based credits — one credit per sold seat, no subscriptions. See Pricing.
2026-07-08
1.0 — Public API + embed SDK. Book, hold, best-available, and block seats; pull
inventory reports and audit logs; embed a live seat map with the SDK; receive webhooks
(seat.booked, seat.released, seat.blocked, hold.created, hold.expired,
event.created, event.soldout); and keep the embedded picker in sync with live seat
updates through the SDK.