API Changelog
Dated record of additive changes to the SeatData REST API
Changes to the SeatData REST API, newest first. Entries here are additive unless stated otherwise.
2026-09-17 — Sales endpoints: optional source filter, new row fields, per-event sources metadata
The v1 sales endpoints now return sales observed on more than one marketplace. The URL version does not change, and no existing request changes: this update adds optional inputs and new output fields.
Affected endpoints:
GET /api/v1/events/{event_id}/salesPOST /api/v1/events/sales/batch
The default is unchanged
Omitting source, or sending source=sh, returns exactly the rows and charges you received
before this update. No existing integration needs to change.
Optional source query parameter
Accepted on both endpoints as a query-string parameter. On the batch endpoint it goes on the URL, not in the JSON body.
source | Returns |
|---|---|
omitted, or sh | The default. Unchanged rows, unchanged charges. |
vs | Only sales observed on the second marketplace. |
all | Both, merged newest-first. |
Any other value returns 400 with error.code set to invalid_param and error.param set to
source. That response is free — it is rejected before any billing or data read.
Pagination cursors are bound to the source they were issued under. Replaying a cursor under a
different source returns 400 with error.code set to invalid_cursor. Use one source value
for every page of a walk.
New fields on every sale row
Two fields are added to every row, on both endpoints and under every source value:
| Field | Type | Meaning |
|---|---|---|
source | string | "sh" or "vs" — the marketplace the sale was observed on. |
all_in_price | number | null | Fee-inclusive price the marketplace showed. Always null on sh rows. |
A vs row carries two more. sh rows carry neither, because their names are the naming space
vs rows are translated into and have nothing to translate.
| Field | Type | Meaning |
|---|---|---|
norm_zone | string | The zone name used for the same seats in sh sales for that event or venue. Derived by matching, not reported by the marketplace. "" when no match is found. |
norm_section | string | The same, for the section. |
Row key sets differ by source
Read source to tell which shape a row has. On a sh row, listing_id is an integer,
all_in_price is always null, and the normalized fields are absent. On a vs row,
listing_id is a string, zone is always "", section may combine zone and section into one
label, and both normalized fields are present.
To join the two sets, compare a vs row's norm_section against a sh row's
section, and its norm_zone against zone. That is what the fields are for.
timestamp, quantity, price, zone, section, row, and listing_id are otherwise
unchanged on sh rows. vs sales come from listing changes
between pulls, so an event's vs count is a lower bound. Sales whose seat details could not be
determined are not returned, and are not counted in total_count.
Quantity and price
sh sales often reach us unenriched, without a quantity or price. For those we derive both from
the listing data we hold for that listing; a quantity of 0 means it could not be reliably
determined. vs sales carry both as reported.
New sources metadata
The single-event endpoint returns a top-level sources array on the first page. Continuation pages
omit it. The batch endpoint returns a top-level sources object keyed by the same client-sent event
ids as results; results and errors are unchanged in shape.
sources always carries two entries, sh then vs, whatever source you sent. Each
entry has:
source—"sh"or"vs"collecting_since— ISO date of the earliest sale observed for this event on that marketplace, ornull. It counts sales these endpoints do not return, so it can be older than your oldest returned row.tracked_for_event— whether the event is tracked on that marketplacestatus—"ok", or"unavailable"when that marketplace could not be read for this request. The response still succeeds, carrying the rows that were available.
total_count on the first page counts rows under the active source filter.
Billing
Unchanged. A first page that returns at least one row is one pull, whichever source produced it.
Continuation pages are free. A page with no rows is free. Because the default is sh, a caller
who sends no source pays exactly what they paid before.
Not changed
No new URL version. The v0.x endpoints are untouched and remain single-marketplace. The error
envelope, cursor format, limit bounds, rate limits, and authentication are all unchanged.