Skip to content
Dashboard

Kling v3.0 Image-to-Video

Kling v3.0 Image-to-Video is a v3.0-generation Kling image-to-video model with first/last frame control, physics-aware motion, native audio, and up to 1080p output at durations up to 15 seconds.

View API reference
Price
$0.17, Per second
Lowest available configuration
import { experimental_generateVideo as generateVideo } from 'ai';
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: 'A serene mountain lake at sunrise.'
});
Read docs

Copy link to headingPlayground

Try out Kling v3.0 Image-to-Video by Kling AI. Usage is billed to your team at API rates. Free users (those who haven't made a payment) get $5 of credits every 30 days.

klingai logo
Images
Add up to 3 images
Videos
Prompt(optional)

End frame(optional)
Duration8s
3s15s
Videos to generate
klingai logo

Your generated video will appear here.

Copy link to headingProviders

Route requests across multiple providers. Copy a provider slug to set your preference. Visit the docs for more info. Using a provider means you agree to their terms, listed under Legal.

Provider
Input
Output
Capabilities
ZDR
No Training
Free Tier
Release Date
$0.17/sec+1 more
02/05/2026

Getting started

Generate videos with Kling v3.0 Image-to-Video using the experimental_generateVideo function from AI SDK 6 or later. AI Gateway handles routing and polls until the video is ready.

Install the AI SDK (pnpm add ai dotenv), create an API key from the API Keys page, and set it as AI_GATEWAY_API_KEY in your environment. Full setup is covered in the video generation quickstart.

index.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/cat.png',
text: 'The cat slowly turns its head and blinks',
},
providerOptions: {
klingai: {
mode: 'std',
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Top-level parameters

Exercise the supported top-level parameters: prompt.image, prompt.text, and duration.

top-level-params.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/cat.png',
text: 'The cat slowly turns its head and blinks',
},
duration: 5,
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);
ParameterTypeRequiredDescription
prompt.imagestringYesURL of the image to animate.
prompt.textstringNoDescription of the motion or animation. Max 2500 characters.
durationnumberNoVideo length in seconds. 3-15 seconds.
resolutionstringNoResolution ('1280x720', '1920x1080', '3840x2160').
aspectRatiostringNoAspect ratio ('16:9', '9:16', '1:1').
generateAudiobooleanNoGenerate synchronized audio with the video.
frameImagesArray<{ image: string | Buffer; frameType: 'first_frame' | 'last_frame' }>NoFirst and last frames of the clip. A first_frame entry replaces prompt.image and wins when both are set, and adding a last_frame interpolates between the two. Video is not accepted and is ignored with a warning.
inputReferencesArray<string | Buffer>NoReference images that the model combines into a new scene, which switches the call to reference-to-video. Images only — a video reference is ignored with a warning. Cannot be combined with prompt.image, frameImages, or imageTail.

Input limits

InputFormatsSourcesMax countMax sizeLimits
TextUp to 2500 characters
Imagejpg, jpeg, pngurl, base64, buffer310 MB≥300px · aspect 2:5–5:2

Provider options

Load the always-compatible KlingAI options under providerOptions.klingai. The mutually exclusive feature controls — first/last frame (frameImages), reference-to-video (inputReferences), motion brush (dynamicMasks / staticMask), cameraControl, and voice/multi-shot — are shown in their own examples below.

