> ## 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.

# Find the most quotable moments on a topic

> Search dialogue by meaning, take the highlight clips that arrive with each match, then pull the strongest clips on a speaker or a show, each with playable audio.

A quotable moment is a clip: an AI-extracted highlight with a title, a one-line lead-in, an engagement score, and a direct MP3. Clips arrive inline on search matches, per episode, and as a catalog-wide list you can filter by speaker, show, type, and score. Every example below was run against `https://api.particle.pro`.

## 1. Search dialogue by meaning

Describe the idea in a sentence. `semantic_search` finds segments that discuss it even when the words differ; the matching lines are flagged, and any clips that overlap the segment ride along.

<CodeGroup>
  ```bash curl theme={"dark"}
  curl --get "https://api.particle.pro/v1/podcasts/episodes/search" \
    --data-urlencode "semantic_search=regretting raising too much venture capital" \
    --data-urlencode "limit=2" \
    -H "X-API-Key: $PARTICLE_API_KEY"
  ```

  ```js JavaScript theme={"dark"}
  const url = new URL("https://api.particle.pro/v1/podcasts/episodes/search");
  url.searchParams.set("semantic_search", "regretting raising too much venture capital");
  url.searchParams.set("limit", "2");
  const res = await fetch(url, { headers: { "X-API-Key": process.env.PARTICLE_API_KEY } });
  const { data } = await res.json();
  ```

  ```python Python theme={"dark"}
  import os, httpx

  headers = {"X-API-Key": os.environ["PARTICLE_API_KEY"]}
  data = httpx.get(
      "https://api.particle.pro/v1/podcasts/episodes/search",
      params={"semantic_search": "regretting raising too much venture capital", "limit": 2},
      headers=headers,
  ).json()["data"]
  ```
</CodeGroup>

```jsonc Response (truncated) theme={"dark"}
{
  "data": [
    {
      "episode": {
        "id": "7dY8r9CtoarTGg9qUmC1Bp",
        "title": "Rookie startup mistakes when raising money | Sidebean",
        "podcast": { "title": "Sidebean", "slug": "sidebean" }
      },
      "segment": {
        "type": "TOPIC_DISCUSSION",
        "title": "Mistake #4 – Asking for Too Much & Showing Desperation",
        "start_seconds": 335.58,
        "end_seconds": 384.864
      },
      "windows": [
        {
          "lines": [
            { "speaker": "Caya", "role": "HOST", "text": "I've seen entrepreneurs with no team, no product, no revenue, pitching a round of $5 million…", "is_match": true },
            { "speaker": "Caya", "role": "HOST", "text": "You always want to raise the least amount of money possible, and that's why a good financial model is important.", "is_match": true }
          ]
        }
      ],
      "match": { "source": "semantic", "relevance_score": 0.5397 },
      "clips": [
        { "id": "TcUA0GKAyxtqm9LhGWjeG", "type": "INSIGHTFUL", "title": "Desperation Repels Investors", "engagement_score": 68, "duration_seconds": 24.287, "audio_url": "https://cdn.particle.pro/podcast/episode/…" },
        { "id": "w0YipNOcYB8L0JwHQri2P", "type": "INFORMATIVE", "title": "Rookie Ask: Too Much Cash", "engagement_score": 55, "duration_seconds": 24.757, "audio_url": "https://cdn.particle.pro/podcast/episode/…" }
      ]
    }
    // …
  ],
  "has_more": false
}
```

Each result is one segment of one episode, and `clips` holds the highlights cut from it. Write the query as a statement of the idea; for a phrase that must be spoken word for word (a product name, a ticker, a slogan), use `keyword_search` instead, or both together for a hybrid ranking. `relevance_score` orders results within one query.

## 2. Take the clips from an episode

When a search hit is the right episode, list all of its clips, best first:

```bash theme={"dark"}
curl "https://api.particle.pro/v1/podcasts/episodes/7dY8r9CtoarTGg9qUmC1Bp/clips?limit=3" \
  -H "X-API-Key: $PARTICLE_API_KEY"
```

Each clip carries `title`, `description`, `intro_statement` (a ready-made lead-in for share copy), `engagement_score`, the `speaker` with a knowledge-graph link when identified, `start_seconds` and `end_seconds` in the episode, and `audio_url`, a direct MP3 you can embed or attach.

## 3. Pull the strongest clips on a speaker or a show

The catalog-wide clip list takes a `speaker` (a person slug), a `podcast_id`, a `type`, and `min_engagement`. Scores are on one scale across the catalog, so a threshold means the same thing on every show; above 70 is strong.

<CodeGroup>
  ```bash curl theme={"dark"}
  curl "https://api.particle.pro/v1/podcasts/clips?speaker=sam-altman&min_engagement=80&limit=2" \
    -H "X-API-Key: $PARTICLE_API_KEY"
  ```

  ```js JavaScript theme={"dark"}
  const url = new URL("https://api.particle.pro/v1/podcasts/clips");
  url.searchParams.set("speaker", "sam-altman");
  url.searchParams.set("min_engagement", "80");
  url.searchParams.set("limit", "2");
  const { data } = await (await fetch(url, { headers: { "X-API-Key": process.env.PARTICLE_API_KEY } })).json();
  ```

  ```python Python theme={"dark"}
  data = httpx.get(
      "https://api.particle.pro/v1/podcasts/clips",
      params={"speaker": "sam-altman", "min_engagement": 80, "limit": 2},
      headers=headers,
  ).json()["data"]
  ```
</CodeGroup>

```jsonc Response (truncated) theme={"dark"}
{
  "data": [
    {
      "id": "7TKA6qoeXYJeCH75pDH1J4",
      "type": "INSIGHTFUL",
      "title": "Chatbots Finally Become Useful",
      "description": "Sam Altman argues that natural-language computer interfaces have finally become practical and could seriously challenge…",
      "engagement_score": 93,
      "duration_seconds": 83.08,
      "speaker": { "name": "Sam Altman", "role": "SOUNDBITE_SPEAKER", "entity": { "slug": "sam-altman", "name": "Sam Altman" } },
      "episode": { "title": "It's Time to Regard A.I. (ChatGPT and Beyond)", "podcast": { "title": "ColdFusion", "slug": "coldfusion" } },
      "audio_url": "https://cdn.particle.pro/podcast/episode/…"
    }
    // …
  ],
  "has_more": true,
  "cursor": "r.…"
}
```

Scope the same list to one show with `podcast_id=the-daily`, or to one kind of moment with `type` (`INSIGHTFUL`, `FUNNY`, `CONTROVERSIAL`, `AHA_MOMENT`, `NOTABLE_LINE`, and more). The `speaker` filter takes the person slug that `GET /v1/entities/search?q=` returns, so resolve a name first and pass the slug.

## Related

* [Episode search](/podcasts/episode-search) for every search parameter and how empty pages explain themselves
* [Segments and clips](/podcasts/segments-and-clips) for the clip model and types
* [Paginate through everything](/recipes/pagination) when you want more than one page of clips
