Workflow
1
Upload
POST /openapi/v1/app/assets/material/upload/gen-upload-url, PUT the file, then .../upload/complete (or the multipart endpoints for large files). For YouTube videos, skip upload and pass source.youtubeUrl.2
Pick voices (optional)
List
.../assets/voice/basic/list and .../assets/voice/clone/list, or clone one with .../task/clone-voice/create. Without a choice, the original voices are cloned automatically, as on the website.3
Create the job
POST /openapi/v1/app/task/media-translation/create-async with X-Idempotency-Key.4
Get the result
Poll
GET /openapi/v1/app/tasks/detail?taskId=... until status is finished or failed. The latest output is result.outputs[0]; open editorUrl to keep editing and re-export.Key differences from the Standalone API
- Website account key — only API keys created on the VMEG website work, and jobs use website credits.
- No webhooks — poll for results. Job status matches the website, so set a polling timeout; if a job stays
runningfar longer than usual, contact support with thetaskId. - Results can change — re-exporting on the website sets the job back to
runningand puts the new output atresult.outputs[0]; earlier outputs stay in the list. - Options match the website form — burned-in subtitles use subtitle templates and are off by default; lip sync needs at least 360p video. Subtitle removal and on-screen text translation are not supported yet.
- Materials are shared with the website — the same file reuses the existing website material, and deleting a material through the API also removes it from My assets.
/openapi/v1/app prefix.
Field details
Access
Access
- The API key must belong to a VMEG website account; other keys get
401. - Voice cloning requires a plan with voice cloning; otherwise
403.
Creating a job
Creating a job
optionsis optional; defaults match a website job with automatic voice cloning.sourceaccepts exactly one ofmaterialIdoryoutubeUrl.taskTypemust match the material:vtfor video,atfor audio.titlesets the job name in My tasks; it defaults to the file name or YouTube video title.- Optional subtitle files (
source.subtitleMaterialId,source.targetSubtitleMaterialId) must be.srtmaterials. options.voiceClone.stylealso acceptsauto,tutorial,drama, andsmart.- Manual voice picking (
voiceSpeakers.selectedVoicesList) acceptssv_*system voices andcv_*voices from List cloned voices. It cannot be combined withvoiceClone, anddubbingVersion: V2cannot be combined with either. - Burned-in subtitles use
options.subtitle(typeplus an optionaltemplateIdfrom List subtitle templates) instead ofoptions.text. Withtypebut notemplateId, the website’s default style is used. options.lipsyncrequires a video of at least 360 × 360 px; lower resolutions return400. YouTube sources are not pre-checked.source.sourceUrl,options.text,output,extraData, and the materialmimeTypefilter return400. Other unknown fields are ignored.
Uploading materials
Uploading materials
- Single-file uploads are de-duplicated by
fileHash: a file already in your website library returns the existing material. Multipart uploads are not de-duplicated.
Results
Results
- The acceptance response and job detail include
editorUrl. result.outputsis newest first;result.outputs[0]is the latest successful render.finishedis not permanent: re-exporting sets the job back torunning, and a failed re-export ends infailedwhile earlier outputs stay in the list.
Voice cloning
Voice cloning
- The call is synchronous and returns the new
cv_*voice; it can take tens of seconds. - Accepts
refAudioMaterialId(an uploaded material) as an alternative torefAudio;voiceNameandsampleTextare required.

