Search podcast episode content
Search podcast episode content. To find podcasts (shows) by name or topic, use /v1/podcasts/search?q=….
Answeringour last check, 2026-09-24
1 of 1checks answered this week
151 msmedian answer time
$0.03listed price per call
$0.03price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
GET https://api.particle.pro/v1/podcasts/episodes/search
| Category | Search and research |
|---|---|
| Provider host | api.particle.pro |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 16 from 2 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-09-24 | valid payment request | 402 | $0.03 | 151 ms |
Example input (from the provider)
{
"method": "GET",
"queryParams": {
"language": "fr",
"since": "2024-01-01",
"until": "2024-06-01"
},
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"method": {
"enum": [
"GET"
],
"type": "string"
},
"queryParams": {
"properties": {
"company_id": {
"description": "Optional company slug, domain, or ID. Resolves to the company's linked entity and applies as a filter.",
"type": "string"
},
"context": {
"description": "Lines of surrounding dialogue around each matched line (1-15, default 1). Widens each match's transcript window in place \u2014 request more context instead of fetching the full transcript. Window size stays bounded even at the maximum.",
"format": "int64",
"type": "integer"
},
"cursor": {
"description": "Opaque cursor from a previous response.",
"type": "string"
},
"entity_id": {
"description": "Optional entity slug or ID. Filters results to episodes featuring this entity. For 'every line about X', use /v1/podcasts/mentions instead.",
"type": "string"
},
"entity_type": {
"description": "Optional entity category slug. Filters to episodes that *mention* any entity in that category (e.g. 'company', 'school', 'book'). Speakers are always people, so this filter only narrows mentioned entities. Cannot be combined with 'role'. Ignored when entity_id resolves to a specific entity. See GET /v1/entities/types for the available slugs.",
"type": "string"
},
"episode_id": {
"description": "Filter to a specific episode by slug or ID.",
"type": "string"
},
"keyword_match": {
"description": "How unquoted keyword_search terms are applied. 'required' (default) filters to segments containing every term, so results are guaranteed to contain what you typed \u2014 this also constrains semantic_search, making a hybrid query an intersection of the two. 'ranked' instead lets unquoted terms only boost BM25 relevance without excluding anything, which widens recall for loose bag-of-words queries but returns segments that may contain none of them. Quoted phrases are unaffected: they filter in BOTH modes, so to relax a phrase remove its quotes. Ignored when keyword_search is empty.",
"enum": [
"required",
"ranked"
],
"type": "string"
},
"keyword_search": {
"description": "BM25 lexical search over dialogue. Use when an exact token must appear verbatim \u2014 tickers, drug names, product codes. By default every token must appear somewhere in the matched segment (see keyword_match). Wrap any token sequence in double quotes (e.g. \"machine learning\") to additionally require those words adjacent and in order in the segment's spoken dialogue \u2014 a speaker's own name is not indexed as dialogue, so quoting a person's name finds segments where the name appears in what was said, not segments they speak in. Adjacency spans consecutive lines, so a phrase may rarely straddle a line break. Multiple quoted phrases AND together (e.g. \"central bank\" \"interest rates\"). There is no boolean OR \u2014 a bare OR is treated as an ordinary word, so pass alternatives as separate requests.",
"type": "string"
},
"language": {
"description": "Restrict to episodes of podcasts in this language (ISO 639-1 code, e.g. 'fr'). Matches the podcast's primary language subtag, so 'fr' covers 'fr-FR'.",
"type": "string"
},
"limit": {
"description": "Results per page (1-100, default 25).",
"format": "int64",
"type": "integer"
},
"podcast_id": {
"description": "Podcast slug, internal ID, or numeric iTunes ID.",
"type": "string"
},
"role": {
"description": "How the entity must relate to the episode. Speaking roles: 'guest', 'host', 'panelist', 'correspondent', or 'speaker' for any of them. 'mention' means the entity is talked about rather than speaking. Omit to match both. Matches the role values on /v1/podcasts/episodes.",
"enum": [
"guest",
"host",
"panelist",
"correspondent",
"speaker",
"mention"
],
"type": "string"
},
"semantic_search": {
"description": "Vector-similarity search by meaning. Express the query the way you'd describe the topic to a colleague \u2014 paraphrase tolerant, finds segments that express the same idea in different vocabulary. Combine with keyword_search for hybrid ranking. Describe a topic, not a name: to find a specific person or company, filter with entity_id / company_id (or use /v1/podcasts/mentions for every line about them) \u2014 and for an exact token like a ticker, use keyword_search.",
"type": "string"
},
"since": {
"description": "Only segments from episodes published after this date.",
"type": "string"
},
"sort": {
"description": "Sort order. Defaults to relevance.",
"enum": [
"relevance",
"recency"
],
"type": "string"
},
"type": {
"description": "Segment type filter.",
"enum": [
"INTRO",
"PERSONAL_BANTER",
"TOPIC_DISCUSSION",
"INTERVIEW",
"TRANSITION",
"A