# API reference

as_of: 2026-10-23

Every public endpoint, generated from [/openapi.json](/openapi.json). Base URL `https://parrot.markets/api/v1`, no key. Formats, limits, caching and errors: [API](/api-guide). MCP: `POST https://parrot.markets/mcp` (streamable HTTP, no key; how to add it: [/mcp](/mcp)). Agent guide: [/llms.txt](/llms.txt). Each Try it is a real request; the first lines of its answer are shown below it, answered 2026-10-23 23:43 UTC.

## Answers

One question, one call, for every hub. TSV by default (format=json or md), with an ETag; the same answers as the MCP tools.

### `GET /api/v1/upcoming`

Occasions with listed mention markets in the next N days, a row each: date, time, entity, venues, listed words, top 3 words (key:rate:n)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `category` | string |  | Hub id (earnings, trump, fed, white-house, news, politics, sports, business, entertainment, podcasts, world); default all |
| `days` | integer | `7` |  |
| `markets` | boolean | `false` | Add px (mid price 0-1 of the listing venue; may be delayed). Off by default |
| `all` | boolean | `false` | Also occasions without a market (scheduled appearances, the earnings calendar) |
| `fields` | string |  | Comma list of columns (unknown names are a 400 listing the allowed ones); 'full' gives every column (+ icon on upcoming and entity): date, time, hub, ent, name, app, ev, v, n\_w, top3, kind, win, icon, evs |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/upcoming](/api/v1/upcoming) (200, TSV, 6,162 bytes)

```
# upcoming 2026-10-23..2026-10-30 · 50 occasions · as_of 2026-10-23T23:40:56Z
# brief?entity=<ent>&date=<date> (brief?event=<ev> where ev is set: several that day) · top3 word:p<p>:n (calibrated p; n 0 = prior) or word:r<rate>:…
date	time	hub	ent	ev	kind	win	v	n_w	top3
2026-10-24		podcasts	mrbeast		podcast_episode by	..2026-10-24	P	11	Minecraft:p0.61:8;Hide:p0.53:4;Build:p0.52:8
2026-10-24		politics	barack-obama		rally		K	24	Michelle:p0.59:3;Chicago:p0.58:2;Afford:p0.52:1
2026-10-24		politics	bernie-sanders		rally		K	20	Iran:p0.83:12;AI:p0.8:33;Billionaire#5:p0.73:9
2026-10-24		trump	donald-trump		rally		KP	46	Dividend:p0.91:40;Save America Act:p0.78:80;Sleepy Joe:p0.76:134
…
```

### `GET /api/v1/brief`

One occasion, a row per listed word ranked by p: settlement history (n y rate l10), transcript history (tn th), p, and after the event cnt / res / t / clip; the rows that fit 3.2 KB, offset= / limit= page the rest

| Parameter | Type | Default | Description |
|---|---|---|---|
| `event` | string |  | Event id (k:<KALSHI TICKER> or p:<polymarket slug>); its venue counterparts are merged in |
| `appearance` | string |  | Appearance id or slug |
| `entity` | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias; with date= the occasion nearest it, else the next open one |
| `symbol` | string |  | Earnings stock symbol (alias of entity= for companies), e.g. NFLX |
| `date` | string |  | Date YYYY-MM-DD (with entity / symbol) |
| `markets` | boolean | `false` | Add px (mid price 0-1 of the listing venue; may be delayed). Off by default |
| `fields` | string |  | Comma list of columns (unknown names are a 400 listing the allowed ones); 'full' gives every column (+ icon on upcoming and entity): w, key, thr, scope, v, n, y, rate, l10, tn, th, p, p\_src, cnt, cnt\_all, res, t, clip, agree, lower\_bound, px, streak, last\_y, ev, strike, ent |
| `limit` | integer |  | Rows (by p) from offset; 0 = every row. Default: as many as fit 3.2 KB; a '# rows ... more: offset=N' line says how many more there are |
| `offset` | integer | `0` | First row (the more: offset= of the previous page) |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/brief?entity=tesla](/api/v1/brief?entity=tesla) (200, TSV, 1,612 bytes)

```
# Tesla (tesla) · earnings_call 2027-01-27 · 20 words · K k:KXEARNINGSMENTIONTSLA-27JAN27 · as_of 2026-10-23T23:40:56Z
# scope K company_reps+operator · n/y settled · tn/th last 8 earnings call transcripts 2025-01-29..2026-10-21 · same on every row: v K, p_src blend ·…
# rules K k:KXEARNINGSMENTIONTSLA-27JAN27 ({word} = w of K rows): If {word} is said by any Tesla representative (including the operator of the call) …
w	key	thr	n	y	rate	l10	tn	th	p
Cybercab	cybercab	1	2	2	1	YY	8	6	0.95
Regulator / Regulatory / Regulation	regulation|regulator|regulatory	1	7	7	1	YYYYYYY	8	8	0.93
SpaceX / xAI	spacex|xai	1	3	3	1	YYY	8	8	0.92
…
```

### `GET /api/v1/word`

One word of one entity in one line: settlement history, transcript history, p, scope, next listing

| Parameter | Type | Default | Description |
|---|---|---|---|
| `word` | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too; a word key ('ai\|artificial intelligence', 'trump#5') works too |
| `key` | string |  | A word key instead of word= ('ai\|artificial intelligence') |
| `entity` | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `symbol` | string |  | Earnings stock symbol (alias of entity= for companies), e.g. NFLX |
| `markets` | boolean | `false` | Add px (mid price 0-1 of the listing venue; may be delayed). Off by default |
| `next` | boolean | `false` | Answer the next open market that lists the word, even when it is a wider listing ('Russia / Ukraine' for Ukraine); default: the word's own key, with next / next\_as naming that market |
| `format` | text \| json | `text` |  |

Try it: [/api/v1/word?entity=nvidia&word=Taiwan](/api/v1/word?entity=nvidia&word=Taiwan) (200, text, 338 bytes)

```
nvidia "Taiwan" · key taiwan · thr 1 · scope company_reps+operator · n 5 · y 1 · rate 0.2 · l10 nnnnY · streak Y1 · last_y 2026-08-26 · tn 8 · th 2 ·…
…
```

