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, v1Getting started
Create a key in Settings, under API, then send it as a bearer token against this base URL.
https://api.findticker.comcurl -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.
{
"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_.
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 unitResolves a name to the Ticker event ids and performer ids the reading routes accept. Ids only, no readings.
q | Required. At least two letters or digits; the % _ and * wildcards are a 400. |
limit | How many matches to return, at the published search cap. |
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 unitShopping demand for one event: the current reading, and a series of points each stamped with its snapshot_date.
eventId | Path. 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. |
range | How far back the series reaches: 3d, 7d, 14d, 28d, 30d, 90d, all. all is the last 365 days. Defaults to 28d. |
include_series | Set to false to return the current reading alone. Defaults to true. |
columns | Comma-separated metric names. Omit for both interest and sales. |
POST /api/feed/v1/events/shopping
1 unit per event id returnedThe same reading for many events in one call.
event_ids | Required 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. |
range | One of 3d, 7d, 14d, 28d, 30d, 90d, all. Defaults to 28d. |
include_series | Boolean. Defaults to false on the batch, so a wide read stays cheap. |
columns | Array 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.
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"]
}'{
"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
| Column | Name in the app | Reading |
|---|---|---|
interest | InterestDemand, people | current + series |
sales_24h | Sales 24hDemand, count | current |
orders_24h | Orders 24hDemand, count | current |
snapshot_date | series | |
snapshot_time | series | |
sales | Performer salesPerformer, score | series |
orders | series |
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.
| Column | Name in the app | Reading |
|---|---|---|
event_id | Event idid | current |
computed_at | Computed attimestamp | current |
lowest_price_current | Lowest pricePricing, $ | current |
median_price_current | Median pricePricing, $ | current |
p25_price_current | P25 pricePricing, $ | current |
p75_price_current | P75 pricePricing, $ | current |
lowest_aip_price_current | Lowest all-inPricing, $ | current |
median_aip_price_current | Median all-inPricing, $ | current |
p25_aip_price_current | P25 all-in$ | current |
p75_aip_price_current | P75 all-in$ | current |
lowest_face_value_current | Lowest face$ | current |
median_face_value_current | Median face$ | current |
average_face_value_current | Avg facePricing, $ | current |
highest_face_value_current | Highest face$ | current |
p25_face_value_current | P25 face$ | current |
p75_face_value_current | P75 face$ | current |
listings_current | ListingsInventory & demand, count | current |
tickets_current | TicketsInventory & demand, count | current |
percent_remaining | Secondary remainingInventory & demand, % | current |
vs_asof_at | current | |
interest | InterestDemand, people | current |
last_price_snapshot_date | Priced as ofEvent & timing, date | current |
partial_row | current | |
primary_status | current | |
prediction_markets | current | |
mlb_lowest_price_current | MLB lowest priceMLB, $ | current |
mlb_lowest_aip_price_current | MLB lowest all-inMLB, $ | current |
mlb_tickets_current | MLB ticketsMLB, count | current |
mlb_currency | MLB currencyMLB, text | current |
mlb_asof_at | MLB as ofMLB, timestamp | current |
mlb_completeness | MLB completenessMLB, category | current |
mlb_price_method | MLB price methodMLB, category | current |
mlb_lowest_price_d1 | MLB lowest price Δ1dMLB, $ | current |
mlb_lowest_aip_price_d1 | MLB lowest all-in Δ1dMLB, $ | current |
mlb_tickets_d1 | MLB tickets Δ1dMLB, count | current |
sh_lowest_aip_price_current | SH lowest all-inSH, $ | current |
sh_median_aip_price_current | SH median all-inSH, $ | current |
sh_tickets_current | SH ticketsSH, count | current |
sh_lowest_aip_price_delta_7d | SH lowest all-in Δ7dSH, $ | current |
sh_lowest_aip_price_pct_7d | SH lowest all-in %Δ7dSH, % | current |
sh_lowest_price_current | SH lowest priceSH, $ | current |
sh_median_price_current | SH median priceSH, $ | current |
sh_lowest_price_delta_7d | SH lowest price Δ7dSH, $ | current |
sh_lowest_price_pct_7d | SH lowest price %Δ7dSH, % | current |
sh_asof_at | SH as ofSH, timestamp | current |
sg_lowest_aip_price_current | SG lowest all-inSG, $ | current |
sg_median_aip_price_current | SG median all-inSG, $ | current |
sg_lowest_price_current | SG lowest priceSG, $ | current |
sg_median_price_current | SG median priceSG, $ | current |
sg_tickets_current | SG ticketsSG, count | current |
sg_lowest_aip_price_delta_7d | SG lowest all-in Δ7dSG, $ | current |
sg_lowest_aip_price_pct_7d | SG lowest all-in %Δ7dSG, % | current |
sg_lowest_price_delta_7d | SG lowest price Δ7dSG, $ | current |
sg_lowest_price_pct_7d | SG lowest price %Δ7dSG, % | current |
sg_asof_at | SG as ofSG, timestamp | current |
gt_lowest_aip_price_current | GT lowest all-inGT, $ | current |
gt_median_aip_price_current | GT median all-inGT, $ | current |
gt_lowest_price_current | GT lowest priceGT, $ | current |
gt_median_price_current | GT median priceGT, $ | current |
gt_tickets_current | GT ticketsGT, count | current |
gt_lowest_aip_price_delta_7d | GT lowest all-in Δ7dGT, $ | current |
gt_lowest_aip_price_pct_7d | GT lowest all-in %Δ7dGT, % | current |
gt_lowest_price_delta_7d | GT lowest price Δ7dGT, $ | current |
gt_lowest_price_pct_7d | GT lowest price %Δ7dGT, % | current |
gt_asof_at | GT as ofGT, timestamp | current |
tmr_lowest_price_current | TM resale lowest priceTM Resale, $ | current |
tmr_lowest_aip_price_current | TM resale all-inTM Resale, $ | current |
tmr_median_price_current | TM resale median priceTM Resale, $ | current |
tmr_median_aip_price_current | TM resale median all-inTM Resale, $ | current |
tmr_tickets_current | TM resale ticketsTM Resale, count | current |
tm_asof_at | TM as ofTM, timestamp | current |
aq_get_in_price_current | AQ B2B get-inAQ B2B, $ | current |
aq_average_price_current | AQ B2B averageAQ B2B, $ | current |
aq_listings_current | AQ B2B listingsAQ B2B, count | current |
aq_tickets_current | AQ B2B ticketsAQ B2B, count | current |
aq_asof_at | AQ B2B as ofAQ B2B, timestamp | current |
tm_percent_remaining | Primary remainingInventory & demand, % | current |
event_name | EventEvent & timing, text | current |
data_quality_score | Data qualityMomentum & signals, fraction | current |
days_to_event | Days to eventEvent & timing, d | current |
absorption_count_1d | Absorbed 1dcount | current |
absorption_count_7d | Absorbed 7dInventory & demand, count | current |
absorption_settled_7d | Absorbed 7d (settled)Inventory & demand, count | current |
absorption_rate_7d | Absorption rate 7dInventory & demand, fraction | current |
listings_added_count_1d | Added 1dcount | current |
listings_added_count_7d | Added 7dInventory & demand, count | current |
absorption_grain | Absorption coverageInventory & demand, text | current |
absorption_data_quality | Absorption qualityfraction | current |
absorption_asof_date | Absorption as ofdate | current |
lowest_price_pct_7d | Lowest price %Δ7dPricing, % | current |
median_price_delta_7d | Median price Δ7dPricing, $ | current |
median_price_delta_14d | Median price Δ14dPricing, $ | current |
median_price_delta_28d | Median price Δ28dPricing, $ | current |
median_price_pct_7d | Median price %Δ7dPricing, % | current |
p25_price_pct_7d | P25 price %Δ7dPricing, % | current |
p75_price_pct_7d | P75 price %Δ7dPricing, % | current |
median_price_7d_ago | Median price 7d agoPricing, $ | current |
resale_to_primary_aip_ratio | Resale / primary all-inPricing, x | current |
vs_to_tmr_aip_ratio | VS / TM resale all-inPricing, x | current |
vs_minus_tmr_aip_spread | VS minus TM resale all-inPricing, $ | current |
sh_interest | SH interestSH, people | current |
sh_interest_d1 | SH interest Δ1dSH, people | current |
sh_interest_d7 | SH interest Δ7dSH, people | current |
sh_sales_24h | SH sales 24hSH, count | current |
sh_sales_7d | SH sales 7dSH, count | current |
sh_sales_30d | SH sales 30dSH, count | current |
sh_sales_hours_24h | SH hours read 24hSH, count | current |
sh_sales_hours_7d | SH hours read 7dSH, count | current |
sh_sales_hours_30d | SH hours read 30dSH, count | current |
sh_interest_now | SH interest nowSH, people | current |
sh_demand_reads | SH readingsSH, count | current |
sh_selling_fast | Selling fastSH, boolean | current |
sh_demand_now_at | SH interest now as ofSH, timestamp | current |
sh_demand_asof_date | SH interest as ofSH, date | current |
sh_signals_asof_at | Selling fast as ofSH, timestamp | current |
tm_lowest_price_current | TM lowest priceTM, $ | current |
tm_lowest_aip_price_current | TM lowest all-inTM, $ | current |
tm_tickets_current | TM ticketsTM, count | current |
tm_tickets_delta_1d | TM tickets Δ1dTM, count | current |
tm_tickets_delta_7d | TM tickets Δ7dTM, count | current |
tm_lowest_price_delta_7d | TM lowest price Δ7dTM, $ | current |
tm_lowest_aip_price_delta_7d | TM lowest all-in Δ7dTM, $ | current |
tm_lowest_aip_price_pct_7d | TM lowest all-in %Δ7dTM, % | current |
tm_tickets_pct_3d | TM tickets %Δ3dTM, % | current |
inventory_velocity_1d | Inv velocityInventory & demand, fraction | current |
listings_delta_1d | Listings Δ1dcount | current |
listings_delta_7d | Listings Δ7dInventory & demand, count | current |
listings_pct_1d | Listings %Δ1dInventory & demand, % | current |
listings_pct_7d | Listings %Δ7dInventory & demand, % | current |
lowest_aip_price_delta_1d | Lowest all-in Δ1d$ | current |
lowest_aip_price_delta_7d | Lowest all-in Δ7d$ | current |
lowest_aip_price_pct_1d | Lowest all-in %Δ1d% | current |
lowest_aip_price_pct_7d | Lowest all-in %Δ7d% | current |
lowest_price_delta_1d | Lowest price Δ1d$ | current |
lowest_price_delta_7d | Lowest price Δ7d$ | current |
lowest_price_pct_1d | Lowest price %Δ1d% | current |
median_price_delta_1d | Median price Δ1d$ | current |
median_price_pct_1d | Median price %Δ1d% | current |
pace_z_3d_vs_14d | Pace zMomentum & signals, σ | current |
pace_z_3d_vs_14d_pct_rank_subcat_tte | Pace z rank (peer)percentile | current |
pace_z_3d_vs_14d_xs_z_subcat_tte | Pace z (peer)Momentum & signals, σ | current |
peer_n_subcat_tte | Peer countcount | current |
peer_n_tour_tte | Tour peer countcount | current |
price_self_z_7d_xs_z_tour_tte | Price z (tour)σ | current |
pace_z_3d_vs_14d_xs_z_tour_tte | Pace z (tour)σ | current |
vol_regime_ratio_xs_z_tour_tte | Vol regime (tour)σ | current |
inventory_velocity_1d_xs_z_tour_tte | Inv velocity (tour)σ | current |
price_self_z_1d | Price z 1dMomentum & signals, σ | current |
price_self_z_7d | Price z 7dMomentum & signals, σ | current |
price_self_z_7d_pct_rank_subcat_tte | Price z rank (peer)percentile | current |
price_self_z_7d_xs_z_subcat_tte | Price z (peer)Momentum & signals, σ | current |
tickets_delta_1d | Tickets Δ1dcount | current |
tickets_delta_7d | Tickets Δ7dInventory & demand, count | current |
tickets_pct_1d | Tickets %Δ1dInventory & demand, % | current |
tickets_pct_7d | Tickets %Δ7dInventory & demand, % | current |
vol_regime_ratio | Vol regimeMomentum & signals, x | current |
vol_regime_ratio_pct_rank_subcat_tte | Vol regime rank (peer)percentile | current |
vol_regime_ratio_xs_z_subcat_tte | Vol regime (peer)σ | current |
inventory_velocity_1d_pct_rank_subcat_tte | Inv velocity rank (peer)percentile | current |
inventory_velocity_1d_xs_z_subcat_tte | Inv velocity (peer)σ | current |
volatility_7d | Vol 7dMomentum & signals, % | current |
volatility_14d | Vol 14dMomentum & signals, % | current |
volatility_28d | Vol 28dMomentum & signals, % | current |
interest_d1 | Interest Δ1dDemand, people | current |
interest_d7 | Interest Δ7dDemand, people | current |
conversion | ConversionDemand, x | current |
sales_24h | Sales 24hDemand, count | current |
sales_7d | Sales 7dDemand, count | current |
sales_30d | Sales 30dDemand, count | current |
orders_24h | Orders 24hDemand, count | current |
orders_7d | Orders 7dDemand, count | current |
orders_30d | Orders 30dDemand, count | current |
interest_now | Interest nowDemand, people | current |
demand_now_at | Interest now as ofDemand, timestamp | current |
demand_asof_date | Demand as ofDemand, date | current |
weather_state | Weather stateWeather, category | current |
weather_sky | WeatherLocation, category | current |
weather_rain_chance | Rain chanceWeather, % | current |
weather_rain_in | RainWeather, in | current |
weather_wind_mph | WindWeather, mph | current |
weather_feels_like_f | Feels likeWeather, °F | current |
venue_roof | RoofWeather, category | current |
tm_percent_remaining_delta_7d | Primary remaining Δ7dInventory & demand, % | current |
tm_ga_tickets_current | Primary GA tickets remainingInventory & demand, count | current |
tm_ga_asof_at | GA as ofInventory & demand, timestamp | current |
p25_price_delta_1d | P25 price Δ1d$ | current |
p25_price_delta_7d | P25 price Δ7d$ | current |
p25_price_pct_1d | P25 price %Δ1d% | current |
p75_price_delta_1d | P75 price Δ1d$ | current |
p75_price_delta_7d | P75 price Δ7d$ | current |
p75_price_pct_1d | P75 price %Δ1d% | current |
p25_price_self_z_7d | P25 z 7dσ | current |
p25_price_self_z_7d_pct_rank_subcat_tte | P25 z rank (peer)percentile | current |
p25_price_self_z_7d_xs_z_subcat_tte | P25 z (peer)σ | current |
p25_price_self_z_7d_xs_z_tour_tte | P25 z (tour)σ | current |
withheld | current |
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 unitThe 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.
eventId | Path. 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. |
currency | Optional. 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 returnedThe same reading for many events, in the envelope the shopping batch already uses.
event_ids | Required 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 daysPrice, inventory and demand for one event across the days window, one point per as_of_date, each as of its own computed_at.
eventId | Path. 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. |
days | Defaults to the published cap and stays at that cap: a larger value returns the cap and sets meta.days_capped, never an error. |
currency | Optional. 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 rangeOne 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.
eventId | Path. 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. |
source | Path. 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. |
range | How 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. |
currency | Optional. 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 daysCurrent price and inventory per section of the house for one event, and optionally each section's history.
eventId | Path. 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. |
days | Optional. 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. |
currency | Optional. 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 unitLive section capacity: seats open now per section, with the section's capacity and the share of it no longer open.
eventId | Path. 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. |
currency | Optional. 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. |
source | Optional. 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 countEvery 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.
eventId | Path. 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. |
source | Optional. 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. |
frame | With source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb. |
currency | Optional. 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 countThe 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.
eventId | Path. 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. |
at | Required, 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. |
source | Optional. 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. |
frame | With source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb. |
currency | Optional. 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 countThe 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.
eventId | Path. 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. |
minutes | Optional. How far back to look, 15 by default, at most 120. |
section | Optional. Only the seats of this section, by its ticket code. |
source | Optional. 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. |
frame | With source=mlb, required: one of the event's seat frames, as the section frames route lists them with source=mlb. |
currency | Optional. 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 pageHow many tickets each general admission section of one event had open over time, with its peak and its last change.
eventId | Path. 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. |
section | Optional. A general admission section's code. Adds that section's exact points, oldest first, one per observed change; meta.next_cursor pages the rest. |
occurrence | Optional, 0 unless the event lists the code twice. section and occurrence together name one section. |
cursor | Optional. meta.next_cursor from the previous page. |
source | Optional. 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 daysHow many seats were open over time on one event, on primary and on resale.
eventId | Path. 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. |
days | Optional. 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 windowEvery section's open seat count at each step across a window, in one answer, so you can replay how one event drained.
eventId | Path. 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. |
since | Optional, 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. |
until | Optional, ISO 8601. Defaults to now. |
interval | Optional 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. |
source | Optional. 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 unitWhen one event goes on sale, and to whom before that: the named presale windows and the public window.
eventId | Path. 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 unitThe 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.
eventId | Path. 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 unitThe 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.
eventId | Path. 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 unitOne event's completed resale sales, newest first. Section, row and price are the listing's last listed state before the sale.
eventId | Path. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. |
section | Only sales whose section contains this text, in any case. |
row | Only sales in this row, exact, in any case. |
date_from | Sales at or after this time. A bare date starts at 00:00 UTC. |
date_to | Sales before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sales per page, at most 100. |
currency | Optional. 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 unitOne event's sections ranked by primary seats taken in the window: the net drop in open seats.
eventId | Path. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. |
section | Only sections whose code contains this text, in any case. |
date_from | Seats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Seats taken before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sections per page, at most 100. |
GET /api/feed/v1/events/{eventId}/sales/sections
1 unitOne event's sections with a count for every date (UTC), most first. Markets are never summed.
eventId | Path. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. |
market | vs (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. |
days | How many dates, today last: 7 (the default), 14 or 28. |
GET /api/feed/v1/events/{eventId}/sales/top
1 unitOne 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.
eventId | Path. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. |
market | secondary (the default): completed resale sales. primary: primary seats taken. |
window | How far back: 1h (the default), 6h, 24h or 7d. |
by | event (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 holdsWhat 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.
eventId | Path. 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_index | Names 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. |
section | With row and seat, names the seat the way a ticket prints it. All three are required together. With scope section, the section to read. |
row | With section and seat, names the seat the way a ticket prints it. |
seat | With section and row, names the seat the way a ticket prints it. |
scope | Optional. 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. |
days | Optional. 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. |
cursor | Optional. 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. |
currency | Optional. 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. |
source | Optional. 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. |
frame | With 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 countAn event's whole primary seat map in one answer: every section, every row in it, and every seat name in the row.
eventId | Path. 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. |
version | Optional. 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 pageThe 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.
eventId | Path. 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. |
source | Optional. One source code: vs, sh, sg or tmr. Defaults to every source the event has; sources in the answer lists them. |
cursor | Optional. 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. |
currency | Optional. 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 unitAn event's section map as GeoJSON shapes in page pixels, with every section and the shape that draws it.
eventId | Path. 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 unitEvery 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.
eventId | Path. 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 unitHow concentrated an event's inventory is among the sellers behind it, as counts and shares. No seller is named or identified.
eventId | Path. 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 unitThe 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.
eventId | Path. A Ticker event id, ev plus ten characters, as returned by the search route. An id the catalog does not know returns 404. |
sellers | Required. 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. |
range | Optional. 3d, 7d, 30d, 90d or all, 7d by default. |
sections | Optional. Section ids as the sections route keys them. Given, both the series and the listings are those sellers inside those sections. |
currency | Optional. 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 unitThe 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.
eventId | Path. 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. |
hours | Optional. 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 unitResolves a name to the Ticker event ids and performer ids the reading routes accept. Ids only, no readings.
q | Required. At least two letters or digits; the % _ and * wildcards are a 400. |
limit | How many matches to return, at the published search cap. |
GET /api/feed/v1/venues
1 unitVenues 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.
name | The 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. |
state | Only venues in this state or province, like TX: the region code where the venue has one, its country code otherwise. |
country | Only venues in this country, by two-letter code. |
capacity_min | Only venues that hold at least this many people. A venue whose capacity is not known is left out when either bound is given. |
capacity_max | Only venues that hold at most this many people. |
limit | Most venues to return. Default 5; a larger value returns at most 25, never an error. |
GET /api/feed/v1/performers/{performerId}
1 unitA 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.
performerId | Path. 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 unitOne 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.
performerId | Path. The performer id, as the search route returns it. An id the catalog does not know returns 404. |
series | rank (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. |
range | How far back: 7d, 14d, 28d (the default), 90d or all, about a year. |
GET /api/feed/v1/venues/{venueId}/schedule
1 unit per event returnedA 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.
venueId | Path. 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. |
days | How far forward to look. Default 30, maximum 365. |
limit | Most 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 unitA performer's events' completed resale sales, newest first. Section, row and price are the listing's last listed state before the sale.
performerId | Path. The performer id, as the search route returns it. An id the catalog does not know returns 404. |
section | Only sales whose section contains this text, in any case. |
row | Only sales in this row, exact, in any case. |
date_from | Sales at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Sales before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sales per page, at most 100. |
GET /api/feed/v1/performers/{performerId}/sales/primary
1 unitA performer's events' sections ranked by primary seats taken in the window: the net drop in open seats.
performerId | Path. The performer id, as the search route returns it. An id the catalog does not know returns 404. |
section | Only sections whose code contains this text, in any case. |
date_from | Seats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Seats taken before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sections per page, at most 100. |
GET /api/feed/v1/performers/{performerId}/sales/top
1 unitA performer's events, or their sections, ranked by completed resale sales or by primary seats taken over the window.
performerId | Path. The performer id, as the search route returns it. An id the catalog does not know returns 404. |
market | secondary (the default): completed resale sales. primary: primary seats taken. |
window | How far back: 1h (the default), 6h, 24h or 7d. |
by | event (the default) ranks events; section ranks the sections of those events. |
GET /api/feed/v1/venues/{venueId}/sales
1 unitA venue's events' completed resale sales, newest first. Section, row and price are the listing's last listed state before the sale.
venueId | Path. The venue id, as the search route or the venues route returns it. An id the catalog does not know returns 404. |
section | Only sales whose section contains this text, in any case. |
row | Only sales in this row, exact, in any case. |
date_from | Sales at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Sales before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sales per page, at most 100. |
GET /api/feed/v1/venues/{venueId}/sales/primary
1 unitA venue's events' sections ranked by primary seats taken in the window: the net drop in open seats.
venueId | Path. The venue id, as the search route or the venues route returns it. An id the catalog does not know returns 404. |
section | Only sections whose code contains this text, in any case. |
date_from | Seats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Seats taken before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sections per page, at most 100. |
GET /api/feed/v1/venues/{venueId}/sales/top
1 unitA venue's events, or their sections, ranked by completed resale sales or by primary seats taken over the window.
venueId | Path. The venue id, as the search route returns it. An id the catalog does not know returns 404. |
market | secondary (the default): completed resale sales. primary: primary seats taken. |
window | How far back: 1h (the default), 6h, 24h or 7d. |
by | event (the default) ranks events; section ranks the sections of those events. |
GET /api/feed/v1/sales
1 unitThe 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.
scope | Required. 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. |
section | Only sales whose section contains this text, in any case. |
row | Only sales in this row, exact, in any case. |
date_from | Sales at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Sales before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sales per page, at most 100. |
GET /api/feed/v1/sales/primary
1 unitThe sections of the events the key holder watches, ranked by primary seats taken in the window.
scope | Required. 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. |
section | Only sections whose code contains this text, in any case. |
date_from | Seats taken at or after this time. A bare date starts at 00:00 UTC. Leave both bounds out for the last 24 hours. |
date_to | Seats taken before this time. A bare date is included whole. |
page | The page to read, from 1. |
limit | Sections per page, at most 100. |
GET /api/feed/v1/sales/top
1 unitEvery 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.
scope | watchlist: only the events the key holder watches. Leave it out to rank the whole market. |
market | secondary (the default): completed resale sales. primary: primary seats taken. |
window | How far back: 1h (the default), 6h, 24h or 7d. |
by | event (the default) ranks events; section ranks the sections of those events. |
GET /api/feed/v1/leagues
1 unitEvery 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 pageA 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.
league | Path. The league key, for example mlb, in any case: MLB reads as mlb. The leagues route lists them. An unknown league returns 404. |
team | Only this team's games, by the team key from teams. An unknown team returns 404. |
schedule_section | postseason or season. Default: the postseason while it has games, else the season. |
sort_by | date (the default) or a market column. A column the key's plan does not include is refused with 402. |
page_size | Games per page, 50 by default, 100 at most. Each game costs a unit. |
GET /api/feed/v1/leagues/{league}/games/{eventId}
1 unitOne game of the league with its market, the row the League page shows, and where the playoff bracket places it.
eventId | Path. 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 linkedThe 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 unitThe 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 unitsThis 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 unitThe saved Views on the key's own account, each with the columns its filter reads.
GET /api/feed/v1/views/{viewId}
1 unitOne saved View, in the shape the Views route lists it.
viewId | Path. 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 returnedThe events one saved View matches right now, with the filter that ran. Values are as of computed_at.
viewId | Path. A View id from the Views route. A View on another account returns 404, the same answer as a View that does not exist. |
page | Which page of matches to return. Defaults to the first. |
limit | Matches per page, at the published page cap. Every match returned costs a unit. |
GET /api/feed/v1/views/{viewId}/matches
1 unit a pageThe 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.
viewId | Path. A View id from the Views route. A View on another account, or beyond the plan's View limit, returns 404. |
page | Which page of Matches to return. Defaults to the first. |
limit | Matches per page. Default 20, at most 100. |
since | Only Matches recorded at or after this time. |
delivery_status | Only Matches in this delivery state: sent, not_sent, pending or not_applicable. |
order | desc (the default), newest first, or asc. |
GET /api/feed/v1/matches
1 unit a pageThe 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.
page | Which page of Matches to return. Defaults to the first. |
limit | Matches per page. Default 20, at most 100. |
since | Only Matches recorded at or after this time. |
delivery_status | Only Matches in this delivery state: sent, not_sent, pending or not_applicable. |
order | desc (the default), newest first, or asc. |
GET /api/feed/v1/matches/{matchId}
1 unitOne Match, in the shape the Match lists serve.
matchId | Path. 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 pageThe 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.
page | Which page to return. Defaults to the first. |
limit | Stars per page. Default 50, at most 100. |
search | Only events whose name contains this. |
sort | created_at (the default), utc_date or event_name. |
order | desc (the default) or asc. |
archived | Stars 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 requestAsk for events in plain language and get the matching list back with the filter the question compiled to. Values are as of computed_at.
query | Required. 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. |
page | Which page of matches to return. Defaults to the first. |
limit | Matches per page, at the published page cap. Omit to let the question decide, within that cap. |
GET /api/feed/v1/screen/presets
1 unitThe 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.
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"{
"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.
| Route | How current |
|---|---|
GET /api/feed/v1/events/{eventId}/shopping | As of computed_at. The series is a list of points, each stamped with its snapshot_date. |
POST /api/feed/v1/events/shopping | As of computed_at. |
GET /api/feed/v1/events/{eventId}/analytics | As of computed_at. |
POST /api/feed/v1/events/analytics | As of computed_at. |
GET /api/feed/v1/events/{eventId}/history | points 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}/inventory | One point per reading, 30 days back at most. |
GET /api/feed/v1/events/{eventId}/section-frames | Counts carry forward between readings; as_of says how old the newest reading behind each step is. |
GET /api/feed/v1/events/{eventId}/sale-windows | The sale dates the event states. |
GET /api/feed/v1/events/{eventId}/weather | The latest stored forecast for the event's day, or null when no forecast covers it. |
GET /api/feed/v1/events/{eventId}/research | The newest stored brief; fetched_at says when it was gathered, whatever its age. |
GET /api/feed/v1/events/{eventId}/sections | The 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-map | The seat map under seat_map_token; a token never changes what it names. |
GET /api/feed/v1/events/{eventId}/listings | As 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-map | The drawing under geometry_version; a version never changes what it draws. |
GET /api/feed/v1/events/{eventId}/sales | Completed sales as recorded at the time of the call, newest first; each sale carries its sold_at. |
GET /api/feed/v1/events/{eventId}/sales/primary | Seats 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/sections | One count per date in days, today last; today's count grows until the date ends. |
GET /api/feed/v1/events/{eventId}/sales/top | Ranked over window, counted at the time of the call. |
GET /api/feed/v1/events/{eventId}/seat-history | Every 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/live | The live state of the house at the time of the call, not a computed reading. |
GET /api/feed/v1/events/{eventId}/seats/live | The 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/at | The 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/recent | The changes in the last minutes before the call, newest first, from since. |
GET /api/feed/v1/events/{eventId}/ga-history | Each general admission section's changes over time; sections/live reads what is open now. |
GET /api/feed/v1/events/{eventId}/section-levels | The 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-concentration | The latest reading for the event, or null when there is none yet. |
GET /api/feed/v1/events/{eventId}/seller-series | One 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-market | One point per reading across the range, plus the current listings per section. |
GET /api/feed/v1/search | Ids, not readings. |
GET /api/feed/v1/venues | Venues 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}/history | Rows stamped with their date, oldest first; the rank row for today comes from the current scores. |
GET /api/feed/v1/venues/{venueId}/schedule | The same rows the public venue page renders. |
GET /api/feed/v1/performers/{performerId}/sales/top | Ranked over window, counted at the time of the call. |
GET /api/feed/v1/venues/{venueId}/sales/top | Ranked over window, counted at the time of the call. |
GET /api/feed/v1/performers/{performerId}/sales | Completed sales as recorded at the time of the call, newest first; each sale carries its sold_at. |
GET /api/feed/v1/performers/{performerId}/sales/primary | Seats taken at the time of the call; each section carries last_at, the newest change behind its count. |
GET /api/feed/v1/venues/{venueId}/sales | Completed sales as recorded at the time of the call, newest first; each sale carries its sold_at. |
GET /api/feed/v1/venues/{venueId}/sales/primary | Seats taken at the time of the call; each section carries last_at, the newest change behind its count. |
GET /api/feed/v1/sales | Completed sales as recorded at the time of the call, newest first; each sale carries its sold_at. |
GET /api/feed/v1/sales/primary | Seats taken at the time of the call; each section carries last_at, the newest change behind its count. |
GET /api/feed/v1/sales/top | Ranked over window, counted at the time of the call. |
GET /api/feed/v1/leagues | The leagues as Ticker holds them at the time of the call. |
GET /api/feed/v1/leagues/{league}/games | The 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}/bracket | The bracket as Ticker holds it at the time of the call. |
GET /api/feed/v1/leagues/{league}/standings | The standings as Ticker holds them at the time of the call; standings_read_at says when they were read. |
GET /api/feed/v1/views | The 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}/results | As of computed_at. |
GET /api/feed/v1/views/{viewId}/matches | Each Match carries matched_at and its numbers as they were at that moment. |
GET /api/feed/v1/matches | Each 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/watchlist | The stars as saved at the time of the call; prices are the latest reading. |
POST /api/feed/v1/screen | As of computed_at. |
GET /api/feed/v1/screen/presets | The presets as defined at the time of the call. |
GET /api/feed/v1/usage | cycle 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": "…" }| Code | Meaning |
|---|---|
400 | A 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. |
401 | The Authorization header is missing, malformed, or names a revoked key. |
402 | The 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. |
403 | The key is valid and the account holds the plan, but API access has not been granted. Ask us. |
404 | The 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. |
429 | The 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. |
500 | A 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.