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

# Transcription requests

> Have back-catalogue episodes transcribed on request, and follow each request until its transcript is ready.

A podcast's older episodes are its [back catalogue](/podcasts/episodes#transcript-status-and-the-back-catalogue): we list them with their feed metadata, but have not transcribed them. Request one, and we transcribe it. Once it is transcribed it keeps its ID, and every episode endpoint serves its transcript, speakers, entities, topics, segments, ads and clips, exactly as for any other episode.

Requests belong to your organization, so they need an organization's API key. They are not available through per-request payment ([x402](/x402)), which has no organization to hold them.

## Find episodes to request

Back-catalogue episodes read `transcript_status: requestable`. List a show's with `transcript_status=requestable`:

```bash theme={"dark"}
curl "https://api.particle.pro/v1/podcasts/crime-junkie/episodes?transcript_status=requestable&published_before=2020-01-01" \
  -H "X-API-Key: $PARTICLE_API_KEY"
```

`GET /v1/podcasts/{id}?include=coverage` counts a show's episodes by `transcript_status` and by year, to plan requests without paging through them.

## Request a transcript

Send one episode per request:

```bash theme={"dark"}
curl -X POST "https://api.particle.pro/v1/podcasts/transcription/requests" \
  -H "X-API-Key: $PARTICLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"episode_id": "5HZ8M9tlTQ0yTgtObZ5zJs"}'
```

A request that queues the episode answers `202` with the new request:

```json theme={"dark"}
{
  "id": "5zFTy7HD96FeUt9QPOXNXi",
  "episode_id": "5HZ8M9tlTQ0yTgtObZ5zJs",
  "podcast_id": "sOFDtTJovkWaaEhasy1E4",
  "state": "queued",
  "created_at": "2026-10-02T05:40:56.278899Z"
}
```

Only a `202` is billed as a transcription request, at your plan's price for `POST /v1/podcasts/transcription/requests`. Every other successful request answers `200` and is billed at the regular lookup price, because there is nothing new to transcribe:

| You requested | Response |
| - | - |
| An episode you requested before | Your existing request. |
| An episode another organization's request already queued | Your own request, which follows the same transcription. |
| An episode we already hold | No request is created: there is no `id`, and `state` says where its transcript stands. |

So requesting an episode again, or one somebody else is already paying to transcribe, never costs a second transcription.

## Follow a request

A request moves through these states:

| `state` | Meaning |
| - | - |
| `queued` | Waiting its turn. The episode reads `transcript_status: queued`. |
| `admitted` | Being transcribed (`admitted_at` is when it started). The episode reads `transcript_status: processing`. |
| `transcribed` | The transcript is available (`completed_at` is when). The episode reads `transcript_status: transcribed`. |
| `failed` | It will not be transcribed. `failure_reason` says why, for example `enclosure_gone` when the publisher has removed the audio, `podcast_removed` when the podcast has left the catalog, or `timed_out` when transcription did not finish in time. |

A request starts transcribing within seconds while there is capacity. When there is not, it waits its turn, with organizations served by plan and then evenly, so one organization's large backlog does not hold up everyone else's requests. Follow it with either of:

* `GET /v1/podcasts/transcription/requests/{id}`, the request itself;
* `GET /v1/podcasts/episodes/{id}`, whose `transcript_status` changes as the request does.

```json theme={"dark"}
{
  "id": "5zFTy7HD96FeUt9QPOXNXi",
  "episode_id": "5HZ8M9tlTQ0yTgtObZ5zJs",
  "podcast_id": "sOFDtTJovkWaaEhasy1E4",
  "state": "transcribed",
  "created_at": "2026-10-02T05:40:56.278899Z",
  "admitted_at": "2026-10-02T05:41:12.435531Z",
  "completed_at": "2026-10-02T05:43:17.079322Z"
}
```

`GET /v1/podcasts/transcription/requests` lists your organization's requests, newest first, filtered by `state` and `podcast_id`. Reading requests is never billed.

A back-catalogue episode does not appear in the [episode feed](/podcasts/feed) or [stream](/podcasts/stream) when it is transcribed: they carry the episodes podcasts publish, and an old episode transcribed today is not news. Follow your requests instead.

## Limits and turnaround

`GET /v1/podcasts/transcription` returns what you need to plan, and is never billed:

```json theme={"dark"}
{
  "limits": {
    "open_requests": 12,
    "open_requests_limit": 200,
    "daily_requests": 40,
    "daily_requests_limit": 500,
    "daily_requests_resets_at": "2026-10-03T05:40:56.278899Z"
  },
  "requests": [
    { "state": "queued", "count": 9 },
    { "state": "admitted", "count": 3 },
    { "state": "transcribed", "count": 28 },
    { "state": "failed", "count": 0 }
  ],
  "queue": {
    "queued_episodes": 9,
    "median_turnaround_seconds": 131,
    "p90_turnaround_seconds": 412
  }
}
```

* `limits`: how many requests your organization may have open at once, and make in 24 hours, and how much of each you have used. Past either, a request answers `429` [`transcription_request_limit_exceeded`](/errors/transcription_request_limit_exceeded) with a `Retry-After` header, and is not billed.
* `queue`: the episodes waiting across every organization, and the median and 90th percentile time from request to transcript over the last 7 days.

## Errors

| Status | Error code | When |
| - | - | - |
| `404` | `not_found` | No episode has that ID, or its podcast is no longer in the catalog. |
| `422` | [`episode_audio_unavailable`](/errors/episode_audio_unavailable) | The episode's feed entry has no playable audio, or the publisher's server says the audio no longer exists. |
| `429` | [`transcription_request_limit_exceeded`](/errors/transcription_request_limit_exceeded) | Your organization is at one of its limits. |

None of these is billed.


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