curl --request POST \
--url https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"image_url": "<string>",
"video_url": "<string>"
}
'import requests
url = "https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6"
payload = {
"prompt": "<string>",
"image_url": "<string>",
"video_url": "<string>"
}
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({prompt: '<string>', image_url: '<string>', video_url: '<string>'})
};
fetch('https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6', 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://open.skills.video/api/v1/generation/kling-ai/kling-v2.6",
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([
'prompt' => '<string>',
'image_url' => '<string>',
'video_url' => '<string>'
]),
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://open.skills.video/api/v1/generation/kling-ai/kling-v2.6"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"image_url\": \"<string>\",\n \"video_url\": \"<string>\"\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://open.skills.video/api/v1/generation/kling-ai/kling-v2.6")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"image_url\": \"<string>\",\n \"video_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6")
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 \"prompt\": \"<string>\",\n \"image_url\": \"<string>\",\n \"video_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyimport Foundation
let parameters = [
"prompt": "<string>",
"image_url": "<string>",
"video_url": "<string>"
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self)){
"id": "gen_123",
"status": "IN_QUEUE",
"input": {
"prompt": "a cat walking through neon rain",
"duration": 5,
"aspect_ratio": "16:9",
"n": 1
},
"usage": {
"total": 20,
"subscription": 20,
"permanent": 0
}
}{
"error": "VIDEO_GENERATION_INVALID_INPUT",
"code": "VIDEO_GENERATION_INVALID_INPUT",
"message": "'prompt' parameter is required"
}{
"error": "UNAUTHORIZED",
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}{
"error": "INSUFFICIENT_CREDITS",
"code": "VIDEO_GENERATION_INSUFFICIENT_CREDITS",
"message": "Insufficient credits for this generation."
}{
"error": "WORKSPACE_FORBIDDEN",
"code": "WORKSPACE_FORBIDDEN",
"message": "You do not have access to this workspace."
}{
"error": "TEMPLATE_NOT_FOUND",
"code": "TEMPLATE_NOT_FOUND",
"message": "Template not found."
}{
"error": "VIDEO_GENERATION_CONTENT_REJECTED",
"code": "VIDEO_GENERATION_CONTENT_REJECTED",
"message": "Request content was rejected by the moderation policy."
}{
"error": "VIDEO_GENERATION_RATE_LIMITED",
"code": "VIDEO_GENERATION_RATE_LIMITED",
"message": "Rate limit exceeded. Please retry later."
}{
"error": "VIDEO_GENERATION_FAILED",
"code": "VIDEO_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "VIDEO_GENERATION_FAILED",
"code": "VIDEO_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "VIDEO_GENERATION_PROVIDER_UNAVAILABLE",
"code": "VIDEO_GENERATION_PROVIDER_UNAVAILABLE",
"message": "Upstream generation provider is temporarily unavailable."
}{
"error": "VIDEO_GENERATION_TIMEOUT",
"code": "VIDEO_GENERATION_TIMEOUT",
"message": "Generation timed out."
}Kling V2.6 Video
curl --request POST \
--url https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "<string>",
"image_url": "<string>",
"video_url": "<string>"
}
'import requests
url = "https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6"
payload = {
"prompt": "<string>",
"image_url": "<string>",
"video_url": "<string>"
}
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({prompt: '<string>', image_url: '<string>', video_url: '<string>'})
};
fetch('https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6', 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://open.skills.video/api/v1/generation/kling-ai/kling-v2.6",
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([
'prompt' => '<string>',
'image_url' => '<string>',
'video_url' => '<string>'
]),
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://open.skills.video/api/v1/generation/kling-ai/kling-v2.6"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"image_url\": \"<string>\",\n \"video_url\": \"<string>\"\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://open.skills.video/api/v1/generation/kling-ai/kling-v2.6")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"image_url\": \"<string>\",\n \"video_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6")
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 \"prompt\": \"<string>\",\n \"image_url\": \"<string>\",\n \"video_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyimport Foundation
let parameters = [
"prompt": "<string>",
"image_url": "<string>",
"video_url": "<string>"
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://open.skills.video/api/v1/generation/kling-ai/kling-v2.6")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self)){
"id": "gen_123",
"status": "IN_QUEUE",
"input": {
"prompt": "a cat walking through neon rain",
"duration": 5,
"aspect_ratio": "16:9",
"n": 1
},
"usage": {
"total": 20,
"subscription": 20,
"permanent": 0
}
}{
"error": "VIDEO_GENERATION_INVALID_INPUT",
"code": "VIDEO_GENERATION_INVALID_INPUT",
"message": "'prompt' parameter is required"
}{
"error": "UNAUTHORIZED",
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}{
"error": "INSUFFICIENT_CREDITS",
"code": "VIDEO_GENERATION_INSUFFICIENT_CREDITS",
"message": "Insufficient credits for this generation."
}{
"error": "WORKSPACE_FORBIDDEN",
"code": "WORKSPACE_FORBIDDEN",
"message": "You do not have access to this workspace."
}{
"error": "TEMPLATE_NOT_FOUND",
"code": "TEMPLATE_NOT_FOUND",
"message": "Template not found."
}{
"error": "VIDEO_GENERATION_CONTENT_REJECTED",
"code": "VIDEO_GENERATION_CONTENT_REJECTED",
"message": "Request content was rejected by the moderation policy."
}{
"error": "VIDEO_GENERATION_RATE_LIMITED",
"code": "VIDEO_GENERATION_RATE_LIMITED",
"message": "Rate limit exceeded. Please retry later."
}{
"error": "VIDEO_GENERATION_FAILED",
"code": "VIDEO_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "VIDEO_GENERATION_FAILED",
"code": "VIDEO_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "VIDEO_GENERATION_PROVIDER_UNAVAILABLE",
"code": "VIDEO_GENERATION_PROVIDER_UNAVAILABLE",
"message": "Upstream generation provider is temporarily unavailable."
}{
"error": "VIDEO_GENERATION_TIMEOUT",
"code": "VIDEO_GENERATION_TIMEOUT",
"message": "Generation timed out."
}Authorizations
API Key for API endpoints
Body
- Text Image To Video
- Motion Control
Text prompt for video generation. Optional for motion control.
Workflow type: prompt/image generation or motion transfer.
"text-image-to-video"Source image for image-to-video, or the character image for motion control.
Optional ending image for image-to-video.
Generate audio with the video
Aspect ratio of the video. Portrait is 720x1280, landscape is 1280x720
9:16, 16:9, 1:1 Description of what to exclude from the generated video.
Reference video URL used to transfer motion.
Keep orientation aligned with the image or video source.
image, video Motion control quality tier.
standard, pro Whether to keep source video sound in motion-control mode.
Video duration in seconds
Response
Generation submission accepted
Generation id.
Queue status
IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED, CANCELED Normalized input payload for the generation task.
- Text Image To Video
- Motion Control
Show child attributes
Show child attributes
Credit usage breakdown for the request
Show child attributes
Show child attributes
Machine-readable generation error code. Present when status is FAILED.
Sanitized human-readable failure message. Present when status is FAILED.