### `GET /api/v1/quotes`

Where a word was said: capped quotes (<= 25 words, match in «»), newest first, counted under the market's scope

| Parameter | Type | Default | Description |
|---|---|---|---|
| `word` (required) | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too |
| `entity` | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `symbol` | string |  | Earnings stock symbol (alias of entity= for companies), e.g. NFLX |
| `appearance` | string |  | One appearance (id or slug) |
| `call` | string |  | Earnings: report date YYYY-MM-DD (nearest call within 3 days) or 'last' |
| `call_id` | integer |  |  |
| `limit` | integer | `5` | Quote rows (at most 5 from sources that are not public domain / OPL; 0 = that maximum) |
| `fields` | string |  | Comma list of columns (unknown names are a 400 listing the allowed ones); 'full' gives every column (+ icon on upcoming and entity): app, date, spk, role, sec, t, q, counted, src, text\_kind |
| `format` | tsv \| json \| md \| text | `tsv` |  |

Try it: [/api/v1/quotes?symbol=NFLX&word=Advertising](/api/v1/quotes?symbol=NFLX&word=Advertising) (200, TSV, 1,624 bytes)

```
# netflix · Advertising · scope company_reps+operator · 5 quotes from the 8 latest transcripts of any kind (2025-01-21..2026-10-20): counted under th…
# quotes <= 25 words, <= 5 a response unless the source is public domain / OPL, never overlapping; t = media seconds · derived data CC BY 4.0 (credit…
app	date	spk	role	sec	t	q	counted	src	text_kind
netflix:2026-10-20:earnings_call	2026-10-20	Spencer Wang	company	qa	1738.7	…us on to the topic of «advertising». We have several questions on «advert…
netflix:2026-10-20:earnings_call	2026-10-20	Spencer Wang	company	qa	1751.5	…of Baird. He asks, "How is the «advertising» business progressing relativ…
netflix:2026-07-16:earnings_call	2026-07-16	Greg Peters	company	prepared	281.6	…that our consumers and our «advertising» partners ascribe to our serv…
netflix:2026-07-16:earnings_call	2026-07-16	Spencer Wang	company	qa	1339	…is monetization, and I'll begin with «advertising». The question is from St…
…
```

### `GET /api/v1/clips`

Timed clips of a word (yt:<video id>@<start>-<end>) from verified timelines, newest first

| Parameter | Type | Default | Description |
|---|---|---|---|
| `word` (required) | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too |
| `entity` | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `symbol` | string |  | Earnings stock symbol (alias of entity= for companies), e.g. NFLX |
| `appearance` | string |  | One appearance (id or slug) |
| `limit` | integer | `10` |  |
| `fields` | string |  | Comma list of columns: key, app, date, spk, t, clip, q |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/clips?symbol=TSLA&word=Cybertruck&limit=3](/api/v1/clips?symbol=TSLA&word=Cybertruck&limit=3) (200, TSV, 729 bytes)

```
# tesla · Cybertruck · scope company_reps+operator · 2 clips from 2 timed transcripts · as_of 2026-10-23T23:40:56Z
# clip yt:<video id>@<start>-<end> (whole s; youtube-nocookie embed) | mp3:<source>@<a>-<b>; t = media s · derived data CC BY 4.0 (credit parrot.mark…
key	app	date	spk	t	clip	q
cybertruck	tesla:2026-10-21:earnings_call	2026-10-21	Vaibhav Taneja	2088.3	mp3:11603@2082.3-2089.2	…drive?" They're not asking for 3/Y or «Cybertruck…
cybertruck	tesla:2026-07-22:earnings_call	2026-07-22	Elon Musk	158	mp3:9326@157.7-164.0	…The «Cybertruck» has started production, and we also have st…
…
```

### `GET /api/v1/history`

Settlement history: an entity's words (most settled first), or with word= every settled listing of one word

| Parameter | Type | Default | Description |
|---|---|---|---|
| `entity` | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `symbol` | string |  | Earnings stock symbol (alias of entity= for companies), e.g. NFLX |
| `word` | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too |
| `q` | string |  | Without word: keys containing this text |
| `limit` | integer | `25` |  |
| `offset` | integer | `0` | First row (the '# more: offset=' of the previous page) |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/history?entity=donald-trump&word=Crypto](/api/v1/history?entity=donald-trump&word=Crypto) (200, TSV, 1,133 bytes)

```
# donald-trump · Crypto (crypto) · settled n 8 y 2 rate 0.25 (one per occasion) · 8 listings newest first, rows 1-8 · as_of 2026-10-23T23:40:56Z
# res void = the event did not qualify (not a NO; left out of n) · cnt = our transcript count under the market's rule; agree 1 / 0 = it matches / doe…
date	ev	v	w	res	cnt	agree	lower_bound
2025-03-03	k:KXDJTINVESTMENT-25MAR03	K	Crypto	yes			
2024-09-04	p:what-will-trump-say-during-lex-friedman-interview	P	Crypto	no			
2024-09-04	p:what-will-trump-say-during-hannity-town-hall	P	Crypto	no			
2024-08-31	p:what-will-trump-say-in-august	P	Crypto	yes	0		1
…
```

### `GET /api/v1/search`

Transcript search (FTS5 syntax) across every hub: a row per hit (app, date, entity, speaker, section, t, quote, src); group=call gives the earnings-only grouped JSON

