> ## Documentation Index
> Fetch the complete documentation index at: https://docs.particle.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# Replay the episode archive

> Replays a month or a day of the podcast episode archive as Server-Sent Events, so a consumer of `GET /v1/podcasts/episodes/stream` can load history through the same code. Each `episode` event carries the episode exactly as the stream delivers it, in publication order, and a `complete` event closes a full replay. Resume a dropped connection with `cursor`. **Available by arrangement.** For bulk loading, the download endpoint is several times faster.

> [!TIP]
>
> Prefer the terminal? This endpoint is also a command in the Particle CLI: pick **Particle CLI** in the request example's language menu. [Install the Particle CLI](https://cli.particle.pro).


## OpenAPI

````yaml /openapi.json get /v1/podcasts/episodes/archive/stream
openapi: 3.1.0
info:
  contact:
    email: api@particle.pro
    name: Particle
    url: https://particle.pro
  description: >-
    Podcast API for transcripts, mentions and sponsorship data. 140,000+
    podcasts transcribed, diarized and speaker-identified within minutes of
    airing, about 28,000 episodes a day. Search transcripts by keyword or
    meaning, track brand and company mentions with alerts, pull sponsor and
    ad-read data and rankings. REST API plus an MCP server for AI agents. Also
    company, people and topic intelligence.
  summary: >-
    Podcast API: transcripts, mentions, sponsors and rankings for 140,000+
    podcasts.
  termsOfService: https://particle.pro/legal/tos-api
  title: Particle API
  version: 0.1.0
  x-guidance: >-
    Podcast, people, company and topic intelligence. Authenticate with a pp_ API
    key (X-API-Key header) or pay per request with x402: a keyless call to a
    billable endpoint returns 402 with the payment requirements in the
    PAYMENT-REQUIRED header; sign the USDC transfer and repeat the request with
    PAYMENT-SIGNATURE. Start with GET /v1/podcasts/search?q=<show name>; the
    slugs in responses are the inputs to the other endpoints. Docs:
    https://docs.particle.pro; setup playbook:
    https://api.particle.pro/agents.md; endpoint and tool map with prices:
    https://api.particle.pro/llms.txt; credential recipe:
    https://api.particle.pro/auth.md.
  x-logo:
    url: https://particle.pro/favicon.svg
servers:
  - url: https://api.particle.pro
security:
  - ApiKeyHeader: []
  - BearerAuth: []
externalDocs:
  url: https://docs.particle.pro
