TickerDocs
REST API

Ticket market data API

The ticket market data API: primary and resale prices, inventory and demand per event, price history, name-to-id search, performer rank, views and screens.

Ticker's market data over HTTP: price, inventory and demand for an event, the history of those readings, a name-to-id search, and performer rank. It authenticates with an API key. There is one Ticker API, and this is its reference. Ticker data is for research, pricing and market analysis only, never for directly purchasing tickets.

OpenAPI document, v1

Getting started

Create a key in Settings, under API, then send it as a bearer token against this base URL.

Base URL
https://api.findticker.com
Request
curl -s \
  -H "Authorization: Bearer $TICKER_API_KEY" \
  "https://api.findticker.com/api/feed/v1/events/ev7k3m9qp2xd/shopping?range=28d&columns=interest,sales"

Responses are JSON. A null means the reading was not observed, never that it was zero. Values are as of computed_at, the time the reading was computed. The shopping series is a list of points, each stamped with its snapshot_date.

Response
{
  "event_id": "ev7k3m9qp2xd",
  "current": {
    "interest": 412,
    "sales": 9
  },
  "series": [
    {
      "snapshot_date": "2026-08-31",
      "interest": 412,
      "sales": 9
    }
  ],
  "meta": {
    "range": "28d",
    "coverage_start": "2026-08-04",
    "points": 28,
    "columns": ["interest", "sales"]
  }
}

Where the prices come from

Every price this API returns is a listed price: what a seller listed a ticket at on resale, or what the primary market lists on the primary market, at the moment Ticker read the marketplace.

Prices are in US dollars. A route that takes currency answers an event at a Canadian venue in Canadian dollars when you pass currency=venue, at one exchange rate for the whole event, and names currency, venue_currency, fx_rate and fx_rate_date beside the prices. An event in the US is always in US dollars.

When a seat stops being open on the primary market the API calls it taken: bought, held or not yet released. When a listing leaves resale, a buyer took it or its seller withdrew it, and a count of listings that left, such as sold_or_pulled, counts both.

Completed resale sales are a separate record. GET /api/feed/v1/events/{eventId}/sales lists an event's sales, newest first: each with its sold_at, matched to the listing it sold from, with its section, row, tickets and listed price before and after fees.

Authentication

Send the key in the Authorization header. Every secret starts with tk_live_.

Header
Authorization: Bearer tk_live_...

The key reaches the data routes and nothing else. The rest of the Ticker API is session-authenticated, so a key cannot read a watchlist, an alert, or an account, and it cannot create another key.

The account's plan is re-read on every request. A downgrade or a cancellation stops the reads at the next call with a 402, without touching the key. A 403 is the other refusal: the plan is there and API access has not been granted.

Ids

Every route takes Ticker ids. An event id is ev plus ten characters, a performer id is pf plus ten characters, and every id the API returns is in that form.

A marketplace id resolves in the same slot when it carries its source prefix, vs:, tm: or tp:. That form does not expire. A bare marketplace id is read as vs: until 2027-09-13 and answers 404 after that date, so nothing you already hold breaks today and nothing stays tied to a marketplace for ever. A whole url segment with its slug is a 400: send the id alone.

Resolve an id by name with the same key:

GET /api/feed/v1/search

1 unit

Resolves a name to the Ticker event ids and performer ids the reading routes accept. Ids only, no readings.

qRequired. At least two letters or digits; the % _ and * wildcards are a 400.
limitHow many matches to return, at the published search cap.
Lookup
curl -s \
  -H "Authorization: Bearer $TICKER_API_KEY" \
  "https://api.findticker.com/api/feed/v1/search?q=morgan%20wallen&limit=5"

Each match carries an event_id, the value every route below takes, and a performer_id for the performer route.

Enumeration

Search resolves a name to ids. A q that is a single character or a wildcard returns 400.

A screen reaches events by rule: date, city, price or demand. Every match it returns costs a unit against the same unit budget.

Shopping routes

Every read is priced in budget units. The two below are the shopping pair. They answer with current, the latest reading, and series, a list of points each stamped with its snapshot_date. Values are as of computed_at. They are the only routes that take columns.

GET /api/feed/v1/events/{eventId}/shopping

1 unit

Shopping demand for one event: the current reading, and a series of points each stamped with its snapshot_date.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.
rangeHow far back the series reaches: 3d, 7d, 14d, 28d, 30d, 90d, all. all is the last 365 days. Defaults to 28d.
include_seriesSet to false to return the current reading alone. Defaults to true.
columnsComma-separated metric names. Omit for both interest and sales.

POST /api/feed/v1/events/shopping

1 unit per event id returned

The same reading for many events in one call.

event_idsRequired array of Ticker event ids, each ev plus ten characters. Every id form the single-event routes take works here too, and two spellings of one event are one event. Duplicates are collapsed before the bound is applied, and an id the catalog does not know, or one in a form the API cannot read, comes back under meta.missing rather than failing the call.
rangeOne of 3d, 7d, 14d, 28d, 30d, 90d, all. Defaults to 28d.
include_seriesBoolean. Defaults to false on the batch, so a wide read stays cheap.
columnsArray of metric names. Omit for both interest and sales.

A batch carries up to 200 ids. Every batch response echoes the bound in force as meta.batch_max, so a client can size its pages from the answer rather than from this page.

Batch request
curl -s -X POST "https://api.findticker.com/api/feed/v1/events/shopping" \
  -H "Authorization: Bearer $TICKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "event_ids": ["ev7k3m9qp2xd", "ev2p5w8xd4mq"],
    "range": "7d",
    "include_series": true,
    "columns": ["interest", "sales"]
  }'
Batch response
{
  "data": [ /* one entry per known id, in the order asked for */ ],
  "meta": {
    "requested": 2,
    "returned": 1,
    "missing": ["ev2p5w8xd4mq"],
    "batch_max": 200
  }
}

Columns

columns applies to the two shopping routes above and to no other route on this page. It narrows a shopping response to interest and sales. An unknown name is a 400 whose message lists the valid set.

A missing key and a null value mean different things. Absent means the request did not select it. Null means it was selected and not observed.

Shopping

ColumnName in the appReading
interestInterestDemand, peoplecurrent + series
sales_24hSales 24hDemand, countcurrent
orders_24hOrders 24hDemand, countcurrent
snapshot_dateseries
snapshot_timeseries
salesPerformer salesPerformer, scoreseries
ordersseries

interest is the most people viewing the event in an hour, and sales the tickets bought.

Analytics

The analytics pair returns this set on every call. It does not take columns. Values are as of computed_at. prediction_markets is present only when at least one Kalshi market maps to the event; the same array appears on the performer route, alongside its raw X counts and Kalshi probability.

