Get sales data
/v0.3/salesdata/getAll responses are gzip encoded.
You must pass either a SeatData Event ID (from the
/v0.3.1/events/search or /v1/events/search endpoints) or a
Marketplace Event ID (obtained separately).
This endpoint returns data from a single marketplace. Multi-source
sales data is available on GET /v1/events/{event_id}/sales.
Pass Authorization: Bearer <api_key>. Preferred for new integrations.
In: header
Query Parameters
SeatData Event ID
Marketplace Event ID
Response Body
application/json
curl -X GET "https://example.com/v0.3/salesdata/get?event_id=225220" \ -H "Authorization: Bearer YOUR_API_KEY"[ { "timestamp": 1624060468, "quantity": 2, "price": 44.46, "zone": "Field Outfield", "section": "109", "row": "2" }]Get listings GET
Returns the listings SeatData holds for a single event - active listings and delisted ones - ordered by `listing_id` ascending, then by id ascending (a stable tiebreak for paging; a `listing_id` can appear more than once when the marketplace reuses it). The v1 equivalent of `GET /v0.1.1/listings/get`. Same rows, same billing - plus cursor pagination, a JSON response envelope, an `active` filter, `created_at` / `updated_at` on every row, and structured JSON errors. `active` is a JSON boolean here (`0`/`1` on v0.1.1). Responses are `application/json`, and v1 never forces gzip the way v0.1.1 does - any compression is ordinary content negotiation your HTTP client handles for you. See the [migration guide](https://docs.seatdata.io/docs/api/migrating-to-v1/). ## Billing rules | Scenario | Charged a pull? | |---|---| | First page, and the event's listings refreshed since your last charged pull | Yes - 1 pull | | First page, nothing refreshed since your last charged pull | No | | Follow-up paginated page (cursor present) | No (continuation) | | No listings under the filter | No (empty result, free) | `has_refreshed` on the first page tells you whether that call was charged. Refresh state is shared with `GET /v0.1.1/listings/get`: a charged pull of an event through either version counts as your last charged pull for both. Fetching every page through pagination costs the same single pull as one v0.1.1 call. The `active` value does not change what a page costs. ## Pagination Cursor-based. The first page includes `total_count`, `has_refreshed` and `last_refreshed_at`; continuation pages omit them. `next_cursor` is opaque - pass it back verbatim via `starting_after`; don't parse it. Cursors are scoped to the event and the `active` value they were issued under, and expire after 1 hour. Replaying a cursor with a different `active` value returns `400` `invalid_cursor`. Use one `active` value for every page of a walk. `limit` applies per request and is not carried by the cursor; send it again on each continuation. Pages are not a snapshot. Listings SeatData observes while you page can appear or change between pages, and `total_count` is the count at the first page. A row is never repeated across the pages of one walk. ### Example: fetching every page ```python tab="Python" import requests base = "https://seatdata.io/api/v1/events/12345/listings" headers = {"Authorization": "Bearer YOUR_API_KEY"} rows = [] params = {"limit": 1000, "active": "true"} while True: response = requests.get(base, params=params, headers=headers) response.raise_for_status() page = response.json() rows.extend(page["data"]) if page["next_cursor"] is None: break params = {"active": "true", "limit": 1000, "starting_after": page["next_cursor"]} print(len(rows), "active listings") ``` ```bash tab="cURL" API_KEY="YOUR_API_KEY" BASE="https://seatdata.io/api/v1/events/12345/listings" URL="$BASE?limit=1000&active=true" while [ -n "$URL" ]; do PAGE=$(curl -s "$URL" -H "Authorization: Bearer $API_KEY") echo "$PAGE" | jq -c '.data[]' >> listings.jsonl CURSOR=$(echo "$PAGE" | jq -r '.next_cursor // empty') URL=${CURSOR:+"$BASE?active=true&limit=1000&starting_after=$CURSOR"} done wc -l listings.jsonl ```
Get sales data (batch) POST
All responses are gzip encoded. Accepts up to 100 events per request, combined across both id lists after deduplication. Billing is identical to `GET /v0.3/salesdata/get` — one pull per event that returns sales data; events with no sales are free. `results` is keyed by the identifier you sent: Marketplace Event IDs appear under the marketplace id, SeatData Event IDs under the SeatData id. `errors` reports per-event failures: `not_found` for a SeatData Event ID that does not exist, `payment_required` when a pay-as-you-go balance ran out mid-batch (that event's data is withheld; events already charged are still returned). This endpoint returns data from a single marketplace. Multi-source sales data is available on `POST /v1/events/sales/batch`.