paths:
  /v1/podcasts/episodes/archive/stream:
    get:
      tags:
        - Podcast Episodes
        - tier:standard
      summary: Replay the episode archive
      description: >-
        Replays a month or a day of the podcast episode archive as Server-Sent
        Events, so a consumer of `GET /v1/podcasts/episodes/stream` can load
        history through the same code. Each `episode` event carries the episode
        exactly as the stream delivers it, in publication order, and a
        `complete` event closes a full replay. Resume a dropped connection with
        `cursor`. **Available by arrangement.** For bulk loading, the download
        endpoint is several times faster.
      operationId: stream-episode-archive
      parameters:
        - description: A month (YYYY-MM) or a day (YYYY-MM-DD), by UTC publication date.
          explode: false
          in: query
          name: period
          required: true
          schema:
            description: A month (YYYY-MM) or a day (YYYY-MM-DD), by UTC publication date.
            examples:
              - 2026-09
            pattern: ^\d{4}-\d{2}(-\d{2})?$
            type: string
        - description: Heavy relations to keep in each episode. Defaults to all of them.
          explode: false
          in: query
          name: include
          schema:
            description: Heavy relations to keep in each episode. Defaults to all of them.
            items:
              enum:
                - transcript
                - segments
                - clips
                - entities
                - ads
                - all
              type: string
            type:
              - array
              - 'null'
        - description: >-
            Resume after this event: pass the cursor of the last episode you
            processed. If the period was rebuilt since, the replay answers with
            an error event; start it again without a cursor.
          explode: false
          in: query
          name: cursor
          schema:
            description: >-
              Resume after this event: pass the cursor of the last episode you
              processed. If the period was rebuilt since, the replay answers
              with an error event; start it again without a cursor.
            type: string
      responses:
        '200':
          content:
            text/event-stream:
              schema:
                description: >-
                  Each oneOf object in the array represents one possible Server
                  Sent Events (SSE) message, serialized as UTF-8 text according
                  to the SSE specification.
                items:
                  oneOf:
                    - properties:
                        data:
                          $ref: '#/components/schemas/EpisodeArchiveComplete'
                        event:
                          const: complete
                          description: The event name.
                          type: string
                        id:
                          description: The event ID.
                          type: integer
                        retry:
                          description: The retry time in milliseconds.
                          type: integer
                      required:
                        - data
                        - event
                      title: Event complete
                      type: object
                    - properties:
                        data:
                          properties:
                            cursor:
                              description: Pass as cursor= to resume after this episode.
                              type: string
                            episode:
                              $ref: '#/components/schemas/Episode'
                          required:
                            - cursor
                            - episode
                          type: object
                        event:
                          const: episode
                          description: The event name.
                          type: string
                        id:
                          description: The event ID.
                          type: integer
                        retry:
                          description: The retry time in milliseconds.
                          type: integer
                      required:
                        - data
                        - event
                      title: Event episode
                      type: object
                    - properties:
                        data:
                          $ref: '#/components/schemas/StreamError'
                        event:
                          const: error
                          description: The event name.
                          type: string
                        id:
                          description: The event ID.
                          type: integer
                        retry:
                          description: The retry time in milliseconds.
                          type: integer
                      required:
                        - data
                        - event
                      title: Event error
                      type: object
                title: Server Sent Events
                type: array
          description: OK
        default:
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PlatformError'
          description: Error
      x-codeSamples:
        - label: cURL
          lang: curl
          source: |-
            curl -H "X-API-Key: $PARTICLE_API_KEY" \
              "https://api.particle.pro/v1/podcasts/episodes/archive/stream?period=2026-09"
        - label: Particle CLI
          lang: bash
          source: |-
            # Install: https://cli.particle.pro
            particle episode archive-stream 2026-09
