Booking Service API Changes - v1.71.0

Release: v1.71.0 Base URL: https://booking.seatmap.pro Date: 2026-08-13

MetaTitle: Booking API Changes 1.71.0 - Seatmap.pro

MetaDescription: New in 1.71.0: split price assignment and availability endpoints, bulk area pricing, and a flat per-seat event endpoint with change polling.


Summary

Backward Compatible: YES New Endpoints: 2 Modified Endpoints: 1 Removed Endpoints: 0 Deprecations: 0 Authentication Changes: none

Migration Required: NO — every existing endpoint keeps its current path, parameters and response shape. GET /api/public/v1.0/event/prices/ is unchanged and continues to work.

One thing to read before adopting GET /api/public/v1.0/event/prices/: its seats and groupOfSeats arrays are positional tuples, not objects. See Positional arrays below.


New Endpoints

GET /api/public/v2.0/event/assignments/ and /availability/

The booking renderer now reads pricing as two requests rather than one: assignments, which answers which price applies where and is revalidated by ETag, and availability, which answers what is no longer for sale and is read fresh every time. Splitting them lets the larger, slower-moving half be cached while the volatile half stays small.

These two are an internal contract between the renderer and the service. Their payload shape is tuned for the renderer and changes with it, without notice and without a version bump. Do not integrate against them.

GET /api/public/v1.0/event/prices/ remains the supported endpoint for reading an event’s prices and availability directly. It is unchanged in this release and is documented below.

POST /api/private/v2.0/event/{eventId}/prices/assignments/areas/

Prices whole sections, rows, general admission areas and individual seats in one request. The caller sends object ids without declaring what each one is; the server resolves the kind from the schema.

Request body

{
  "groupOfSeats": [
    { "objectId": 1362, "assignmentId": 42 },
    { "objectId": 2001, "assignmentId": 42, "activeCount": 100 }
  ],
  "seats": [{ "objectId": 980123, "assignmentId": 43 }]
}

objectId and assignmentId are required on every entry; activeCount applies only to general admission areas.

Response 200

[
  {
    "kind": "SECTION",
    "objectId": 1362,
    "priceId": 42,
    "seatsUpdated": 1240,
    "quantityApplied": false
  }
]

kind is SECTION, ROW or GA. Ordering rules: areas are applied in the order sent, so a row listed after its section wins over that section; the seats list is applied last, so a seat overrides the area containing it.

For a general admission area, omitting activeCount when the area already carries exactly one price changes only the price and leaves ticket counts untouched. Omitting it when the area has no price, or several, is rejected with 400 naming the areas, so a bulk re-price cannot silently move live inventory. Every area is applied in one transaction, with all validation ahead of any write.

GET /api/private/v2.0/events/{id}/seats/

One flat record per seat of an event, replacing the previous approach of combining a schema-scoped seat listing with a renderer payload and reassembling by identifier.

Parameters

Name In Required Type Description
id path yes UUID Event identifier
sectionId query no int64 Only seats of this section
rowId query no int64 Only seats of this row
lastUpdated query no string Only seats changed at or after this point
page, size, sort query no Standard paging; sort accepts any returned field

Response 200 — a page whose content holds:

{
  "seatId": 980123,
  "seatName": "14",
  "rowId": 5971,
  "rowName": "B",
  "sectionId": 1362,
  "sectionName": "Orchestra",
  "state": "ACTIVE",
  "available": true,
  "priceId": 42,
  "priceName": "Premium",
  "updatedAt": "2026-08-11T09:21:44"
}

state is ACTIVE (on sale), LOCKED (held), SOLD (bought), BLOCKED (withdrawn), or null when the seat carries no price for the event and therefore cannot be booked.

Results are ordered by seatId when no sort is given, and seatId always breaks ties, so paging is stable.

Polling for changes. Echo the largest updatedAt of the previous response back as lastUpdated, verbatim. updatedAt is a local date-time on the service clock and carries no offset — do not convert it into your own time zone. Note that the OpenAPI schema types it as format: date-time, which usually implies an offset; a generated client may need its deserializer overridden to treat the field as a local date-time.

A seat whose price is removed altogether stops appearing rather than being reported as a change, so reconcile with a periodic full read.


Modified Endpoints

GET /api/public/v1.0/event/prices/

Unchanged in path, parameters and response shape, and it remains the supported way to read an event’s prices and availability.


Positional arrays

groupOfSeats and seats in v1.0/event/prices/ are arrays of positional tuples rather than objects. The server types them as List<Object[]>, so no generated schema conveys the element order:

Response seats groupOfSeats
v1.0/event/prices/ [seatId, priceId, special?] [gosId, priceId, activeCount, special?]

OpenAPI coverage

The public API is now published as its own OpenAPI group. Point a client generator or a browser at:

Group Document Covers
public /v3/api-docs/public /api/public/** — the endpoints on this page
booking /v3/api-docs/booking /api/private/v2.0/**
v1 /v3/api-docs/v1 /api/private/v1.0/**
management /v3/api-docs/management /api/private/management/v2.0/**

All four appear in the Swagger UI selector at /swagger-ui.html. The three private groups are unchanged in content; only the new public group is added.

Note that seats and groupOfSeats are typed as arrays of untyped arrays in the generated schema, since the service models them as positional tuples. The generated document tells you the fields exist but not what each position holds — use the table above for that.


Authentication Changes

None. The public endpoints continue to authorize by publicKey on the query string, and the private endpoints continue to use the existing scheme.


Removed and Deprecated Endpoints

None. No endpoint was removed, deprecated, or had its response shape changed in this release.