Video Generation
Generate Video
Create a video generation job in an existing project. The API returns a video ID immediately; poll it for status.
POST
/
v1
/
videos
/
generate
Generate Video
curl --request POST \
--url https://api.turboads.ai/v1/videos/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"project_id": "j97project123abc456def789",
"prompt": "A fast-paced ad showing a founder demoing a new productivity app",
"model": "kling-3.0",
"aspect_ratio": "9:16",
"duration": 8,
"resolution": "1080p"
}
'import requests
url = "https://api.turboads.ai/v1/videos/generate"
payload = {
"project_id": "j97project123abc456def789",
"prompt": "A fast-paced ad showing a founder demoing a new productivity app",
"model": "kling-3.0",
"aspect_ratio": "9:16",
"duration": 8,
"resolution": "1080p"
}
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({
project_id: 'j97project123abc456def789',
prompt: 'A fast-paced ad showing a founder demoing a new productivity app',
model: 'kling-3.0',
aspect_ratio: '9:16',
duration: 8,
resolution: '1080p'
})
};
fetch('https://api.turboads.ai/v1/videos/generate', 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.turboads.ai/v1/videos/generate",
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([
'project_id' => 'j97project123abc456def789',
'prompt' => 'A fast-paced ad showing a founder demoing a new productivity app',
'model' => 'kling-3.0',
'aspect_ratio' => '9:16',
'duration' => 8,
'resolution' => '1080p'
]),
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.turboads.ai/v1/videos/generate"
payload := strings.NewReader("{\n \"project_id\": \"j97project123abc456def789\",\n \"prompt\": \"A fast-paced ad showing a founder demoing a new productivity app\",\n \"model\": \"kling-3.0\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": 8,\n \"resolution\": \"1080p\"\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.turboads.ai/v1/videos/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"j97project123abc456def789\",\n \"prompt\": \"A fast-paced ad showing a founder demoing a new productivity app\",\n \"model\": \"kling-3.0\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": 8,\n \"resolution\": \"1080p\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.turboads.ai/v1/videos/generate")
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 \"project_id\": \"j97project123abc456def789\",\n \"prompt\": \"A fast-paced ad showing a founder demoing a new productivity app\",\n \"model\": \"kling-3.0\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": 8,\n \"resolution\": \"1080p\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "j97video123abc456def789",
"status": "pending"
}
}{
"error": {
"code": "invalid_request",
"message": "Required fields are missing or malformed."
}
}{
"error": {
"code": "unauthorized",
"message": "Missing, invalid, or revoked API key."
}
}{
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits. Required: 8, Available: 2"
}
}{
"error": {
"code": "forbidden",
"message": "Project does not belong to this API key workspace."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded."
},
"retry_after_ms": 1200
}{
"error": {
"code": "internal_error",
"message": "Something went wrong."
}
}Authorizations
Your TurboAds API key
Body
application/json
Existing project ID in the API key workspace.
Text prompt describing the video to generate.
Available options:
sora-2-pro, sora-2, kling-3.0, kling-2.6, veo-3.1, seedance-1.5, grok-video Available options:
1:1, 9:16, 16:9 Requested duration in seconds.
Optional output resolution, when supported by the selected model.
Completed image file upload IDs to use as reference images.
Completed image file upload ID to use as the start frame when the model supports it.
Completed image file upload ID to use as the end frame when the model supports it.
Response
Video generation job created
Show child attributes
Show child attributes
⌘I
Generate Video
curl --request POST \
--url https://api.turboads.ai/v1/videos/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"project_id": "j97project123abc456def789",
"prompt": "A fast-paced ad showing a founder demoing a new productivity app",
"model": "kling-3.0",
"aspect_ratio": "9:16",
"duration": 8,
"resolution": "1080p"
}
'import requests
url = "https://api.turboads.ai/v1/videos/generate"
payload = {
"project_id": "j97project123abc456def789",
"prompt": "A fast-paced ad showing a founder demoing a new productivity app",
"model": "kling-3.0",
"aspect_ratio": "9:16",
"duration": 8,
"resolution": "1080p"
}
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({
project_id: 'j97project123abc456def789',
prompt: 'A fast-paced ad showing a founder demoing a new productivity app',
model: 'kling-3.0',
aspect_ratio: '9:16',
duration: 8,
resolution: '1080p'
})
};
fetch('https://api.turboads.ai/v1/videos/generate', 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.turboads.ai/v1/videos/generate",
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([
'project_id' => 'j97project123abc456def789',
'prompt' => 'A fast-paced ad showing a founder demoing a new productivity app',
'model' => 'kling-3.0',
'aspect_ratio' => '9:16',
'duration' => 8,
'resolution' => '1080p'
]),
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.turboads.ai/v1/videos/generate"
payload := strings.NewReader("{\n \"project_id\": \"j97project123abc456def789\",\n \"prompt\": \"A fast-paced ad showing a founder demoing a new productivity app\",\n \"model\": \"kling-3.0\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": 8,\n \"resolution\": \"1080p\"\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.turboads.ai/v1/videos/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"j97project123abc456def789\",\n \"prompt\": \"A fast-paced ad showing a founder demoing a new productivity app\",\n \"model\": \"kling-3.0\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": 8,\n \"resolution\": \"1080p\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.turboads.ai/v1/videos/generate")
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 \"project_id\": \"j97project123abc456def789\",\n \"prompt\": \"A fast-paced ad showing a founder demoing a new productivity app\",\n \"model\": \"kling-3.0\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": 8,\n \"resolution\": \"1080p\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "j97video123abc456def789",
"status": "pending"
}
}{
"error": {
"code": "invalid_request",
"message": "Required fields are missing or malformed."
}
}{
"error": {
"code": "unauthorized",
"message": "Missing, invalid, or revoked API key."
}
}{
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits. Required: 8, Available: 2"
}
}{
"error": {
"code": "forbidden",
"message": "Project does not belong to this API key workspace."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded."
},
"retry_after_ms": 1200
}{
"error": {
"code": "internal_error",
"message": "Something went wrong."
}
}
