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
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
Input parameters for the generation.
Show properties
Show properties
Input image URL to animate.
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
Text description to guide the video generation.
Describe what you do not want to see in the output.
Video length in seconds.
- V3: Integer from
3to15 - V2.6:
5or10
Output aspect ratio. Options:
16:9, 9:16, 1:1Generation quality mode. Options:
std (standard), pro (professional)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
V3 only. Enable multi-shot mode. Options:
true— Enable multi-shot with manualmulti_promptsegmentsintelligence— AI-powered automatic scene splitting
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
V3 only. Element control list. Maximum 4 elements. Each element object:
element_id(number, required) — Positive integer referencing a pre-created element
Voice list for audio generation. Requires
sound: "on". Each voice object:voice_id(string) — Voice identifiertext(string) — Text to speak
URL to receive a webhook when the task completes.
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