---
title: "GET /api/feed/v1/events/{eventId}/seat-history"
method: GET
path: "/api/feed/v1/events/{eventId}/seat-history"
tags: ["Feed"]
---

# GET /api/feed/v1/events/{eventId}/seat-history

`GET /api/feed/v1/events/{eventId}/seat-history`

## Request

- Base URL: `https://api.findticker.com`
- URL: `https://api.findticker.com/api/feed/v1/events/{eventId}/seat-history`
- Auth: HTTP bearer

## Path parameters

- `eventId` string, required

## Query parameters

- `place_index` integer, nullable
- `section` string
- `row` string
- `seat` string
- `scope` 'seat' | 'section' | 'event'
- `days` integer
- `cursor` string

## Response `200`

With scope section or event: every seat of the section or the event that changed in the window, 100 seats a page in seat order, each with its changes as below (at most 200 rows a seat; a longer seat is truncated and carries its own next_cursor), and meta.next_cursor for the next seats. Costs ONE UNIT a page. Otherwise, what happened to one seat, newest first: when it was first seen, every price it was re-listed at with the price before it, every period it was not for sale and when it was for sale again, and whether it has gone, which is taken or pulled. The log does not say which, so a seat that came back is never called gone. Name the seat by place_index, or by section, row and seat together. Reads the seat's whole history by default, back to its first change; the days parameter narrows it. Most events have no per-seat reading at all: meta.covered says so and the array is empty. A seat with a long history comes in pages, newest page first: meta.next_cursor is set while older changes exist, the pages join end to end, and gone is only ever on the first page. Costs ONE UNIT a page whatever the change count.

- union
  - FeedEventSeatHistory
    - `event_id` string, nullable, required
    - `seat` object, required
      - `place_index` integer, nullable, required
      - `section` string, nullable, required
      - `row` string, nullable, required
      - `seat` string, nullable, required
    - `since` string, required
    - `changes` FeedSeatChange[], required
      - `kind` 'listed' | 'repriced' | 'unavailable' | 'gone', required: listed: the seat became available for sale. repriced: it was re-listed at a different price with no gap worth reporting. unavailable: it was not for sale between at and until_at, then it was again, and read times before reading the dates because one row can stand for a run of them. gone: it stopped being available and has not come back, which is taken or pulled. The log does not say which, so only a seat that never came back is called gone.
      - `at` string, required: When it happened, UTC. On unavailable, when the seat stopped being for sale.
      - `until_at` string, nullable, required: When the seat was for sale again, UTC. Set on unavailable only.
      - `price` number, nullable, required: The price the seat carried after the change. Null when no price is known for it.
      - `previous_price` number, nullable, required: The price it carried before. Set only where the price moved.
      - `price_exact` boolean, required: False when the price is the nearest known price rather than the one in force at that moment.
      - `first` boolean, required: On listed, the seat had not been listed in anything held for it.
      - `offer_name` string, nullable, required: Name of the offer the price belongs to. Not captured yet, so null on every row.
      - `times` integer, required: Number of periods represented by this row. A value of 1 represents a single period. Only unavailable rows can summarize repeated periods. A group spanning a page boundary may appear as adjacent rows whose counts add.
      - `away_seconds` number, nullable, required: Duration of unavailability, in seconds. On a grouped row, this is the median duration; at and until_at span the whole group, including intervening availability. Null for kinds other than unavailable.
    - `meta` object, required
      - `changes` integer, required
      - `covered` boolean, required: False when the event has no per-seat reading at all, which is most events. The changes array is then empty.
      - `reaches_start` boolean, required: True when nothing older than the oldest change is held, which is the only case where a first listing is marked first.
      - `next_cursor` string, nullable, required: Pass as cursor for the next, older page. Null when this page reaches the start. Pages join end to end: an older page's changes follow the page before it, and the joined list is the seat's whole list.
      - `units_charged` integer, required
  - FeedEventSeatsHistory
    - `event_id` string, nullable, required
    - `scope` 'section' | 'event', required
    - `section` string, nullable, required
    - `since` string, required
    - `seats` object[], required
      - `place_index` integer, nullable, required: The seat's place index on the event's current seat map, the index the seat routes take. Null when the seat is not on the current map; section, row and seat still name it.
      - `section` string, required
      - `row` string, required
      - `seat` string, required
      - `changes` FeedSeatChange[], required
        - `kind` 'listed' | 'repriced' | 'unavailable' | 'gone', required: listed: the seat became available for sale. repriced: it was re-listed at a different price with no gap worth reporting. unavailable: it was not for sale between at and until_at, then it was again, and read times before reading the dates because one row can stand for a run of them. gone: it stopped being available and has not come back, which is taken or pulled. The log does not say which, so only a seat that never came back is called gone.
        - `at` string, required: When it happened, UTC. On unavailable, when the seat stopped being for sale.
        - `until_at` string, nullable, required: When the seat was for sale again, UTC. Set on unavailable only.
        - `price` number, nullable, required: The price the seat carried after the change. Null when no price is known for it.
        - `previous_price` number, nullable, required: The price it carried before. Set only where the price moved.
        - `price_exact` boolean, required: False when the price is the nearest known price rather than the one in force at that moment.
        - `first` boolean, required: On listed, the seat had not been listed in anything held for it.
        - `offer_name` string, nullable, required: Name of the offer the price belongs to. Not captured yet, so null on every row.
        - `times` integer, required: Number of periods represented by this row. A value of 1 represents a single period. Only unavailable rows can summarize repeated periods. A group spanning a page boundary may appear as adjacent rows whose counts add.
        - `away_seconds` number, nullable, required: Duration of unavailability, in seconds. On a grouped row, this is the median duration; at and until_at span the whole group, including intervening availability. Null for kinds other than unavailable.
      - `truncated` boolean, required: True when the seat had more changes than one page takes per seat; next_cursor reads on with this route by place_index.
      - `next_cursor` string, nullable, required: For a truncated seat: pass with its place_index and no scope for the seat's older changes.
    - `meta` object, required
      - `seats` integer, required
      - `covered` boolean, required: False when the event has no per-seat reading at all, which is most events. seats is then empty.
      - `next_cursor` string, nullable, required: Pass as cursor with the same scope, section and days for the next seats. Null on the last page.
      - `units_charged` integer, required

## Other responses

- `400`: Validation error, a cursor this route did not mint, or neither a place index nor a full section, row and seat.
- `401`: Missing or invalid API key.
- `403`: The key's account is not entitled to the feed, or the account or the address it calls from is blocked (`reason` `blocked`).
- `404`: No such event.
- `429`: The per-minute burst ceiling or the unit budget for the current UTC date is used up.
- `500`: Internal Server Error.

---

[API](https://skmtc.dev/findticker/apis/ticker-api.md) · [All operations](https://skmtc.dev/findticker/apis/ticker-api/llms.txt) · [OpenAPI document](https://skmtc.dev/findticker/apis/ticker-api/revisions/b6229ca924f4?raw)
