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

# Transcript Search

> Search across transcribed videos by keyword or natural language

FastDrop lets you search across all transcribed videos in a batch using keyword, semantic, or hybrid search. Search is free (0 credits per query) after the initial transcription cost.

## How it works

1. **Transcribe** your videos using the [`/transcribe`](/api-reference/transcribe-video) endpoint or include `transcribe` in batch capabilities
2. **Search** the batch using [`POST /v1/batch/{id}/search`](/api-reference/search-batch)

Each transcribed video is broken into timestamped segments. When you search, FastDrop finds the segments that match your query and returns them with the video filename, timestamps, and a relevance score.

<Note>
  Search works on any transcribed batch. Classification is not required. You can transcribe and search without ever running `classify`.
</Note>

## Search modes

### Keyword

Full-text search using PostgreSQL with language-aware stemming. Best for finding exact phrases, names, or specific terms.

```json theme={null}
{
  "query": "machine learning",
  "mode": "keyword"
}
```

### Semantic

Embedding-based similarity search. Understands meaning, not just words. Best for finding topics discussed in different phrasing.

```json theme={null}
{
  "query": "how to improve video quality",
  "mode": "semantic"
}
```

### Hybrid (default)

Combines keyword and semantic search with score fusion (0.4 keyword + 0.6 semantic). Best overall accuracy for most queries.

```json theme={null}
{
  "query": "color grading tips",
  "mode": "hybrid"
}
```

## Multilingual search

When videos are transcribed with translation enabled, each segment is stored in both the source language and English. This means you can:

* Search Arabic footage using English queries
* Search Japanese interviews for English keywords
* Find content across languages in a single query

Semantic search searches all languages by default. Keyword search works across both source and translated text.

## Credit costs

| Action | Credits |
| - | :-: |
| Transcribe a video (standalone) | 5 |
| Transcribe for search (batch add-on) | 3/video |
| Search query | 0 |

## Code examples

### Search a batch

<CodeGroup>
  ```python Python theme={null}
  import httpx

  API_KEY = "fd_live_your_key_here"
  BATCH_ID = "a1b2c3d4-5678-90ab-cdef-1234567890ab"

  response = httpx.post(
      f"https://api.fastdrop.io/api/v1/batch/{BATCH_ID}/search",
      headers={"X-API-Key": API_KEY},
      json={
          "query": "talking about deadlines",
          "mode": "hybrid",
          "max_results": 10,
      },
  )

  data = response.json()
  for result in data["results"]:
      print(f'{result["filename"]} [{result["start_time"]:.1f}s - {result["end_time"]:.1f}s]')
      print(f'  "{result["text"]}"')
      print(f'  Score: {result["relevance_score"]}, Language: {result["language"]}')
  ```

  ```javascript JavaScript theme={null}
  const API_KEY = "fd_live_your_key_here";
  const BATCH_ID = "a1b2c3d4-5678-90ab-cdef-1234567890ab";

  const response = await fetch(
    `https://api.fastdrop.io/api/v1/batch/${BATCH_ID}/search`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "X-API-Key": API_KEY,
      },
      body: JSON.stringify({
        query: "talking about deadlines",
        mode: "hybrid",
        max_results: 10,
      }),
    }
  );

  const data = await response.json();
  for (const result of data.results) {
    console.log(`${result.filename} [${result.start_time}s - ${result.end_time}s]`);
    console.log(`  "${result.text}"`);
    console.log(`  Score: ${result.relevance_score}, Language: ${result.language}`);
  }
  ```
</CodeGroup>

### Example response

```json theme={null}
{
  "query": "talking about deadlines",
  "total_results": 3,
  "results": [
    {
      "video_id": "f8e7d6c5-...",
      "filename": "GH010087.MP4",
      "role": null,
      "start_time": 42.5,
      "end_time": 49.2,
      "text": "We need to push the deadline back by at least two weeks.",
      "relevance_score": 0.8721,
      "match_type": "hybrid",
      "language": "en",
      "thumbnail_url": "https://storage.fastdrop.io/thumbs/..."
    }
  ]
}
```

## Response fields

| Field | Type | Description |
| - | - | - |
| `video_id` | string | UUID of the matched video |
| `filename` | string | Original filename |
| `role` | string \| null | Classification role (null if not classified) |
| `start_time` | float | Segment start time in seconds |
| `end_time` | float | Segment end time in seconds |
| `text` | string | Transcript text of the matched segment |
| `relevance_score` | float | 0.0 to 1.0 relevance score |
| `match_type` | string | `keyword`, `semantic`, or `hybrid` |
| `language` | string | ISO 639-1 code of the segment language |
| `thumbnail_url` | string \| null | Video thumbnail URL |

## What works well

* Finding specific topics discussed across many videos
* Locating quotes or key moments by content
* Searching multilingual footage in English
* Building searchable archives of interviews, lectures, or meetings

## Limitations

* Search requires transcription first — silent or music-only videos won't have searchable content
* Domain-specific jargon may affect keyword search accuracy
* Semantic search works best with natural language queries, not single keywords

## Error responses

| Status | Code | Meaning |
| - | - | - |
| 404 | Batch not found | Batch doesn't exist or doesn't belong to your API key |
| 409 | Batch not completed | Batch is still processing — wait for completion |
| 400 | Search not enabled | Batch was not transcribed with search enabled |


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