score in (0, 1), and a coarse band (strong / moderate / weak). Branch on the band rather than on raw score thresholds.
Add include: ["basis"] to see why each pair is related: content similarity of the two episodes, the named entities they share, shared topics, a shared news story, shared guests, and how many days apart they were published. Use published_within_days for news-style questions (“who covered this in the same fortnight”) and same_podcast: true to include the source show’s own episodes, which are excluded by default.
Results are computed live from the episode’s content centroid and reranked on the structured signals, then cached for a day, so the first call for an episode is slower than repeats. An episode with no embedded content yet returns an empty list, not an error.
This is not a topic search — for dialogue about a subject use particle_podcast_search_transcripts. It is not a mention lookup — for every line naming an entity use particle_podcast_find_mentions. For shows like a show, use particle_podcast_list_related.
Inputs
Output
## Related episodes for <episode_slug> (N) followed by one numbered line per episode — **Episode title** (episode-slug) — Show title (podcast-slug) · 2026-09-01 — score 0.83, strong — and, with include: ["basis"], an indented reason line such as content similarity 0.71; shared entities: Federal Reserve, Jerome Powell; same story; 2 days apart. When more pages exist a trailing line More results: pass cursor=… is appended, carrying the cursor to pass back. An empty set carries a one-line note instead of an error.
Slugs are edges: every episode slug feeds particle_podcast_get_episode and particle_podcast_search_transcripts’s episode_slug filter; show slugs feed particle_podcast_resolve.