ColumnName in the appReading
event_idEvent ididcurrent
computed_atComputed attimestampcurrent
lowest_price_currentLowest pricePricing, $current
median_price_currentMedian pricePricing, $current
p25_price_currentP25 pricePricing, $current
p75_price_currentP75 pricePricing, $current
lowest_aip_price_currentLowest all-inPricing, $current
median_aip_price_currentMedian all-inPricing, $current
p25_aip_price_currentP25 all-in$current
p75_aip_price_currentP75 all-in$current
lowest_face_value_currentLowest face$current
median_face_value_currentMedian face$current
average_face_value_currentAvg facePricing, $current
highest_face_value_currentHighest face$current
p25_face_value_currentP25 face$current
p75_face_value_currentP75 face$current
listings_currentListingsInventory & demand, countcurrent
tickets_currentTicketsInventory & demand, countcurrent
percent_remainingSecondary remainingInventory & demand, %current
vs_asof_atcurrent
interestInterestDemand, peoplecurrent
last_price_snapshot_datePriced as ofEvent & timing, datecurrent
partial_rowcurrent
primary_statuscurrent
prediction_marketscurrent
mlb_lowest_price_currentMLB lowest priceMLB, $current
mlb_lowest_aip_price_currentMLB lowest all-inMLB, $current
mlb_tickets_currentMLB ticketsMLB, countcurrent
mlb_currencyMLB currencyMLB, textcurrent
mlb_asof_atMLB as ofMLB, timestampcurrent
mlb_completenessMLB completenessMLB, categorycurrent
mlb_price_methodMLB price methodMLB, categorycurrent
mlb_lowest_price_d1MLB lowest price Δ1dMLB, $current
mlb_lowest_aip_price_d1MLB lowest all-in Δ1dMLB, $current
mlb_tickets_d1MLB tickets Δ1dMLB, countcurrent
sh_lowest_aip_price_currentSH lowest all-inSH, $current
sh_median_aip_price_currentSH median all-inSH, $current
sh_tickets_currentSH ticketsSH, countcurrent
sh_lowest_aip_price_delta_7dSH lowest all-in Δ7dSH, $current
sh_lowest_aip_price_pct_7dSH lowest all-in %Δ7dSH, %current
sh_lowest_price_currentSH lowest priceSH, $current
sh_median_price_currentSH median priceSH, $current
sh_lowest_price_delta_7dSH lowest price Δ7dSH, $current
sh_lowest_price_pct_7dSH lowest price %Δ7dSH, %current
sh_asof_atSH as ofSH, timestampcurrent
sg_lowest_aip_price_currentSG lowest all-inSG, $current
sg_median_aip_price_currentSG median all-inSG, $current
sg_lowest_price_currentSG lowest priceSG, $current
sg_median_price_currentSG median priceSG, $current
sg_tickets_currentSG ticketsSG, countcurrent
sg_lowest_aip_price_delta_7dSG lowest all-in Δ7dSG, $current
sg_lowest_aip_price_pct_7dSG lowest all-in %Δ7dSG, %current
sg_lowest_price_delta_7dSG lowest price Δ7dSG, $current
sg_lowest_price_pct_7dSG lowest price %Δ7dSG, %current
sg_asof_atSG as ofSG, timestampcurrent
gt_lowest_aip_price_currentGT lowest all-inGT, $current
gt_median_aip_price_currentGT median all-inGT, $current
gt_lowest_price_currentGT lowest priceGT, $current
gt_median_price_currentGT median priceGT, $current
gt_tickets_currentGT ticketsGT, countcurrent
gt_lowest_aip_price_delta_7dGT lowest all-in Δ7dGT, $current
gt_lowest_aip_price_pct_7dGT lowest all-in %Δ7dGT, %current
gt_lowest_price_delta_7dGT lowest price Δ7dGT, $current
gt_lowest_price_pct_7dGT lowest price %Δ7dGT, %current
gt_asof_atGT as ofGT, timestampcurrent
tmr_lowest_price_currentTM resale lowest priceTM Resale, $current
tmr_lowest_aip_price_currentTM resale all-inTM Resale, $current
tmr_median_price_currentTM resale median priceTM Resale, $current
tmr_median_aip_price_currentTM resale median all-inTM Resale, $current
tmr_tickets_currentTM resale ticketsTM Resale, countcurrent
tm_asof_atTM as ofTM, timestampcurrent
aq_get_in_price_currentAQ B2B get-inAQ B2B, $current
aq_average_price_currentAQ B2B averageAQ B2B, $current
aq_listings_currentAQ B2B listingsAQ B2B, countcurrent
aq_tickets_currentAQ B2B ticketsAQ B2B, countcurrent
aq_asof_atAQ B2B as ofAQ B2B, timestampcurrent
tm_percent_remainingPrimary remainingInventory & demand, %current
event_nameEventEvent & timing, textcurrent
data_quality_scoreData qualityMomentum & signals, fractioncurrent
days_to_eventDays to eventEvent & timing, dcurrent
absorption_count_1dAbsorbed 1dcountcurrent
absorption_count_7dAbsorbed 7dInventory & demand, countcurrent
absorption_settled_7dAbsorbed 7d (settled)Inventory & demand, countcurrent
absorption_rate_7dAbsorption rate 7dInventory & demand, fractioncurrent
listings_added_count_1dAdded 1dcountcurrent
listings_added_count_7dAdded 7dInventory & demand, countcurrent
absorption_grainAbsorption coverageInventory & demand, textcurrent
absorption_data_qualityAbsorption qualityfractioncurrent
absorption_asof_dateAbsorption as ofdatecurrent
lowest_price_pct_7dLowest price %Δ7dPricing, %current
median_price_delta_7dMedian price Δ7dPricing, $current
median_price_delta_14dMedian price Δ14dPricing, $current
median_price_delta_28dMedian price Δ28dPricing, $current
median_price_pct_7dMedian price %Δ7dPricing, %current
p25_price_pct_7dP25 price %Δ7dPricing, %current
p75_price_pct_7dP75 price %Δ7dPricing, %current
median_price_7d_agoMedian price 7d agoPricing, $current
resale_to_primary_aip_ratioResale / primary all-inPricing, xcurrent
vs_to_tmr_aip_ratioVS / TM resale all-inPricing, xcurrent
vs_minus_tmr_aip_spreadVS minus TM resale all-inPricing, $current
sh_interestSH interestSH, peoplecurrent
sh_interest_d1SH interest Δ1dSH, peoplecurrent
sh_interest_d7SH interest Δ7dSH, peoplecurrent
sh_sales_24hSH sales 24hSH, countcurrent
sh_sales_7dSH sales 7dSH, countcurrent
sh_sales_30dSH sales 30dSH, countcurrent
sh_sales_hours_24hSH hours read 24hSH, countcurrent
sh_sales_hours_7dSH hours read 7dSH, countcurrent
sh_sales_hours_30dSH hours read 30dSH, countcurrent
sh_interest_nowSH interest nowSH, peoplecurrent
sh_demand_readsSH readingsSH, countcurrent
sh_selling_fastSelling fastSH, booleancurrent
sh_demand_now_atSH interest now as ofSH, timestampcurrent
sh_demand_asof_dateSH interest as ofSH, datecurrent
sh_signals_asof_atSelling fast as ofSH, timestampcurrent
tm_lowest_price_currentTM lowest priceTM, $current
tm_lowest_aip_price_currentTM lowest all-inTM, $current
tm_tickets_currentTM ticketsTM, countcurrent
tm_tickets_delta_1dTM tickets Δ1dTM, countcurrent
tm_tickets_delta_7dTM tickets Δ7dTM, countcurrent
tm_lowest_price_delta_7dTM lowest price Δ7dTM, $current
tm_lowest_aip_price_delta_7dTM lowest all-in Δ7dTM, $current
tm_lowest_aip_price_pct_7dTM lowest all-in %Δ7dTM, %current
tm_tickets_pct_3dTM tickets %Δ3dTM, %current
inventory_velocity_1dInv velocityInventory & demand, fractioncurrent
listings_delta_1dListings Δ1dcountcurrent
listings_delta_7dListings Δ7dInventory & demand, countcurrent
listings_pct_1dListings %Δ1dInventory & demand, %current
listings_pct_7dListings %Δ7dInventory & demand, %current
lowest_aip_price_delta_1dLowest all-in Δ1d$current
lowest_aip_price_delta_7dLowest all-in Δ7d$current
lowest_aip_price_pct_1dLowest all-in %Δ1d%current
lowest_aip_price_pct_7dLowest all-in %Δ7d%current
lowest_price_delta_1dLowest price Δ1d$current
lowest_price_delta_7dLowest price Δ7d$current
lowest_price_pct_1dLowest price %Δ1d%current
median_price_delta_1dMedian price Δ1d$current
median_price_pct_1dMedian price %Δ1d%current
pace_z_3d_vs_14dPace zMomentum & signals, σcurrent
pace_z_3d_vs_14d_pct_rank_subcat_ttePace z rank (peer)percentilecurrent
pace_z_3d_vs_14d_xs_z_subcat_ttePace z (peer)Momentum & signals, σcurrent
peer_n_subcat_ttePeer countcountcurrent
peer_n_tour_tteTour peer countcountcurrent
price_self_z_7d_xs_z_tour_ttePrice z (tour)σcurrent
pace_z_3d_vs_14d_xs_z_tour_ttePace z (tour)σcurrent
vol_regime_ratio_xs_z_tour_tteVol regime (tour)σcurrent
inventory_velocity_1d_xs_z_tour_tteInv velocity (tour)σcurrent
price_self_z_1dPrice z 1dMomentum & signals, σcurrent
price_self_z_7dPrice z 7dMomentum & signals, σcurrent
price_self_z_7d_pct_rank_subcat_ttePrice z rank (peer)percentilecurrent
price_self_z_7d_xs_z_subcat_ttePrice z (peer)Momentum & signals, σcurrent
tickets_delta_1dTickets Δ1dcountcurrent
tickets_delta_7dTickets Δ7dInventory & demand, countcurrent
tickets_pct_1dTickets %Δ1dInventory & demand, %current
tickets_pct_7dTickets %Δ7dInventory & demand, %current
vol_regime_ratioVol regimeMomentum & signals, xcurrent
vol_regime_ratio_pct_rank_subcat_tteVol regime rank (peer)percentilecurrent
vol_regime_ratio_xs_z_subcat_tteVol regime (peer)σcurrent
inventory_velocity_1d_pct_rank_subcat_tteInv velocity rank (peer)percentilecurrent
inventory_velocity_1d_xs_z_subcat_tteInv velocity (peer)σcurrent
volatility_7dVol 7dMomentum & signals, %current
volatility_14dVol 14dMomentum & signals, %current
volatility_28dVol 28dMomentum & signals, %current
interest_d1Interest Δ1dDemand, peoplecurrent
interest_d7Interest Δ7dDemand, peoplecurrent
conversionConversionDemand, xcurrent
sales_24hSales 24hDemand, countcurrent
sales_7dSales 7dDemand, countcurrent
sales_30dSales 30dDemand, countcurrent
orders_24hOrders 24hDemand, countcurrent
orders_7dOrders 7dDemand, countcurrent
orders_30dOrders 30dDemand, countcurrent
interest_nowInterest nowDemand, peoplecurrent
demand_now_atInterest now as ofDemand, timestampcurrent
demand_asof_dateDemand as ofDemand, datecurrent
weather_stateWeather stateWeather, categorycurrent
weather_skyWeatherLocation, categorycurrent
weather_rain_chanceRain chanceWeather, %current
weather_rain_inRainWeather, incurrent
weather_wind_mphWindWeather, mphcurrent
weather_feels_like_fFeels likeWeather, °Fcurrent
venue_roofRoofWeather, categorycurrent
tm_percent_remaining_delta_7dPrimary remaining Δ7dInventory & demand, %current
tm_ga_tickets_currentPrimary GA tickets remainingInventory & demand, countcurrent
tm_ga_asof_atGA as ofInventory & demand, timestampcurrent
p25_price_delta_1dP25 price Δ1d$current
p25_price_delta_7dP25 price Δ7d$current
p25_price_pct_1dP25 price %Δ1d%current
p75_price_delta_1dP75 price Δ1d$current
p75_price_delta_7dP75 price Δ7d$current
p75_price_pct_1dP75 price %Δ1d%current
p25_price_self_z_7dP25 z 7dσcurrent
p25_price_self_z_7d_pct_rank_subcat_tteP25 z rank (peer)percentilecurrent
p25_price_self_z_7d_xs_z_subcat_tteP25 z (peer)σcurrent
p25_price_self_z_7d_xs_z_tour_tteP25 z (tour)σcurrent
withheldcurrent

