Quotes with their speaker and second, by API
A REST API, webhooks and an MCP endpoint that return quotes, never transcripts: the exact words, who said them, the show, the date and the second, with a page to cite. All three are in pilot. Keys come with it.
One address, JSON, a key
The addresses below aren’t open yet. They’re what pilot teams get with a key.
- Base address
https://api.poddata.ai/v1 - Send your key as
Authorization: Bearer pd_live_…. A key belongs to a team and is shown once. - JSON only. Times are ISO 8601 in UTC, and seconds are numbers.
- Lists page with a cursor:
?limit=(20 unless you say, at most 100) and?cursor=. Asincecursor returns only what’s new, for polling. - Errors are
{ "error": { "code", "message" } }with the matching status.
curl "https://api.poddata.ai/v1/quotes?q=memory+prices&person=sam-altman" \
-H "Authorization: Bearer pd_live_…" A quote, as the API returns it
{
"data": [
{
"id": "q_example",
"text": "until right now, I don’t think making memory has ever been a great business over a long period of time.",
"speaker": {
"id": "p_example",
"name": "Sam Altman",
"role": "Co-founder & CEO, OpenAI",
"status": "confirmed"
},
"show": {
"id": "s_example",
"name": "Cheeky Pint"
},
"episode": {
"id": "e_example",
"title": "Why Sam Altman is against a single superintelligence",
"date": "2026-10-29"
},
"starts_at": 1676,
"ends_at": 1682,
"clock": "video",
"url": "https://poddata.ai/q/q_example",
"source_url": "https://www.youtube.com/watch?v=iMsUcCYNKqY&t=1676s",
"cite": "Sam Altman, Co-founder & CEO, OpenAI. Cheeky Pint, Oct 29, 2026, at 27:56. https://poddata.ai/q/q_example",
"corrected": null
}
],
"next": null
} A real quote, in the shape the API returns. The ids, the address on poddata.ai and the end second are made up for the example.
The routes
| Route | What it does |
|---|---|
GET /quotes | Quotes, newest first. Filter by meaning (q), person, company, show, from, to, confirmed (true unless you say otherwise) and since |
GET /quotes/{id} | One quote |
GET /people | The people we follow. Filter by q, kind and company |
GET /people/{id} | One person, with their latest quotes |
GET /shows | The shows we follow, each with its latest episode’s date |
GET /coverage | Counts and freshness: sources, episodes indexed in the last 7 and 30 days, the median time from feed to index |
GET /trackers | Your team’s trackers |
POST /trackers | Make a tracker from a sentence, with its name and how it’s delivered |
POST /trackers/preview | What a sentence would have caught in the last 90 days. Saves nothing |
PATCH /trackers/{id} | Change a tracker’s name, sentence, status, delivery or recipients |
DELETE /trackers/{id} | Delete a tracker. Its matches stay readable for 30 days |
GET /trackers/{id}/matches | A tracker’s matches, newest first, each with its quote. Takes since |
POST /matches/{id}/feedback | Say a match was right ("good") or wrong ("not_this") |
GET, POST, DELETE /webhooks | List, register or remove your webhooks. The secret is shown once |
POST /webhooks/{id}/test | Send a ping |
GET /usage | Your team’s counts by day and kind |
Quotes, never transcripts
80 words at most
Nothing returns more than 80 words in a row from an episode, and one key gets at most 20 quotes from one episode a day.
120 requests a minute
For each key, and 60 tracker previews a day for each team. Past a limit, you get 429 with Retry-After.
Confirmed speakers first
Quotes whose speaker is unconfirmed are left out unless you ask for them with confirmed=false.
Each new quote, posted to you
Register an address and get a secret, shown once. Each event is a POST with a JSON body.
- Events:
match.created,quote.correctedandping. - Signature:
X-PodData-Signature: t=…,v1=…, where v1 is the HMAC-SHA256 oft.bodywith your secret. Refuse a t older than five minutes. - Retries: anything but a 2xx within 10 seconds is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours, with the same event id.
- Turned off after 20 failures in a row, and your team’s owner gets an email.
import { createHmac, timingSafeEqual } from 'node:crypto';
// header is X-PodData-Signature; body is the raw request body.
function verify(header, body, secret) {
const { t, v1 = '' } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const want = createHmac('sha256', secret).update(`${t}.${body}`).digest('hex');
return want.length === v1.length && timingSafeEqual(Buffer.from(want), Buffer.from(v1));
} PodData inside your AI assistant
Streamable HTTP at https://api.poddata.ai/mcp, with the same key as the REST API. Each quote it returns carries its line to cite and its page.
| Tool | What it does |
|---|---|
search_quotes | Search quotes by meaning, person, show and date |
list_trackers | Your team’s trackers |
preview_tracker | What a sentence would have caught |
create_tracker | Make a tracker from a sentence, after a preview |
tracker_matches | A tracker’s latest matches |
not_this | Mark a match as wrong |
{
"mcpServers": {
"poddata": {
"type": "http",
"url": "https://api.poddata.ai/mcp",
"headers": { "Authorization": "Bearer pd_live_…" }
}
}
} Get a key with the pilot.
Tell us what you’re building and who you need to hear. We’ll reply by email, and set you up with a key.
Request pilot access