| Parameter | Type | Default | Description |
|---|---|---|---|
| `q` (required) | string |  | SQLite FTS5 query: words (ANDed), "exact phrase", prefix\* (3+ characters), OR, NOT (needs a left side), NEAR(a b, 5) |
| `category` | string |  | Hub id |
| `entity` | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `symbol` | string |  | Stock symbol, e.g. TSLA; a comma / space separated list where noted (list allowed; group=call, or an alias of entity=) |
| `from` | string |  | Date YYYY-MM-DD |
| `to` | string |  | Date YYYY-MM-DD |
| `limit` | integer | `10` | Transcripts (appearances / calls) per page |
| `offset` | integer | `0` |  |
| `per_app` | integer | `2` | Hits per transcript |
| `group` | string |  | call: the earnings-only JSON grouped by call (the pre-v3 shape) |
| `role` | company \| analyst \| operator |  | group=call only |
| `section` | prepared \| qa |  | group=call only |
| `speaker` | string |  | group=call only: speaker name substring |
| `per_call` | integer | `5` | group=call only: snippets per call (capped at 5) |
| `plain` | boolean | `false` | group=call only: «hit» text instead of HTML <mark> |
| `snippet_chars` | integer | `160` | group=call only (capped at 200) |
| `format` | tsv \| json \| md \| csv | `tsv` |  |
| `fields` | string |  | Comma list of columns: app, date, ent, spk, sec, t, q, src, text\_kind, hub, role (group=call: call\_id, symbol, report\_date, label, fiscal\_year, fiscal\_quarter, flags, hits, snippets) |

Try it: [/api/v1/search?q=tariff&limit=3](/api/v1/search?q=tariff&limit=3) (200, TSV, 1,371 bytes)

```
# q 'tariff' · 932 transcripts, 2433 hits · showing 3 from offset 0 · more: offset=3 · as_of 2026-10-23T23:40:56Z
# quotes <= 25 words, <= 2 a transcript unless public domain / OPL, never overlapping · derived data CC BY 4.0 (credit parrot.markets) · not advice (…
app	date	ent	spk	sec	t	q	src	text_kind
donald-trump:2026-10-23:rally-florida	2026-10-23	donald-trump	donald-trump		2135	…she wrote this article and she said «tariff» is his favorite word h…
donald-trump:2026-10-23:rally-florida	2026-10-23	donald-trump	donald-trump		2186.6	…«tariff» on you. both of you and amazing they stopped	https://www…
donald-trump:2026-10-22:rally-iowa	2026-10-22	donald-trump	donald-trump		2847	…«tariff» is my favorite word. So what happened is I now make it my fif…
procter-and-gamble:2026-10-22:earnings_call	2026-10-22	procter-and-gamble	Andre Schulten	qa		…year. The last point I'll give you is we had the second…
…
```

### `GET /api/v1/entity/{entity_id}`

Entity card: kind, hub, tier, venues, next / last occasion, role holder, top 10 words (key n y rate l10 tn th)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `entity_id` (path) | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `fields` | string |  | full: add the icon path |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/entity/tesla](/api/v1/entity/tesla) (200, TSV, 987 bytes)

```
# ent tesla · name Tesla · kind company · hub earnings · sub - · tier T1 · v KP · symbol TSLA
# next 2027-01-27 k:KXEARNINGSMENTIONTSLA-27JAN27 (20 words)
# last text 2026-10-21 earnings_call
# url https://parrot.markets/earnings/TSLA · as_of 2026-10-23T23:40:56Z
# 117 words with settled history; top 10 by n · tn/th: last 8 earnings call transcripts 2025-01-29..2026-10-21 · derived data CC BY 4.0 (credit parro…
w	key	n	y	rate	l10	tn	th
Regulator / Regulatory / Regulation	regulation|regulator|regulatory	7	7	1	YYYYYYY	8	8
…
```

### `GET /api/v1/entity`

Entity card by ?id= (same as /api/v1/entity/{id})

| Parameter | Type | Default | Description |
|---|---|---|---|
| `id` (required) | string |  | Entity id (donald-trump, nvidia, the-last-word, role-fed-chair), a name or an alias |
| `fields` | string |  | full: add the icon path |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/entity?id=Tesla](/api/v1/entity?id=Tesla) (200, TSV, 987 bytes)

```
# ent tesla · name Tesla · kind company · hub earnings · sub - · tier T1 · v KP · symbol TSLA
# next 2027-01-27 k:KXEARNINGSMENTIONTSLA-27JAN27 (20 words)
# last text 2026-10-21 earnings_call
# url https://parrot.markets/earnings/TSLA · as_of 2026-10-23T23:40:56Z
# 117 words with settled history; top 10 by n · tn/th: last 8 earnings call transcripts 2025-01-29..2026-10-21 · derived data CC BY 4.0 (credit parro…
w	key	n	y	rate	l10	tn	th
Regulator / Regulatory / Regulation	regulation|regulator|regulatory	7	7	1	YYYYYYY	8	8
…
```

### `GET /api/v1/entities`

Entities (speakers, shows, companies, leagues, roles) of a hub, a row each with the next open market date

| Parameter | Type | Default | Description |
|---|---|---|---|
| `category` | string |  | Hub id; default all |
| `q` | string |  | Substring of the id or name |
| `limit` | integer | `200` |  |
| `offset` | integer | `0` |  |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/entities?category=fed&limit=5](/api/v1/entities?category=fed&limit=5) (200, TSV, 517 bytes)

```
# entities · hub fed · 13 total · showing 5 from offset 0 · as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice …
ent	name	kind	hub	sub	next
austan-goolsbee	Austan Goolsbee	person	fed	governors	
christine-lagarde	Christine Lagarde	person	fed	other-central-banks	
christopher-waller	Christopher Waller	person	fed	governors	
fomc-press-conference	FOMC press conference	event_series	fed	fomc	2026-10-28
janet-yellen	Janet Yellen	person	fed	fed-chair	
…
```

### `GET /api/v1/appearances/{appearance_id}`

One appearance: people, active source (text kind, rights, timeline), events

| Parameter | Type | Default | Description |
|---|---|---|---|
| `appearance_id` (path) | string |  | Appearance id or slug |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/appearances/donald-trump:2026-11-01:posts_window](/api/v1/appearances/donald-trump:2026-11-01:posts_window) (200, TSV, 775 bytes)

```
# app donald-trump:2026-11-01:posts_window · kind posts_window · date 2026-11-01 · ent donald-trump · status live · as_of 2026-10-23T23:40:56Z
# title @realDonaldTrump posts, week ending 2026-11-01 · url https://parrot.markets/e/2026-11-01-donald-trump-posts-window
# people donald-trump (speaker)
# source posts · text_kind official · rights link_only · src https://truthsocial.com/@realDonaldTrump · timeline none · verified - · words - · Truth …
# text pending: source listed, text not fetched yet · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
ev	v	status	kind	scope	n_w
p:what-will-trump-post-this-week-october-26-november-1-20261101	P	open	word	named	12
…
```

