# Summarise an interview

> POST /summary/ turns an interview transcript, transcript file or recording into highlights, red flags, skills mentioned and a hire recommendation with reasons.

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

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

**Stateless.** Turns an interview into `highlights`, `red_flags`, `skills_mentioned`, `decision_recommendation`, `decision_reasoning` and optional speaking-time `analytics`. Send a transcript as text, a transcript document, or a recording to be transcribed and summarised in one request.

**Price:** $0.01 per request for a transcript. For a recording, $0.002 per minute of audio plus $0.01. See [Pricing and billing](/docs/pricing/).

## Transcript mode

`application/json`. Send a JSON object for one interview, or a JSON array for up to 10. Each interview gets its own id.

| Field | Type | Notes |
|---|---|---|
| `interview_id` | string | Your own identifier. Echoed back, never looked up. |
| `transcript_text` (required) | string | Raw transcript, up to 200,000 characters. |
| `transcript_entries` | object[] | Optional structured turns (`participant`, `text`, `startTime`, `endTime`). Enables speaking-time analytics. |
| `language` | string | ISO 639-1 code to render the summary prose in. Defaults to English. |

```bash
curl -X POST https://api.curriculo.me/public/summary/ \
  -H 'Authorization: Bearer key_abc123_yoursecret' \
  -H 'Content-Type: application/json' \
  -d '{"interview_id": "int_0042", "transcript_text": "Interviewer: Tell me about a system you shipped. Candidate: …", "language": "en"}'
```

## File mode

`multipart/form-data` on the same path. Upload recordings or transcript documents.

| Field | Type | Notes |
|---|---|---|
| `media` | file[] | Repeat for up to 10 files. Each file's own content decides how it is read: PDF, DOCX and DOC are read as transcripts (up to 50 MB); anything else is treated as audio or video (for example mp4, mov, mkv, mp3, m4a, wav) and transcribed first (up to 100 MB). |
| `interview_id` | string | Your identifier, shared by every file in the request. Defaults to the uploaded filename. |
| `language` | string | ISO 639-1 code for the summary prose. |

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

A recording comes back with its transcription alongside the analysis, so no separate transcription vendor is needed. Because a mislabelled upload is read by its content, a transcript saved with the wrong extension still lands correctly.

> [!TIP]
> A synchronous call must finish inside 300 seconds. For long interviews, send a link to [`POST /summary/async`](/docs/background-processing/) instead: recordings up to 1 GB and 2 hours.

> [!NOTE]
> Where media transcription is not enabled, a recording returns `503`. Send a transcript instead.

## Response

The summary fields above, with your `interview_id` echoed back. A JSON array of interviews returns a `results` array in input order. See [Batching](/docs/batching/).

## Timing

15 to 20 seconds for a transcript. Recordings take longer, depending on length.

## Errors

| Status | Typical cause |
|---|---|
| `400` | Blank transcript, unreadable file, or a duplicate JSON key. |
| `413` | A transcript over 200,000 characters, more than 10 interviews or files, or a file over its size limit. |
| `422` | `transcript_text` is missing, or a field is misnamed. |
| `503` | Media transcription is not enabled. Send a transcript instead. |
| `504` | Processing exceeded 300 seconds. Use `/summary/async`. |