components:
  schemas:
    EpisodeArchiveComplete:
      additionalProperties: false
      properties:
        episodes:
          description: Episodes sent by this connection.
          format: int64
          type: integer
        period:
          description: The period replayed.
          type: string
      required:
        - period
        - episodes
      type: object
    Episode:
      additionalProperties: false
      properties:
        ads:
          description: >-
            Advertising spots detected in the episode, in playback order. Only
            present when include=ads (or include=all) is requested at the
            fully_ingested milestone, and in episode archive records.
          items:
            $ref: '#/components/schemas/EpisodeAd'
          type:
            - array
            - 'null'
        audio_url:
          description: >-
            Particle's CDN copy of the episode audio. Every timestamp in our
            responses (transcript lines, segments, clips, mentions) is measured
            against this copy. Use it when no one will listen, such as for
            analysis or processing, so those downloads aren't counted as
            listens, and to play or cut audio from a specific point. To play the
            whole episode to a listener, use url.
          type: string
        clip_count:
          description: Number of AI-extracted clips
          format: int64
          type: integer
        clips:
          description: >-
            AI-extracted clips. Only present when include=clips (or include=all)
            is requested at the fully_ingested milestone.
          items:
            $ref: '#/components/schemas/Clip'
          type:
            - array
            - 'null'
        description:
          description: Episode description
          type: string
        duration_seconds:
          description: Episode duration in seconds
          format: double
          type: number
        entities:
          description: >-
            Knowledge graph entities discussed in the episode, most salient
            first, with the transcript lines that mention each. Only present
            when include=entities (or include=all) is requested at the
            fully_ingested milestone, and in episode archive records.
          items:
            $ref: '#/components/schemas/EpisodeEntity'
          type:
            - array
            - 'null'
        entity_count:
          description: Number of mentioned entities
          format: int64
          type: integer
        episode_number:
          description: Episode number in the series
          format: int64
          type: integer
        explicit:
          description: Whether the episode contains explicit content
          type: boolean
        has_transcript:
          description: Whether a transcript is available
          type: boolean
        id:
          description: Unique identifier
          type: string
        image_url:
          description: Episode artwork URL
          type: string
        language:
          description: ISO 639-1 language code
          type: string
        podcast:
          $ref: '#/components/schemas/PodcastCompact'
          description: Parent podcast
        published_at:
          description: Publication date
          format: date-time
          type: string
        segment_count:
          description: Number of AI-identified segments
          format: int64
          type: integer
        segments:
          description: >-
            AI-identified segments. Only present when include=segments (or
            include=all) is requested at a milestone of segmented or later.
          items:
            $ref: '#/components/schemas/Segment'
          type:
            - array
            - 'null'
        slug:
          description: Human-readable slug identifier
          type: string
        speakers:
          description: Speakers in this episode
          items:
            $ref: '#/components/schemas/EpisodeSpeaker'
          type:
            - array
            - 'null'
        title:
          description: Episode title
          type: string
        topics:
          description: Topic classifications
          items:
            $ref: '#/components/schemas/Topic'
          type:
            - array
            - 'null'
        transcript:
          $ref: '#/components/schemas/DialogueTranscriptResponse'
          description: >-
            Dialogue transcript. Only present when include=transcript (or
            include=all) is requested at a milestone of transcribed or later.
        transcript_status:
          description: >-
            Where the episode stands on the way to a transcript. transcribed:
            the transcript is available. processing: we are transcribing it, or
            retrying after a failure. queued: a back-catalogue episode whose
            transcript has been requested and is waiting to be transcribed.
            requestable: a discovered back-catalogue episode we have not
            transcribed. unavailable: it can never be transcribed, for example
            because its audio no longer exists.
          enum:
            - transcribed
            - processing
            - queued
            - requestable
            - unavailable
          type: string
        url:
          description: >-
            The episode's audio file as the podcast's RSS feed publishes it.
            Feeds often route it through a measurement or ad-insertion service
            such as Podtrac, which counts each download and can insert different
            ads each time. Use it to play the whole episode to a listener, so
            the publisher's downloads and ad impressions are counted. Because
            the inserted ads vary, its timing need not match our timestamps: to
            play or cut from a specific point, use audio_url.
          type: string
        videos:
          description: >-
            Video URLs discovered for this episode (native enclosures,
            Podcasting 2.0 alternate enclosures, Media RSS, and platform links /
            show-note URLs from YouTube, Vimeo, Twitch, Rumble). Populated on
            the GET /podcasts/episodes/{id} endpoint.
          items:
            $ref: '#/components/schemas/EpisodeVideo'
          type:
            - array
            - 'null'
      required:
        - id
        - title
        - explicit
        - duration_seconds
        - has_transcript
        - transcript_status
      type: object
    StreamError:
      additionalProperties: false
      properties:
        message:
          type: string
      required:
        - message
      type: object
    PlatformError:
      additionalProperties: false
      properties:
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        error_code:
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        resolve:
          $ref: '#/components/schemas/ErrorResolve'
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
      type: object
    EpisodeAd:
      additionalProperties: false
      properties:
        company_id:
          description: >-
            The sponsor's company, when linked: the identifier GET
            /v1/companies/{id} takes (its domain, slug or encoded ID). Fetch its
            current profile there.
          type: string
        duration_seconds:
          description: Ad duration in seconds
          format: double
          type: number
        end_seconds:
          description: Ad end offset within the episode, in seconds
          format: double
          type: number
        id:
          description: Unique identifier
          type: string
        offer_description:
          description: Promotional offer details
          type: string
        placement_type:
          description: Where the ad appeared in the episode (PRE_ROLL, MID_ROLL, POST_ROLL)
          type: string
        product:
          description: Advertised product or service
          type: string
        read_type:
          description: How the ad was delivered (HOST_READ, PRE_RECORDED, NETWORK_PROMO)
          type: string
        sponsor_id:
          description: Linked sponsor ID, when known
          type: string
        sponsor_name:
          description: Name of the advertising sponsor
          type: string
        sponsor_url:
          description: Sponsor website URL
          type: string
        start_seconds:
          description: Ad start offset within the episode, in seconds
          format: double
          type: number
        url:
          description: Moment link that plays the ad on Radar, at start_seconds.
          type: string
      required:
        - id
        - sponsor_name
        - read_type
        - start_seconds
        - end_seconds
        - duration_seconds
      type: object
    Clip:
      additionalProperties: false
      properties:
        audio_url:
          description: Direct audio URL for this clip
          type: string
        description:
          description: AI-generated clip description
          type: string
        duration_seconds:
          description: Clip duration
          format: double
          type: number
        end_seconds:
          description: End time within the episode
          format: double
          type: number
        engagement_score:
          description: >-
            AI-predicted engagement potential (integer, 0 to 100). Values above
            70 are typical for a strong clip.
          format: double
          type: number
        episode:
          $ref: '#/components/schemas/EpisodeCompactWithPodcast'
          description: Parent episode with podcast context
        id:
          description: Unique identifier
          type: string
        intro_statement:
          description: AI-generated hook text for social sharing
          type: string
        quote:
          description: >-
            Verbatim transcript line from the clip, at most 140 characters, by
            the clip's speaker where possible
          type: string
        segment:
          $ref: '#/components/schemas/SegmentCompact'
          description: Parent segment context
        speaker:
          $ref: '#/components/schemas/ClipSpeaker'
          description: Primary speaker in this clip
        start_seconds:
          description: Start time within the episode
          format: double
          type: number
        title:
          description: AI-generated clip title
          type: string
        type:
          description: Clip type
          enum:
            - SPICY
            - CONTROVERSIAL
            - EMOTIONAL
            - FUNNY
            - SHOCKING
            - INSIGHTFUL
            - INFORMATIVE
            - EDUCATIONAL
            - PHILOSOPHICAL
            - AHA_MOMENT
            - NOTABLE_LINE
            - BEST_STORY
            - DEBATE_DISAGREEMENT
          type: string
        url:
          description: >-
            Moment link that plays the clip in its episode on Radar: the
            episode's web_url with ?t= at start_seconds. Cite or share it to
            link the exact moment. On a clip inside a search match it comes from
            the match's episode. Omitted when the episode is not known.
          type: string
      required:
        - id
        - title
        - engagement_score
        - start_seconds
        - end_seconds
        - duration_seconds
      type: object
    EpisodeEntity:
      additionalProperties: false
      properties:
        entity:
          $ref: '#/components/schemas/EntityCompact'
          description: The knowledge graph entity
        mention_lines:
          description: >-
            Numbers of the transcript lines (transcript.lines[].number) that
            mention the entity, by its name or by a form extraction recognized
            for it, ascending. Absent when no line does.
          items:
            format: int64
            type: integer
          type:
            - array
            - 'null'
        occurrences:
          description: Number of mentions in the episode
          format: int64
          type: integer
        salience:
          description: >-
            Importance score for the entity within the episode. When salience
            metadata is available, this is a percentile rank in (0.0, 1.0) —
            0.95 means more salient than 95% of other entities mentioned, and
            the top entity approaches but never reaches 1.0. A value of 0.0
            indicates the salience is unknown or unavailable.
          format: double
          type: number
      required:
        - entity
        - salience
        - occurrences
      type: object
    PodcastCompact:
      additionalProperties: false
      properties:
        best_rank:
          $ref: '#/components/schemas/PodcastRankingHandle'
          description: >-
            The single best (lowest-numbered) chart position this podcast
            currently holds across all charts. Omitted when the podcast holds no
            current chart appearances, and on endpoints that do not attach it.
            Reading a full chart (with country/category/source filters and
            history) remains premium; a single show's own placement is available
            on every plan.
        id:
          description: Podcast ID
          type: string
        image_url:
          description: Cover image URL
          type: string
        popularity:
          description: >-
            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.
          format: double
          type: number
        publisher:
          $ref: '#/components/schemas/PodcastPublisherCompact'
          description: >-
            Publisher (network) attributed to this podcast. Present only when
            the embedding endpoint preloads publisher attribution and the
            podcast's publisher is known.
        slug:
          description: Human-readable slug identifier
          type: string
        title:
          description: Podcast title
          type: string
      required:
        - id
        - title
      type: object
    Segment:
      additionalProperties: false
      properties:
        audio_url:
          description: Direct audio URL for this segment
          type: string
        description:
          description: AI-generated segment description
          type: string
        duration_seconds:
          description: Segment duration
          format: double
          type: number
        end_line:
          description: >-
            Last transcript line covered by this segment (1-indexed, inclusive).
            Omitted for episodes segmented before line ranges were recorded.
          format: int64
          type: integer
        end_seconds:
          description: >-
            End time within the episode — when the segment's last spoken line
            ends. Where start_line/end_line are present, segments partition the
            transcript's lines rather than tiling the wall-clock timeline, and
            the interval between this and the next segment's start_seconds
            contains no transcribed speech (typically under a second,
            occasionally minutes of music or silence). Segments without a
            recorded line range were produced by an earlier segmenter and a
            small share of them do leave transcript lines uncovered, so a gap
            between two such segments may contain real speech. Use
            start_line/end_line to slice a transcript losslessly.
          format: double
          type: number
        episode:
          $ref: '#/components/schemas/EpisodeCompactWithPodcast'
          description: Parent episode with podcast context
        id:
          description: Unique identifier
          type: string
        number:
          description: Segment position within the episode
          format: int64
          type: integer
        read_type:
          description: >-
            For AD segments, how the ad was delivered (HOST_READ, PRE_RECORDED,
            NETWORK_PROMO)
          type: string
        start_line:
          description: >-
            First transcript line covered by this segment (1-indexed,
            inclusive). Line numbers match the number field of GET
            /v1/podcasts/episodes/{id}/transcript lines. This segment's end_line
            + 1 is the next segment's start_line, and the segments together
            cover every line of the transcript. Omitted for episodes segmented
            before line ranges were recorded.
          format: int64
          type: integer
        start_seconds:
          description: >-
            Start time within the episode — when the segment's first spoken line
            begins
          format: double
          type: number
        summary:
          description: AI-generated segment summary
          type: string
        title:
          description: AI-generated segment title
          type: string
        type:
          description: >-
            Segment type (INTRO, PERSONAL_BANTER, TOPIC_DISCUSSION, INTERVIEW,
            TRANSITION, AD, OUTRO)
          type: string
        url:
          description: >-
            Moment link that plays the segment on Radar from start_seconds: the
            episode's web_url with ?t=. Ad placements are segments, so this is
            also the link to an ad read. On a search match's segment it comes
            from the match's episode. Omitted only when the segment's episode or
            its podcast is unavailable.
          type: string
      required:
        - id
        - number
        - type
        - title
        - start_seconds
        - end_seconds
        - duration_seconds
      type: object
    EpisodeSpeaker:
      additionalProperties: false
      properties:
        description:
          description: Brief description of the speaker
          type: string
        descriptor:
          description: >-
            Movie-credits-style role-in-context label for speakers we can
            describe but not identify by name ("Taylor's Lawyer", "Court
            Officer"). Co-exists with name carrying the raw STT label when no
            identity could be established. Rendered by clients when descriptor
            is non-empty and the speaker is otherwise unresolved.
          type: string
        entity:
          $ref: '#/components/schemas/EntityCompact'
          description: Linked knowledge graph entity, when this speaker is identified
        expertise:
          $ref: '#/components/schemas/SpeakerExpertise'
          description: >-
            What the speaker knows, compactly: standing, seniority, and their
            most specific occupations and fields with the codes the
            guest_occupation and guest_field filters take. Omitted when the
            person is not read yet, when their link is unsettled, when the
            episode may describe someone else than the linked person, or for a
            role reads do not cover (only hosts, guests, panelists and
            correspondents carry one). The full read is GET
            /v1/people/{id}/expertise.
        name:
          description: Speaker name
          type: string
        person:
          $ref: '#/components/schemas/PersonCompact'
          description: >-
            Linked first-class Person, when the speaker has been resolved to a
            row in /v1/people
        role:
          description: >-
            Speaker role, always one of HOST, GUEST, PANELIST, CORRESPONDENT,
            MODERATOR, NARRATOR, ANNOUNCER, VOICE_ACTOR, SOUNDBITE_SPEAKER,
            AUDIENCE, ADVERTISER, PRODUCER, UNKNOWN, OTHER. Responses carry only
            HOST, GUEST, PANELIST and CORRESPONDENT unless you widen the set
            with the role query param.
          type: string
        speaking_duration_seconds:
          description: Total speaking time in seconds
          format: double
          type: number
      required:
        - name
      type: object
    Topic:
      additionalProperties: false
      properties:
        ancestry:
          description: Human-readable breadcrumb path (e.g. Business > Technology > AI)
          type: string
        ancestry_path:
          description: Hash-based ancestry path for programmatic filtering
          type: string
        episode_count:
          description: >-
            Number of episodes in this podcast that cover this topic (only
            populated for /v1/podcasts/{id} topic lists)
          format: int64
          type: integer
        id:
          description: Unique identifier
          type: string
        name:
          description: Topic name
          type: string
        slug:
          description: >-
            Ancestry-based slug (e.g., technology/artificial-intelligence). Can
            be used as topic_id.
          type: string
      required:
        - id
        - name
        - slug
      type: object
    DialogueTranscriptResponse:
      additionalProperties: false
      properties:
        duration_seconds:
          description: Total duration in seconds
          format: double
          type: number
        episode_id:
          description: Parent episode ID
          type: string
        excerpt:
          description: >-
            True when this response is one requested segment of the episode
            rather than the whole transcript.
          type: boolean
        language:
          description: Transcript language code
          type: string
        lines:
          description: Speaker-attributed dialogue lines
          items:
            $ref: '#/components/schemas/DialogueLine'
          type:
            - array
            - 'null'
        segment_end_seconds:
          description: End of the excerpt's segment, in seconds.
          format: double
          type: number
        segment_id:
          description: >-
            The segment this excerpt covers. Pass to get-segment-transcript for
            the same lines.
          type: string
        segment_start_seconds:
          description: Start of the excerpt's segment, in seconds.
          format: double
          type: number
      required:
        - episode_id
        - duration_seconds
        - lines
      type: object
    EpisodeVideo:
      additionalProperties: false
      properties:
        duration_seconds:
          description: Video duration in seconds when known
          format: int64
          type: integer
        height:
          description: Frame height in pixels when known
          format: int64
          type: integer
        mime_type:
          description: MIME type when known (e.g. video/mp4)
          type: string
        platform:
          description: >-
            Hosting platform. native denotes a direct media file served from the
            podcaster's own infrastructure; other is the fallback when we know
            the URL is video but don't have a platform-specific handler.
          enum:
            - youtube
            - vimeo
            - twitch
            - rumble
            - tiktok
            - native
            - other
          type: string
        url:
          description: Video URL
          type: string
        width:
          description: Frame width in pixels when known
          format: int64
          type: integer
      required:
        - url
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    ErrorResolve:
      additionalProperties: false
      properties:
        action:
          type: string
        endpoint:
          type: string
        message:
          type: string
        method:
          type: string
        url:
          type: string
      required:
        - message
      type: object
    EpisodeCompactWithPodcast:
      additionalProperties: false
      properties:
        id:
          description: Episode ID
          type: string
        podcast:
          $ref: '#/components/schemas/PodcastCompact'
          description: Parent podcast
        published_at:
          description: Publication date
          format: date-time
          type: string
        slug:
          description: Human-readable slug identifier
          type: string
        title:
          description: Episode title
          type: string
        web_url:
          description: >-
            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.
          type: string
      required:
        - id
        - title
      type: object
    SegmentCompact:
      additionalProperties: false
      properties:
        id:
          description: Segment ID
          type: string
        title:
          description: Segment title
          type: string
        type:
          description: Segment type
          type: string
      required:
        - id
        - type
        - title
      type: object
    ClipSpeaker:
      additionalProperties: false
      properties:
        entity:
          $ref: '#/components/schemas/EntityCompact'
          description: Linked knowledge graph entity, when this speaker is identified
        name:
          description: Speaker name
          type: string
        person:
          $ref: '#/components/schemas/PersonCompact'
          description: Linked first-class Person, when the speaker has been resolved
        role:
          description: Speaker role
          type: string
      required:
        - name
      type: object
    EntityCompact:
      additionalProperties: false
      properties:
        company:
          $ref: '#/components/schemas/EntityCompany'
          description: Linked company record, if this entity is a known company
        description:
          description: Short description
          type: string
        id:
          description: Entity ID
          type: string
        image_url:
          description: Entity image URL
          type: string
        name:
          description: Entity name
          type: string
        person:
          $ref: '#/components/schemas/EntityPerson'
          description: Linked person record, if this entity is a known person
        slug:
          description: Human-readable slug identifier
          type: string
        type:
          $ref: '#/components/schemas/EntityType'
          description: Category. Omitted when the entity falls outside the supported set.
        wikipedia_url:
          description: Wikipedia URL
          type: string
      required:
        - id
        - slug
        - name
      type: object
    PodcastRankingHandle:
      additionalProperties: false
      properties:
        captured_at:
          format: date-time
          type: string
        category_slug:
          type: string
        chart_type:
          enum:
            - top_podcasts
          type: string
        country:
          type: string
        rank:
          format: int64
          type: integer
        source:
          enum:
            - apple
            - spotify
          type: string
      required:
        - source
        - chart_type
        - rank
        - captured_at
      type: object
    PodcastPublisherCompact:
      additionalProperties: false
      properties:
        id:
          description: Publisher ID
          type: string
        name:
          description: Publisher name
          type: string
        slug:
          description: >-
            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).
          type: string
      required:
        - id
        - name
      type: object
    SpeakerExpertise:
      additionalProperties: false
      properties:
        fields:
          description: >-
            Up to three ANZSRC 2020 fields of research the speaker is listed
            under, most specific first, none an ancestor of another. Pass a code
            or slug as guest_field (or field) to filter by it.
          items:
            $ref: '#/components/schemas/ExpertiseCode'
          type:
            - array
            - 'null'
        occupations:
          description: >-
            Up to three SOC 2018 occupations the speaker is listed under, most
            specific first, none an ancestor of another. Pass a code or slug as
            guest_occupation (or occupation) to filter by it.
          items:
            $ref: '#/components/schemas/PersonOccupation'
          type:
            - array
            - 'null'
        seniority:
          description: >-
            The highest level the speaker has reached in their field; omitted
            below professional.
          enum:
            - professional
            - senior
            - distinguished
          type: string
        standing:
          description: >-
            How the speaker's standing is recognized: established (conferred by
            others: a credential, a position, recognition in the field),
            self_described (claimed by the speaker), or unverified (the records
            do not say, which never means the speaker is not an expert).
          enum:
            - established
            - self_described
            - unverified
          type: string
      required:
        - standing
      type: object
    PersonCompact:
      additionalProperties: false
      properties:
        description:
          description: Short description (e.g. current role), when known.
          type: string
        id:
          description: Encoded Person identifier
          type: string
        image_url:
          description: Canonical headshot URL when one is known for the Person
          type: string
        name:
          description: Display name
          type: string
        slug:
          description: >-
            Stable human-readable handle (e.g. 'satya-nadella'). Recommended
            canonical identifier on every Particle Pro person surface.
          type: string
      required:
        - id
        - name
      type: object
    DialogueLine:
      additionalProperties: false
      properties:
        end_seconds:
          description: End time in seconds
          format: double
          type: number
        number:
          description: Line number (1-indexed)
          format: int64
          type: integer
        role:
          description: >-
            Speaker role. One of the canonical buckets documented on the episode
            speakers endpoint (HOST, GUEST, PANELIST, CORRESPONDENT, MODERATOR,
            NARRATOR, ANNOUNCER, VOICE_ACTOR, SOUNDBITE_SPEAKER, AUDIENCE,
            ADVERTISER, PRODUCER, UNKNOWN, OTHER).
          type: string
        speaker:
          description: Speaker name or ID
          type: string
        start_seconds:
          description: Start time in seconds
          format: double
          type: number
        text:
          description: Spoken text
          type: string
      required:
        - number
        - speaker
        - start_seconds
        - end_seconds
        - text
      type: object
    EntityCompany:
      additionalProperties: false
      properties:
        domain:
          description: Company website domain
          type: string
        id:
          description: Company identifier
          type: string
        ticker:
          description: Primary stock ticker symbol
          type: string
      required:
        - id
      type: object
    EntityPerson:
      additionalProperties: false
      properties:
        company:
          description: Current company name
          type: string
        id:
          description: Person identifier
          type: string
        image_url:
          description: Person headshot URL
          type: string
        title:
          description: Current role title
          type: string
      required:
        - id
      type: object
    EntityType:
      additionalProperties: false
      properties:
        name:
          description: Human-friendly display label (e.g. 'Company').
          type: string
        slug:
          description: >-
            Stable identifier, safe to pass to the type query parameter (e.g.
            'company').
          type: string
      required:
        - slug
        - name
      type: object
    ExpertiseCode:
      additionalProperties: false
      properties:
        code:
          description: >-
            The standard's own notation, such as 29-1212 (SOC), 2212 (ISCO), or
            320101 (FoR).
          type: string
        group:
          description: >-
            Set for a code that stands for several detailed SOC 2018
            occupations: a SOC minor group (such as 29-1000 Healthcare
            Diagnosing or Treating Practitioners), a broad group (such as
            29-1210 Physicians), or an alias, an everyday name such as doctors
            (physicians and surgeons). Every occupation filter accepts one and
            matches a speaker listed under any of its occupations.
          enum:
            - minor
            - broad
            - alias
          type: string
        level:
          description: >-
            Depth in the standard's official hierarchy: SOC major group 1 and
            detailed occupation 2; FoR division 1, group 2, field 3; ISCO-08
            unit group 4 and minor group 3. ISCO-08 codes are the groups SOC
            maps to, listed flat without the standard's upper levels. Omitted
            for a SOC group or alias (see group).
          format: int64
          type: integer
        parent_code:
          description: >-
            The standard's official parent code; omitted at the top level and
            for every ISCO-08 code, since ISCO-08 is listed without its upper
            levels. A SOC broad group's parent is its minor group and a minor
            group's its major group, but a detailed SOC occupation's official
            parent is its major group (29-1211 has parent_code 29-0000), so it
            can differ from parent, which is the browse parent one level up
            (29-1210).
          type: string
        slug:
          description: The title as a URL segment, such as cardiologists.
          type: string
        standard:
          description: >-
            The standard the code belongs to: soc_2018 (US Standard Occupational
            Classification), isco_08 (the ILO's International Standard
            Classification of Occupations), or anzsrc_for_2020 (ANZSRC Fields of
            Research).
          enum:
            - soc_2018
            - isco_08
            - anzsrc_for_2020
          type: string
        title:
          description: The standard's official title, such as Cardiologists.
          type: string
      required:
        - standard
        - code
        - title
        - slug
      type: object
    PersonOccupation:
      additionalProperties: false
      properties:
        code:
          description: >-
            The standard's own notation, such as 29-1212 (SOC), 2212 (ISCO), or
            320101 (FoR).
          type: string
        established:
          description: >-
            Whether others conferred the speaker's standing in this occupation,
            such as a licence or an appointment, rather than the speaker
            describing it. Present for detailed SOC 2018 occupations only.
          type: boolean
        group:
          description: >-
            Set for a code that stands for several detailed SOC 2018
            occupations: a SOC minor group (such as 29-1000 Healthcare
            Diagnosing or Treating Practitioners), a broad group (such as
            29-1210 Physicians), or an alias, an everyday name such as doctors
            (physicians and surgeons). Every occupation filter accepts one and
            matches a speaker listed under any of its occupations.
          enum:
            - minor
            - broad
            - alias
          type: string
        level:
          description: >-
            Depth in the standard's official hierarchy: SOC major group 1 and
            detailed occupation 2; FoR division 1, group 2, field 3; ISCO-08
            unit group 4 and minor group 3. ISCO-08 codes are the groups SOC
            maps to, listed flat without the standard's upper levels. Omitted
            for a SOC group or alias (see group).
          format: int64
          type: integer
        parent_code:
          description: >-
            The standard's official parent code; omitted at the top level and
            for every ISCO-08 code, since ISCO-08 is listed without its upper
            levels. A SOC broad group's parent is its minor group and a minor
            group's its major group, but a detailed SOC occupation's official
            parent is its major group (29-1211 has parent_code 29-0000), so it
            can differ from parent, which is the browse parent one level up
            (29-1210).
          type: string
        practicing:
          description: >-
            Whether the speaker still works in this occupation, as opposed to
            having worked in it. Present for detailed SOC 2018 occupations only.
          type: boolean
        slug:
          description: The title as a URL segment, such as cardiologists.
          type: string
        standard:
          description: >-
            The standard the code belongs to: soc_2018 (US Standard Occupational
            Classification), isco_08 (the ILO's International Standard
            Classification of Occupations), or anzsrc_for_2020 (ANZSRC Fields of
            Research).
          enum:
            - soc_2018
            - isco_08
            - anzsrc_for_2020
          type: string
        title:
          description: The standard's official title, such as Cardiologists.
          type: string
      required:
        - standard
        - code
        - title
        - slug
      type: object
  securitySchemes:
    ApiKeyHeader:
      description: Pass your API key in the X-API-Key header (recommended).
      in: header
      name: X-API-Key
      type: apiKey
    BearerAuth:
      description: Pass your API key as a Bearer token in the Authorization header.
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.