### `GET /api/v1/appearances/{appearance_id}/text`

Full text of an appearance, only when its source is public domain or OPL (else 403 rights)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `appearance_id` (path) | string |  | Appearance id or slug |

Try it: [/api/v1/appearances/prime-ministers-questions:2026-10-21:pmqs/text](/api/v1/appearances/prime-ministers-questions:2026-10-21:pmqs/text) (200, text, 41,836 bytes)

```
# prime-ministers-questions:2026-10-21:pmqs · Prime Minister's Questions, 21 October 2026 · rights opl · Contains Parliamentary information licensed …
[0] Clive Jones (Wokingham) (LD): Q1. If he will list his official engagements for Wednesday 21 October.
[1] andy-burnham: Today we welcome the Sultan of Oman on the occasion of the state visit, which is an opportunity to recognise the deep and historic …
[2] Clive Jones: Like you, Mr Speaker, I have recollections of Aberfan and being at primary school myself at that time. Too many patients are sufferi…
[3] andy-burnham: I thank the hon. Gentleman for his question and recognise his sincerity and personal experience in this regard. We have a national …
[4] Alex McIntyre (Gloucester) (Lab): Q4. When Ian and Emma bought their flat a few years ago, they were told there was a 10-year warranty on its con…
[5] andy-burnham: I thank my hon. Friend for raising that question. I think we all feel for Emma, given the position she is in. I can give him an ass…
…
```

### `GET /api/v1/changes`

What changed since a time: entities, appearances, sources, events (strikes roll up), history; paged by a cursor

| Parameter | Type | Default | Description |
|---|---|---|---|
| `since` (required) | string |  | ISO time (e.g. a previous response's as\_of) or the \`next\` cursor of the previous page |
| `limit` | integer | `50` |  |
| `types` | string |  | Comma list of entity, appearance, source, event, strike, history |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/changes?since=2026-10-22&limit=5](/api/v1/changes?since=2026-10-22&limit=5) (200, TSV, 743 bytes)

```
# changes since 2026-10-22T00:00:00Z · 5 rows (rolling up 35 row changes on this page) · more: since=2026-10-22T00:22:26Z|source|tbpn:2026-10-21:podc…
ts	type	id	op
2026-10-22T00:08:16Z	event	p:what-will-andy-burnham-say-at-the-next-prime-ministers-questions-event-20261028	upd
2026-10-22T00:08:16Z	event	p:what-will-be-said-on-the-first-joe-rogan-experience-episode-of-the-week-october-26	upd
2026-10-22T00:13:20Z	event	k:KXEARNINGSMENTIONWGO-26DEC18	upd
2026-10-22T00:22:26Z	appearance	tbpn:2026-10-21:podcast_episode	upd
2026-10-22T00:22:26Z	source	tbpn:2026-10-21:podcast_episode	add
…
```

### `GET /api/v1/windows`

Window markets, a row each: window, scope, known appearances, with text, own posts, listed words

| Parameter | Type | Default | Description |
|---|---|---|---|
| `entity` | string |  |  |
| `status` | open \| all | `open` |  |
| `limit` | integer | `50` |  |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/windows?limit=5](/api/v1/windows?limit=5) (200, TSV, 969 bytes)

```
# window markets · 5 rows · spoken vs spoken+posts per word: /api/v1/window?event=<ev> · derived data CC BY 4.0 (credit parrot.markets) · not advice …
ev	v	ent	fmt	start	end	status	scope	known	text	posts	n_w
k:KXTRUMPSAYNICKNAME-27JAN01	K	donald-trump	window_month	2026-10-01T14:00:00Z	2027-01-01T05:00:00Z	open	window_spoken_written	31	5	509	23
p:what-will-trump-post-this-week-october-26-november-1-20261101	P	donald-trump	posts_window	2026-10-26T04:00:00Z	2026-11-02T04:59:00Z	open	posts_text…
p:what-will-trump-say-this-week-october-26-november-1-20261101	P	donald-trump	window_week	2026-10-26T04:00:00Z	2026-11-02T04:59:00Z	open	window_spoke…
k:KXTRUMPSAYCOMPANY-26NOV01	K	donald-trump	window_month	2026-10-01T14:00:00Z	2026-11-01T04:00:00Z	open	window_spoken_written	31	5	509	50
k:KXTRUMPSAYCOUNTRY-26NOV01	K	donald-trump	window_month	2026-10-01T14:00:00Z	2026-11-01T04:00:00Z	open	window_spoken_written	31	5	509	42
…
```

### `GET /api/v1/window`

One window market (this week / this month / posts): per word the spoken count, the posts count and both, the market's own count; part=apps lists the window's appearances with coverage

| Parameter | Type | Default | Description |
|---|---|---|---|
| `event` (required) | string |  | Event id (k:... / p:...) |
| `part` | words \| apps | `words` |  |
| `format` | tsv \| json \| md | `tsv` |  |

Try it: [/api/v1/window?event=k:KXTRUMPSAYNICKNAME-27JAN01](/api/v1/window?event=k:KXTRUMPSAYNICKNAME-27JAN01) (200, TSV, 1,081 bytes)

```
# window k:KXTRUMPSAYNICKNAME-27JAN01 · donald-trump · 2026-10-01T14:00:00Z → 2027-01-01T05:00:00Z · counts spoken + his own written posts
# coverage 5 of 31 known appearances transcribed · posts 509 own (115 reposts excluded) · as_of 2026-10-23T22:50:09Z · derived data CC BY 4.0 (credit…
w	thr	res	spoken	posts	spoken_posts	cnt	lower_bound
Barack Hussein Obama	1	yes	14	2	16	16	0
Biden Crime Family	1		0	0	0	0	1
Comrade Kamala	1		0	0	0	0	1
Crazy Bernie	1		1	0	1	1	0
…
```

## Earnings (legacy)

The earnings-era JSON endpoints, kept for existing clients. Earnings transcript text is not served: counts and quotes of at most 25 words.

