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
string
required
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.object
required
Provider-specific parameters for the generation request.
Show properties
Show properties
string[]
required
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
string
Text description to guide the video generation. Max 5,000 characters.Note: If
is_rec is enabled, the model will ignore this prompt.number
Video length in seconds (1–16).
string
default:"720p"
Output resolution. Options:
540p, 720p, 1080pboolean
Enable audio-video sync output. Default
true for Q3 models.When enabled, the video will include dialogue and sound effects.string
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.boolean
default:false
Use Vidu’s recommended prompt instead of user-provided prompt.Note: Enabling this consumes an additional 10 credits per task.
boolean
default:false
Add background music to the generated video.Note: Not available for Q3 models. Ineffective when Q2 duration is 9–10s.
string
default:"auto"
Movement amplitude of objects in the frame. Options:
auto, small, medium, largeNote: Ineffective for Q2 and Q3 models.number
Random seed for reproducibility.
boolean
default:false
Enable off-peak mode for 50% discount. Tasks complete within 48 hours.
string
URL to receive a webhook when the task completes.
object
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