Other routes

None of these take columns. The analytics pair answers one flat reading per event, history answers a list of points stamped as_of_date, search answers ids only, and the performer route answers a rank position and its series.

GET /api/feed/v1/events/{eventId}/analytics

1 unit

The current reading for one event: lowest, median, p25 and p75 price, the face-value set, listings, tickets, percent remaining, interest and sales. Values are as of computed_at.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

POST /api/feed/v1/events/analytics

1 unit per event id returned

The same reading for many events, in the envelope the shopping batch already uses.

event_idsRequired array of Ticker event ids, each ev plus ten characters. Every id form the single-event routes take works here too, and two spellings of one event are one event and one unit. Duplicates collapse before the bound applies, and an id the catalog does not know, or one in a form the API cannot read, comes back under meta.missing rather than failing the call. meta.units_charged states what the call cost.

GET /api/feed/v1/events/{eventId}/history

1 unit, whatever days

Price, inventory and demand for one event across the days window, one point per as_of_date, each as of its own computed_at.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.
daysDefaults to the published cap and stays at that cap: a larger value returns the cap and sets meta.days_capped, never an error.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/series/{source}

1 unit, whatever range

One event's prices and inventory over time from one source, oldest first, with the same field names on every source and null where a source lacks the concept. Never mix a primary and a resale source into one line.

eventIdPath. A Ticker event id, ev plus ten characters, a marketplace id with its source prefix, or a marketplace event link, URL-encoded. An id two events share is answered 409 with both their ids.
sourcePath. The source code: tm is the primary market at face value, tmr its resale market, sgp a primary market, mlb a club's primary market, and vs, tp, gt, sg, sh, aq, axs and axsr the others. A source the key's plan does not include is a 402. An unmapped source answers 200 with mapped false and an empty series.
rangeHow far back the points reach: 3d, 7d, 14d, 28d, 30d, 90d or all, counted back from today, or from the event's date once it has happened. Leave it out for every point.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/sections

1 unit, whatever the sections and whatever days

