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

# Output formats

> The canonical JSON, the four renderings, the size limit, and the headers that travel with a raw body.

Every transcript endpoint takes `format`, one of `json`, `text`, `srt`, `vtt`
or `md`. The default is `json`.

## The canonical transcript (`json`)

```json theme={null}
{
  "episode_id": "ep_a3urk6fzq2mvbxyc",
  "show_id": "sh_k4n7qzvw2mtxyabc",
  "language": "en",
  "duration_sec": 3841,
  "source": "whisper-large-v3-turbo",
  "source_revision": "…",
  "model_version": "…",
  "timing_precision": "word",
  "diarized": false,
  "pipeline_version": "…",
  "warnings": [],
  "segments": [
    {
      "id": 0,
      "start": 0.0,
      "end": 6.4,
      "speaker": null,
      "text": "Welcome back to the show.",
      "words": [
        { "start": 0.0, "end": 0.3, "text": "Welcome" },
        { "start": 0.3, "end": 0.5, "text": "back" }
      ]
    }
  ],
  "created_at": "2026-09-15T09:00:00Z"
}
```

| field                  | meaning                                                                                                                                                                                          |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `source`               | Which engine produced the text. The value `publisher` is reserved for passing a publisher's own transcript through, which the pipeline does not do yet: every transcript today is engine output. |
| `timing_precision`     | `word` when every segment carries `words`; `segment` when only segment times are real; `none` for untimed publisher text. A publisher transcript never claims timing it does not have.           |
| `diarized` / `speaker` | Always `false` and `null` at launch: no speaker labels. The fields exist so a client can rely on the shape.                                                                                      |
| `warnings`             | Per-segment quality notes from the pipeline's own checks, listed below.                                                                                                                          |

`source`, `timing_precision` and the ids are also sent as response headers on
every delivery, raw or JSON, so a client reading a plain-text body still
knows what it holds: `X-Transcript-Episode-Id`, `X-Transcript-Source`,
`X-Transcript-Timing-Precision`, and `X-Credits-Charged` when the read cost
something.

## The renderings

| `format` | media type             | what you get                                                                                            |
| -------- | ---------------------- | ------------------------------------------------------------------------------------------------------- |
| `text`   | `text/plain`           | The segments' text, one line per segment.                                                               |
| `srt`    | `application/x-subrip` | Numbered cues with `HH:MM:SS,mmm` timestamps, lines wrapped at 42 characters.                           |
| `vtt`    | `text/vtt`             | The same cues under a `WEBVTT` header, with `.` in the timestamps.                                      |
| `md`     | `text/markdown`        | A `# Transcript` heading, a list of the identity and provenance fields, then one paragraph per segment. |

Subtitle cues are cut on segment boundaries; word timings are used only by
the JSON form.

## Large transcripts

A rendering up to **5 MB** is returned inline. Past that, every format
switches to a reference: the JSON envelope carries `transcript_url` and
`expires_at` instead of the body, the URL is a signed link to the object
that stays valid for **24 hours**, and a raw format answers with the same
reference as JSON. Ask again after expiry for a fresh link. Nothing is ever
served from a storage URL you have to trust; the link is minted by Audivo for
your request.

## Warnings

The pipeline checks its own output and attaches a warning to the first
segment it concerns rather than silently editing text:

| `type`                    | what it flags                                                                     |
| ------------------------- | --------------------------------------------------------------------------------- |
| `repetition_loop`         | The engine repeated a phrase in a way real speech does not.                       |
| `known_hallucination`     | Text matching a phrase engines are known to invent over silence or music.         |
| `compression_ratio`       | Output implausibly dense or sparse for the audio length.                          |
| `text_over_silence`       | Text produced where the audio's energy says nothing was said.                     |
| `language_mismatch`       | Chunks disagreed about the language; the transcript's `language` is the majority. |
| `low_language_confidence` | The detected language was uncertain.                                              |
| `language_unresolved`     | No chunk reported a usable language.                                              |

A warning is information, not a refusal: the transcript is delivered and
charged as usual. Treat the flagged segments with care in anything automated.
