Create Video
curl --request POST \
--url https://www.token-nova.com/v1/video/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"images": [
{}
],
"prompt": "<string>",
"aspect_ratio": "<string>",
"audio": true,
"voice_id": "<string>",
"is_rec": true,
"bgm": true,
"duration": 123,
"seed": 123,
"resolution": "<string>",
"payload": "<string>",
"off_peak": true,
"watermark": true,
"wm_position": 123,
"wm_url": "<string>",
"meta_data": "<string>"
}
'import requests
url = "https://www.token-nova.com/v1/video/create"
payload = {
"model": "<string>",
"images": [{}],
"prompt": "<string>",
"aspect_ratio": "<string>",
"audio": True,
"voice_id": "<string>",
"is_rec": True,
"bgm": True,
"duration": 123,
"seed": 123,
"resolution": "<string>",
"payload": "<string>",
"off_peak": True,
"watermark": True,
"wm_position": 123,
"wm_url": "<string>",
"meta_data": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
images: [{}],
prompt: '<string>',
aspect_ratio: '<string>',
audio: true,
voice_id: '<string>',
is_rec: true,
bgm: true,
duration: 123,
seed: 123,
resolution: '<string>',
payload: '<string>',
off_peak: true,
watermark: true,
wm_position: 123,
wm_url: '<string>',
meta_data: '<string>'
})
};
fetch('https://www.token-nova.com/v1/video/create', 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://www.token-nova.com/v1/video/create",
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([
'model' => '<string>',
'images' => [
[
]
],
'prompt' => '<string>',
'aspect_ratio' => '<string>',
'audio' => true,
'voice_id' => '<string>',
'is_rec' => true,
'bgm' => true,
'duration' => 123,
'seed' => 123,
'resolution' => '<string>',
'payload' => '<string>',
'off_peak' => true,
'watermark' => true,
'wm_position' => 123,
'wm_url' => '<string>',
'meta_data' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://www.token-nova.com/v1/video/create"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"images\": [\n {}\n ],\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"duration\": 123,\n \"seed\": 123,\n \"resolution\": \"<string>\",\n \"payload\": \"<string>\",\n \"off_peak\": true,\n \"watermark\": true,\n \"wm_position\": 123,\n \"wm_url\": \"<string>\",\n \"meta_data\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.token-nova.com/v1/video/create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"images\": [\n {}\n ],\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"duration\": 123,\n \"seed\": 123,\n \"resolution\": \"<string>\",\n \"payload\": \"<string>\",\n \"off_peak\": true,\n \"watermark\": true,\n \"wm_position\": 123,\n \"wm_url\": \"<string>\",\n \"meta_data\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.token-nova.com/v1/video/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"images\": [\n {}\n ],\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"duration\": 123,\n \"seed\": 123,\n \"resolution\": \"<string>\",\n \"payload\": \"<string>\",\n \"off_peak\": true,\n \"watermark\": true,\n \"wm_position\": 123,\n \"wm_url\": \"<string>\",\n \"meta_data\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2025-11-08T23:07:57.510141923+08:00",
"status": "processing",
"task_id": "48038932-0ff5-4251-8b4b-7a76c09fd114"
}
Unified Video
Create Video
Use POST /v1/video/create to submit Vidu asynchronous generation tasks through the unified video format.
POST
https://www.token-nova.com
/
v1
/
video
/
create
Create Video
curl --request POST \
--url https://www.token-nova.com/v1/video/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"images": [
{}
],
"prompt": "<string>",
"aspect_ratio": "<string>",
"audio": true,
"voice_id": "<string>",
"is_rec": true,
"bgm": true,
"duration": 123,
"seed": 123,
"resolution": "<string>",
"payload": "<string>",
"off_peak": true,
"watermark": true,
"wm_position": 123,
"wm_url": "<string>",
"meta_data": "<string>"
}
'import requests
url = "https://www.token-nova.com/v1/video/create"
payload = {
"model": "<string>",
"images": [{}],
"prompt": "<string>",
"aspect_ratio": "<string>",
"audio": True,
"voice_id": "<string>",
"is_rec": True,
"bgm": True,
"duration": 123,
"seed": 123,
"resolution": "<string>",
"payload": "<string>",
"off_peak": True,
"watermark": True,
"wm_position": 123,
"wm_url": "<string>",
"meta_data": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
images: [{}],
prompt: '<string>',
aspect_ratio: '<string>',
audio: true,
voice_id: '<string>',
is_rec: true,
bgm: true,
duration: 123,
seed: 123,
resolution: '<string>',
payload: '<string>',
off_peak: true,
watermark: true,
wm_position: 123,
wm_url: '<string>',
meta_data: '<string>'
})
};
fetch('https://www.token-nova.com/v1/video/create', 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://www.token-nova.com/v1/video/create",
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([
'model' => '<string>',
'images' => [
[
]
],
'prompt' => '<string>',
'aspect_ratio' => '<string>',
'audio' => true,
'voice_id' => '<string>',
'is_rec' => true,
'bgm' => true,
'duration' => 123,
'seed' => 123,
'resolution' => '<string>',
'payload' => '<string>',
'off_peak' => true,
'watermark' => true,
'wm_position' => 123,
'wm_url' => '<string>',
'meta_data' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://www.token-nova.com/v1/video/create"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"images\": [\n {}\n ],\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"duration\": 123,\n \"seed\": 123,\n \"resolution\": \"<string>\",\n \"payload\": \"<string>\",\n \"off_peak\": true,\n \"watermark\": true,\n \"wm_position\": 123,\n \"wm_url\": \"<string>\",\n \"meta_data\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.token-nova.com/v1/video/create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"images\": [\n {}\n ],\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"duration\": 123,\n \"seed\": 123,\n \"resolution\": \"<string>\",\n \"payload\": \"<string>\",\n \"off_peak\": true,\n \"watermark\": true,\n \"wm_position\": 123,\n \"wm_url\": \"<string>\",\n \"meta_data\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.token-nova.com/v1/video/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"images\": [\n {}\n ],\n \"prompt\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"duration\": 123,\n \"seed\": 123,\n \"resolution\": \"<string>\",\n \"payload\": \"<string>\",\n \"off_peak\": true,\n \"watermark\": true,\n \"wm_position\": 123,\n \"wm_url\": \"<string>\",\n \"meta_data\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2025-11-08T23:07:57.510141923+08:00",
"status": "processing",
"task_id": "48038932-0ff5-4251-8b4b-7a76c09fd114"
}
Create Video
The Vidu unified video entry usesPOST /v1/video/create, and the request body is JSON. Unlike the official Vidu format, this endpoint uses fields such as images, aspect_ratio, resolution, and duration.
- The route endpoint is
POST /v1/video/create. - Reference images are passed as a URL list through the
imagesarray; text-to-video can pass an empty array. - A common model example is
viduq3-pro; use the actually available model for the current channel as the reference. - After a successful submission, the task
idandstatusare returned, and you can later use Query Task to poll for results.
Supported Models
viduq3-pro: Efficiently generates high-quality audio and video content, making video content more vivid, more lifelike, and more three-dimensionalviduq2-pro-fast: Lower price floor, stable results, generation speed 2-3 times faster than viduq2-turboviduq2-pro: New model, good results, rich detailsviduq2-turbo: New model, good results, fast generationviduq1: Clear visuals, smooth transitions, stable camera movementviduq1-classic: Clear visuals, richer transitions and camera movementvidu2.0: Fast generation speed
Method and Path
POST /v1/video/create
Request Example
curl -X POST https://www.token-nova.com/v1/video/create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "viduq3-pro",
"prompt": "一只猫在草地上追逐蝴蝶",
"aspect_ratio": "16:9",
"duration": 5,
"audio": false,
"images": []
}'
import requests
resp = requests.post(
"https://www.token-nova.com/v1/video/create",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "viduq3-pro",
"prompt": "一只猫在草地上追逐蝴蝶",
"aspect_ratio": "16:9",
"duration": 5,
"audio": False,
"images": [],
},
timeout=60,
)
print(resp.json())
const response = await fetch("https://www.token-nova.com/v1/video/create", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "viduq3-pro",
prompt: "一只猫在草地上追逐蝴蝶",
aspect_ratio: "16:9",
duration: 5,
audio: false,
images: [],
}),
});
console.log(await response.json());
Response Example
{
"created_at": "2025-11-08T23:07:57.510141923+08:00",
"status": "processing",
"task_id": "48038932-0ff5-4251-8b4b-7a76c09fd114"
}
Authentication
Authorization: Bearer YOUR_API_KEY
Body
string
required
Model name. Supports
viduq3-pro, viduq2-pro-fast, viduq2-pro, viduq2-turbo, viduq1, viduq1-classic, and vidu2.0.array
required
Image array. Supports passing image Base64-encoded data or image URLs (ensure they are accessible). For text-to-video, pass an empty array
[]; for image-to-video, pass 1 image; for first-and-last-frame video generation, pass 2 images. Supported image formats are png, jpeg, jpg, and webp. The aspect ratio must be less than 1:4 or greater than 4:1, and the size must not exceed 50 MB.string
Text prompt. The text description for the generated video, with a maximum length of 2000 characters. If you use the
is_rec recommended prompt parameter, the model will ignore the prompt input in this parameter.string
Aspect ratio. Default is
16:9. Optional values: 16:9, 9:16, 3:4, 4:3, 1:1. Note: 3:4 and 4:3 are supported only by q2 and q3 models.boolean
Whether to use direct audio-video output capability. Default is
false. false: audio-video direct output is not needed, and a silent video is output; true: audio-video direct output is needed, and a video with dialogue and background sound is output.string
Voice ID. Does not take effect for q3 models. Used to determine the voice timbre in the video; if empty, the system will recommend one automatically.
boolean
Whether to use recommended prompts.
true: yes, the system automatically recommends prompts and generates the video using the prompt content, with the number of recommended prompts = 1; false: no, generate the video based on the input prompt.boolean
Whether to add background music to the generated video. Default is
false. true: the system will automatically select suitable music from the preset BGM library and add it; false: no BGM is added.integer
Video duration (seconds). The default for the
viduq2 series is 5. Optional: 1-10.integer
Random seed. When omitted by default or set to 0, a random number will be used instead. If manually set, the specified seed will be used.
string
Resolution parameter. The default value depends on the model and video duration. Optional values:
540p, 720p, 1080p, 360p. viduq2 (1-10 seconds): default 720p, optional: 540p, 720p, 1080p.string
Passthrough parameter. No processing is performed; data transmission only. Maximum length: 1048576 characters.
boolean
Off-peak mode. Default is
false. true: generate video during off-peak periods; false: generate video immediately.boolean
Whether to add a watermark. Default is
false. true: add watermark; false: do not add watermark.integer
Watermark position. Default is
3 (bottom right). Optional values: 1: top left; 2: top right; 3: bottom right; 4: bottom left.string
Watermark content, where this is an image URL. If not provided, the default watermark is used: content generated by AI.
string
Metadata identifier. A JSON-formatted string, passed through as-is.
Response
string
Creation time (ISO 8601 format).
string
Task status. Common values include
processing, failed, and completed.string
Task ID, passed as the
id parameter in subsequent queries.