Current price and inventory per section of the house for one event, and optionally each section's history.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.
daysOptional. Omit it for current levels only. Pass it to attach a history to every section: points stamped as_of_date and snapshot_time, the time of the last reading behind each point. It stays at the published cap: a larger value returns the cap and sets meta.days_capped, never an error. Sections are keyed by the label printed on a ticket, and meta.truncated says whether the window was shortened at the oldest end to keep the payload sane.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/sections/live

1 unit

Live section capacity: seats open now per section, with the section's capacity and the share of it no longer open.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. A known event with no live reading answers 200 with meta.covered false; 404 is only an id the catalog does not know. Per section you get open_count, capacity, percent_taken, is_general_admission, base_section, min_price, median_price and max_price. percent_taken is capacity minus the open seats: a seat that sold, one held back and one withdrawn all count the same. capacity is null, never 0, when the seat map states none, and covered false means no live reading rather than an empty house.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.
sourceOptional. tm (the default), the primary seat log, or mlb, a club's own primary market, its sections by the name a fan reads.

GET /api/feed/v1/events/{eventId}/seats/live

1 unit, whatever the seat count

Every reserved seat of one event open for sale now, as place indexes on the seat map that seat_map_token names, with each seat's price and its price after fees in the same order.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event without a live seat reading answers meta.covered false. count is the true total. held true marks the previous answer, age_seconds old. The seat map route names the seats behind the indexes.
sourceOptional. tm (the default), the primary seat log, or mlb, a club's own primary market. An mlb seat read covers one seat frame at a time: list them with the section frames route and source=mlb, and pass one as frame.
frameWith source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/seats/at

1 unit, whatever the seat count

The reserved seats of one event open for sale at one past instant, as place indexes on the current seat map, so they line up with the live seat route and the seat map.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event without a seat reading answers meta.covered false. A seat open then that the current map has no place for is counted in unplaced, and method says how the answer was put together.
atRequired, ISO 8601. The instant to read; one in the future reads as now. With source=tm the answer has no prices; with source=mlb each seat carries its price at that instant.
sourceOptional. tm (the default), the primary seat log, or mlb, a club's own primary market. An mlb seat read covers one seat frame at a time: list them with the section frames route and source=mlb, and pass one as frame.
frameWith source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/seats/recent

1 unit, whatever the seat count

The reserved seats of one event that came on sale or went off sale in the last few minutes, newest first, each with its latest change and how many times it changed.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event without a live seat reading answers meta.covered false. A seat that went off sale was taken or pulled. meta.truncated says more seats moved than one answer holds.
minutesOptional. How far back to look, 15 by default, at most 120.
sectionOptional. Only the seats of this section, by its ticket code.
sourceOptional. tm (the default), the primary seat log, or mlb, a club's own primary market. An mlb seat read covers one seat frame at a time: list them with the section frames route and source=mlb, and pass one as frame.
frameWith source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/ga-history

1 unit a call or a page

How many tickets each general admission section of one event had open over time, with its peak and its last change.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. A known event with no live reading answers 200 with meta.covered false; 404 is only an id the catalog does not know. Per section you get open_count, peak_open_count, peak_at, observed_additions, observed_removals, first_observed_at, last_changed_at and removed_at. The additions and removals are observed changes: a returned or re-released ticket adds again.
sectionOptional. A general admission section's code. Adds that section's exact points, oldest first, one per observed change; meta.next_cursor pages the rest.
occurrenceOptional, 0 unless the event lists the code twice. section and occurrence together name one section.
cursorOptional. meta.next_cursor from the previous page.
sourceOptional. tm (the default), the primary seat log, or mlb, a club's own primary market. An mlb seat read covers one seat frame at a time: list them with the section frames route and source=mlb, and pass one as frame.

GET /api/feed/v1/events/{eventId}/inventory

1 unit, whatever the days

How many seats were open over time on one event, on primary and on resale.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.
daysOptional. How far back to read. It stays at the published cap: a larger value returns the cap and sets meta.days_capped, never an error. Primary and resale are read in one pass and stamped seconds apart, so both land on one point; a null on either means that pass did not read it, never zero.

GET /api/feed/v1/events/{eventId}/section-frames

1 unit, whatever the sections and whatever the window

Every section's open seat count at each step across a window, in one answer, so you can replay how one event drained.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.
sinceOptional, ISO 8601. Leave it out and the window is the event's own history, at most 90 days back and never past the key plan's history depth. An event with no section readings answers an empty frame list rather than a 404.
untilOptional, ISO 8601. Defaults to now.
intervalOptional step size, 5m, 15m, 1h, 6h or 1d. Ask for one too fine for the window and a wider one is served, never a shorter window; meta.interval says which and meta.coarsened says it happened. At most 288 steps, so the step follows the window: fifteen minutes across one date, one date a step across a season. counts[i] and min_prices[i] are sections[i]'s open seats and cheapest open seat at that step. counts[i] is sections[i] at that step, and null there means that section has no reading at or before it, which is not the same as zero. total is the whole house at that step and is null until every section in sections has been read at least once; sections_read says how many of them have, and adding counts up yourself gives the part that was read.
sourceOptional. tm (the default) for every section's counts across the window, or mlb for a club's primary market's own seat frames, one per map of its own; the seat routes with source=mlb take one as frame.

GET /api/feed/v1/events/{eventId}/sale-windows

1 unit

When one event goes on sale, and to whom before that: the named presale windows and the public window.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404.

GET /api/feed/v1/events/{eventId}/weather

1 unit

The weather for one event's own local day, the card the event page shows: high and low, the sky, the chance and total of rain, wind and gusts, the feels-like at the start hour, the event's Weather state and the venue's roof.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. weather is null when no forecast covers the day: no venue location, or a day more than 15 days out. A field the reading lacks is absent, never 0, and under a fixed roof sky is indoor with no Weather state.

GET /api/feed/v1/events/{eventId}/research

1 unit

The event's newest stored research brief, the one its page shows: dated, cited coverage of the event and its performers, each item a short fact with where it was published.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. Read only: this route never gathers a new brief, so research is null for an event nobody has researched yet. research carries status, summary, payload.items (each with date, fact and its url when there is one), fetched_at, which says how old the brief is, and cached.

GET /api/feed/v1/events/{eventId}/sales

1 unit

One event's completed resale sales, newest first. Section, row and price are the listing's last listed state before the sale.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404.
sectionOnly sales whose section contains this text, in any case.
rowOnly sales in this row, exact, in any case.
date_fromSales at or after this time. A bare date starts at 00:00 UTC.
date_toSales before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSales per page, at most 100.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/sales/primary

1 unit

One event's sections ranked by primary seats taken in the window: the net drop in open seats.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404.
sectionOnly sections whose code contains this text, in any case.
date_fromSeats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSeats taken before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSections per page, at most 100.

GET /api/feed/v1/events/{eventId}/sales/sections

1 unit

One event's sections with a count for every date (UTC), most first. Markets are never summed.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404.
marketvs (the default): completed resale sales in the section on each date. sh: how many of the date's readings named the section among the best selling, with the date's count of readings beside it.
daysHow many dates, today last: 7 (the default), 14 or 28.

GET /api/feed/v1/events/{eventId}/sales/top

1 unit

One event, or its sections, ranked by completed resale sales or by primary seats taken over the window. At most 50 rows; total and truncated say how many the ranking had.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404.
marketsecondary (the default): completed resale sales. primary: primary seats taken.
windowHow far back: 1h (the default), 6h, 24h or 7d.
byevent (the default) ranks events; section ranks the sections of those events.

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

