# Parrot (parrot.markets) > Free data for Kalshi and Polymarket mention markets: transcripts, word history and calibrated probabilities, for people and AI agents. Hubs: earnings calls, Trump, the Fed, White House briefings, news and talk shows, politics, sports broadcasts, business keynotes, entertainment, podcasts, world leaders. Transcripts and history first; prices are an opt-in layer (markets=1). Anonymous and read-only: no key, no signup, no OAuth. REST: https://parrot.markets/api/v1/... MCP (streamable HTTP, stateless): https://parrot.markets/mcp claude mcp add --transport http parrot https://parrot.markets/mcp ## Start here: one question, one call (sizes in bytes of the default TSV answer, measured on the full data 2026-10-21; '<=' is a budget the endpoint enforces) 1. What is listed in a hub? GET /api/v1/upcoming?category=trump ~1,700 (every hub: /api/v1/upcoming ~5,600; <=2,800 a hub-week) (MCP upcoming) 2. Everything about the next occasion GET /api/v1/brief?entity=donald-trump <=3,200: the words that fit, ranked by p; '# rows 1-48 of 54 · more: offset=48' pages the rest (limit=0 = all) (MCP brief) 3. Will they say this word? GET /api/v1/word?entity=donald-trump&word=Tariff ~290, one line (<=480) (MCP word) 4. Who / what is this? GET /api/v1/entity/fomc-press-conference ~1,000 (<=1,600) (MCP entity) 5. How did this word settle before? GET /api/v1/history?entity=donald-trump&word=Crypto ~870 for 8 listings (~70 a listing) (MCP history) 6. Where was it said? GET /api/v1/quotes?symbol=NFLX&word=Advertising ~1,500 (~250 a row, <=5 rows) (MCP quotes) 7. Search what was said GET /api/v1/search?q=tariff&limit=3 ~1,500 (10 transcripts ~4,600) (MCP search + fetch) 8. What changed since my last call? GET /api/v1/changes?since= ~3,100 a page of 50 rows (~60 a row) (MCP changes) Two calls answer "Will the Fed chair say 'uncertainty' at the next press conference?": upcoming?category=fed&days=14 (~500 bytes), then word?entity=fomc-press-conference&word=Uncertainty (~300). An empty upcoming says when the next occasion is ('# next beyond the window'). ChatGPT deep research / connectors: MCP search(query) -> {results: [{id, title, url, text}]}, then fetch(id) -> {id, title, text, url, metadata}; ids are entities, appearances, k:/p: events and /words/. ## Every hub: category=, an example entity and word (brief?entity= answers once upcoming lists an occasion) - earnings: GET /api/v1/entity/netflix · GET /api/v1/word?entity=netflix&word=Live%20Event (transcripts: quotes, tn/th; symbol=NFLX works too) - trump: GET /api/v1/entity/donald-trump · GET /api/v1/word?entity=donald-trump&word=Tariff (the hub is the entity; ~20 open events a week: rallies, remarks, windows) - fed: GET /api/v1/entity/fomc-press-conference · GET /api/v1/word?entity=fomc-press-conference&word=Uncertainty (scope role:fed-chair = whoever chairs that day; see role-fed-chair) - white-house: GET /api/v1/entity/white-house-press-briefing · GET /api/v1/word?entity=white-house-press-briefing&word=Border (scope role:press-secretary) - politics: GET /api/v1/entity/jd-vance · GET /api/v1/word?entity=jd-vance&word=Border - news: GET /api/v1/entity/world-news-tonight · GET /api/v1/word?entity=world-news-tonight&word=Trump (anchors and talk shows) - sports: GET /api/v1/entity/nba · GET /api/v1/word?entity=nba&word=Triple%20Double (leagues: the announcers of each game) - business: GET /api/v1/entity/elon-musk · GET /api/v1/word?entity=elon-musk&word=Tesla (CEOs, keynotes, posts) - entertainment: GET /api/v1/entity/love-island-usa · GET /api/v1/word?entity=love-island-usa&word=Bombshell - podcasts: GET /api/v1/entity/the-joe-rogan-experience · GET /api/v1/word?entity=the-joe-rogan-experience&word=Elon - world: GET /api/v1/entity/prime-ministers-questions · GET /api/v1/word?entity=prime-ministers-questions&word=Reform Transcripts (tn/th, quotes, search) by hub: of the word events settled in the 30 days to 2026-10-23, these had text: earnings calls 60 of 61, News 48 of 49, Podcasts 13 of 17. Series that meet less often, over their own last settled occasions: Fed: FOMC press conference 7 of its last 8 occasions, latest 2026-09-16 (other Fed events 0 of 6 in those 30 days). Other hubs show settlement history and p until their transcripts land and pass our checks (/accuracy); blank tn/th = no transcript yet, or the market's speakers are not attributed in the text; never zero. Clips: earnings calls with verified timings (Castify MP3 at the second); other sources use quotes. ## Ids - Hubs (category=): earnings, trump (one entity: donald-trump), news, politics, sports, business, entertainment, podcasts, world, fed, white-house. - Entities are stable slugs: donald-trump, kevin-warsh, nvidia, the-last-word, role-fed-chair. Earnings companies also take symbol=NFLX (an alias of entity=). List a hub: GET /api/v1/entities?category=news - Events: k:, p:. Appearances: ::. - Words: Kalshi syntax 'Tariff / Tariffs (3+ times)' (Polymarket's 'Tariff 3+ times' works too), or a key ('ai|artificial intelligence', key=); any word, listed or not. A word answers its own history; when the next market lists it inside a wider word, word says 'next as "Russia / Ukraine"' (next=1 answers that market instead). Plurals, possessives and spoken numbers count; thresholds are never merged. - Entities resolve by id, name, alias or a unique surname ('Warsh'); an ambiguous one is a 404 that lists 'did you mean' ids. ## Formats - Tables: format=tsv (default: '# ' head lines with key value pairs and as_of, a header row, tab-separated rows, empty cell = none) | json ({meta, cols, rows}) | md. word: format=text (one line) | json. - fields=a,b picks columns (unknown names: 400 listing the allowed ones); fields=full gives every column (icons on upcoming and entity). markets=1 adds px (mid 0-1 of the listing venue; may be delayed). - brief: the head gives each venue's speaker scope; a scope column appears only when a word differs. Default columns leave out a column empty on every row (tn/th before transcripts, p before it is published) and move a column with one value on every row to the head ('same on every row: p_src hist'; json: meta.same). - Every table and word answer has as_of and an ETag: send If-None-Match to get 304. Poll changes?since= instead of re-pulling lists (when a page says more, pass its next cursor back as since=). CORS is open (*) for GET. - Full text: GET /api/v1/appearances//text for public-domain / OPL sources (Fed, White House, Congress, UK Parliament); MCP fetch() includes it. - Errors: JSON {"error", "detail"}: 400 bad parameter (one short line), 404 unknown id, 403 rights, 429 rate limit, 503 query_timeout. Unknown parameters are ignored and named ('# ignored params: x'). - Search: FTS5 words, "phrases", OR / NEAR (<= 6 alternatives), NOT after a word, prefix* (3+ letters, <= 2 a query; a prefix matching most of the index is refused). '# more: offset=N' pages. ## Columns (one dictionary for every endpoint) - w: the word as listed by the venue - key: normalised word key: alternates joined by |, #N = threshold - thr: count threshold (3+ times = 3) - scope: who must say it (named, company_reps+operator, anyone, host, role:fed-chair, ...) - v: venues listing it: K Kalshi, P Polymarket - n: settled listings (settlement history) - y: YES among n - rate: y / n (always next to n) - l10: last <=10 results oldest -> newest, Y / n - last_y: date of the last YES - tn: transcript history: appearances checked (the last <=8 with text of the occasion's kind: rallies for a rally); blank = no transcript yet, or the market's speakers are not attributed in the text (tx / tx_reason say which), never zero - th: of those, appearances where the word reached thr under scope - tx: word: the transcripts behind tn/th, '8 rally 2026-07-29..2026-09-17' ('any' = every kind; '*' = too few of the occasion's kind, so every kind) - tx_reason: word json: why tn/th are blank: no_text | scope_unattributed - p: Parrot's calibrated probability that the word is said (blank until published) - p_src: p's inputs: hist = settlement history, tx = transcripts, blend = both, prior = a base rate (no settled history of the word: speaker / category rate; ranked after the rest) - cnt: after the event: count under scope - cnt_all: after the event: count over every speaker - res: yes no void pending; blank = open - t: media seconds of the first counted hit - clip: yt: