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

# Translate transcript

> Translate the whole transcript of a finished transcription job into `targetLanguage`, using the same translation as the **Translate** button in the website transcription editor. Use it for mixed-language recordings too: create the job with several `language.source` codes, then translate the full conversation into English.

Translation runs asynchronously. Poll [Query job status](/api-reference/app-synced/tasks/get-task-detail): `result.translation.status` goes from `running` to `finished`. Then download it with [Download transcript](/api-reference/app-synced/transcription/get-transcription-srt) and `content=translation`. The original transcript is unchanged and still available with `content=source`.

- **One target language per job**, as on the website. Requesting a different language for a job that already has a translation returns `409`. Requesting the same language again re-translates the whole transcript and replaces the previous translation, including edits made on the website.
- Requires the same credit balance check as the website; an insufficient balance returns `402`.
- Requires [`X-Idempotency-Key`](/guides/idempotency).

Errors use the JSON envelope with HTTP 200 and `code` in the body: `400` invalid parameters; `402` insufficient credits; `404` not a transcription job in your account; `409` the job is not finished, a translation is already running, the job already has a different target language or the transcript is being updated (retry later).



## OpenAPI

````yaml /api-reference/app-synced.json post /openapi/v1/app/tasks/transcription/translate
openapi: 3.1.0
info:
  title: VMEG Open API (App-Synced)
  description: >-
    Same protocol as the Standalone API, but every task, material, and cloned
    voice lives in your VMEG website account: jobs show up in **My tasks**, open
    in the editor, and can be re-exported. Supports media translation,
    transcription, and voice clone. Get results from your webhook (first result
    only, event `openapi-app-media-translation`) or by polling `GET
    /openapi/v1/app/tasks/detail`. See [Standalone vs
    App-Synced](/guides/choose-api).


    Linked guides are written for the Standalone API. The steps are the same;
    use the `/openapi/v1/app` prefix instead of `/openapi/v1`.
  version: 1.0.0
servers:
  - url: https://api.vmeg.ai
    description: Production
security:
  - apiKeyAuth: []
tags:
  - name: Media translation
    x-group: Video & audio translate and dub
    description: >-
      Translate and dub uploaded video/audio or a YouTube link on the same
      pipeline as vmeg.ai. The first pass renders the dubbed file; the job also
      appears in **My tasks** for editing and re-export. Get results from your
      webhook (first result only) or poll [Query job
      status](/api-reference/app-synced/tasks/get-task-detail).
  - name: Transcription
    description: >-
      Transcribe uploaded video/audio or a YouTube link on the same pipeline as
      vmeg.ai. The job appears in **My tasks** and opens in the transcription
      editor. When it finishes, download the latest transcript (including your
      edits on the website) as SRT or JSON.
  - name: Voice clone
    x-group: Voice cloning
    description: >-
      Clone a voice from a short recording. The voice is saved to **My voices**
      on the website and returned as `cv_*` for translate-and-dub jobs.
  - name: Task management
    x-group: Task status and history
    description: >-
      List, inspect, or delete the video/audio translation and transcription
      jobs in your VMEG account, including jobs created on the website.
  - name: Assets - Materials
    x-group: Upload files (materials)
    description: >-
      Upload and manage the files in your website material library (**My
      assets**). Finish the upload (single-file or multipart), then pass
      `materialId` to create-async.
  - name: Assets - Voices
    x-group: Voices (presets and clones)
    description: >-
      List preset system voices (`sv_*`) and manage your cloned voices (`cv_*`,
      same as **My voices** on the website).
paths:
  /openapi/v1/app/tasks/transcription/translate:
    post:
      tags:
        - Transcription
      summary: Translate transcript
      description: >-
        Translate the whole transcript of a finished transcription job into
        `targetLanguage`, using the same translation as the **Translate** button
        in the website transcription editor. Use it for mixed-language
        recordings too: create the job with several `language.source` codes,
        then translate the full conversation into English.


        Translation runs asynchronously. Poll [Query job
        status](/api-reference/app-synced/tasks/get-task-detail):
        `result.translation.status` goes from `running` to `finished`. Then
        download it with [Download
        transcript](/api-reference/app-synced/transcription/get-transcription-srt)
        and `content=translation`. The original transcript is unchanged and
        still available with `content=source`.


        - **One target language per job**, as on the website. Requesting a
        different language for a job that already has a translation returns
        `409`. Requesting the same language again re-translates the whole
        transcript and replaces the previous translation, including edits made
        on the website.

        - Requires the same credit balance check as the website; an insufficient
        balance returns `402`.

        - Requires [`X-Idempotency-Key`](/guides/idempotency).


        Errors use the JSON envelope with HTTP 200 and `code` in the body: `400`
        invalid parameters; `402` insufficient credits; `404` not a
        transcription job in your account; `409` the job is not finished, a
        translation is already running, the job already has a different target
        language or the transcript is being updated (retry later).
      operationId: appTranscriptionTranslate
      parameters:
        - $ref: '#/components/parameters/IdempotencyKeyRequired'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppTranscriptionTranslateRequest'
      responses:
        '200':
          description: Translation accepted. `translation.status` is `running`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppTranscriptionTranslateResponse'
components:
  parameters:
    IdempotencyKeyRequired:
      name: X-Idempotency-Key
      in: header
      required: true
      description: >-
        Required on mutating `POST` requests that create tasks or change
        persisted data (max 64 characters). See
        [Idempotency](/guides/idempotency).
      schema:
        type: string
        maxLength: 64
  schemas:
    AppTranscriptionTranslateRequest:
      type: object
      required:
        - taskId
        - targetLanguage
      properties:
        taskId:
          type: string
          description: ID of a finished transcription job
        targetLanguage:
          type: string
          description: >-
            Target language code, e.g. `en-US`. One language only; `auto` and
            comma-separated lists return `400`. See [Supported
            languages](/guides/supported-languages).
          example: en-US
      example:
        taskId: '2047316590123456789'
        targetLanguage: en-US
    AppTranscriptionTranslateResponse:
      allOf:
        - $ref: '#/components/schemas/OpenApiResponseBase'
        - type: object
          properties:
            data:
              type: object
              properties:
                taskId:
                  type: string
                  description: Task ID (same as the job ID on the website)
                translation:
                  allOf:
                    - $ref: '#/components/schemas/AppTranscriptionTranslation'
                  example:
                    status: running
                    targetLanguage: en-US
    OpenApiResponseBase:
      type: object
      properties:
        code:
          type: integer
          example: 200
          description: Business code; 200 means success
        message:
          type: string
          example: ''
          description: Human-readable detail when `code` is not success
      required:
        - code
    AppTranscriptionTranslation:
      type: object
      description: >-
        Transcription jobs only, present once `status` is `finished`. `status`:
        `none` never translated | `running` in progress | `finished` ready,
        download with `content=translation` | if a translation request fails,
        the status returns to its previous value (`none`, or `finished` with the
        earlier translation); request it again. `targetLanguage` is omitted when
        `status` is `none`.
      properties:
        status:
          type: string
          enum:
            - none
            - running
            - finished
          example: finished
        targetLanguage:
          type: string
          example: en-US
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      description: >-
        Send your API Key in the **`Authorization`** header (`Bearer
        <api_key>`). See [Authentication](/guides/authentication).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.