VIDU Q2 Text to Video
curl --request POST \
--url https://api.novita.ai/v3/async/vidu-q2-text2video \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"bgm": true,
"seed": 123,
"audio": true,
"style": "<string>",
"prompt": "<string>",
"duration": 123,
"subjects": [
{
"id": "<string>",
"images": [
"<string>"
],
"voice_id": "<string>"
}
],
"watermark": true,
"resolution": "<string>",
"aspect_ratio": "<string>",
"movement_amplitude": "<string>"
}
'import requests
url = "https://api.novita.ai/v3/async/vidu-q2-text2video"
payload = {
"bgm": True,
"seed": 123,
"audio": True,
"style": "<string>",
"prompt": "<string>",
"duration": 123,
"subjects": [
{
"id": "<string>",
"images": ["<string>"],
"voice_id": "<string>"
}
],
"watermark": True,
"resolution": "<string>",
"aspect_ratio": "<string>",
"movement_amplitude": "<string>"
}
headers = {
"Content-Type": "<content-type>",
"Authorization": "<authorization>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': '<content-type>', Authorization: '<authorization>'},
body: JSON.stringify({
bgm: true,
seed: 123,
audio: true,
style: '<string>',
prompt: '<string>',
duration: 123,
subjects: [{id: '<string>', images: ['<string>'], voice_id: '<string>'}],
watermark: true,
resolution: '<string>',
aspect_ratio: '<string>',
movement_amplitude: '<string>'
})
};
fetch('https://api.novita.ai/v3/async/vidu-q2-text2video', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.novita.ai/v3/async/vidu-q2-text2video",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'bgm' => true,
'seed' => 123,
'audio' => true,
'style' => '<string>',
'prompt' => '<string>',
'duration' => 123,
'subjects' => [
[
'id' => '<string>',
'images' => [
'<string>'
],
'voice_id' => '<string>'
]
],
'watermark' => true,
'resolution' => '<string>',
'aspect_ratio' => '<string>',
'movement_amplitude' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.novita.ai/v3/async/vidu-q2-text2video"
payload := strings.NewReader("{\n \"bgm\": true,\n \"seed\": 123,\n \"audio\": true,\n \"style\": \"<string>\",\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"subjects\": [\n {\n \"id\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"voice_id\": \"<string>\"\n }\n ],\n \"watermark\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"movement_amplitude\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.novita.ai/v3/async/vidu-q2-text2video")
.header("Content-Type", "<content-type>")
.header("Authorization", "<authorization>")
.body("{\n \"bgm\": true,\n \"seed\": 123,\n \"audio\": true,\n \"style\": \"<string>\",\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"subjects\": [\n {\n \"id\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"voice_id\": \"<string>\"\n }\n ],\n \"watermark\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"movement_amplitude\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novita.ai/v3/async/vidu-q2-text2video")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = '<content-type>'
request["Authorization"] = '<authorization>'
request.body = "{\n \"bgm\": true,\n \"seed\": 123,\n \"audio\": true,\n \"style\": \"<string>\",\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"subjects\": [\n {\n \"id\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"voice_id\": \"<string>\"\n }\n ],\n \"watermark\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"movement_amplitude\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"task_id": "<string>"
}Video Generator
VIDU Q2 Text to Video
POST
/
v3
/
async
/
vidu-q2-text2video
VIDU Q2 Text to Video
curl --request POST \
--url https://api.novita.ai/v3/async/vidu-q2-text2video \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"bgm": true,
"seed": 123,
"audio": true,
"style": "<string>",
"prompt": "<string>",
"duration": 123,
"subjects": [
{
"id": "<string>",
"images": [
"<string>"
],
"voice_id": "<string>"
}
],
"watermark": true,
"resolution": "<string>",
"aspect_ratio": "<string>",
"movement_amplitude": "<string>"
}
'import requests
url = "https://api.novita.ai/v3/async/vidu-q2-text2video"
payload = {
"bgm": True,
"seed": 123,
"audio": True,
"style": "<string>",
"prompt": "<string>",
"duration": 123,
"subjects": [
{
"id": "<string>",
"images": ["<string>"],
"voice_id": "<string>"
}
],
"watermark": True,
"resolution": "<string>",
"aspect_ratio": "<string>",
"movement_amplitude": "<string>"
}
headers = {
"Content-Type": "<content-type>",
"Authorization": "<authorization>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': '<content-type>', Authorization: '<authorization>'},
body: JSON.stringify({
bgm: true,
seed: 123,
audio: true,
style: '<string>',
prompt: '<string>',
duration: 123,
subjects: [{id: '<string>', images: ['<string>'], voice_id: '<string>'}],
watermark: true,
resolution: '<string>',
aspect_ratio: '<string>',
movement_amplitude: '<string>'
})
};
fetch('https://api.novita.ai/v3/async/vidu-q2-text2video', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.novita.ai/v3/async/vidu-q2-text2video",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'bgm' => true,
'seed' => 123,
'audio' => true,
'style' => '<string>',
'prompt' => '<string>',
'duration' => 123,
'subjects' => [
[
'id' => '<string>',
'images' => [
'<string>'
],
'voice_id' => '<string>'
]
],
'watermark' => true,
'resolution' => '<string>',
'aspect_ratio' => '<string>',
'movement_amplitude' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.novita.ai/v3/async/vidu-q2-text2video"
payload := strings.NewReader("{\n \"bgm\": true,\n \"seed\": 123,\n \"audio\": true,\n \"style\": \"<string>\",\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"subjects\": [\n {\n \"id\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"voice_id\": \"<string>\"\n }\n ],\n \"watermark\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"movement_amplitude\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.novita.ai/v3/async/vidu-q2-text2video")
.header("Content-Type", "<content-type>")
.header("Authorization", "<authorization>")
.body("{\n \"bgm\": true,\n \"seed\": 123,\n \"audio\": true,\n \"style\": \"<string>\",\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"subjects\": [\n {\n \"id\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"voice_id\": \"<string>\"\n }\n ],\n \"watermark\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"movement_amplitude\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novita.ai/v3/async/vidu-q2-text2video")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = '<content-type>'
request["Authorization"] = '<authorization>'
request.body = "{\n \"bgm\": true,\n \"seed\": 123,\n \"audio\": true,\n \"style\": \"<string>\",\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"subjects\": [\n {\n \"id\": \"<string>\",\n \"images\": [\n \"<string>\"\n ],\n \"voice_id\": \"<string>\"\n }\n ],\n \"watermark\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"movement_amplitude\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"task_id": "<string>"
}VIDU Q2 Text to Video API, supports multiple resolution options. Generates video content based on text descriptions.
This is an asynchronous API; only the task_id will be returned. You should use the task_id to request the Task Result API to retrieve the video generation results.
Request Headers
Supports:
application/jsonBearer authentication format, for example: Bearer {{API Key}}.
Request Body
Whether to add background music
Random seed, used to control the randomness of the generation result. The same seed will produce similar results.
Whether to generate audio
Video style, e.g., cinematic, realistic, artistic, etc.
Text prompt, describing the desired video content in detailLength limit: 1 - unlimited
Video duration in seconds, supports 1-10 secondsOptional values:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10Whether to add watermark
Output video resolution. Default is 720p.Optional values:
540p, 720p, 1080pVideo aspect ratio, e.g., 16:9, 9:16, 1:1, etc.
Movement amplitude, controls the intensity of object movement in the videoOptional values:
auto, small, medium, highResponse
Use the task_id to request the Task Result API to retrieve the generated outputs.
Last modified on July 3, 2026
Was this page helpful?
⌘I