Kling 3.0 API
Kling 3.0 is a video model for motion-heavy shots, product movement, and start/end frame control.
Model keys
kling/kling-v3— Kling V3
Supported modes and inputs
| Model | Mode | Label | Input requirements |
|---|---|---|---|
kling/kling-v3 |
text_to_video |
Text to Video | Prompt max 2000 chars |
kling/kling-v3 |
frames_to_video |
Frames to Video | Prompt max 2000 chars Images start_frame,end_frame: 1-2 files, 10 MB, formats jpg, png, webp |
Options
| Model | Option | Default | Allowed values | Applies to |
|---|---|---|---|---|
kling/kling-v3 |
duration |
5s |
5s, 10s, 15s |
text_to_video |
kling/kling-v3 |
frames_to_video_duration → duration |
5s |
5s, 10s |
frames_to_video |
kling/kling-v3 |
resolution |
std |
std, pro |
All modes |
kling/kling-v3 |
aspect_ratio |
16:9 |
16:9, 9:16, 1:1 |
All modes |
kling/kling-v3 |
audio |
false |
false, true |
All modes |
Pricing
| Model | Pricing |
|---|---|
kling/kling-v3 |
1 credit per second; option multipliers: audio={"true":1.5,"false":1}, resolution={"pro":6,"std":4} |
Production guidance
- Pass
modeexplicitly. - Use only option values listed above.
- Upload media with
POST /api/v1/filesbefore calling media-input modes. - Use the exact model key for the variant you want.
Example: text to video
curl https://img2vid.net/api/v1/generations \
-H "Authorization: Bearer $BUBLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/kling-v3",
"mode": "text_to_video",
"prompt": "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
"duration": "5s",
"resolution": "std",
"aspect_ratio": "16:9",
"audio": "false"
}'
Example: media-guided video
curl https://img2vid.net/api/v1/generations \
-H "Authorization: Bearer $BUBLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/kling-v3",
"mode": "frames_to_video",
"prompt": "Animate the source into a polished cinematic motion shot with natural camera movement",
"start_frame": "https://example.com/start.png",
"duration": "5s",
"resolution": "std",
"aspect_ratio": "16:9",
"audio": "false"
}'
SDK examples
The examples below use this page's public model key, mode, and parameter values. They assume you have already initialized the SDK client as shown in the Quickstart and imported the required language SDK types. For media-input modes, upload local files first and pass the returned URL through public fields such as image_urls, start_frame, or video_urls.
JavaScript / TypeScript
const task = await buble.generations.create({
model: 'kling/kling-v3',
mode: 'text_to_video',
prompt:
'A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion',
duration: '5s',
resolution: 'std',
aspect_ratio: '16:9',
audio: 'false',
});
const result = await buble.generations.wait(task.data.id);
console.log(result.data.result?.videos?.[0]?.url);
Python
task = client.generations.create(
model="kling/kling-v3",
mode="text_to_video",
prompt="A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
duration="5s",
resolution="std",
aspect_ratio="16:9",
audio="false",
)
result = client.generations.wait(task["data"]["id"])
print(result["data"]["result"]["videos"][0]["url"])
Go
task, err := client.Generations.Create(ctx, &buble.CreateGenerationRequest{
Model: "kling/kling-v3",
Mode: "text_to_video",
Prompt: "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
Params: map[string]any{
"duration": "5s",
"resolution": "std",
"aspect_ratio": "16:9",
"audio": "false",
},
})
if err != nil {
return err
}
result, err := client.Generations.Wait(ctx, task.Data.ID)
if err != nil {
return err
}
fmt.Println(result.Data.Result.Videos[0].URL)
Rust
let task = client.generations().create(
CreateGenerationRequest::new("kling/kling-v3")
.mode("text_to_video")
.prompt("A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion")
.param("duration", "5s")?
.param("resolution", "std")?
.param("aspect_ratio", "16:9")?
.param("audio", "false")?,
).await?;
let result = client
.generations()
.wait(&task.data.id, WaitOptions::default())
.await?;
Swift
let task = try await client.generations.create(
try CreateGenerationRequest(model: "kling/kling-v3")
.mode("text_to_video")
.prompt("A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion")
.param("duration", "5s")
.param("resolution", "std")
.param("aspect_ratio", "16:9")
.param("audio", "false")
)
let result = try await client.generations.wait(task.data.id)
print(result.data.result?.videos?.first?.url.absoluteString ?? "")
Dart / Flutter
final task = await client.generations.create(
CreateGenerationRequest(
model: 'kling/kling-v3',
mode: 'text_to_video',
prompt: 'A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion',
).withParam('duration', '5s').withParam('resolution', 'std').withParam('aspect_ratio', '16:9').withParam('audio', 'false'),
);
final result = await client.generations.wait(task.data.id);
print(result.data.result?.videos.firstOrNull?.url);
Elixir
{:ok, task} =
Buble.Generations.create(client, %{
model: "kling/kling-v3",
mode: "text_to_video",
prompt: "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
duration: "5s",
resolution: "std",
aspect_ratio: "16:9",
audio: "false"
})
{:ok, result} = Buble.Generations.wait(client, task["data"]["id"])
IO.puts(result["data"]["result"]["videos"] |> List.first() |> Map.fetch!("url"))
Java
Envelope<GenerationTask> task = client.generations().create(
CreateGenerationRequest.builder()
.model("kling/kling-v3")
.mode("text_to_video")
.prompt("A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion")
.param("duration", "5s")
.param("resolution", "std")
.param("aspect_ratio", "16:9")
.param("audio", "false")
.build());
Envelope<GenerationTask> result = client.generations().wait(task.getData().getId());
.NET
var task = await client.Generations.CreateAsync(new CreateGenerationRequest
{
Model = "kling/kling-v3",
Mode = "text_to_video",
Prompt = "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion"
}.WithParam("duration", "5s").WithParam("resolution", "std").WithParam("aspect_ratio", "16:9").WithParam("audio", "false"));
var result = await client.Generations.WaitAsync(task!.Data!.Id!);
PHP
$task = $client->generations()->create(
CreateGenerationRequest::make(
model: 'kling/kling-v3',
mode: 'text_to_video',
prompt: 'A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion',
)
->withParam('duration', '5s')
->withParam('resolution', 'std')
->withParam('aspect_ratio', '16:9')
->withParam('audio', 'false')
);
$result = $client->generations()->wait($task['data']['id']);
Ruby
task = client.generations.create(
model: "kling/kling-v3",
mode: "text_to_video",
prompt: "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
duration: "5s",
resolution: "std",
aspect_ratio: "16:9",
audio: "false"
)
result = client.generations.wait(task.dig("data", "id"))
puts result.dig("data", "result", "videos", 0, "url")