---
title: "Translate a transcript"
method: POST
path: "/api/v1/transcriptions/{id}/translate"
---

# Translate a transcript

`POST /api/v1/transcriptions/{id}/translate`

## Request

- Base URL: `https://podcaststotext.com`
- URL: `https://podcaststotext.com/api/v1/transcriptions/{id}/translate`
- Auth: HTTP bearer

Translate a completed transcript into one language. Cached per language: asking for a language already generated returns `cached: true`, spends nothing, and never counts against the limit. Each transcript may hold a capped number of DISTINCT languages, reported as languages_limit in the response, and exceeding it returns 403 `translation_limit_reached` naming the languages already stored. Pass {"force": true} to re-translate one in place. Requires the "ai:write" scope and a paid plan.

## Path parameters

- `id` string, required

## Request body

- object
  - `language` string, required
  - `force` boolean: Re-translate a language already stored, replacing it. Bills again.

## Response `200`

The translation

- object
  - `id` string
  - `language` string
  - `translation` string
  - `cached` boolean
  - `languages_used` integer
  - `languages_limit` integer

## Other responses

- `400`: No language given, or the transcript has no content
- `401`: Missing or invalid API key
- `403`: Paid plan required, or the per-transcript language limit is reached
- `404`: No such transcription on this account
- `429`: Too many requests. Limits are per API key, counted per minute and per day, and depend on the plan. Operations that cost money to run (transcription, renders, AI) carry a second, tighter limit of their own. Read RateLimit-Remaining on every successful response to pace requests rather than waiting to be refused.

---

[API](https://skmtc.dev/podcaststotext/apis/podcaststotext-api.md) · [All operations](https://skmtc.dev/podcaststotext/apis/podcaststotext-api/llms.txt) · [OpenAPI document](https://skmtc.dev/podcaststotext/apis/podcaststotext-api/revisions/ef711acf4bc3?raw)
