SeatDataDocs

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}/sales
  • POST /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.

sourceReturns
omitted, or shThe default. Unchanged rows, unchanged charges.
vsOnly sales observed on the second marketplace.
allBoth, 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:

FieldTypeMeaning
sourcestring"sh" or "vs" — the marketplace the sale was observed on.
all_in_pricenumber | nullFee-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.

FieldTypeMeaning
norm_zonestringThe 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_sectionstringThe 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, or null. 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 marketplace
  • status"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.

On this page