Image to Video
curl --request POST \
--url https://api.modelhunter.ai/api/v1/kling/image-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"image": "<string>",
"image_tail": "<string>",
"prompt": "<string>",
"negative_prompt": "<string>",
"duration": 123,
"aspect_ratio": "<string>",
"mode": "<string>",
"sound": "<string>",
"multi_shot": "<string>",
"multi_prompt": [
{}
],
"element_list": [
{}
],
"voice_list": [
{}
]
},
"webhookUrl": "<string>",
"metadata": {}
}
'import requests
url = "https://api.modelhunter.ai/api/v1/kling/image-to-video"
payload = {
"model": "<string>",
"input": {
"image": "<string>",
"image_tail": "<string>",
"prompt": "<string>",
"negative_prompt": "<string>",
"duration": 123,
"aspect_ratio": "<string>",
"mode": "<string>",
"sound": "<string>",
"multi_shot": "<string>",
"multi_prompt": [{}],
"element_list": [{}],
"voice_list": [{}]
},
"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: {
image: '<string>',
image_tail: '<string>',
prompt: '<string>',
negative_prompt: '<string>',
duration: 123,
aspect_ratio: '<string>',
mode: '<string>',
sound: '<string>',
multi_shot: '<string>',
multi_prompt: [{}],
element_list: [{}],
voice_list: [{}]
},
webhookUrl: '<string>',
metadata: {}
})
};
fetch('https://api.modelhunter.ai/api/v1/kling/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/kling/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' => [
'image' => '<string>',
'image_tail' => '<string>',
'prompt' => '<string>',
'negative_prompt' => '<string>',
'duration' => 123,
'aspect_ratio' => '<string>',
'mode' => '<string>',
'sound' => '<string>',
'multi_shot' => '<string>',
'multi_prompt' => [
[
]
],
'element_list' => [
[
]
],
'voice_list' => [
[
]
]
],
'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/kling/image-to-video"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"image\": \"<string>\",\n \"image_tail\": \"<string>\",\n \"prompt\": \"<string>\",\n \"negative_prompt\": \"<string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"mode\": \"<string>\",\n \"sound\": \"<string>\",\n \"multi_shot\": \"<string>\",\n \"multi_prompt\": [\n {}\n ],\n \"element_list\": [\n {}\n ],\n \"voice_list\": [\n {}\n ]\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/kling/image-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"image\": \"<string>\",\n \"image_tail\": \"<string>\",\n \"prompt\": \"<string>\",\n \"negative_prompt\": \"<string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"mode\": \"<string>\",\n \"sound\": \"<string>\",\n \"multi_shot\": \"<string>\",\n \"multi_prompt\": [\n {}\n ],\n \"element_list\": [\n {}\n ],\n \"voice_list\": [\n {}\n ]\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelhunter.ai/api/v1/kling/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 \"image\": \"<string>\",\n \"image_tail\": \"<string>\",\n \"prompt\": \"<string>\",\n \"negative_prompt\": \"<string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"mode\": \"<string>\",\n \"sound\": \"<string>\",\n \"multi_shot\": \"<string>\",\n \"multi_prompt\": [\n {}\n ],\n \"element_list\": [\n {}\n ],\n \"voice_list\": [\n {}\n ]\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "task_ghi789",
"status": "pending",
"type": "image-to-video",
"provider": "kling",
"model": "kling-v3",
"created_at": "2026-02-27T10:00:00Z",
"estimated_seconds": 60
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters"
}
}
Kling
Image to Video
Animate an image into a video using Kling.
POST
/
api
/
v1
/
kling
/
image-to-video
Image to Video
curl --request POST \
--url https://api.modelhunter.ai/api/v1/kling/image-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"image": "<string>",
"image_tail": "<string>",
"prompt": "<string>",
"negative_prompt": "<string>",
"duration": 123,
"aspect_ratio": "<string>",
"mode": "<string>",
"sound": "<string>",
"multi_shot": "<string>",
"multi_prompt": [
{}
],
"element_list": [
{}
],
"voice_list": [
{}
]
},
"webhookUrl": "<string>",
"metadata": {}
}
'import requests
url = "https://api.modelhunter.ai/api/v1/kling/image-to-video"
payload = {
"model": "<string>",
"input": {
"image": "<string>",
"image_tail": "<string>",
"prompt": "<string>",
"negative_prompt": "<string>",
"duration": 123,
"aspect_ratio": "<string>",
"mode": "<string>",
"sound": "<string>",
"multi_shot": "<string>",
"multi_prompt": [{}],
"element_list": [{}],
"voice_list": [{}]
},
"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: {
image: '<string>',
image_tail: '<string>',
prompt: '<string>',
negative_prompt: '<string>',
duration: 123,
aspect_ratio: '<string>',
mode: '<string>',
sound: '<string>',
multi_shot: '<string>',
multi_prompt: [{}],
element_list: [{}],
voice_list: [{}]
},
webhookUrl: '<string>',
metadata: {}
})
};
fetch('https://api.modelhunter.ai/api/v1/kling/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/kling/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' => [
'image' => '<string>',
'image_tail' => '<string>',
'prompt' => '<string>',
'negative_prompt' => '<string>',
'duration' => 123,
'aspect_ratio' => '<string>',
'mode' => '<string>',
'sound' => '<string>',
'multi_shot' => '<string>',
'multi_prompt' => [
[
]
],
'element_list' => [
[
]
],
'voice_list' => [
[
]
]
],
'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/kling/image-to-video"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"image\": \"<string>\",\n \"image_tail\": \"<string>\",\n \"prompt\": \"<string>\",\n \"negative_prompt\": \"<string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"mode\": \"<string>\",\n \"sound\": \"<string>\",\n \"multi_shot\": \"<string>\",\n \"multi_prompt\": [\n {}\n ],\n \"element_list\": [\n {}\n ],\n \"voice_list\": [\n {}\n ]\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/kling/image-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"image\": \"<string>\",\n \"image_tail\": \"<string>\",\n \"prompt\": \"<string>\",\n \"negative_prompt\": \"<string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"mode\": \"<string>\",\n \"sound\": \"<string>\",\n \"multi_shot\": \"<string>\",\n \"multi_prompt\": [\n {}\n ],\n \"element_list\": [\n {}\n ],\n \"voice_list\": [\n {}\n ]\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelhunter.ai/api/v1/kling/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 \"image\": \"<string>\",\n \"image_tail\": \"<string>\",\n \"prompt\": \"<string>\",\n \"negative_prompt\": \"<string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"mode\": \"<string>\",\n \"sound\": \"<string>\",\n \"multi_shot\": \"<string>\",\n \"multi_prompt\": [\n {}\n ],\n \"element_list\": [\n {}\n ],\n \"voice_list\": [\n {}\n ]\n },\n \"webhookUrl\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "task_ghi789",
"status": "pending",
"type": "image-to-video",
"provider": "kling",
"model": "kling-v3",
"created_at": "2026-02-27T10:00:00Z",
"estimated_seconds": 60
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters"
}
}
Body Parameters
string
required
Kling model. Options:
kling-v3— Per-second billing, multi-shot, element control (3–15s), $0.084–$0.168/seckling-v2-6— Fixed pricing, std/pro modes (5s or 10s), $0.21–$1.40 per video
object
required
Input parameters for the generation.
Show properties
Show properties
string
required
Input image URL to animate.
string
End frame image URL. When provided, the video transitions from the input image to this image.
- V3: Supported in both
stdandpromodes - V2.6: Only supported in
promode
string
Text description to guide the video generation.
string
Describe what you do not want to see in the output.
number
Video length in seconds.
- V3: Integer from
3to15 - V2.6:
5or10
string
default:"16:9"
Output aspect ratio. Options:
16:9, 9:16, 1:1string
default:"std"
Generation quality mode. Options:
std (standard), pro (professional)string
default:"off"
Enable audio generation with the video. Options:
on, off.Pricing impact (V3):- std + no audio: $0.084/sec
- std + audio: $0.126/sec
- pro + no audio: $0.112/sec
- pro + audio: $0.168/sec
string
V3 only. Enable multi-shot mode. Options:
true— Enable multi-shot with manualmulti_promptsegmentsintelligence— AI-powered automatic scene splitting
object[]
V3 only. Multi-shot segment prompts. Requires
multi_shot to be enabled. Maximum 6 segments.Each segment object:index(number, required) — Shot number, starting from 1, must be consecutiveprompt(string, required) — Description for this shotduration(number) — Duration of this segment in seconds
object[]
V3 only. Element control list. Maximum 4 elements. Each element object:
element_id(number, required) — Positive integer referencing a pre-created element
object[]
Voice list for audio generation. Requires
sound: "on". Each voice object:voice_id(string) — Voice identifiertext(string) — Text to speak
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_ghi789",
"status": "pending",
"type": "image-to-video",
"provider": "kling",
"model": "kling-v3",
"created_at": "2026-02-27T10:00:00Z",
"estimated_seconds": 60
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters"
}
}
⌘I