Image to Video
curl --request POST \
--url https://api.modelhunter.ai/api/v1/vidu/image-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"images": [
"<string>"
],
"prompt": "<string>",
"duration": 123,
"resolution": "<string>",
"audio": true,
"voice_id": "<string>",
"is_rec": true,
"bgm": true,
"movement_amplitude": "<string>",
"seed": 123,
"off_peak": true
},
"webhookUrl": "<string>",
"metadata": {}
}
'import requests
url = "https://api.modelhunter.ai/api/v1/vidu/image-to-video"
payload = {
"model": "<string>",
"input": {
"images": ["<string>"],
"prompt": "<string>",
"duration": 123,
"resolution": "<string>",
"audio": True,
"voice_id": "<string>",
"is_rec": True,
"bgm": True,
"movement_amplitude": "<string>",
"seed": 123,
"off_peak": True
},
"webhookUrl": "<string>",
"metadata": {}
}
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>',
input: {
images: ['<string>'],
prompt: '<string>',
duration: 123,
resolution: '<string>',
audio: true,
voice_id: '<string>',
is_rec: true,
bgm: true,
movement_amplitude: '<string>',
seed: 123,
off_peak: true
},
webhookUrl: '<string>',
metadata: {}
})
};
fetch('https://api.modelhunter.ai/api/v1/vidu/image-to-video', 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.modelhunter.ai/api/v1/vidu/image-to-video",
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>',
'input' => [
'images' => [
'<string>'
],
'prompt' => '<string>',
'duration' => 123,
'resolution' => '<string>',
'audio' => true,
'voice_id' => '<string>',
'is_rec' => true,
'bgm' => true,
'movement_amplitude' => '<string>',
'seed' => 123,
'off_peak' => true
],
'webhookUrl' => '<string>',
'metadata' => [
]
]),
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://api.modelhunter.ai/api/v1/vidu/image-to-video"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"images\": [\n \"<string>\"\n ],\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"resolution\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"movement_amplitude\": \"<string>\",\n \"seed\": 123,\n \"off_peak\": true\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\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://api.modelhunter.ai/api/v1/vidu/image-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"images\": [\n \"<string>\"\n ],\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"resolution\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"movement_amplitude\": \"<string>\",\n \"seed\": 123,\n \"off_peak\": true\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelhunter.ai/api/v1/vidu/image-to-video")
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 \"input\": {\n \"images\": [\n \"<string>\"\n ],\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"resolution\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"movement_amplitude\": \"<string>\",\n \"seed\": 123,\n \"off_peak\": true\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "task_abc123",
"status": "pending",
"type": "image-to-video",
"provider": "vidu",
"model": "viduq3-turbo",
"created_at": "2025-01-15T10:00:00Z",
"estimated_seconds": 30
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters"
}
}
Vidu
Image to Video
Animate a static image into a video using Vidu.
POST
/
api
/
v1
/
vidu
/
image-to-video
Image to Video
curl --request POST \
--url https://api.modelhunter.ai/api/v1/vidu/image-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"images": [
"<string>"
],
"prompt": "<string>",
"duration": 123,
"resolution": "<string>",
"audio": true,
"voice_id": "<string>",
"is_rec": true,
"bgm": true,
"movement_amplitude": "<string>",
"seed": 123,
"off_peak": true
},
"webhookUrl": "<string>",
"metadata": {}
}
'import requests
url = "https://api.modelhunter.ai/api/v1/vidu/image-to-video"
payload = {
"model": "<string>",
"input": {
"images": ["<string>"],
"prompt": "<string>",
"duration": 123,
"resolution": "<string>",
"audio": True,
"voice_id": "<string>",
"is_rec": True,
"bgm": True,
"movement_amplitude": "<string>",
"seed": 123,
"off_peak": True
},
"webhookUrl": "<string>",
"metadata": {}
}
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>',
input: {
images: ['<string>'],
prompt: '<string>',
duration: 123,
resolution: '<string>',
audio: true,
voice_id: '<string>',
is_rec: true,
bgm: true,
movement_amplitude: '<string>',
seed: 123,
off_peak: true
},
webhookUrl: '<string>',
metadata: {}
})
};
fetch('https://api.modelhunter.ai/api/v1/vidu/image-to-video', 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.modelhunter.ai/api/v1/vidu/image-to-video",
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>',
'input' => [
'images' => [
'<string>'
],
'prompt' => '<string>',
'duration' => 123,
'resolution' => '<string>',
'audio' => true,
'voice_id' => '<string>',
'is_rec' => true,
'bgm' => true,
'movement_amplitude' => '<string>',
'seed' => 123,
'off_peak' => true
],
'webhookUrl' => '<string>',
'metadata' => [
]
]),
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://api.modelhunter.ai/api/v1/vidu/image-to-video"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"images\": [\n \"<string>\"\n ],\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"resolution\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"movement_amplitude\": \"<string>\",\n \"seed\": 123,\n \"off_peak\": true\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\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://api.modelhunter.ai/api/v1/vidu/image-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"images\": [\n \"<string>\"\n ],\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"resolution\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"movement_amplitude\": \"<string>\",\n \"seed\": 123,\n \"off_peak\": true\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelhunter.ai/api/v1/vidu/image-to-video")
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 \"input\": {\n \"images\": [\n \"<string>\"\n ],\n \"prompt\": \"<string>\",\n \"duration\": 123,\n \"resolution\": \"<string>\",\n \"audio\": true,\n \"voice_id\": \"<string>\",\n \"is_rec\": true,\n \"bgm\": true,\n \"movement_amplitude\": \"<string>\",\n \"seed\": 123,\n \"off_peak\": true\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "task_abc123",
"status": "pending",
"type": "image-to-video",
"provider": "vidu",
"model": "viduq3-turbo",
"created_at": "2025-01-15T10:00:00Z",
"estimated_seconds": 30
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters"
}
}
Check out Vidu pricing — enable
off_peak: true for 50% off.Body Parameters
Vidu model to use. Options:
viduq3-pro— Latest flagship, supports audio sync (1–16s), $0.07–$0.16/secviduq3-turbo— Fast Q3, supports audio sync (1–16s), $0.04–$0.08/sec
off_peak: true for 50% off.Provider-specific parameters for the generation request.
Show properties
Show properties
Image array for the start frame. Only 1 image is accepted. Supports public URL or base64 format.
- Formats:
png,jpeg,jpg,webp - Aspect ratio must be between 1:4 and 4:1
- Max image size: 50 MB
Text description to guide the video generation. Max 5,000 characters.Note: If
is_rec is enabled, the model will ignore this prompt.Video length in seconds (1–16).
Output resolution. Options:
540p, 720p, 1080pEnable audio-video sync output. Default
true for Q3 models.When enabled, the video will include dialogue and sound effects.Voice ID for audio generation. Only effective when
audio is true.See Vidu Voice List for available voices. You can also use the Voice Clone API to create custom voices.Use Vidu’s recommended prompt instead of user-provided prompt.Note: Enabling this consumes an additional 10 credits per task.
Add background music to the generated video.Note: Not available for Q3 models. Ineffective when Q2 duration is 9–10s.
Movement amplitude of objects in the frame. Options:
auto, small, medium, largeNote: Ineffective for Q2 and Q3 models.Random seed for reproducibility.
Enable off-peak mode for 50% discount. Tasks complete within 48 hours.
URL to receive a webhook when the task completes.
Custom key-value metadata to attach to the task.
{
"success": true,
"data": {
"id": "task_abc123",
"status": "pending",
"type": "image-to-video",
"provider": "vidu",
"model": "viduq3-turbo",
"created_at": "2025-01-15T10:00:00Z",
"estimated_seconds": 30
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters"
}
}
⌘I