# Transcribe

> POST /transcribe/ turns an audio or video recording into a transcript, with no summary. About $0.002 per minute of audio. Long recordings run as background tasks.

**Source:** /docs/api/transcribe/ (Curriculo Docs)  
**Updated:** 15 October 2026  
**Contact:** hello@curriculo.me

```http
POST https://api.curriculo.me/public/transcribe/
```

**Stateless.** Transcribes one or more audio or video recordings, without generating a summary. To get a summary as well, use [`POST /summary/`](/docs/api/summary/).

**Price:** about $0.002 per minute of audio, rounded up to the next $0.001 per request (a 60-minute recording costs $0.109). See [Pricing and billing](/docs/pricing/).

## Request

`multipart/form-data`

| Field | Type | Notes |
|---|---|---|
| `media` (required) | file[] | One or more audio or video recordings, up to 12 MB in total. |
| `language` | string | Optional ISO 639-1 hint for the recording's language. |

```bash
curl -X POST https://api.curriculo.me/public/transcribe/ \
  -H 'Authorization: Bearer key_abc123_yoursecret' \
  -F 'media=@interview.m4a' \
  -F 'language=en'
```

## Longer recordings

The synchronous upload is limited to 12 MB. For anything larger, send a public link to `POST /transcribe/async`: recordings up to 1 GB and 2 hours.

```bash
curl -X POST https://api.curriculo.me/public/transcribe/async \
  -H 'Authorization: Bearer key_abc123_yoursecret' \
  -H 'Content-Type: application/json' \
  -d '{"media_url": "https://example.com/interviews/interview.mp4"}'
```

The task's `result` contains `transcript_text` and `transcript_entries`. Entries are empty when no timestamps are available. See [Background processing and callbacks](/docs/background-processing/).

## Errors

| Status | Typical cause |
|---|---|
| `413` | A recording over 12 MB. Use `/transcribe/async`. |
| `400` | `media` is missing. |
| `503` | Media transcription is not enabled. |
| `504` | Processing exceeded 300 seconds. Use `/transcribe/async`. |

## Choosing between transcribe and summary

| You need | Use |
|---|---|
| The words only, to store or search | `POST /transcribe/` |
| Highlights, red flags, skills and a recommendation | [`POST /summary/`](/docs/api/summary/), which also returns the transcript for a recording |
| A recording over 12 MB or longer than the 300 second request limit | `POST /transcribe/async` with a `media_url` |

## Common questions

**What is the largest recording I can send?**
12 MB on the synchronous call. Through `/transcribe/async`, a public link to a recording of up to 1 GB and 2 hours.

**Do I need to set `language`?**
No. It is an optional hint. Set it when you know the language, for example `es`, to help with short or noisy recordings.

**Is the recording stored?**
Not on the synchronous call. An async task keeps its result so you can poll for it; see [Data handling](/docs/data-handling/).

## Next steps

- [Summarise an interview](/docs/api/summary/): a summary and a recommendation from the same recording.
- [Background processing and callbacks](/docs/background-processing/): polling and signed callbacks for long recordings.
- [Errors](/docs/errors/): what each status means and when to retry.