### `GET /api/v1/companies`

Tracked companies (filter q by symbol / name)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `q` | string |  |  |

Try it: [/api/v1/companies?q=TSLA](/api/v1/companies?q=TSLA) (200, JSON, 274 bytes)

```
{"companies":[{"symbol":"TSLA","name":"Tesla, Inc.","aliases":["TSLA","Tesla","Tesla, Inc."],"n_calls":62,"first_call":"2011-08-03","last_call":"2026-10-21","kalshi_series":["KXEARNINGSMENTIONTSLA"],"n_events":13,"open_events":1,"next_call_date":"2027-01-27","in_hf":true}]}
```

### `GET /api/v1/companies/{symbol}`

One company: calls, events, speakers, next call date

| Parameter | Type | Default | Description |
|---|---|---|---|
| `symbol` (path) | string |  |  |

Try it: [/api/v1/companies/TSLA](/api/v1/companies/TSLA) (200, JSON, 44,438 bytes)

```
{"symbol":"TSLA","name":"Tesla, Inc.","aliases":["TSLA","Tesla","Tesla, Inc."],"kalshi_series":["KXEARNINGSMENTIONTSLA"],"in_hf":true,"n_calls":62,"calls":[{"id":10500,"symbol":"TSLA","report_date":"2026-10-21","fiscal_year":2026,"fiscal_quarter":3,"n_paragraphs":120,"n_words":8205,"company_words":7097,"flags":[],"n_events":2},{"id":9326,"symbol":"TSLA","report_date":"2026-07-22","fiscal_year":2026,"fiscal_quarter":2
…
```

### `GET /api/v1/calls`

Calls, newest first

| Parameter | Type | Default | Description |
|---|---|---|---|
| `symbol` | string |  | Stock symbol, e.g. TSLA; a comma / space separated list where noted |
| `from` | string |  | Date YYYY-MM-DD |
| `to` | string |  | Date YYYY-MM-DD |
| `limit` | integer | `50` |  |
| `offset` | integer | `0` |  |

Try it: [/api/v1/calls?symbol=TSLA&limit=3](/api/v1/calls?symbol=TSLA&limit=3) (200, JSON, 538 bytes)

```
{"total":62,"calls":[{"id":10500,"symbol":"TSLA","report_date":"2026-10-21","fiscal_year":2026,"fiscal_quarter":3,"n_paragraphs":120,"n_words":8205,"company_words":7097,"flags":[],"n_events":2},{"id":9326,"symbol":"TSLA","report_date":"2026-07-22","fiscal_year":2026,"fiscal_quarter":2,"n_paragraphs":109,"n_words":8432,"company_words":7400,"flags":[],"n_events":2},{"id":9325,"symbol":"TSLA","report_date":"2026-04-22",
…
```

### `GET /api/v1/calls/{call_id}`

One call: speakers, paragraph structure (text withheld: internal rights), events; q marks a word (offsets + capped quotes)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `call_id` (path) | integer |  |  |
| `q` | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too (marks it) |
| `operator` | boolean |  | Count the operator's speech too (Kalshi rules that mention the operator); alias include\_operator |
| `analyst` | boolean |  | Count analysts' speech too (Polymarket's 'anyone' rule); alias include\_analyst |
| `include_operator` | boolean |  |  |
| `include_analyst` | boolean |  |  |

Try it: [/api/v1/calls/10500](/api/v1/calls/10500) (200, JSON, 14,488 bytes)

```
{"call":{"id":10500,"symbol":"TSLA","report_date":"2026-10-21","fiscal_year":2026,"fiscal_quarter":3,"n_paragraphs":120,"n_words":8205,"company_words":7097,"flags":[],"n_events":2,"qa_start_idx":20,"analyst_words":1108,"operator_words":0,"n_versions":1,"speakers":[{"name":"Elon Musk","role":"company","n_paragraphs":39,"n_words":2724},{"name":"Vaibhav Taneja","role":"company","n_paragraphs":28,"n_words":2093},{"name":
…
```

### `GET /api/v1/count`

A word's per-call counts over a company's last n calls

| Parameter | Type | Default | Description |
|---|---|---|---|
| `symbol` (required) | string |  | Stock symbol, e.g. TSLA; a comma / space separated list where noted |
| `word` (required) | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too |
| `n` | integer | `8` | Number of calls; 0 = all |
| `before` | string |  | Date YYYY-MM-DD; only calls before it (default: through today) |
| `operator` | boolean |  | Count the operator's speech too (Kalshi rules that mention the operator); alias include\_operator |
| `analyst` | boolean |  | Count analysts' speech too (Polymarket's 'anyone' rule); alias include\_analyst |
| `include_operator` | boolean |  |  |
| `include_analyst` | boolean |  |  |

Try it: [/api/v1/count?symbol=TSLA&word=Cybertruck](/api/v1/count?symbol=TSLA&word=Cybertruck) (200, JSON, 1,641 bytes)

```
{"symbol":"TSLA","word":"Cybertruck","alts":["Cybertruck"],"spelling_aliases":[],"threshold":1,"include_operator":false,"include_analyst":false,"before":"2026-10-24","calls":[{"id":9320,"report_date":"2025-01-29","fiscal_year":2024,"fiscal_quarter":4,"count":0,"prepared":0,"qa":0,"analyst":0,"operator":0,"hit":false,"flags":[]},{"id":9321,"report_date":"2025-04-22","fiscal_year":2025,"fiscal_quarter":1,"count":3,"pre
…
```

### `GET /api/v1/occurrences`

Every match of a word in one call

| Parameter | Type | Default | Description |
|---|---|---|---|
| `call_id` (required) | integer |  |  |
| `word` (required) | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too |
| `operator` | boolean |  | Count the operator's speech too (Kalshi rules that mention the operator); alias include\_operator |
| `analyst` | boolean |  | Count analysts' speech too (Polymarket's 'anyone' rule); alias include\_analyst |
| `include_operator` | boolean |  |  |
| `include_analyst` | boolean |  |  |
| `limit` | integer |  |  |
| `offset` | integer | `0` |  |
| `plain` | boolean | `false` | Snippets as plain text with «hit» markers instead of HTML |