1 unit a page, whatever the page holds

What happened to one seat: when it was first seen, every price it was re-listed at, every period it was not for sale, and whether it has gone. With scope, every seat of a section or of the event that changed, 100 seats a page.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event without a per-seat reading answers meta.covered false with an empty list rather than a 404.
place_indexNames the seat by its index in the seat map's index space, which the seat position read returns. Pass this or the section, row and seat trio, not neither, unless scope is section or event.
sectionWith row and seat, names the seat the way a ticket prints it. All three are required together. With scope section, the section to read.
rowWith section and seat, names the seat the way a ticket prints it.
seatWith section and row, names the seat the way a ticket prints it.
scopeOptional. seat (the default) reads one seat. section reads every seat of section that changed in the window, event every seat of the event: 100 seats a page in seat order, each with its changes (at most 200 a seat; a longer seat is truncated and carries its own next_cursor), and meta.next_cursor for the next seats. Each seat's place_index is its index on the event's current seat map, the one the seat routes take, and null when the seat is not on the current map; section, row and seat still name it. One unit a page.
daysOptional. How far back to read, 90 days by default. It stays at the published cap rather than erroring. A change is one of listed, repriced, unavailable or gone; gone means sold or pulled and is only ever set on a seat that has not come back.
cursorOptional. meta.next_cursor from the previous page: a seat's older changes, or with scope section or event the next seats. A seat with a long history comes in pages, newest first, and the pages join end to end into the seat's whole list. Keep days the same across pages. gone is only ever on the first page.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.
sourceOptional. tm (the default), the primary seat log, or mlb, a club's own primary market. An mlb seat read covers one seat frame at a time: list them with the section frames route and source=mlb, and pass one as frame.
frameWith source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb.

GET /api/feed/v1/events/{eventId}/seat-map

1 unit, whatever the seat count

An event's whole primary seat map in one answer: every section, every row in it, and every seat name in the row.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event with no primary seat map answers meta.covered false with an empty list rather than a 404. A seat map covers one event; for a venue, list its events with the venue schedule route and read each one.
versionOptional. A seat_map_token an earlier answer reported (a seat_map_version from an older answer is read too); defaults to the current one. A token never changes what it names, and place_start plus a seat's position in seats is the place_index the seat history route takes under the same version. first_seat and last_seat are set only where every name in the row is a whole number that steps by one; seats is the full list either way. General admission sections come with ga true, the count the map states and no rows. A large house is several hundred kilobytes, so send Accept-Encoding: gzip.

GET /api/feed/v1/events/{eventId}/listings

1 unit a page

The listings on sale for one event, one per row: source, section, row, quantity, price before and after fees, face value, and when the listing last changed. No seller is named or identified and no score is attached.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. An event with no listings answers an empty page.
sourceOptional. One source code: vs, sh, sg or tmr. Defaults to every source the event has; sources in the answer lists them.
cursorOptional. meta.next_cursor from the previous page, with the same source. 500 listings a page. The first page fixes as_of and every later page answers at that instant, so the pages join end to end. section is the key the sections and section map routes use. Send Accept-Encoding: gzip.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/section-map

1 unit

An event's section map as GeoJSON shapes in page pixels, with every section and the shape that draws it.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. An event with no section map answers meta.covered false with empty lists rather than a 404. sections[].section joins the sections and listings routes; sections[].code joins the seat map and live sections routes. geometry_version names the drawing and is the ETag; keep the answer for a day. Send Accept-Encoding: gzip.

GET /api/feed/v1/events/{eventId}/section-levels

1 unit

Every section of one event with its level, the sections close to it on that level and the section opposite it. Every row says which source answered each part; a level is never guessed.

eventIdPath. A Ticker event id, ev plus ten characters, a marketplace id with its source prefix, or a marketplace event link, URL-encoded. An id two events share returns 409 with both event ids. section_key joins the listings, sections and section map routes. Send Accept-Encoding: gzip.

GET /api/feed/v1/events/{eventId}/seller-concentration

1 unit

How concentrated an event's inventory is among the sellers behind it, as counts and shares. No seller is named or identified.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event with no reading yet answers concentration null.

GET /api/feed/v1/events/{eventId}/seller-market

1 unit

The market of chosen sellers on one event: their price series over a range, and their current listings per section. Sellers are named by the letters the seller series draws. No seller is identified.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404.
sellersRequired. Seller letters, A,F. Only a seller whose peak live listings over the range reached 10 can be chosen; any other letter selects nothing, and sellers in the answer lists the letters that did.
rangeOptional. 3d, 7d, 30d, 90d or all, 7d by default.
sectionsOptional. Section ids as the sections route keys them. Given, both the series and the listings are those sellers inside those sections.
currencyOptional. usd (the default) or venue. With venue, an event at a Canadian venue answers every price in Canadian dollars at one exchange rate for the event, so the cheapest market and any sort order are the same in both; the answer then names currency, venue_currency, fx_rate and fx_rate_date. An event in the US is always in USD.

GET /api/feed/v1/events/{eventId}/seller-series

1 unit

The same block as one point per hour across the window, an hour with no reading being a point of nulls: how many sellers held inventory in that hour, how many of the event's tickets had a known seller of record, and one line per seller with what it held. No seller is named or identified.

eventIdPath. A Ticker event id, ev plus ten characters, as returned by the search route. A marketplace id also resolves when it carries its source prefix (vs:, tm:, tp:), and a bare marketplace id resolves until 2027-09-13. An id the catalog does not know returns 404. An event with no readings yet answers series null.
hoursOptional. How many of the most recent hours to return, 168 by default. It stays at the published cap of 720 rather than erroring. A seller gets a line once it has been among the five largest of an hour, or once it has grown into the event without reaching them, and it keeps that line for the rest of the window. Labels are the order the sellers first appear inside the window, not a rank, and they do not carry across events or across calls with a different window.

GET /api/feed/v1/search

1 unit

Resolves a name to the Ticker event ids and performer ids the reading routes accept. Ids only, no readings.

qRequired. At least two letters or digits; the % _ and * wildcards are a 400.
limitHow many matches to return, at the published search cap.

GET /api/feed/v1/venues

1 unit

Venues by name, or by state, country and capacity range, best name match first, each with its count of upcoming events. Only venues with upcoming events are listed.

nameThe venue name, or part of it, at least two letters. Use the official name, not a nickname. Optional when state, country, capacity_min or capacity_max is given.
stateOnly venues in this state or province, like TX: the region code where the venue has one, its country code otherwise.
countryOnly venues in this country, by two-letter code.
capacity_minOnly venues that hold at least this many people. A venue whose capacity is not known is left out when either bound is given.
capacity_maxOnly venues that hold at most this many people.
limitMost venues to return. Default 5; a larger value returns at most 25, never an error.

GET /api/feed/v1/performers/{performerId}

1 unit

A performer's current popularity rank, the raw aggregates behind it, and a rank series of points stamped snapshot_date. Rank is published as a position, never as its inputs.

performerIdPath. A Ticker performer id, pf plus ten characters, which the search route returns under performers. A marketplace id also resolves with its vs: prefix, and bare until 2027-09-13.

