AI video V3
Send a script and an art style, and Vsub splits the script into scenes, records the voice over, draws every scene in that style and optionally renders the final mp4. Creation returns immediately, so poll the video or listen with webhooks.
How it differs from AI video V2
V2 draws in one of sixteen fixed looks named by imageStyle. V3 draws in an art style learned from footage you uploaded, so the scenes look like your channel rather than like a preset. That style is required, and its id comes from Art styles. V3 also accepts a recorded voice over instead of a script, and leaves captions off unless you ask for them.
/v1/ai-videos-v3Create an AI video
artStyleIdrequiredscriptvoiceoverUrlsizelandscapevoiceIdvoiceStylecaptionsfalsecaptionTemplateIdrenderwebhookUrlvoiceStyle.stability50voiceStyle.similarityBoost75voiceStyle.style0voiceStyle.speed100render.formatstandardrender.frameRate30curl -X POST "https://api.vsub.io/v1/ai-videos-v3" \
-H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90" \
-H "Content-Type: application/json" \
-d '{
"artStyleId": "6f1d0b74-9a2e-4f3c-8b51-2d7c9e40a1b8",
"script": "Every map you have ever seen is wrong, and here is why.",
"size": "landscape",
"webhookUrl": "https://your-app.example.com/hooks/vsub-video"
}'{
"id": "9f0c1d5e-3a1b-4c2f-9d7e-8b1a2c3d4e5f",
"status": "processing",
"step": "create-vocal",
"render": false,
"createdAt": "2026-08-14T09:20:11.000Z",
"editorUrl": "https://vsub.io/workspace/editor/9f0c1d5e-3a1b-4c2f-9d7e-8b1a2c3d4e5f"
}Generation runs in the background and a V3 video has a lot of scenes to draw, so it takes longer than V2. Follow the video with Video status or let a webhook tell you when it's done.
Narrate with your own recording
Sending voiceoverUrl instead of a script has Vsub transcribe the recording, cut it into parts and draw the scenes against the words it heard.
curl -X POST "https://api.vsub.io/v1/ai-videos-v3" \
-H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90" \
-H "Content-Type: application/json" \
-d '{
"artStyleId": "6f1d0b74-9a2e-4f3c-8b51-2d7c9e40a1b8",
"voiceoverUrl": "https://your-app.example.com/audio/episode-14.mp3",
"captions": true,
"render": {}
}'Send either script or voiceoverUrl, not both. The request stays open while the recording is fetched, so a large file takes a moment to answer.