Try it: [/api/v1/occurrences?call_id=10500&word=Cybertruck&limit=3](/api/v1/occurrences?call_id=10500&word=Cybertruck&limit=3) (200, JSON, 539 bytes)

```
{"call_id":10500,"word":"Cybertruck","alts":["Cybertruck"],"spelling_aliases":[],"threshold":1,"include_operator":false,"include_analyst":false,"total":1,"counted_total":1,"hit":true,"flags":[],"warnings":[],"offset":0,"occurrences":[{"idx":57,"speaker":"Vaibhav Taneja","role":"company","section":"qa","counted":true,"start":null,"end":null,"snippet":"…saying, &quot;Can we get into an FSD drive?&quot; They&#x27;re not
…
```

### `GET /api/v1/trend`

A word's count and rate in every call of a company

| Parameter | Type | Default | Description |
|---|---|---|---|
| `symbol` (required) | string |  | Stock symbol, e.g. TSLA; a comma / space separated list where noted |
| `word` (required) | string |  | Word in Kalshi syntax: alternates separated by ' / ', optional threshold '(N+ times)' last, e.g. 'Tariff / Tariffs (3+ times)'; Polymarket's 'Quarter 15+ times' works too |
| `operator` | boolean |  | Count the operator's speech too (Kalshi rules that mention the operator); alias include\_operator |
| `analyst` | boolean |  | Count analysts' speech too (Polymarket's 'anyone' rule); alias include\_analyst |
| `include_operator` | boolean |  |  |
| `include_analyst` | boolean |  |  |

Try it: [/api/v1/trend?symbol=TSLA&word=Cybertruck](/api/v1/trend?symbol=TSLA&word=Cybertruck) (200, JSON, 7,393 bytes)

```
{"symbol":"TSLA","word":"Cybertruck","alts":["Cybertruck"],"threshold":1,"include_operator":false,"include_analyst":false,"points":[{"call_id":9266,"report_date":"2011-08-03","fiscal_year":2011,"fiscal_quarter":2,"count":0,"per10k":0.0,"hit":false},{"call_id":9267,"report_date":"2011-11-03","fiscal_year":2011,"fiscal_quarter":3,"count":0,"per10k":0.0,"hit":false},{"call_id":9268,"report_date":"2012-02-16","fiscal_yea
…
```

### `GET /api/v1/compare`

Terms gained / lost / new in call b vs call a (company speech)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `a` | integer |  | Base call id |
| `b` | integer |  | Call id compared against a |
| `symbol` | string |  | Instead of a / b: the symbol's previous vs latest call |
| `top` | integer | `40` |  |

Try it: [/api/v1/compare?symbol=TSLA&top=5](/api/v1/compare?symbol=TSLA&top=5) (200, JSON, 1,510 bytes)

```
{"a":{"id":9326,"symbol":"TSLA","report_date":"2026-07-22","fiscal_year":2026,"fiscal_quarter":2,"n_paragraphs":109,"n_words":8432,"company_words":7400,"flags":[],"n_events":2},"b":{"id":10500,"symbol":"TSLA","report_date":"2026-10-21","fiscal_year":2026,"fiscal_quarter":3,"n_paragraphs":120,"n_words":8205,"company_words":7097,"flags":[],"n_events":2},"gained":[{"term":"hard","a":3,"b":13,"a_per10k":4.0,"b_per10k":18
…
```

### `GET /api/v1/events`

Mention-market events (earnings JSON shape; next\_strikes\_preview = word:p)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `venue` | kalshi \| polymarket \| all | `all` |  |
| `status` | open \| closed \| settled \| all | `open` |  |
| `symbol` | string |  | Stock symbol, e.g. TSLA; a comma / space separated list where noted (list allowed) |
| `from` | string |  | Date YYYY-MM-DD; call date on or after |
| `to` | string |  | Date YYYY-MM-DD; call date on or before |
| `limit` | integer | `200` |  |
| `offset` | integer | `0` |  |
| `preview_n` | integer | `6` | Strikes in next\_strikes\_preview (open events; 0 = none) |
| `format` | json \| tsv \| csv | `json` | tsv / csv: one line per event |
| `fields` | string |  | Comma list of columns (tsv / csv / json rows): id, venue, ticker, series, symbol, company, title, call\_date, call\_type, status, close\_time, url, n\_strikes, volume, call\_id, counterpart\_id, session, call\_date\_source, venue\_call\_date, close\_is\_placeholder, n\_yes, n\_no, qa, next\_strikes\_preview |
| `markets` | boolean | `false` | Add venue prices (bid, ask, last, mid; may be delayed). Off by default (D7) |

Try it: [/api/v1/events?symbol=TSLA&limit=2](/api/v1/events?symbol=TSLA&limit=2) (200, JSON, 1,398 bytes)

### `GET /api/v1/events/{event_id}`

One event: strikes with history stats, published p (p\_src), results; prices with markets=1

| Parameter | Type | Default | Description |
|---|---|---|---|
| `event_id` (path) | string |  |  |
| `compact` | boolean | `false` | Drop internal keys, raw price subkeys and empty values |
| `markets` | boolean | `false` | Add venue prices (bid, ask, last, mid; may be delayed). Off by default (D7) |

Try it: [/api/v1/events/k:KXEARNINGSMENTIONTSLA-27JAN27?compact=1](/api/v1/events/k:KXEARNINGSMENTIONTSLA-27JAN27?compact=1) (200, JSON, 8,900 bytes)

### `GET /api/v1/strikes/{strike_id}/prices`

Market endpoint: price snapshots of one strike

| Parameter | Type | Default | Description |
|---|---|---|---|
| `strike_id` (path) | string |  |  |

Try it: [/api/v1/strikes/k:KXEARNINGSMENTIONTSLA-27JAN27-CHIN/prices](/api/v1/strikes/k:KXEARNINGSMENTIONTSLA-27JAN27-CHIN/prices) (200, JSON, 202 bytes)

### `GET /api/v1/calendar`

Tracked companies' calls in the next N days

| Parameter | Type | Default | Description |
|---|---|---|---|
| `days` | integer | `14` |  |