GET /api/feed/v1/performers/{performerId}/history

1 unit

One performer over time, one row per date, oldest first: its ranks, its prices across its events, or its X totals. A date with no reading has no row.

performerIdPath. The performer id, as the search route returns it. An id the catalog does not know returns 404.
seriesrank (the default): the popularity and lifetime ranks, higher is better and null is unranked. price: the mean get-in and median across the performer's events, before fees and all-in. social: the raw X totals.
rangeHow far back: 7d, 14d, 28d (the default), 90d or all, about a year.

GET /api/feed/v1/venues/{venueId}/schedule

1 unit per event returned

A venue's identity and everything on there inside a forward window, soonest first. The same rows the venue's public page shows: name, date, sale dates and the get-in price.

venueIdPath. A Ticker venue id, vn plus ten characters, which the search route returns under venues. A marketplace id also resolves with its vs: prefix, and bare until 2027-09-13.
daysHow far forward to look. Default 30, maximum 365.
limitMost events to return, at most 200. Each one costs a unit, so a narrow window costs less than a wide one.

GET /api/feed/v1/performers/{performerId}/sales

1 unit

A performer's events' completed resale sales, newest first. Section, row and price are the listing's last listed state before the sale.

performerIdPath. The performer id, as the search route returns it. An id the catalog does not know returns 404.
sectionOnly sales whose section contains this text, in any case.
rowOnly sales in this row, exact, in any case.
date_fromSales at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSales before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSales per page, at most 100.

GET /api/feed/v1/performers/{performerId}/sales/primary

1 unit

A performer's events' sections ranked by primary seats taken in the window: the net drop in open seats.

performerIdPath. The performer id, as the search route returns it. An id the catalog does not know returns 404.
sectionOnly sections whose code contains this text, in any case.
date_fromSeats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSeats taken before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSections per page, at most 100.

GET /api/feed/v1/performers/{performerId}/sales/top

1 unit

A performer's events, or their sections, ranked by completed resale sales or by primary seats taken over the window.

performerIdPath. The performer id, as the search route returns it. An id the catalog does not know returns 404.
marketsecondary (the default): completed resale sales. primary: primary seats taken.
windowHow far back: 1h (the default), 6h, 24h or 7d.
byevent (the default) ranks events; section ranks the sections of those events.

GET /api/feed/v1/venues/{venueId}/sales

1 unit

A venue's events' completed resale sales, newest first. Section, row and price are the listing's last listed state before the sale.

venueIdPath. The venue id, as the search route or the venues route returns it. An id the catalog does not know returns 404.
sectionOnly sales whose section contains this text, in any case.
rowOnly sales in this row, exact, in any case.
date_fromSales at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSales before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSales per page, at most 100.

GET /api/feed/v1/venues/{venueId}/sales/primary

1 unit

A venue's events' sections ranked by primary seats taken in the window: the net drop in open seats.

venueIdPath. The venue id, as the search route or the venues route returns it. An id the catalog does not know returns 404.
sectionOnly sections whose code contains this text, in any case.
date_fromSeats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSeats taken before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSections per page, at most 100.

GET /api/feed/v1/venues/{venueId}/sales/top

1 unit

A venue's events, or their sections, ranked by completed resale sales or by primary seats taken over the window.

venueIdPath. The venue id, as the search route returns it. An id the catalog does not know returns 404.
marketsecondary (the default): completed resale sales. primary: primary seats taken.
windowHow far back: 1h (the default), 6h, 24h or 7d.
byevent (the default) ranks events; section ranks the sections of those events.

GET /api/feed/v1/sales

1 unit

The completed resale sales of the events the key holder watches, newest first. Section, row and price are the listing's last listed state before the sale. One event's, performer's or venue's sales are on their own routes.

scopeRequired. watchlist: only the events the key holder watches, with their team's shared stars and without archived ones. A call without it is a 400.
sectionOnly sales whose section contains this text, in any case.
rowOnly sales in this row, exact, in any case.
date_fromSales at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSales before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSales per page, at most 100.

GET /api/feed/v1/sales/primary

1 unit

The sections of the events the key holder watches, ranked by primary seats taken in the window.

scopeRequired. watchlist: only the events the key holder watches, with their team's shared stars and without archived ones. A call without it is a 400.
sectionOnly sections whose code contains this text, in any case.
date_fromSeats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours.
date_toSeats taken before this time. A bare date is included whole.
pageThe page to read, from 1.
limitSections per page, at most 100.

GET /api/feed/v1/sales/top

1 unit

Every event, or with scope the events the key holder watches, ranked by completed resale sales or by primary seats taken over the window. At most 50 rows; total and truncated say how many the ranking had.

scopewatchlist: only the events the key holder watches. Leave it out to rank the whole market.
marketsecondary (the default): completed resale sales. primary: primary seats taken.
windowHow far back: 1h (the default), 6h, 24h or 7d.
byevent (the default) ranks events; section ranks the sections of those events.

GET /api/feed/v1/leagues

1 unit

Every league with a League page: its key, name, sport and where its season stands.

GET /api/feed/v1/leagues/{league}/games

1 unit per game returned, 1 unit for an empty page

A league's upcoming games, soonest first, one section and one page at a time, each with its market: the League page's read. Market columns follow the key's plan the way the screener's do.

leaguePath. The league key, for example mlb, in any case: MLB reads as mlb. The leagues route lists them. An unknown league returns 404.
teamOnly this team's games, by the team key from teams. An unknown team returns 404.
schedule_sectionpostseason or season. Default: the postseason while it has games, else the season.
sort_bydate (the default) or a market column. A column the key's plan does not include is refused with 402.
page_sizeGames per page, 50 by default, 100 at most. Each game costs a unit.

GET /api/feed/v1/leagues/{league}/games/{eventId}

1 unit

One game of the league with its market, the row the League page shows, and where the playoff bracket places it.

eventIdPath. A Ticker event id. An event that is not a game of the league returns 404.

GET /api/feed/v1/leagues/{league}/bracket

1 unit per linked event, 1 unit when none is linked

The league's season phase and its playoff bracket: each series with its state, wins and game dates, each game linked to its event when Ticker has it.

GET /api/feed/v1/leagues/{league}/standings

1 unit

The league's regular-season standings by conference, then division: wins, losses, ties and win percentage per club. Null conferences outside the regular season.

GET /api/feed/v1/usage

0 units

This account's feed spend: today's budget, what each key spent today, and 30 UTC days of history.

Views and screens

These answer with a set of events rather than a reading for an id. A saved View is one you built in the product and the key reads back its current matches, the Matches it recorded, and the account's Watchlist. A screen takes the question in plain language, compiles it with the same model the product's own screener uses, and returns the matching list together with the filter that ran, so nothing about the answer is opaque.

GET /api/feed/v1/views

1 unit

The saved Views on the key's own account, each with the columns its filter reads.

GET /api/feed/v1/views/{viewId}

1 unit

One saved View, in the shape the Views route lists it.

viewIdPath. A View id from the Views route. A View on another account, or beyond the plan's View limit, returns 404.

GET /api/feed/v1/views/{viewId}/results

1 unit per event returned

The events one saved View matches right now, with the filter that ran. Values are as of computed_at.

