When to use which
- Standalone — fully automated back-end pipelines that need webhooks, TTS, or text translation, and never open the website.
- App-Synced — you want API submission but still edit subtitles, voices, or timing in the VMEG editor and export from the website.
Protocol differences (App-Synced)
Access- The API key must belong to a VMEG website account (create it on the website); other keys get
401. - Voice cloning requires a plan with voice cloning; otherwise
403.
optionsis optional; defaults match a website job with automatic voice cloning.sourceaccepts exactly one ofmaterialIdoryoutubeUrl(a YouTube link, no upload needed).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. They are off by default, as on the website; withtypebut notemplateId, the website’s default style is used. options.lipsyncrequires a video of at least 360 × 360 px, as on the website; lower resolutions return400. YouTube sources are not pre-checked.- Subtitle removal and on-screen text translation from the website form are not supported yet; jobs are created with both turned off.
source.sourceUrl,options.text,output,extraData, and the materialmimeTypefilter return400. Other unknown fields are ignored.- Single-file uploads are de-duplicated by
fileHash: a file already in your website library returns the existing material, and deleting it also removes it from My assets.
- The acceptance response and job detail include
editorUrl. - Job detail returns
result.outputs, newest first;result.outputs[0]is the latest successful render. finishedis not permanent: re-exporting on the website sets the job back torunning, and a failed re-export ends infailedwhile earlier outputs stay in the list.
- 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.
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.3
Create the job
POST /openapi/v1/app/task/media-translation/create-async with X-Idempotency-Key.4
Poll
GET /openapi/v1/app/tasks/detail?taskId=... until status is finished or failed. Open editorUrl to edit and re-export. The status matches the website, so set a polling timeout: if a job stays running far longer than usual, contact support with the taskId./openapi/v1/app prefix.
