The Data Model
Podcast → episode → insight
There are three entities. A podcast is a show; it contains
episodes; each episode yields insights. Every insight carries its
episode_id and podcast_id, and every id is resolvable through the
API — no dead ends.
One naming rule everywhere: an entity’s own fields are bare (id,
title, text, name); fields that point at another entity are
prefixed (episode_id, podcast_name, episode_audio_url).
Most integrations start with insights: they’re the objects you search, cite, and ground — so we take the entities in that order.
Insight — the atomic unit
One discrete, investor-relevant claim extracted from a conversation:
Field notes:
- Every insight object is self-contained: the speaker, the companies, the episode and show identity, and the audio pointer are all on it — displaying, citing, or playing an insight never requires a follow-up call.
textis our extracted paraphrase of the claim;quoteis the verbatim transcript passage it came from. Citetext, ground withquote.type:thesis= forward-looking argument,observation= qualitative read on the present,data_point= a concrete number.speaker_roleis what the speaker does professionally:operator(runs a business),investor(deploys capital),researcher(sell-side/academic),commentator(journalist/host),government. “CEO of a VC firm” = investor, not operator.unknownwhen the profession can’t be determined; the field is always present.mentions[].tickeris the canonical symbol for a tracked public company. Private and untracked names still appear in the insight text and are reachable through semantic queries.start_seconds/end_secondsare seconds intoepisode_audio_url— pass them straight to a player or a#t=fragment.- Results are ordered most-relevant first (newest first when no query); ordering is the relevance contract.
- Timestamps are ISO 8601 UTC with a
Zsuffix; request dates accept bare days,date_toinclusive. published_atis when the episode aired. New insights typically become searchable within hours of airing, so a “published today” query run at breakfast will fill in over the day.
Episode
One recording of a show — the conversation the insights were extracted from. An episode exists in the API only if it produced at least one searchable insight.
Field notes:
idis the join key: every insight from this conversation carries it asepisode_id, and search accepts it in theepisode_idsfilter to scope retrieval to one conversation.published_atis the point-in-time anchor its insights inherit — an insight is knowable from the moment its episode aired.insight_countis how much searchable content the conversation yielded — a 26-insight episode is a dense discussion, a 2-insight one a passing segment.episode_audio_urlis the full recording; insights carry the same URL plusstart_seconds/end_seconds, so any claim can be played at the moment it was said.
Podcast
The show — the ongoing feed episodes belong to. One directory entry per
show: mirror and regional feeds are merged, and podcast_ids lists every
feed id the show publishes under. A podcast exists in the API only if it
has searchable insights; absence means not covered, not “not found.”
Field notes:
idscopes work to one voice: search accepts it in thepodcast_idsfilter, so “everything this show has said about X” is one query. Any id inpodcast_idsworks too — the filter covers the whole show whichever feed id you hold.insight_count/episode_counttogether read as coverage depth — how much of this show’s thinking the corpus holds.latest_episode_atis the freshness signal: how recently this show last produced searchable content.