viewIdPath. A View id from the Views route. A View on another account returns 404, the same answer as a View that does not exist.
pageWhich page of matches to return. Defaults to the first.
limitMatches per page, at the published page cap. Every match returned costs a unit.

GET /api/feed/v1/views/{viewId}/matches

1 unit a page

The Matches one View recorded, newest first: each event that entered it, when, its numbers frozen at that moment, and whether an Alert email carried it.

viewIdPath. A View id from the Views route. A View on another account, or beyond the plan's View limit, returns 404.
pageWhich page of Matches to return. Defaults to the first.
limitMatches per page. Default 20, at most 100.
sinceOnly Matches recorded at or after this time.
delivery_statusOnly Matches in this delivery state: sent, not_sent, pending or not_applicable.
orderdesc (the default), newest first, or asc.

GET /api/feed/v1/matches

1 unit a page

The Matches of every View the key holder reads, starred events included, newest first. A Locked View's Matches are left out. meta.has_more says whether another page follows.

pageWhich page of Matches to return. Defaults to the first.
limitMatches per page. Default 20, at most 100.
sinceOnly Matches recorded at or after this time.
delivery_statusOnly Matches in this delivery state: sent, not_sent, pending or not_applicable.
orderdesc (the default), newest first, or asc.

GET /api/feed/v1/matches/{matchId}

1 unit

One Match, in the shape the Match lists serve.

matchIdPath. A Match id from a Match list. A Match on a View the key holder does not read, or on a Locked View, returns 404.

GET /api/feed/v1/watchlist

1 unit a page

The events the key holder and their team have starred, as the Watchlist lists them: each with its current prices, its armed triggers, its Alert count and whether it still alerts.

pageWhich page to return. Defaults to the first.
limitStars per page. Default 50, at most 100.
searchOnly events whose name contains this.
sortcreated_at (the default), utc_date or event_name.
orderdesc (the default) or asc.
archivedStars of events that ended over a week ago: exclude (the default), include or only.

POST /api/feed/v1/screen

1 unit per event returned, plus one assist request

Ask for events in plain language and get the matching list back with the filter the question compiled to. Values are as of computed_at.

queryRequired. The question in plain language, not a filter. It is compiled by the same model the product's own screener uses, and the compiled filter comes back in the response so you can see what ran.
pageWhich page of matches to return. Defaults to the first.
limitMatches per page, at the published page cap. Omit to let the question decide, within that cap.

GET /api/feed/v1/screen/presets

1 unit

The preset screens, in order: each one's key, name, filter, sort and columns, the plan its filter needs and whether the key's plan holds it. Pass a key as preset to the screen route.

Rows carry the analytics reading, the same set the analytics route serves. A screen spends one screener run from the account's plan and the rows spend budget units, so a question that matches fifty events costs fifty units and one screener run. The compile spends nothing of its own.

Screen request
curl -s -X POST \
  -H "Authorization: Bearer $TICKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"events under $80 with more than 200 listings"}' \
  "https://api.findticker.com/api/feed/v1/screen"
Screen response
{
  "query": "events under $80 with more than 200 listings",
  "predicate": {
    "all": [
      { "col": "ea.median_price_current", "op": "<", "val": 80 },
      { "col": "ea.listings_current", "op": ">", "val": 200 }
    ]
  },
  "sort": null,
  "note": null,
  "total": 143,
  "rows": [ { "event_id": "...", "median_price_current": 62, "listings_current": 318 } ],
  "meta": { "page": 1, "limit": 50, "returned": 50, "units_charged": 50 }
}

Freshness

How current each route's answer is, and the field that says so. A reading carries the time it was computed; read that field rather than assuming an age. History runs from the first reading to today, and no reading is overwritten.

RouteHow current
GET /api/feed/v1/events/{eventId}/shoppingAs of computed_at. The series is a list of points, each stamped with its snapshot_date.
POST /api/feed/v1/events/shoppingAs of computed_at.
GET /api/feed/v1/events/{eventId}/analyticsAs of computed_at.
POST /api/feed/v1/events/analyticsAs of computed_at.
GET /api/feed/v1/events/{eventId}/historypoints stamped as_of_date, each with its own computed_at; days reaches 30 back at most.
GET /api/feed/v1/events/{eventId}/series/{source}One point per UTC date, oldest first, from the first point Ticker holds or range back.
GET /api/feed/v1/events/{eventId}/inventoryOne point per reading, 30 days back at most.
GET /api/feed/v1/events/{eventId}/section-framesCounts carry forward between readings; as_of says how old the newest reading behind each step is.
GET /api/feed/v1/events/{eventId}/sale-windowsThe sale dates the event states.
GET /api/feed/v1/events/{eventId}/weatherThe latest stored forecast for the event's day, or null when no forecast covers it.
GET /api/feed/v1/events/{eventId}/researchThe newest stored brief; fetched_at says when it was gathered, whatever its age.
GET /api/feed/v1/events/{eventId}/sectionsThe latest reading per section, as of as_of; with days, each section carries a history of points stamped as_of_date and snapshot_time.
GET /api/feed/v1/events/{eventId}/seat-mapThe seat map under seat_map_token; a token never changes what it names.
GET /api/feed/v1/events/{eventId}/listingsAs of as_of, the newest observation of the event in the sources served; every page of one walk answers at the same as_of.
GET /api/feed/v1/events/{eventId}/section-mapThe drawing under geometry_version; a version never changes what it draws.
GET /api/feed/v1/events/{eventId}/salesCompleted sales as recorded at the time of the call, newest first; each sale carries its sold_at.
GET /api/feed/v1/events/{eventId}/sales/primarySeats taken at the time of the call; each section carries last_at, the newest change behind its count.
GET /api/feed/v1/events/{eventId}/sales/sectionsOne count per date in days, today last; today's count grows until the date ends.
GET /api/feed/v1/events/{eventId}/sales/topRanked over window, counted at the time of the call.
GET /api/feed/v1/events/{eventId}/seat-historyEvery change to the seat since it was first seen, newest first; with scope, every seat of a section or of the event that changed in the window, in seat order.
GET /api/feed/v1/events/{eventId}/sections/liveThe live state of the house at the time of the call, not a computed reading.
GET /api/feed/v1/events/{eventId}/seats/liveThe live state of the house at the time of the call, as of as_of; held with age_seconds says when it is the last answer that could be served.
GET /api/feed/v1/events/{eventId}/seats/atThe seats open at at, placed on the current seat map; as_of says when the reading behind the answer was taken.
GET /api/feed/v1/events/{eventId}/seats/recentThe changes in the last minutes before the call, newest first, from since.
GET /api/feed/v1/events/{eventId}/ga-historyEach general admission section's changes over time; sections/live reads what is open now.
GET /api/feed/v1/events/{eventId}/section-levelsThe levels as Ticker holds them at the time of the call; each part names the source that answered it.
GET /api/feed/v1/events/{eventId}/seller-concentrationThe latest reading for the event, or null when there is none yet.
GET /api/feed/v1/events/{eventId}/seller-seriesOne point per hour across the window; an hour with no reading is a point of nulls, not a gap.
GET /api/feed/v1/events/{eventId}/seller-marketOne point per reading across the range, plus the current listings per section.
GET /api/feed/v1/searchIds, not readings.
GET /api/feed/v1/venuesVenues as Ticker holds them at the time of the call, with their count of upcoming events.
GET /api/feed/v1/performers/{performerId}As of computed_at, with a rank history of points stamped snapshot_date, 30 days back.
GET /api/feed/v1/performers/{performerId}/historyRows stamped with their date, oldest first; the rank row for today comes from the current scores.
GET /api/feed/v1/venues/{venueId}/scheduleThe same rows the public venue page renders.
GET /api/feed/v1/performers/{performerId}/sales/topRanked over window, counted at the time of the call.
GET /api/feed/v1/venues/{venueId}/sales/topRanked over window, counted at the time of the call.
GET /api/feed/v1/performers/{performerId}/salesCompleted sales as recorded at the time of the call, newest first; each sale carries its sold_at.
GET /api/feed/v1/performers/{performerId}/sales/primarySeats taken at the time of the call; each section carries last_at, the newest change behind its count.
GET /api/feed/v1/venues/{venueId}/salesCompleted sales as recorded at the time of the call, newest first; each sale carries its sold_at.
GET /api/feed/v1/venues/{venueId}/sales/primarySeats taken at the time of the call; each section carries last_at, the newest change behind its count.
GET /api/feed/v1/salesCompleted sales as recorded at the time of the call, newest first; each sale carries its sold_at.
GET /api/feed/v1/sales/primarySeats taken at the time of the call; each section carries last_at, the newest change behind its count.
GET /api/feed/v1/sales/topRanked over window, counted at the time of the call.
GET /api/feed/v1/leaguesThe leagues as Ticker holds them at the time of the call.
GET /api/feed/v1/leagues/{league}/gamesThe rows the League page shows at the time of the call; each price carries as_of, when its newest reading was taken.
GET /api/feed/v1/leagues/{league}/games/{eventId}The same row, at the time of the call.
GET /api/feed/v1/leagues/{league}/bracketThe bracket as Ticker holds it at the time of the call.
GET /api/feed/v1/leagues/{league}/standingsThe standings as Ticker holds them at the time of the call; standings_read_at says when they were read.
GET /api/feed/v1/viewsThe Views as saved at the time of the call.
GET /api/feed/v1/views/{viewId}The View as saved at the time of the call.
GET /api/feed/v1/views/{viewId}/resultsAs of computed_at.
GET /api/feed/v1/views/{viewId}/matchesEach Match carries matched_at and its numbers as they were at that moment.
GET /api/feed/v1/matchesEach Match carries matched_at and its numbers as they were at that moment.
GET /api/feed/v1/matches/{matchId}The Match as recorded at matched_at.
GET /api/feed/v1/watchlistThe stars as saved at the time of the call; prices are the latest reading.
POST /api/feed/v1/screenAs of computed_at.
GET /api/feed/v1/screen/presetsThe presets as defined at the time of the call.
GET /api/feed/v1/usagecycle is the budget in force for the billing cycle (first, renews_on, limit, used, remaining, burst_per_minute, burst_per_hour, resets_at), written on every billed request; keys is what each key spent today; history is one row per day for the last 30 UTC days. today is deprecated: read cycle.

