curl --request POST \
--url https://api.bitstudio.ai/v1/text-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "A silk scarf moves gently in the breeze"
}
'import requests
url = "https://api.bitstudio.ai/v1/text-to-video"
payload = { "prompt": "A silk scarf moves gently in the breeze" }
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: 'A silk scarf moves gently in the breeze'})
};
fetch('https://api.bitstudio.ai/v1/text-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.bitstudio.ai/v1/text-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([
'prompt' => 'A silk scarf moves gently in the breeze'
]),
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.bitstudio.ai/v1/text-to-video"
payload := strings.NewReader("{\n \"prompt\": \"A silk scarf moves gently in the breeze\"\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.bitstudio.ai/v1/text-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"A silk scarf moves gently in the breeze\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bitstudio.ai/v1/text-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 \"prompt\": \"A silk scarf moves gently in the breeze\"\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "pending",
"task": "text-to-video",
"created_at": "2026-09-15T12:00:00Z",
"result": null,
"error": null,
"credits_used": 15
}
]
}{
"code": "<string>",
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"error": "<string>",
"cta": true,
"next_action": "<string>"
}Generate a video
Create a video from scene and motion directions.
curl --request POST \
--url https://api.bitstudio.ai/v1/text-to-video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "A silk scarf moves gently in the breeze"
}
'import requests
url = "https://api.bitstudio.ai/v1/text-to-video"
payload = { "prompt": "A silk scarf moves gently in the breeze" }
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: 'A silk scarf moves gently in the breeze'})
};
fetch('https://api.bitstudio.ai/v1/text-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.bitstudio.ai/v1/text-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([
'prompt' => 'A silk scarf moves gently in the breeze'
]),
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.bitstudio.ai/v1/text-to-video"
payload := strings.NewReader("{\n \"prompt\": \"A silk scarf moves gently in the breeze\"\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.bitstudio.ai/v1/text-to-video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"A silk scarf moves gently in the breeze\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bitstudio.ai/v1/text-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 \"prompt\": \"A silk scarf moves gently in the breeze\"\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "pending",
"task": "text-to-video",
"created_at": "2026-09-15T12:00:00Z",
"result": null,
"error": null,
"credits_used": 15
}
]
}{
"code": "<string>",
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"error": "<string>",
"cta": true,
"next_action": "<string>"
}prompt. Defaults are model: "kling-v3-standard" and five seconds. Kling 3 supports 3–15 seconds and optional generate_audio. For multiple shots, send multi_prompt instead of top-level prompt and duration; each shot requires 3–15 seconds and the total must not exceed 15 seconds. Subject references use saved model or outfit assets.
The completed result has type: "video".
A successful request returns HTTP 202 with a jobs array. Save each id, then get the job until it finishes. Read the completed media from result.url and its reusable ID from result.id. Use an Idempotency-Key when submitting work that may be retried.Authorizations
Create an API key in Studio → account menu → API Keys. Keep it on your server.
Headers
Use a unique key for each intended creation. Retry the same method, path and JSON with the same key to replay its response for 24 hours after completion. Conflicting requests and unfinished or uncertain outcomes return 409. An uncertain receipt is never automatically rerun.
1 - 128^[!-~]+$Body
- Option 1
- Option 2
Scene and motion direction. Omit when using multi_prompt.
1Video model. All successful submissions return jobs.
kling-v3-pro, kling-v3-standard "kling-v3-standard"
Kling 3 shots. Omit prompt and duration when using this array. Each shot requires 3–15 seconds; their total must not exceed 15 seconds. End frames require a single shot.
1 - 5 elementsShow child attributes
Show child attributes
Kling 3 subject references. Each asset must be an accessible model or outfit with an HTTP(S) display_image. Model assets are ordered before outfit assets in provider element numbering.
Show child attributes
Show child attributes
Generate audio with Kling 3. Must be false or omitted for kling-2.5.
Single-shot length in seconds: 5 for kling-2.5; 3–15 for Kling 3. Omit when using multi_prompt.
3 <= x <= 155
Video output ratio.
16:9, 9:16, 1:1 Additional subject directions for Kling 3 only.
Additional subject directions for Kling 3 only.
Response
Accepted; poll each job.
1Show child attributes
Show child attributes