> ## 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 transcription job

> Create a transcription job on the **same pipeline as vmeg.ai**. The job appears in **My tasks** on the website; open `editorUrl` to review and edit the transcript. Your webhook receives the first result (event `openapi-app-media-translation`, `data.taskType` is `transcription`), or poll [Query job status](/api-reference/app-synced/tasks/get-task-detail) until `status` is `finished`, then download the transcript from `result.srtEndpoint`. Credits follow website pricing.

`source` takes exactly one of `materialId` (an audio or video material) or `youtubeUrl`; `sourceUrl`, `output`, and `extraData` return `400`. Other unknown fields are ignored.



## OpenAPI

````yaml /api-reference/app-synced.json post /openapi/v1/app/task/transcription/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. 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/task/transcription/create-async:
    post:
      tags:
        - Transcription
      summary: Create transcription job
      description: >-
        Create a transcription job on the **same pipeline as vmeg.ai**. The job
        appears in **My tasks** on the website; open `editorUrl` to review and
        edit the transcript. Your webhook receives the first result (event
        `openapi-app-media-translation`, `data.taskType` is `transcription`), or
        poll [Query job status](/api-reference/app-synced/tasks/get-task-detail)
        until `status` is `finished`, then download the transcript from
        `result.srtEndpoint`. Credits follow website pricing.


        `source` takes exactly one of `materialId` (an audio or video material)
        or `youtubeUrl`; `sourceUrl`, `output`, and `extraData` return `400`.
        Other unknown fields are ignored.
      operationId: appTranscriptionCreateAsync
      parameters:
        - $ref: '#/components/parameters/IdempotencyKeyRequired'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppTranscriptionCreateRequest'
      responses:
        '200':
          description: >-
            Task accepted. `editorUrl` opens the job in the website
            transcription editor.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppTranscriptionAcceptedResponse'
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:
    AppTranscriptionCreateRequest:
      type: object
      required:
        - source
        - language
      properties:
        source:
          $ref: '#/components/schemas/AppTranscriptionSource'
        language:
          type: object
          description: Language settings
          required:
            - source
          properties:
            source:
              type: string
              example: en-US
              description: >-
                Spoken language of the media (required), same codes as the
                website. See [Supported languages](/guides/supported-languages).
        options:
          $ref: '#/components/schemas/AppTranscriptionOptions'
        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.
      example:
        source:
          materialId: YOUR_MATERIAL_ID
        language:
          source: en-US
        options:
          asr:
            quality: standard
          speakers: auto
        title: Weekly meeting
    AppTranscriptionAcceptedResponse:
      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)
                taskType:
                  type: string
                  enum:
                    - transcription
                status:
                  type: string
                  enum:
                    - running
                    - finished
                    - failed
                  example: running
                createdAt:
                  type: string
                  description: Creation time
                editorUrl:
                  type: string
                  description: >-
                    Website editor URL for this job (sign in with the same VMEG
                    account)
                  example: >-
                    https://www.vmeg.ai/transcription/editor/2047316590123456789/
    AppTranscriptionSource:
      type: object
      description: >-
        Exactly one of `materialId` or `youtubeUrl`. `sourceUrl` is not
        supported for transcription and returns `400`.
      properties:
        materialId:
          type: string
          description: >-
            Audio or video 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).
            Other file types return `400`; an unknown ID returns `404`.
        youtubeUrl:
          type: string
          description: >-
            Public YouTube video URL. A link that cannot be loaded returns
            `400`.
    AppTranscriptionOptions:
      type: object
      description: Transcription options (all optional)
      properties:
        asr:
          type: object
          description: Speech recognition settings
          properties:
            quality:
              type: string
              enum:
                - quick
                - standard
              default: standard
              description: >-
                `standard` (default): higher accuracy. `quick`: faster
                turnaround. Same choices as the website. Other values return
                `400`.
        speakers:
          type: string
          default: auto
          example: auto
          description: >-
            Number of speakers: `auto` (default) detects automatically, or a
            positive integer such as `"2"`. Other values return `400`.
    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
  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.