Release 1.73.0

Release date: September 4, 2026

Release Notes - Seatmap Platform

Version 1.73.0 - 2026-09-04

Release Focus: A release built around booking sessions. A buyer’s seats are now held in a server-side cart that survives a page reload and cannot be double-booked: seats and general-admission capacity are held for a configurable time, checkout freezes the cart for payment, and confirming converts the whole cart to sold in one step. The public session endpoints need no API key, so a booking page can drive the flow from the browser and keep the organisation key server-side, and the renderer package ships a client for them. Alongside it, image conversions are queued and rendered on a GPU whenever one is free, PDF export is retired in favour of SVG, self-hosted deployments can declare their environment, and the integration credentials are named consistently across the editor and the API reference.


Breaking

PDF export is removed (SEAT-1238)

The editor no longer offers a PDF export action, and the endpoint behind it, GET /api/export/{id}/pdf/{eventId}/, no longer exists. Use the SVG export, GET /api/export/{id}/, which is unchanged. Anything that downloaded PDFs through this endpoint must switch to the SVG export and convert on its own side.

Section photo upload answers immediately and is polled (SEAT-1238)

POST /api/section-photo/ now answers 202 Accepted with {"status":"accepted","requestId":"..."} when the conversion queue is enabled, and the caller polls GET /api/section-photo/{requestId}/ until status is ready to read url and thumbUrl, or failed if the photo could not be processed. The editor does this itself. A direct caller of the endpoint must follow the poll. With the queue disabled the endpoint still answers 200 with status: "ready" and both urls directly.

The converter’s conversion routes require a shared secret (SEAT-1238)

A Helm-managed deployment generates the secret per install, keeps it across upgrades and wires it into editor-service, so it needs no action. Anything else that calls the converter directly must send Authorization: Bearer <value>; a request without it is answered 401. Deployments that run editor-service and the converter as separate releases must pin the same value on both sides before upgrading. The Deployment Guide has the steps.


New in the booking API

Booking sessions (SEAT-1226)

A booking session is a server-held cart. It survives a page reload, and because a seat is owned by exactly one session, two buyers can no longer be sold the same seat.

The buyer’s seats and general-admission capacity are held against the session for a configurable time, fifteen minutes by default. Checkout freezes the cart for payment with its own grace period, ten minutes by default, and confirming converts the whole cart to sold in one atomic step and stores the order reference. A session that is never confirmed expires on its own and returns its seats to the map.

The public session endpoints, under /api/public/v2.0/session/, need no API key: the session id is the credential, and opening one requires only the renderer public key. A booking page can therefore open a session, hold and release seats and check out from the browser, while the organisation key stays server-side for the final confirm on /api/private/v2.0/session/{id}/confirm. Holds are all-or-nothing: a lock that cannot acquire every line is rolled back and answers 409 with the seats and areas that conflicted, so a page can show the buyer exactly what was taken in the meantime.

The organisation opts in before the public endpoints accept anything: PUT /api/private/management/v2.0/session-config/ with publicSessionsEnabled: true. The private list, read, confirm and cancel endpoints work regardless.

The existing lock, sale and direct-sale endpoints now refuse a seat that a live session holds, answering 409 with error code SESSION_HELD and the seat ids, instead of skipping it. An integration that does not use sessions sees no change.

Endpoints, payloads and error codes are in the Backend API Changes.


New in the booking renderer

A client for booking sessions (SEAT-1226)

@seatmap.pro/renderer exports BookingSessionClient, covering the public session surface: create, get, lock, unlock, checkout and cancel. Failures arrive as BookingSessionError with the HTTP status, the error code and, on a refused hold, the conflicting seats and areas. Two helpers, selectionFromCart and selectionFromSession, turn a renderer cart or a session into the selection the lock and unlock calls take. Details and an example in the Renderer API Changes.


New in the schema editor

Conversions are queued and rendered on the GPU whenever it is free (SEAT-1238)