Try it: [/api/v1/calendar?days=7](/api/v1/calendar?days=7) (200, JSON, 20,110 bytes)

### `GET /api/v1/qa`

Settlement agreement: transcript count vs market result

| Parameter | Type | Default | Description |
|---|---|---|---|
| `symbol` | string |  |  |
| `venue` | kalshi \| polymarket |  |  |
| `mismatch_only` | boolean | `false` |  |
| `limit` | integer | `500` |  |
| `offset` | integer | `0` |  |

Try it: [/api/v1/qa?mismatch_only=1&limit=3](/api/v1/qa?mismatch_only=1&limit=3) (200, JSON, 9,637 bytes)

```
{"overall":{"n":8512,"agree":8442,"rate":0.9918},"by_venue":{"kalshi":{"n":6353,"agree":6304,"rate":0.9923},"polymarket":{"n":2159,"agree":2138,"rate":0.9903}},"by_symbol":[{"symbol":"RYAAY","n":13,"agree":10,"rate":0.7692},{"symbol":"INTU","n":14,"agree":12,"rate":0.8571},{"symbol":"MU","n":87,"agree":76,"rate":0.8736},{"symbol":"TSM","n":27,"agree":25,"rate":0.9259},{"symbol":"CALM","n":14,"agree":13,"rate":0.9286}
…
```

## Sports

Sports broadcasts: leagues, games and word boards (settlement history only).

### `GET /api/v1/sports`

Sports hub: per-league status, counts and next game, plus the live strip (history only)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `format` | string | `tsv` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports](/api/v1/sports) (200, TSV, 1,396 bytes)

```
# sports · state live = a market is open · History only on Kalshi: sports mention markets paused 31 Jul 2026 (https://www.stlpr.org/npr/2026-08-13/fe…
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
ent	name	state	v	events	strikes	first	last	next
nfl	NFL	live	KP	126	2610	2025-02-09	2026-10-18	
nba	NBA	history	KP	352	6530	2025-06-05	2026-06-23	
mlb	MLB	history	K	188	3531	2025-10-21	2026-08-01	
fifa-world-cup	FIFA World Cup	history	KP	167	4500	2025-12-05	2026-07-19	
…
```

### `GET /api/v1/sports/live`

Games with open or unresolved sports markets (upcoming, live or awaiting resolution)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `format` | string | `tsv` |  |
| `markets` | integer | `0` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/live](/api/v1/sports/live) (200, TSV, 1,109 bytes)

```
# sports live strip · states: live, upcoming (listed), pending (game over, unresolved), likely (national window, not listed yet) · top3 key:p<p>:n (c…
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
date	time	ent	app	away	home	net	booth	state	ev	v	n_w	top3
2026-10-11	16:25	nfl	nfl:2026-10-11:game-sf-sea	SF	SEA	Fox		pending	p:what-will-the-announcers-say-during-the-49ers-vs-seahawks-game-20261011	P	15	sa…
2026-10-15	20:15	nfl	nfl:2026-10-15:game-sea-den	SEA	DEN	Prime Video	Al Michaels, Kirk Herbstreit	pending	p:what-will-the-announcers-say-during-the-s…
2026-10-18	20:20	nfl	nfl:2026-10-18:game-dal-gb	DAL	GB	NBC	Mike Tirico, Cris Collinsworth	pending	p:what-will-the-announcers-say-during-the-cowboys-v…
…
```

### `GET /api/v1/sports/ufc/lengths`

UFC: YES share of settled bout words by how long the fight lasted

| Parameter | Type | Default | Description |
|---|---|---|---|
| `format` | string | `tsv` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/ufc/lengths](/api/v1/sports/ufc/lengths) (200, TSV, 407 bytes)

```
# UFC bouts: YES share of settled strikes by fight length (ESPN final round + clock)
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
bin	bouts	strikes	yes	rate	dec_y	dec_n	blood_y	blood_n
<=5 min (R1)	26	421	45	0.11	3	25	1	26
5-10 min	12	199	41	0.21	2	12	5	12
10-15 min	35	550	158	0.29	25	35	11	35
15-25 min	14	237	102	0.43	8	11	8	14
```

### `GET /api/v1/sports/games`

Games by league, date window (ET) and whether they listed markets

| Parameter | Type | Default | Description |
|---|---|---|---|
| `league` | string |  |  |
| `start` | string |  |  |
| `end` | string |  |  |
| `listed` | integer |  |  |
| `limit` | integer | `50` |  |
| `format` | string | `tsv` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/games?league=nfl&listed=1&limit=3](/api/v1/sports/games?league=nfl&listed=1&limit=3) (200, TSV, 728 bytes)

```
# sports games · ent = league · away / home = fighter a / b for fights
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
date	time	ent	app	away	home	net	booth	venue	surface	status	score	periods	ev
2025-09-28	20:20	nfl	nfl:2025-09-28:game-gb-dal	GB	DAL	NBC	Mike Tirico, Cris Collinsworth	AT&T Stadium	turf	final	40-40	5	k:KXSNFMENTION-25SEP28
2025-09-29	19:15	nfl	nfl:2025-09-29:game-nyj-mia	NYJ	MIA	ESPN		Hard Rock Stadium	grass	final	21-27	4	p:what-will-the-announcers-say-during-jets-vs-do…
2025-09-29	20:15	nfl	nfl:2025-09-29:game-cin-den	CIN	DEN	ABC	Joe Buck, Troy Aikman	Empower Field at Mile High	grass	final	3-28	4	k:KXNFLMENTION-25SEP…
…
```

### `GET /api/v1/sports/games/{app_id}`

One game: facts, linked market events and each listed word with league history and result

| Parameter | Type | Default | Description |
|---|---|---|---|
| `app_id` (path) | string |  |  |
| `markets` | integer | `0` |  |
| `format` | string | `tsv` |  |
| `limit` | integer |  |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/games/nfl:2026-10-18:game-dal-gb?limit=5](/api/v1/sports/games/nfl:2026-10-18:game-dal-gb?limit=5) (200, TSV, 1,163 bytes)

