---
title: "Changelog"
description: "Track SeatLayer API, Buyer SDK, Designer, webhook, and platform releases, behavior changes, fixes, and migration notes."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.seatlayer.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

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](/platform/sales-channels#give-a-partner-its-own-context-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](/integrations/performance-groups).

## 2026-08-16

- **Sales channels can now carry authoritative sparse prices.** Each channel
  exposes `priceOverrides` and an independent `pricingVersion`; 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 `capabilities`
  when minting an `mse_…` token is still accepted, but the effective grant is
  now exactly `event: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 `404` responses, and live/test key mismatch returns the
  documented `403 mode_mismatch` without revoking the session.
- **`event:boxoffice` browser 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. `bookingRef` links the systems; it is not a SeatLayer commerce
  Order.

  The short-lived behavior announced on 2026-08-06—creating an internal
  `external` Order, tickets, PDF/email, attendance, and Door artifacts after
  `POST /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/unbook` and legacy
  `POST /v1/events/:key/box-book` are 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/book` with a `holdId` created 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 optional `buyer.email`) the
  confirmation email. The response gains an `order` object 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 same `bookingRef` return 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 states
  `orderUnavailable` instead 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](/server-api/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
  long `ord_…` 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 with `403 channel_access_denied`
  unless 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 send `ignoreChannelRestrictions: true` with a `reason` for 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](/server-api/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](/platform/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`](/server-api/channels).
  Buyer access sessions — the short-lived, opaque, origin-bound `bse_…` bearer
  your backend mints for one buyer — are on
  [`/server-api/buyer-access-sessions`](/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/report` reports 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 a `methodology` field rather than leaving you to
  guess. Revenue requires `event:reports` on top of `event:channels:view`; a
  caller without it sees every operational figure with `revenue: null`. See
  [reports](/server-api/reports).

- **`seat.booked` webhooks carry sale attribution.** Booked line items gain
  `channelId` (`null` = Public sale), `channelExternalRef`, `accessSource`, and
  `partnerRef` where 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](/webhooks/events).

- **Two new least-privilege capabilities** for event manage tokens:
  `event:channels:view` (names, allocations, counts) and
  `event:channels:manage` (create, assign, pause, archive). Neither implies the
  other, and `event:block` gains 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-arena` | 864 | 3,666 | +2,802 |
  | `amphitheatre` | 864 | 3,605 | +2,741 |
  | `arena-round` | 2,364 | 3,684 | +1,320 |
  | `west-end` | 1,584 | 922 | −662 |
  | `small-theatre` | 198 | 788 | +590 |
  | `concert-hall` | 663 | 1,119 | +456 |
  | `uber-arena` | 14,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-arena` reduction 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-section` previously 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/js`
  and `@seatlayer/react` are on npm; the CDN `seatlayer-js@0` alias resolves to
  the new version.

