> ## 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.

# Create translate and dub job

> Create a translate-and-dub job on the **same pipeline as vmeg.ai**. The first pass renders the dubbed output: poll [Query job status](/api-reference/app-synced/tasks/get-task-detail) until `status` is `finished`, then read `result.outputs[0]`. The job appears in **My tasks** on the website; open `editorUrl` to edit and re-export. Credits follow website pricing.

Differences from Standalone: `options` is optional; `source` takes `materialId` or `youtubeUrl` (no `sourceUrl`); `taskType` must match the material (`vt` video, `at` audio); `title` sets the job name on the website; `output` and `extraData` are rejected with `400`; burned-in subtitles use `options.subtitle` instead of `text`; results are polled, not delivered by webhook. Other unknown fields are ignored.



## OpenAPI

````yaml /api-reference/app-synced.json post /openapi/v1/app/task/media-translation/create-async
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. Poll `GET
    /openapi/v1/app/tasks/detail` for results (no webhooks). See [Standalone vs
    App-Synced](/guides/app-synced/comparison).


    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. Poll [Query job
      status](/api-reference/app-synced/tasks/get-task-detail) for results.
  - 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 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/task/media-translation/create-async:
    post:
      tags:
        - Media translation
      summary: Create translate and dub job
      description: >-
        Create a translate-and-dub job on the **same pipeline as vmeg.ai**. The
        first pass renders the dubbed output: poll [Query job
        status](/api-reference/app-synced/tasks/get-task-detail) until `status`
        is `finished`, then read `result.outputs[0]`. The job appears in **My
        tasks** on the website; open `editorUrl` to edit and re-export. Credits
        follow website pricing.


        Differences from Standalone: `options` is optional; `source` takes
        `materialId` or `youtubeUrl` (no `sourceUrl`); `taskType` must match the
        material (`vt` video, `at` audio); `title` sets the job name on the
        website; `output` and `extraData` are rejected with `400`; burned-in
        subtitles use `options.subtitle` instead of `text`; results are polled,
        not delivered by webhook. Other unknown fields are ignored.
      operationId: appMediaTranslationCreateAsync
      parameters:
        - $ref: '#/components/parameters/IdempotencyKeyRequired'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppMediaTranslationCreateRequest'
      responses:
        '200':
          description: Task accepted. `editorUrl` opens the job in the website editor.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppMediaTranslationAcceptedResponse'
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:
    AppMediaTranslationCreateRequest:
      type: object
      required:
        - taskType
        - source
        - language
      properties:
        taskType:
          $ref: '#/components/schemas/AppTaskType'
          description: >-
            `vt` video translation | `at` audio translation. Must match the
            material type, otherwise `400`.
        source:
          $ref: '#/components/schemas/AppMediaTranslationSource'
        language:
          $ref: '#/components/schemas/OpenApiMediaTranslationLanguage'
          description: Source and target locales for localization
        options:
          $ref: '#/components/schemas/AppMediaTranslationOptions'
        title:
          type: string
          maxLength: 255
          description: >-
            Job name shown in **My tasks** (max 255 characters). Defaults to the
            file name or the YouTube video title.
    AppMediaTranslationAcceptedResponse:
      allOf:
        - $ref: '#/components/schemas/OpenApiResponseBase'
        - type: object
          properties:
            data:
              allOf:
                - $ref: '#/components/schemas/OpenApiMediaTranslationAcceptedData'
                - type: object
                  properties:
                    editorUrl:
                      type: string
                      description: >-
                        Website editor URL for this job (sign in with the same
                        VMEG account)
    AppTaskType:
      type: string
      enum:
        - vt
        - at
      description: '`vt` video translation | `at` audio translation'
    AppMediaTranslationSource:
      type: object
      description: Exactly one of `materialId` or `youtubeUrl`
      properties:
        materialId:
          type: string
          description: >-
            Material ID from [App-Synced
            upload](/api-reference/app-synced/assets/materials/gen-upload-url)
            or [List
            materials](/api-reference/app-synced/assets/materials/list-materials)
        youtubeUrl:
          type: string
          description: 'YouTube video URL (use `taskType: vt`)'
        subtitleMaterialId:
          type: string
          description: >-
            Optional `.srt` material with the source-language subtitles. Other
            file types return `400`.
        targetSubtitleMaterialId:
          type: string
          description: >-
            Optional `.srt` material with the translated subtitles. Other file
            types return `400`.
    OpenApiMediaTranslationLanguage:
      type: object
      required:
        - target
      properties:
        source:
          type: string
          default: auto
          example: auto
          description: >-
            Source locale (BCP-47) or `auto` for detection. See [Supported
            languages](/guides/supported-languages).
        target:
          type: string
          example: zh-CN
          description: >-
            Target locale (BCP-47). See [Supported
            languages](/guides/supported-languages).
      description: Source and target locales for localization
    AppMediaTranslationOptions:
      type: object
      required: []
      description: >-
        Pipeline options (all optional). Voice rules match the website:
        `voiceClone.style` picks automatic dubbing;
        `voiceSpeakers.selectedVoicesList` picks voices manually (`sv_*` system,
        `cv_*` your cloned voices) and cannot be combined with `voiceClone`.
        `dubbingVersion: V2` cannot be combined with either. Leave
        `voiceSpeakers.timbreMethod` empty when you set voices; a conflicting
        value returns `400`.
      properties:
        dubbingVersion:
          type: string
          enum:
            - V1
            - V2
          default: V1
          description: >-
            Dubbing version, same as the website. `V1` (default): mature and
            reliable, auto-match a voice or choose one yourself. `V2`: more
            natural voices and richer emotions; it picks voices automatically,
            so it cannot be combined with `voiceClone` or
            `voiceSpeakers.selectedVoicesList`.
        subtitle:
          $ref: '#/components/schemas/AppMediaTranslationSubtitle'
        voiceClone:
          $ref: '#/components/schemas/AppMediaTranslationVoiceClone'
        transcribe:
          $ref: '#/components/schemas/OpenApiMediaTranslationTranscribe'
        translate:
          $ref: '#/components/schemas/OpenApiMediaTranslationTranslate'
        separation:
          $ref: '#/components/schemas/OpenApiMediaTranslationSeparation'
        dynamicVideoLength:
          $ref: '#/components/schemas/OpenApiMediaTranslationDynamicVideoLength'
        lipsync:
          $ref: '#/components/schemas/OpenApiMediaTranslationLipsync'
          description: >-
            Lip sync on the dubbed video. Requires width and height of at least
            360 px, same as the website; lower-resolution materials return
            `400`. YouTube sources are not pre-checked; make sure the video is
            at least 360p.
        voiceSpeakers:
          $ref: '#/components/schemas/OpenApiMediaTranslationVoiceSpeakers'
    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
    OpenApiMediaTranslationAcceptedData:
      type: object
      description: Immediate response for media translation async create (no deliverables)
      required:
        - taskId
      properties:
        taskId:
          type: string
          description: Task ID (same as the job ID on the website)
        taskType:
          $ref: '#/components/schemas/AppTaskType'
        status:
          type: string
          enum:
            - running
            - failed
            - finished
          example: running
          description: Task status after acceptance (`running`, `failed`, or `finished`)
        createdAt:
          type: string
          description: Task creation time (ISO 8601)
    AppMediaTranslationSubtitle:
      type: object
      description: >-
        Burned-in subtitles (video translation only). Omit to render without
        subtitles, same as the website default. Replaces the Standalone `text`
        field; sending `text` returns `400`.
      properties:
        type:
          type: string
          enum:
            - none
            - target
            - origin
            - multi
          description: >-
            `none` no subtitles | `target` translated | `origin` original |
            `multi` both. When omitted: `target` if `templateId` is set,
            otherwise `none`. Audio translation accepts only `none`.
        templateId:
          type: string
          description: >-
            Style from [List subtitle
            templates](/api-reference/app-synced/media-translation/list-subtitle-templates).
            When omitted, the website's default style (the first template in the
            list) is used.
    AppMediaTranslationVoiceClone:
      type: object
      required: []
      description: Automatic dubbing settings (optional). Omit to use website defaults.
      properties:
        style:
          type: string
          enum:
            - emotional
            - consistent
            - auto
            - tutorial
            - drama
            - smart
          default: emotional
          description: >-
            `emotional` (default) | `consistent` clone the original voices;
            `auto` lets VMEG decide; `tutorial` / `drama` are content presets;
            `smart` matches preset voices.
        mode:
          type: string
          enum:
            - role
            - mix
            - sentence
          example: role
          description: >-
            role | mix | sentence. Only for `emotional` / `consistent`;
            optional.
        provider:
          type: string
          enum:
            - V1
            - V2
            - V3
            - V4
            - V5
          description: >-
            Clone engine (`V1`–`V5`). Only for `emotional` / `consistent`;
            optional. See [Supported clone
            methods](/guides/supported-clone-methods).
    OpenApiMediaTranslationTranscribe:
      type: object
      description: Automatic speech recognition (ASR) settings
      properties:
        mode:
          type: string
          enum:
            - fast
            - normal
          default: fast
          description: ASR speed vs accuracy trade-off
        type:
          type: string
          default: default
          description: ASR profile (product default when omitted)
    OpenApiMediaTranslationTranslate:
      type: object
      description: Text translation step inside the media pipeline
      properties:
        mode:
          type: string
          enum:
            - default
            - machine
          default: default
          description: >-
            `default` — standard localization. `machine` — machine translation
            mode
        prompt:
          type: string
          description: Custom prompt for the translation step
    OpenApiMediaTranslationSeparation:
      type: object
      description: Source separation (vocals vs background)
      properties:
        mode:
          type: string
          default: auto
          example: auto
          description: Separation mode (e.g. `auto`)
    OpenApiMediaTranslationDynamicVideoLength:
      type: object
      description: Dynamic video length adjustment (video translation)
      properties:
        enable:
          type: boolean
          description: Enable dynamic length matching between source and dubbed video
    OpenApiMediaTranslationLipsync:
      type: object
      description: >-
        Lip sync (video translation only; may add credits). See
        [Pricing](/guides/pricing)
      properties:
        enable:
          type: boolean
          default: false
          description: Enable lip sync on the output video
    OpenApiMediaTranslationVoiceSpeakers:
      type: object
      description: Speaker and timbre configuration for dubbing
      properties:
        selectedVoicesList:
          type: array
          items:
            $ref: '#/components/schemas/OpenApiMediaTranslationSelectedVoice'
          description: Explicit voice picks per speaker slot
        speakerNum:
          type: string
          example: auto
          description: Number of speakers to detect (`auto` or a numeric string)
        timbreMethod:
          type: string
          enum:
            - clone
            - smart
          example: clone
          description: '`clone` — clone from source audio. `smart` — smart voice matching'
    OpenApiMediaTranslationSelectedVoice:
      type: object
      description: A preset or cloned voice selected for dubbing
      properties:
        provider:
          type: string
          example: S1
          description: >-
            Optional preset tier (`S1`, `S2`, …) when you pick a system voice.
            Clone voices use `V1`–`V5`. See
            [Voices](/guides/app-synced/comparison).
        voiceId:
          type: string
          description: >-
            `sv_*` from [List system
            voices](/api-reference/app-synced/assets/voices/list-system-voices)
            or `cv_*` from [List cloned
            voices](/api-reference/app-synced/assets/voices/list-cloned-voices)
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      description: >-
        Send your API Key in the **`Authorization`** header (`Bearer
        <api_key>`). See [Authentication](/guides/authentication).

````