Image conversions, which produce schema backgrounds, previews, thumbnails and section photos, are now queued rather than rendered inside the request. A converter with a GPU claims each job first; a CPU converter picks the job up when the GPU one is busy or unavailable, so a render no longer fails or falls back at random depending on which converter received the request. A conversion interrupted mid-render is returned to the queue and retried.

Section photo upload now answers immediately with a request id and the editor polls for the result, so a large upload no longer blocks on a single long request.


New for self-hosted deployments

Declare the deployment environment (SEAT-1205)

Operators can declare which environment a deployment is, production, staging, development or unspecified, with the new instance.environment Helm value. The declared environment is returned by GET /api/instance-info alongside the new installationId field, and error reports default their environment tag from it, so the per-service glitchtip.*.environment values no longer need to be set individually. Existing installs behave unchanged without it and report their environment as undeclared until it is set.

The chart validates instance.environment (SEAT-1230)

A misspelled instance.environment value used to install cleanly and then report the deployment as undeclared. The chart now checks the value while rendering and names the four it accepts, production, staging, development and unspecified, with surrounding whitespace and capitalisation ignored. Leaving the value unset is still valid and still means undeclared. An install or upgrade that sets it to anything else now fails at render time, so an abbreviation such as prod or stage must be changed to the full value before the next upgrade.

The diagnostic check-in carries deployment identity (SEAT-1206)

The periodic diagnostic check-in identifies the deployment precisely, by installation, runtime and declared environment, and reports five system fields: Java version, OS name, OS version, architecture and working directory. A failed delivery is logged at DEBUG level so operators can diagnose blocked egress locally.


What’s fixed in the schema editor

Public API key and Secret API key (SEAT-1231)

Organization settings now label the two integration credentials Public API key and Secret API key; the value previously shown as “Organization token” is unchanged, only its name. The Booking API v2 reference uses the same wording. Integrators need no change: the sign-in response fields (publicKey, organizationToken, tenantToken) and the X-API-Key header keep their names and values.

Super admins now see their tenant token where it is expected: Organization settings displays the value issued at sign-in, and the tenant administration screen shows the same value. Both screens previously showed a value the API does not accept, and the Organization settings field could stay hidden altogether. Switching tenant context hides the field until the next sign-in rather than showing a token for the previous tenant.


Affected products

  • booking-service
  • booking-client
  • editor-client
  • editor-service
  • converter-service
  • common-lib
  • db-migrations
  • deployment

Upgrade

Three items under Breaking need attention before upgrading: PDF export is gone, direct callers of the section photo endpoint must follow the poll, and a deployment that runs the converter as a separate release must pin the converter secret on both sides first. Everything else is additive.

Booking sessions are served by default but accept nothing until an organisation enables public sessions through the session-config endpoint. Operators who do not want the endpoints exposed at all can set the Helm value global.bookingSessions.enabled to false; existing holds still expire normally while it is off.

Three database migrations run on startup. They add the tables, columns and indexes behind booking sessions, plus one further additive migration; nothing existing is altered or dropped, and the one index on a large table is built concurrently. Deployments whose migration role is restricted per table should read the migration section of the Deployment Guide before upgrading.

The converter now queues conversions in Redis by default, so a release that runs it needs a Redis. Set converter.config.async.enabled to false to keep rendering inside the request without one.

Full details in the Deployment Guide.

Booking renderer

npm install @seatmap.pro/renderer@1.73.0

New renderer surface in this release: BookingSessionClient, BookingSessionError, selectionFromCart and selectionFromSession, with the types IBookingSessionClientSettings, BookingSessionState, IBookingSession, ICreatedBookingSession, ISessionCart, ISessionCartSeat, ISessionCartGa, ISessionSelection and ISessionConflicts. No existing method, callback or setting changes meaning, and nothing is deprecated.


Additional Documentation

  • Renderer API ChangesBookingSessionClient, its errors and the selection helpers
  • Backend API Changes — the public and private session endpoints, session configuration, the 409 on held seats, the section photo poll and the removed PDF export
  • Deployment Guide — migrations V118-V120, the converter queue and secret, instance.environment