```
# sports game · app nfl:2026-10-18:game-dal-gb · ent nfl · away DAL · home GB · kickoff 2026-10-19T00:20:00Z · state done · network NBC · venue Lambe…
# markets P p:what-will-the-announcers-say-during-the-cowboys-vs-packers-game-20261018 open pbp_or_color
# history: league word history before this game, one per game; n_tm / n_net = games of either team / same network, shown when n>=5
# more 10 words not shown (limit=15 lists all)
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
w	key	thr	scope	v	n	y	rate	l10	n_tm	rate_tm	n_net	rate_net	p	p_src	res
Safety	safety	1	pbp_or_color	P	114	112	0.98	YYYYYYYYYY	21	1	24	1	0.96	hist	yes
…
```

### `GET /api/v1/sports/{league}/words`

A league's word board: games that listed each word, settled YES rate, last 10 and p

| Parameter | Type | Default | Description |
|---|---|---|---|
| `league` (path) | string |  |  |
| `sort` | string | `listed` |  |
| `limit` | integer | `100` |  |
| `format` | string | `tsv` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/nfl/words?limit=5](/api/v1/sports/nfl/words?limit=5) (200, TSV, 770 bytes)

```
# sports words · ent nfl · state live · History only on Kalshi: sports mention markets paused 31 Jul 2026
# listed = games that listed the word; n / y / rate / l10 count one settled observation per game; p = calibrated p for the next listing, p_src its so…
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
key	w	listed	n	y	rate	l10	last_y	p	p_src
late hit	Late Hit	115	115	13	0.11	nnnnnnnnnY	2026-10-18	0.19	hist
safety	Safety	115	115	113	0.98	YYYYYYYYYY	2026-10-18	0.97	hist
one handed	One Handed	115	114	21	0.18	nnnnnYnnnn	2026-10-05	0.15	hist
…
```

### `GET /api/v1/sports/{league}/teams/{team_id}`

A team: words whose YES rate in its games differs most from the league, and its games

| Parameter | Type | Default | Description |
|---|---|---|---|
| `league` (path) | string |  |  |
| `team_id` (path) | string |  |  |
| `format` | string | `tsv` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/nfl/teams/green-bay-packers](/api/v1/sports/nfl/teams/green-bay-packers) (200, TSV, 882 bytes)

```
# sports team · ent nfl · team green-bay-packers · Green Bay Packers · splits shown when n>=5 · lg_n / lg_rate = the whole league, diff = rate - lg_r…
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
key	w	n	y	rate	l10	lg_n	lg_rate	diff
pro bowl|pro bowler	Pro Bowl / Pro Bowler	6	3	0.5	nnnYYY	58	0.79	-0.29
contract	Contract	6	1	0.17	nnnYnn	61	0.43	-0.26
next gen stat	Next Gen Stat	6	4	0.67	YnYYnY	57	0.42	0.25
tush push	Tush Push	5	1	0.2	nnnYn	58	0.34	-0.14
…
```

### `GET /api/v1/sports/{league}/networks/{network}`

Word YES rates in one network's games of a league, with the league rate beside each

| Parameter | Type | Default | Description |
|---|---|---|---|
| `league` (path) | string |  |  |
| `network` (path) | string |  |  |
| `format` | string | `tsv` |  |
| `fields` | string |  |  |

Try it: [/api/v1/sports/nfl/networks/NBC](/api/v1/sports/nfl/networks/NBC) (200, TSV, 1,935 bytes)

```
# sports network · ent nfl · net NBC · splits shown when n>=5 · lg_n / lg_rate = the whole league, diff = rate - lg_rate
# as_of 2026-10-23T23:40:56Z · derived data CC BY 4.0 (credit parrot.markets) · not advice (parrot.markets/disclosure)
key	w	n	y	rate	l10	lg_n	lg_rate	diff
next gen stat	Next Gen Stat	8	8	1	YYYYYYYY	57	0.42	0.58
offside	Offside / Offsides	6	6	1	YYYYYY	20	0.7	0.3
fumble|fumbled	Fumble / Fumbles / Fumbled	8	5	0.62	YYnnYnYY	24	0.88	-0.25
pylon	Pylon	11	5	0.45	YnnYYnnnYn	37	0.22	0.24
…
```

## Status

Data freshness and service health.

### `GET /api/v1/status`

Data freshness, counts, each job's last run, QA rates and gap counts (compact); detail=1 adds job summaries and the gap lists

| Parameter | Type | Default | Description |
|---|---|---|---|
| `detail` | boolean | `false` | Add each job's last summary and the gap lists (earnings events without a symbol, capped; companies without transcripts) |

Try it: [/api/v1/status](/api/v1/status) (200, JSON, 2,303 bytes)

```
{"hf":{"sha":"2afd3723f8e92449618c617e4ed7d89e85ab0e18","last_modified":"2026-10-23T05:49:25.000Z","last_check":"2026-10-23T22:43:23Z","last_ingest":"2026-10-23T06:37:47Z"},"counts":{"companies":187,"calls":10507,"paragraphs":807079,"events":5500,"strikes":97161,"open_events":200,"entities":1149,"appearances":12835,"sources":11628,"segments":157244,"word_history":67986,"posts":12645},"jobs":[{"job":"backup","ok":true
…
```

### `GET /api/v1/status/health`

Compact health: green / amber / red, freshness per category, 5xx rate, Mac worker (<= 2 KB; ?probe=1 answers 503 when red)

| Parameter | Type | Default | Description |
|---|---|---|---|
| `probe` | boolean | `false` |  |

Try it: [/api/v1/status/health](/api/v1/status/health) (200, JSON, 1,111 bytes)

```
{"status":"green","at":"2026-10-23T23:38:53Z","checks":{"kalshi":"ok","pm":"ok","jobs":"ok","link":"ok","history":"ok","qa":"ok","errors":"ok","worker":"ok","text":"ok","backup":"ok","import":"ok"},"up":1,"why":[],"cat":{"business":["Delayed","2026-10-20T23:45",2,14],"earnings":["Up to date","2026-10-23T06:38",0,147],"entertainment":["No data yet","",0,1],"fed":["Up to date","2026-10-21T02:15",0,2],"news":["Up to dat
…
```
