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.