Rate limits

A unit budget for each billing cycle, and a ceiling of requests per minute and per hour, belong to the account, not to a key, so five keys share one allowance and rotating a key does not buy more calls. The billing cycle is the account's 30 days, the same days its plan counts; /v1/usage names its first day and the day it renews.

A read costs one unit per event id it returns. A single read costs one. A batch of known ids costs one unit per id returned. Ids the catalog does not know cost nothing and come back under meta.missing. A history read costs one whatever its days value, and a search costs one because it returns ids rather than readings.

Every 200 carries X-Feed-Limit and X-Feed-Remaining. When the budget or a ceiling is used up, the call returns 429 with Retry-After in seconds: seconds until the minute or the hour clears for a ceiling, seconds until the cycle renews for the budget. Every 200 also carries X-Feed-Cost, the units that call spent.

An admitted request answered 404 or 5xx costs nothing: an unknown id, or our own failure. A 400, 401, 403 or 429 on an admitted request costs one unit, so a client that retries a bad request in a loop is still bounded. Every attempt counts toward the minute and hour ceilings. A call refused on authentication or entitlement is never admitted, so it costs nothing and carries no X-Feed header at all. These are current limits, not an SLA.

Heavy routes

These routes under /api/feed/v1/events/{eventId} read the live seat log: /sections/live, /seats/live, /seats/at, /seats/recent, /section-frames, /seat-history, /ga-history, /seller-series and /seller-market. An account runs two of them at a time. A third waits in line for up to 30 seconds; when it waited, the response carries X-Ticker-Queued-Ms, the milliseconds it waited, and the body is unchanged. Past 30 seconds it returns 429 with Retry-After and this body:

{
  "code": 429,
  "error": "busy",
  "message": "Ticker is busy with this account's earlier calls of this kind. Wait 6 seconds, then call again. Send these calls one at a time, not all at once.",
  "retry_after_seconds": 6
}

When Ticker as a whole is running as many heavy reads as it can, every caller waits in one shared line, and past 30 seconds the 429 carries "error": "busy_global" instead.

Send heavy reads one at a time per account. For bulk reads across hundreds of events, contact us.

Key lifecycle

Keys live in Settings, under API. An account can hold five at once, which is what makes rotation possible: create the replacement, move your integration over, then revoke the old one.

The secret appears once, in the dialog that creates it. Ticker stores a SHA-256 hash of it and the non-secret prefix, so no route can return the secret a second time and nobody at Ticker can read it back. Copy it into your secret store before you close that dialog. If you lose it, revoke the key and create another.

After creation a key is identified by its prefix, tk_live_ plus eight characters, next to its name, creation date and last use. Revoking is immediate: requests carrying that key return 401 from the next call on.

Treat a key like a password. Keep it server-side, out of source control and out of browser code, and revoke it the moment you think it has leaked.

Errors

Every error is JSON in one shape:

{ "code": 401, "message": "…" }
CodeMeaning
400A malformed request, an unknown columns name (the message lists the valid set), a batch over the size bound, or, on a single-id route, an id in a form the API cannot read: a url segment with its slug, or an unknown source prefix. A batch names such an id under meta.missing instead.
401The Authorization header is missing, malformed, or names a revoked key.
402The key is valid but its account no longer holds what the API requires, or the account has used its screener runs on the screen route. The body carries reason.
403The key is valid and the account holds the plan, but API access has not been granted. Ask us.
404The read was given an event id the catalog does not know, or a View id that is not on this account. A well-formed id we have never seen is a 404, not a 400. Costs nothing.
429The burst ceiling or the unit budget is used up, or a heavy route waited 30 seconds for a slot (error is busy or busy_global). Retry-After carries the seconds.
500A server-side failure. Retry with backoff. Costs nothing.

A known event that has no reading yet is not an error. The shopping routes return 200 with current set to null and an empty series; the analytics and history routes return 200 with null readings.

Prefer an AI client?

Everything the API exposes is also reachable through the MCP server: no key, OAuth sign-in, and the same readings as tools. Use the API when you want raw HTTP from your own code; use MCP when an assistant is doing the reading.

On this page