- **`GET /v1/charts/:id` returns `categorySeats`.** 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 with `0`, 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](https://github.com/seatlayer/seatlayer-android).
- **React Native SDK 0.1.0 enters public preview.** The official
  `@seatlayer/react-native` package 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](https://github.com/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/js` and `@seatlayer/react` `0.29.0`
  are 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
  [`seatlayer`](https://pub.dev/packages/seatlayer) package is available from
  pub.dev, with source in
  [seatlayer/seatlayer-flutter](https://github.com/seatlayer/seatlayer-flutter).
- **iOS SDK source is public.** The Swift package is available at
  [seatlayer/seatlayer-ios](https://github.com/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.0` packages 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.4` packages 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 `referenceImage` bytes and
  provenance are removed from buyer documents; the optional URL-only `backgroundImage`
  is 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
  `bestAvailable` accepts an optional stable `zoneId`. 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.** `EmbeddedDesigner`
  defaults to `height: 'fill'`: the iframe always reaches the bottom of the browser
  window (recomputed on resize and scroll, floor of `minHeight: 480`), instead of the
  old content-height auto-grow that could leave the editor short inside a host page.
  Numeric `height` plus `autoResize` remains for hosts that manage sizing themselves,
  and the Designer's new full-screen button asks the host to pin the iframe over the
  page via `seatlayer.designer.fullscreen`. See
  [Embed the chart Designer](/platform/embedded-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, including `pricing`, `hideBadge`, and `transport`, instead
  of silently dropping newer options. React hosts can also import `attachPickerFrame`
  directly from `@seatlayer/react`.
- **SDK 0.19.0 — embedded control room.** `@seatlayer/js` now exports `SeatManager`
  and `@seatlayer/react` exports `<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](/platform/embedded-control-room/).
- **Manage sessions — browser-safe, capability-gated tokens.** A secret key or a
  dashboard session can mint a short-lived `mse_…` token via
  `POST /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 `closed` state.** Availability rules
  (`POST /v1/events/:key/availability`) add a `closed` mode alongside `hidden`, `timed`,
  and `threshold`: 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](/server-api/inventory/#availability-windows-timed--auto-reveal).
- **Iframe embed docs.** The one-iframe `/e/:key` buyer embed — responsive sizing plus the
  `seatlayer:height` / `seatlayer:fullscreen` postMessage contract and the
  `attachPickerFrame` host helper — is now documented in
  [Iframe embedding & sizing](/integrations/iframe/).
- **Embedded Designer host options.** [Embed the chart Designer](/platform/embedded-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](/billing/credits): 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](/billing/pricing).
- **`hold.extended` webhook.** The extended-hold event is now subscribable, bringing the
  [webhook catalog](/webhooks/events) 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](/platform/embed-sessions), 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](/agents/overview).

## 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](/platform/embedded-designer/).
- **SDK 0.3.0 — native Designer hosts.** `@seatlayer/js` now exports
  `EmbeddedDesigner`, and `@seatlayer/react` exports `<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/workspaces` while retaining account-level
  billing, keys, and a single webhook subscription. Charts have an immutable
  `workspaceId`; 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. `externalRef` remains 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/publish` and `GET /v1/events` (sold counts, `externalRef` filter, `mode` on every item) now accept secret-key auth: duplicate → publish → create event → embed without a dashboard visit.
- **`externalRef` tagging for platforms.** Charts and events accept an optional
  `externalRef` (your own organiser/tenant id, up to 128 chars) on create and on
  `POST /v1/charts/:id/duplicate` (override wins, explicit `null` clears, absent
  inherits the source's tag). It's returned in chart/event meta, updatable via
  `PUT /v1/charts/:id` and `PATCH /v1/events/:key`, filterable on the list routes
  (`?externalRef=…`), and rides every webhook payload alongside `livemode` (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](/integrations/platforms/).** 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 carries
  `livemode: true|false` so receivers can route sandbox traffic. Test and live are
  strictly isolated — a key used on an event of the other mode gets
  `403 mode_mismatch`. See [Test mode](/start/authentication/#test-mode) and
  the updated [Quickstart](/start/quickstart).
- **SDK 0.1.4.** New floor API for multi-floor charts — `getFloors()` and
  `setFloor(floorId)` let embedders build their own floor switcher (see
  [Multi-floor venues](/designer/multi-floor-venues)); new colorblind-safe mode — the
  `colorblindSafe` option (and `setColorblindSafe()`) switches categories to an
  Okabe-Ito palette and renders booked seats as hollow rings, with a matching toggle
  on the hosted buyer page; new `onHint` callback delivers the non-blocking,
  localized orphan-seat hint (see [Holding seats](/buyer-sdk/holds-and-checkout/#the-orphan-seat-hint)).
  `@seatlayer/react` exposes 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-ttl` or the dashboard's
  "Checkout window" field. Precedence: explicit `ttlMs` on the hold → event setting →
  default, all clamped to 60 minutes. See [Handling hold expiry](/buyer-sdk/hold-expiry/).
- **SDK 0.1.3.** `HoldResult` and `BestAvailableResult` gain `seats` (the held seats
  with the buyer's chosen ticket tier per seat); new `setSeatTier()` method and
  `tiers`/`tierId` on `SelectedSeat`; new `onDeckTap` callback 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
  with `POST /v1/events/:key/unbook`; schedule blocked seats to auto-release with `releaseAt`
  on `block`. Reveal changes reach embedded pickers live through the SDK. See
  [Inventory control](/server-api/inventory/).
- **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](/buyer-sdk/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](/designer/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](/designer/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`/`messages` options), and prices render in the organizer's workspace
  currency. See [Localization](/customization/localization).
- **Subscription plans.** _Superseded 2026-07-19._ Monthly paid tiers (Studio, Pro, Scale)
  shipped here were retired in favor of pure usage-based [credits](/billing/credits) — one
  credit per sold seat, no subscriptions. See [Pricing](/billing/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.

Source: https://docs.seatlayer.io/changelog/index.mdx
