---
title: "List related episodes"
method: GET
path: "/v1/podcasts/episodes/{id}/related"
tags: ["Podcast Episodes", "tier:standard"]
---

# List related episodes

`GET /v1/podcasts/episodes/{id}/related`

## Request

- Base URL: `https://api.particle.pro`
- URL: `https://api.particle.pro/v1/podcasts/episodes/{id}/related`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Returns episodes from other shows that cover the same story or subject as this episode, best first: a live nearest-neighbour search over episode content, reranked on shared salient entities, shared topics and a shared news story. Each result carries a calibrated score and a band (strong / moderate / weak); pass include=basis to see the signals behind each match. Use published_within_days for 'who else covered this story this week'; pass same_podcast=true to admit the show's own episodes. Returns an empty page when the episode has no embedded content yet, and 404 when the episode is not found.

## Path parameters

- `id` string, required: Episode slug or ID

## Query parameters

- `limit` integer: Results per page
- `cursor` string: Opaque pagination cursor from previous response
- `same_podcast` boolean: Admit episodes of the same show. Off by default: a show's own episodes are its episode list (GET /v1/podcasts/{id}/episodes), not its related content.
- `published_within_days` integer: Only episodes published within this many days of the query episode, on either side. Omit (or 0) for no window. Use a short window (7–30) for 'who else covered this story'.
- `include` string[], nullable: Optional response sections. Pass include=basis to attach, for every result, the signals that make the two episodes related: content similarity, shared entities (with names), shared topics, a shared news story, shared guests, and days apart.

## Response `200`

OK

- PageRelatedEpisode
  - `cursor` string: Pass to next request for more results
  - `data` RelatedEpisode[], nullable, required: List of results
    - `band` 'strong' | 'moderate' | 'weak', required: Coarse class of the score: strong (the same story or subject), moderate (overlapping subject), weak (a loose connection). Branch on this rather than on exact score thresholds.
    - `basis` RelatedEpisodeBasis
      - `content_similarity` number, double: Cosine similarity of the two episodes' content centroids in [0,1]; omitted when either episode has no embedded content segments.
      - `days_apart` number, double: Absolute difference between the two publish dates, in days. Omitted when either episode has no publish date.
      - `shared_entities` RelatedEpisodeEntity[], nullable: Up to three shared entities that contribute most, most significant first. Their ids feed GET /v1/entities/{id} and the mentions tools.
        - `id` string, required: Knowledge-graph entity id, valid on GET /v1/entities/{id}.
        - `name` string, required: Entity name.
      - `shared_entity_count` integer, required: Number of salient knowledge-graph entities both episodes are about.
      - `shared_guest_count` integer, required: Number of guests who appear in both episodes.
      - `shared_story_count` integer, required: Number of news stories both episodes were linked to. Non-zero means the two episodes discuss the same story.
      - `shared_topic_count` integer, required: Number of taxonomy topics both episodes were classified under.
    - `episode` EpisodeCompactWithPodcast, required
      - `id` string, required: Episode ID
      - `podcast` PodcastCompact
        - `best_rank` PodcastRankingHandle
          - `captured_at` string, date-time, required
          - `category_slug` string
          - `chart_type` 'top_podcasts', required
          - `country` string
          - `rank` integer, required
          - `source` 'apple' | 'spotify', required
        - `id` string, required: Podcast ID
        - `image_url` string: Cover image URL
        - `popularity` number, double: Global popularity percentile in (0,1], a cume_dist ranking over all currently-charting podcasts (Apple Podcasts charts). Higher is more popular. Omitted when the podcast is not currently charting, on endpoints that build this resource from a projection rather than the full podcast row, and in episode stream, feed and archive payloads, which are stored and replayed: read it live from the podcast endpoints.
        - `publisher` PodcastPublisherCompact
          - `id` string, required: Publisher ID
          - `name` string, required: Publisher name
          - `slug` string: Human-readable slug identifier (e.g., 'goalhanger', 'iheartpodcasts'). When present, accepted in place of the ID anywhere a publisher reference is taken in the API. Occasionally absent on publishers whose name doesn't slugify (e.g., scripts not representable in ASCII URL slugs).
        - `slug` string: Human-readable slug identifier
        - `title` string, required: Podcast title
      - `published_at` string, date-time: Publication date
      - `slug` string: Human-readable slug identifier
      - `title` string, required: Episode title
      - `web_url` string: The episode's page on Radar, where it plays beside its transcript: https://radar.particle.pro/podcasts/{podcast}/episodes/{episode}, each segment the slug or, when there is none, the raw UUID. Append ?t={seconds} to start at a moment; the hit's own url field already does. Omitted for back-catalogue episodes we have not ingested, which have no page, and in episode stream, feed and archive payloads stored before this field shipped (they are replayed as stored): build it from the slugs, or fetch the episode.
    - `score` number, double, required: Fused relatedness in (0,1]; higher is more likely to be judged related. Comparable across episodes.
  - `has_more` boolean, required: Whether more results exist

## Other responses

- `402`: Payment Required. Read error_code. payment_required is the x402 path: either a keyless request being challenged — pay $0.03 in USDC per request (requirements in the PAYMENT-REQUIRED header) or send a pp_ API key — or a supplied payment that failed settlement (details in the PAYMENT-RESPONSE header; retry the same signature before signing a new one). See https://docs.particle.pro/x402. Any other code means the credential was accepted but does not cover this request (a plan or session gate such as premium_required or paid_plan_confirmation_required); its resolve says how to obtain access, and no payment header is sent.
- `default`: Error

---

[API](https://skmtc.dev/particle/apis/particle-api.md) · [All operations](https://skmtc.dev/particle/apis/particle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/particle/apis/particle-api/revisions/416ba82ab9d7?raw)