provider-options.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/cat.png',
text: 'The cat slowly turns its head and blinks',
},
duration: 5,
generateAudio: true,
providerOptions: {
klingai: {
mode: 'pro',
negativePrompt: 'blurry, low quality',
cfgScale: 0.5,
watermarkEnabled: true,
pollIntervalMs: 5000,
pollTimeoutMs: 600000,
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Pass KlingAI-specific options under providerOptions.klingai in your generateVideo call.

ParameterTypeRequiredDescription
mode'std' | 'pro'No'std' for standard quality. 'pro' for professional quality. Defaults to 'std'.
negativePromptstringNoWhat to avoid in the video. Max 2500 characters.
cfgScalenumberNoPrompt adherence (0-1). Higher = stricter. Defaults to 0.5. Not supported on v2.x.
voiceListarrayNoVoice IDs for speech. Max 2 voices. Requires generateAudio: true. Cannot coexist with elementList.
multiShotbooleanNoEnable multi-shot generation. Requires v3.0+.
shotType'customize' | 'intelligence'NoStoryboard method, required when multiShot is true. 'customize' takes the shots from multiPrompt; 'intelligence' lets the model segment the main prompt. Requires v3.0+.
multiPromptArray<{ index: number; prompt: string; duration: string }>NoPer-shot details, required when multiShot is true and shotType is 'customize'. Up to 6 shots, each prompt max 512 characters, and the shot durations must sum to the total duration. Requires v3.0+.
elementListarrayNoReference elements for element control. Up to 3 elements. Requires v3.0+. Cannot coexist with voiceList.
imageTailstring | BufferNoThe last frame (ending image). Same format requirements as prompt.image. Legacy alternative to the top-level frameImages, used only when frameImages is omitted.
cameraControl.typestringNoCamera movement type: 'simple', 'down_back', 'forward_up', 'right_turn_forward', or 'left_turn_forward'.
cameraControl.configobjectNoMovement configuration. Required when type is 'simple'. Set one of horizontal, vertical, pan, tilt, roll, or zoom in range [-10, 10] and leave the others at 0.
staticMaskstringNoMask image for areas that should remain static.
dynamicMasksarrayNoArray of dynamic mask configurations (up to 6). Each has mask (image for areas that should move) and trajectories (motion path coordinates, 2-77 points for a 5s video).
watermarkEnabledbooleanNoGenerate a watermarked result alongside the video.
pollIntervalMsnumberNoHow often to check task status. Defaults to 5000.
pollTimeoutMsnumberNoMaximum wait time. Defaults to 600000 (10 minutes).

Base64 image encoding

When passing an image as base64 (for example prompt.image), submit only the raw base64 string. Do not include a data:image/png;base64, prefix.

Mutually exclusive features

First/last frame (frameImages), reference-to-video (inputReferences), motion brush (dynamicMasks / staticMask), and camera control (cameraControl) cannot be combined. Use only one of these per request.

The top-level parameters win over their provider-option equivalents: a first_frame in frameImages overrides prompt.image, and a last_frame overrides providerOptions.klingai.imageTail.

Passing inputReferences switches the model to reference-to-video, which ignores prompt.image, frameImages, and imageTail.

voiceList cannot coexist with elementList.

Audio and voice

Set generateAudio: true to enable audio.

Reference voices in your prompt with the <<<voice_1>>> syntax, where the number matches the order of entries in voiceList. You can use up to 2 voices per video, and voice generation requires generateAudio: true.

Multi-shot generation

Multi-shot generation requires v3.0+. Set multiShot: true with shotType: 'customize' and a multiPrompt array, where each entry has an index (shot order, starting from 1), a prompt, and a duration (in seconds, as a string).

When using multiPrompt, the top-level prompt is typically left empty because each shot supplies its own prompt.

First and last frame

Generate a video that transitions between a starting and ending image, interpolating the motion between the two. Pass both frames through the top-level frameImages, tagging one first_frame and one last_frame. Mutually exclusive with motion brush and camera control.

first-last-frame.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const firstFrame = fs.readFileSync('start.png');
const lastFrame = fs.readFileSync('end.png');
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: 'Smooth transition between the two scenes',
frameImages: [
{ image: firstFrame, frameType: 'first_frame' },
{ image: lastFrame, frameType: 'last_frame' },
],
providerOptions: {
klingai: {
mode: 'pro',
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Reference to video

Combine reference images into a brand-new scene described by your prompt. Passing inputReferences selects reference-to-video, so leave out prompt.image, frameImages, and imageTail — the references guide what the characters look like rather than becoming the video content.

reference-to-video.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: 'The two characters meet and walk together through a sunny park',
inputReferences: [
'https://example.com/character-1.png',
'https://example.com/character-2.png',
],
aspectRatio: '16:9',
duration: 5,
providerOptions: {
klingai: {
mode: 'std',
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Camera control

Control camera movement during generation. Use a preset movement type or 'simple' with a config that sets one axis (others stay at 0).

camera-control.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/landscape.png',
text: 'A serene mountain landscape',
},
providerOptions: {
klingai: {
mode: 'std',
cameraControl: {
type: 'simple',
config: {
zoom: 5,
horizontal: 0,
vertical: 0,
pan: 0,
tilt: 0,
roll: 0,
},
},
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Motion brush

Control which parts of the image move and how using mask images. Mutually exclusive with first/last frame and camera control.

motion-brush.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/scene.png',
text: 'A ball bouncing across the scene',
},
providerOptions: {
klingai: {
mode: 'std',
dynamicMasks: [
{
mask: 'https://example.com/ball-mask.png',
trajectories: [
{ x: 100, y: 200 },
{ x: 200, y: 300 },
{ x: 300, y: 200 },
{ x: 400, y: 300 },
],
},
],
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Voice generation

Add speech using voice IDs. Requires generateAudio: true. Reference voices in the prompt with the <<<voice_1>>> syntax.

voice-generation.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/person.png',
text: 'The person<<<voice_1>>> says: "Hello, welcome to my channel"',
},
generateAudio: true,
providerOptions: {
klingai: {
mode: 'std',
voiceList: [{ voiceId: 'your_voice_id' }],
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Multi-shot generation

Generate videos with multiple storyboard shots, combining a start frame image with per-shot prompts. Requires Kling v3.0+ models.

multi-shot-i2v.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'klingai/kling-v3.0-i2v',
prompt: {
image: 'https://example.com/start-frame.png',
text: '',
},
aspectRatio: '16:9',
duration: 10,
generateAudio: true,
providerOptions: {
klingai: {
mode: 'pro',
multiShot: true,
shotType: 'customize',
multiPrompt: [
{
index: 1,
prompt: 'The character looks up at the sky.',
duration: '4',
},
{
index: 2,
prompt: 'A bird flies across the frame.',
duration: '3',
},
{
index: 3,
prompt: 'The character smiles and waves.',
duration: '3',
},
],
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Copy link to headingMore models by Kling AI

Model
Context
Latency
Throughput
Input
Output
Cache
Web Search
Capabilities
Providers
ZDR
No Training
Free Tier
Release Date
$0.13/sec+1 more
klingai logo
03/04/2026
$0.07/sec+1 more
klingai logo
12/18/2025
$0.04/sec+1 more
klingai logo
12/03/2025
$0.04/sec+1 more
klingai logo
12/03/2025
$0.04/sec+1 more
klingai logo
09/23/2025
$0.04/sec+1 more
klingai logo
09/23/2025

Copy link to headingAbout Kling v3.0 Image-to-Video

Kling v3.0 Image-to-Video brings full v3 generation capabilities to image-anchored video production. You provide a reference image as the visual foundation and optionally supply a last-frame image to define a precise end state. The model generates motion connecting the two while applying v3's enhanced motion physics, temporal consistency, and audio generation.

The maximum duration extends to 15 seconds (compared to 10 in earlier versions), supporting longer uninterrupted animated sequences from a single starting image. This helps with product showcase loops, animated illustrations, or character scenes that need more time to develop a full motion arc. Native audio generation, first introduced in v2.6, carries forward in v3.0 and provides synchronized speech and sound from the same inference call.

Physics-aware motion rendering in v3.0 tightens cloth dynamics, environmental interaction, and secondary motion (hair, foliage, and water surfaces) compared with older Kling image-to-video tiers. When you animate a still photograph with v3.0, motion tracks material behavior in the source image more closely.

Copy link to headingWhat To Consider When Choosing a Provider

  • Configuration: Confirm access rules and plan limits in AI Gateway before you scale production.
  • Zero Data Retention: Zero Data Retention is offered on a per-provider and model basis. See the documentation for details.
  • Authentication: AI Gateway authenticates requests using an API key or OIDC token. You do not need to manage provider credentials directly.

Copy link to headingWhen to Use Kling v3.0 Image-to-Video

Best for

  • Product and lifestyle clips: Content built from strong still photography
  • Extended animated sequences: A single reference image drives output where 15-second duration is needed
  • Image-to-video with audio: Narration or ambient sound generated in a single inference pass
  • Controlled visual transitions: First and last frame anchoring at the v3 quality tier

Consider alternatives when

  • Speed and cost priority: Speed and cost matter more than maximum output quality, so consider v2.5 Turbo i2v
  • Multi-shot narratives: You need narrative sequences across multiple scenes, so use v3.0 t2v with multishot
  • Motion transfer required: You need frame-accurate motion transfer from a reference performance video, so use motion control

Kling v3.0 Image-to-Video delivers Kling image animation at the v3 quality tier with longer duration, physics-aware motion, and integrated audio. It fits image-to-video workflows where frame quality and a full clip matter more than the fastest turbo tier.

Copy link to headingFrequently Asked Questions

  • How long can output videos be with Kling v3.0 Image-to-Video?

    Up to 15 seconds, extended from the 10-second maximum in earlier Kling versions.

  • Can I define both the first and last frame of the generated video?

    Yes. You can supply a first-frame image, a last-frame image, or both. The model generates motion between the two endpoints.

  • Does Kling v3.0 Image-to-Video include audio generation?

    Yes. Native audio generation (speech, sound effects, and ambient audio) is included in the v3.0 generation tier.

  • What is the difference between v3.0 i2v and v2.6 i2v?

    V3.0 extends maximum duration to 15 seconds, improves physics-aware motion, and includes the full v3 quality tier. V2.6 introduced audio generation but operates at the v2 quality level with a 10-second maximum.

  • What resolution does Kling v3.0 Image-to-Video support?

    Up to 1080p at 16:9, 9:16, and 1:1. Select Pro mode on the provider when you need 1080p output.

  • Is Kling v3.0 Image-to-Video generally available on AI Gateway?

    Yes, for Pro and Enterprise plans and paid AI Gateway users while video generation stays in beta. Recheck AI Gateway access notes before you rely on it in production.

Your use is subject to Kling AI's Terms & Privacy Policies.