---
title: "List Audio Translations"
method: GET
path: "/v2/audios/{audio_id}/translations"
tags: ["Audio Emotion API"]
---

# List Audio Translations

`GET /v2/audios/{audio_id}/translations`

## Request

- Base URL: `https://api.imentiv.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.imentiv.ai/v2/audios/{audio_id}/translations`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer
  - OAuth 2
    - Authorization code: `https://api.imentiv.ai/oauth/authorize`
    - Token URL: `https://api.imentiv.ai/oauth/token` scopes: `media.read`

List the stored translations of an audio's transcript.

The audio's owner sees every translation in every status, with its charge fields. Anyone
else who can see the audio (it is shared, or a sample) sees `ready` translations only, without
`error_code`, charge fields or `retry_kind`. `source_revision` is the revision a new
translation would accept (send it when requesting one), or null when a new translation could
not start (no usable transcript, sample media, audio not yet `completed`, all-blank or
over-limit transcript, or a non-positive estimate).

## Path parameters

- `audio_id` string, required: The unique ID of the audio.

## Response `200`

Successful Response

- TranslationIndexOut: The translations of one audio.
  - `audio_id` string, required
  - `source_revision` string, nullable: The transcript revision a new translation would accept (see `source_revision` on a request), or null when a new translation could not start: the audio has no transcript that can be translated, is sample media, is not yet `completed`, the transcript is all blank, over the size limits, or prices at a non-positive estimate.
  - `estimated_credits` integer, nullable: The hold a new translation of this transcript would take, in credits. The charge is the actual usage and can differ. Null when `source_revision` is null.
  - `translations` TranslationOut[], required
    - `language` string, required: The target language, as a canonical BCP-47 tag.
    - `status` 'queued' | 'running' | 'ready' | 'failed', required: `queued`, `running`, `ready` or `failed`.
    - `lines` string[], nullable: One entry per transcript segment, in the transcript's order. Present only when `status` is `ready`. A segment with no text comes back as an empty string. A segment that was already in the target language was not translated and comes back as null: show its own text.
    - `source_revision` string, required: The transcript revision this translation was requested for.
    - `source_line_hashes` string[], nullable: For each segment, the SHA-256 (64 lowercase hexadecimal characters) of the segment's text (trimmed with ECMAScript `trim`, then NFC-normalised) that the translation was made from; null for a segment that was not translated. Compare with the current segment to tell which line is out of date. Null for a translation made before these were recorded: use `stale`.
    - `stale_lines` integer[], nullable: The indexes of the segments whose text changed since this translation was made, when it can be said line by line: the number of segments and each segment's time and speaker are unchanged. Empty while `stale` is false. Null when `stale` is true and it cannot be said line by line: treat the whole translation as out of date.
    - `stale` boolean, required: True once the transcript's text or timing has changed since this translation was made. Renaming, merging or deleting speakers does not change it.
    - `error_code` string, nullable: Why a `failed` translation failed. Present only for the owner.
    - `attempt_charge_state` 'reserved' | 'captured' | 'released', nullable: `reserved` while an attempt can still be charged, then `captured` if it was charged or `released` if it was not. Present only for the owner.
    - `captured_credits` integer, nullable: Credits charged for the attempt. Present only for the owner.
    - `reserved_credits` integer, nullable: Credits held for the attempt that have not been settled yet; 0 once settled. Present only for the owner.
    - `estimated_credits` integer, nullable: The estimate this attempt reserved. The charge is the actual usage and can differ. Present only for the owner.
    - `retry_kind` 'resend' | 'new_attempt', nullable: For a `failed` translation, what `POST .../retry` must send: `resend` repeats the original request, `new_attempt` needs the current transcript revision and a new `idempotency_key`. Present only for the owner.

## Other responses

- `401`: Missing, malformed or rejected credentials — no `X-API-Key` / `Authorization: Bearer <jwt>`, an expired token, or a caller that lacks the role the route requires. Note that this API answers *authorization* failures with 401 as well as 403 (see the 403 entry where a route declares both).
- `404`: No such resource, or it is not visible to this caller. Ownership failures are reported as 404 rather than 403 so the API does not confirm the existence of another account's records.
- `422`: Request validation failed. The app flattens FastAPI's validation error list into a single `detail` string, so the body is `{"detail": "'field' <message>"}` and NOT FastAPI's default `HTTPValidationError`. Declaring this overrides the auto-generated 422 — see the module docstring.

## Changes

- **2026-11-02** `1ec1d62c9bcf`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/imentiv/apis/welcome-to-imentiv-ai/changes/v2/audios/:audio_id/translations/get.md)

---

[API](https://skmtc.dev/imentiv/apis/welcome-to-imentiv-ai.md) - [All operations](https://skmtc.dev/imentiv/apis/welcome-to-imentiv-ai/llms.txt) - [OpenAPI document](https://skmtc.dev/imentiv/apis/welcome-to-imentiv-ai/revisions/bc15cec7e794?raw)
