Image to Video
curl --request POST \
--url https://api.modelhunter.ai/api/v1/veo/image-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": [
"<string>"
],
"aspect_ratio": "<string>",
"seed": 123,
"enable_translation": true,
"watermark": "<string>"
},
"webhookUrl": "<string>",
"metadata": {}
}
'import requests
url = "https://api.modelhunter.ai/api/v1/veo/image-to-video"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": ["<string>"],
"aspect_ratio": "<string>",
"seed": 123,
"enable_translation": True,
"watermark": "<string>"
},
"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: {
prompt: '<string>',
image_urls: ['<string>'],
aspect_ratio: '<string>',
seed: 123,
enable_translation: true,
watermark: '<string>'
},
webhookUrl: '<string>',
metadata: {}
})
};
fetch('https://api.modelhunter.ai/api/v1/veo/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/veo/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' => [
'prompt' => '<string>',
'image_urls' => [
'<string>'
],
'aspect_ratio' => '<string>',
'seed' => 123,
'enable_translation' => true,
'watermark' => '<string>'
],
'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/veo/image-to-video"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"aspect_ratio\": \"<string>\",\n \"seed\": 123,\n \"enable_translation\": true,\n \"watermark\": \"<string>\"\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/veo/image-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"aspect_ratio\": \"<string>\",\n \"seed\": 123,\n \"enable_translation\": true,\n \"watermark\": \"<string>\"\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelhunter.ai/api/v1/veo/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 \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"aspect_ratio\": \"<string>\",\n \"seed\": 123,\n \"enable_translation\": true,\n \"watermark\": \"<string>\"\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "task_veo_i2v_456",
"status": "pending",
"type": "image-to-video",
"provider": "veo",
"model": "veo3_fast",
"created_at": "2026-03-14T10:00:00Z",
"estimated_seconds": 90
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "input.image_urls must contain 1 or 2 URLs"
}
}
Gemini
Image to Video
Animate one or two input images into a video using Veo 3.1.
POST
/
api
/
v1
/
veo
/
image-to-video
Image to Video
curl --request POST \
--url https://api.modelhunter.ai/api/v1/veo/image-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": [
"<string>"
],
"aspect_ratio": "<string>",
"seed": 123,
"enable_translation": true,
"watermark": "<string>"
},
"webhookUrl": "<string>",
"metadata": {}
}
'import requests
url = "https://api.modelhunter.ai/api/v1/veo/image-to-video"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": ["<string>"],
"aspect_ratio": "<string>",
"seed": 123,
"enable_translation": True,
"watermark": "<string>"
},
"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: {
prompt: '<string>',
image_urls: ['<string>'],
aspect_ratio: '<string>',
seed: 123,
enable_translation: true,
watermark: '<string>'
},
webhookUrl: '<string>',
metadata: {}
})
};
fetch('https://api.modelhunter.ai/api/v1/veo/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/veo/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' => [
'prompt' => '<string>',
'image_urls' => [
'<string>'
],
'aspect_ratio' => '<string>',
'seed' => 123,
'enable_translation' => true,
'watermark' => '<string>'
],
'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/veo/image-to-video"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"aspect_ratio\": \"<string>\",\n \"seed\": 123,\n \"enable_translation\": true,\n \"watermark\": \"<string>\"\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/veo/image-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"aspect_ratio\": \"<string>\",\n \"seed\": 123,\n \"enable_translation\": true,\n \"watermark\": \"<string>\"\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelhunter.ai/api/v1/veo/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 \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"aspect_ratio\": \"<string>\",\n \"seed\": 123,\n \"enable_translation\": true,\n \"watermark\": \"<string>\"\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "task_veo_i2v_456",
"status": "pending",
"type": "image-to-video",
"provider": "veo",
"model": "veo3_fast",
"created_at": "2026-03-14T10:00:00Z",
"estimated_seconds": 90
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "input.image_urls must contain 1 or 2 URLs"
}
}
Body Parameters
string
required
Veo model to use. In this phase:
veo3— billed at$3.20per requestveo3_fast— billed at$1.20per request
8s clip.object
required
Input parameters for the generation.
Show properties
Show properties
string
required
Motion or scene direction for the generated video.
string[]
required
Public image URL array. Provide
1 or 2 directly accessible HTTP(S) image URLs.string
default:"16:9"
Output aspect ratio. Options:
16:9, 9:16, Auto.number
Optional deterministic seed. Must be an integer between
10000 and 99999.boolean
Enable upstream prompt translation before generation.
string
Optional watermark mode passed through to the upstream Veo provider.
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_veo_i2v_456",
"status": "pending",
"type": "image-to-video",
"provider": "veo",
"model": "veo3_fast",
"created_at": "2026-03-14T10:00:00Z",
"estimated_seconds": 90
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "input.image_urls must contain 1 or 2 URLs"
}
}
⌘I