Kling 3
Generate 3–15 second videos at the std or pro tier from text or one or two frames, with multi-shot storyboards and reusable elements; billed per second.
- Asynchronous: the create call returns a task ID; the video arrives when the task succeeds.
- Three ways in: text only, a first frame, or a first and last frame. This model takes no reference images, videos or audio.
resolutionis a tier:stdrenders at 720p andpro(the default) at 1080p.- Multi-shot: up to five shots, each with its own prompt and length, from one first-frame image. The shot lengths must add up to
duration. - Elements: up to three named subjects you define once with
elements. - Billed per second of video at the tier you choose. A failed task costs nothing.
Opens this model in the API Explorer. Enter your BeatAPI API key to create a task: the call is real and is billed to your own balance.
Endpoint and authentication
POST https://api.beatapi.io/v1/videos/tasks
Authorization
string
Required
Your BeatAPI API key, sent as Bearer <BEATAPI_API_KEY>. Create keys in the Dashboard. Keep keys on your server; never ship them in a browser or mobile app.
Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.
How a request works
Create the task
POST the parameters below to the endpoint. A 201 means the task was accepted and its price reserved from your balance; the work runs in the background. Save data.id.
Wait for it to finish
Call GET /v1/tasks/{task_id} and wait data.poll_after_seconds between calls (5 s for images, 8 s for videos) until status is succeeded or failed. Or register a webhook for task.succeeded and task.failed; keep polling as the fallback, because a task stopped by the processing timeout sends no event.
Save the result
On succeeded, download every data.output.media[].url and store the files you need; BeatAPI does not promise how long result URLs stay available. On failed, read data.error_code and data.error_message: the reserved amount was returned to your balance, and data.retryable says whether sending the same request again can succeed.
Input modes
Request parameters
model
string
Required
The model to run.
Value: kling-v3
If the value is wrong
- Missing:
"model" is required - An image model sent to this endpoint:
"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
prompt
string
Required
What happens in the video: subject, action, camera movement and style.
Length: 1–5000 characters
- Length is counted in characters (a CJK character counts as one).
- It is required in every mode, including multi-shot, where each shot also has its own prompt in
multi_prompt.
If the value is wrong
- Missing:
"prompt" is required - Empty or longer than the limit:
"prompt" has an unsupported length
images
string[]
Optional
A first frame, or a first and a last frame.
Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- One link: the video starts from this image. Two links:
images[0]is the first frame andimages[1]the last. - Multi-shot (
multi_shots: true) takes exactly one image. - There are no reference-image fields on this model; pictures of a subject go in
elements.
If the value is wrong
- More than two links:
"images" accepts at most 2 items - An empty array:
"images" requires at least 1 item - Not an https:// link:
"images[0]" must be a public HTTPS URL multi_shots: truewith no image or two images:Kling V3 multi-shot mode requires exactly one image
duration
integer
OptionalDefault: 5
Length of the video in seconds, a whole number. It is what you are billed for.
Default: 5
Range: 3–15
- If you leave it out,
5is used and billed. - With
multi_shots: true, thedurationof the shots inmulti_promptmust add up to this number exactly. If you leavedurationout, they must add up to 5.
If the value is wrong
- Outside the range, not a whole number, or sent as a string:
"duration" is outside its supported range - Multi-shot lengths that do not add up to
duration:Kling V3 shot durations must sum to duration
aspect_ratio
string
OptionalDefault: 16:9
Shape of the video as width:height.
Allowed values: 16:9, 9:16, 1:1
Default: 16:9
- The default is
16:9.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [16:9 9:16 1:1]
resolution
string
OptionalDefault: pro
The quality tier: std renders at 720p, pro renders at 1080p. pro costs more per second. The names are std and pro, not pixel sizes.
Allowed values: std, pro
Default: pro
- If you leave it out,
prois used and billed. 4K,720pand1080pare not accepted: sendstdorpro.
If the value is wrong
- A value not in the list (for example
720por4K):"resolution" must be one of: [std pro]
sound
boolean
Optional
Whether the video has a generated soundtrack.
- If you leave it out, sound follows
multi_shots: on for a multi-shot request, off otherwise. Sendtrueorfalseto decide for yourself.
If the value is wrong
- Not true or false:
"sound" must be a boolean
multi_shots
boolean
OptionalDefault: false
Turns on storyboard mode: the video is made of the shots listed in multi_prompt. The default is false.
Default: false
- Needs exactly one image in
imagesand amulti_promptwhose shot lengths add up toduration. Withoutmulti_shots: true,multi_promptis refused. - Checks run in this order: one image, then
multi_promptpresent, then the lengths.
If the value is wrong
- Not true or false:
"multi_shots" must be a boolean - No image or more than one image:
Kling V3 multi-shot mode requires exactly one image multi_promptmissing:Kling V3 multi-shot mode requires multi_prompt- Shot lengths do not add up to
duration:Kling V3 shot durations must sum to duration
multi_prompt
object[]
Optional
The shots of a multi-shot video, in order: one to five objects, each with its own prompt and length.
Items: 1–5
- Each shot is an object with two required fields, and no others are accepted:
multi_prompt[].prompt(string, required): what happens in this shot, 1 to 500 characters.multi_prompt[].duration(integer, required): the length of this shot in whole seconds, 1 to 12.- The shot lengths must add up to the request’s
duration(5 whendurationis left out), and that total is at most 15. - Only valid with
multi_shots: true.
If the value is wrong
- Sent without
multi_shots: true:"multi_prompt" requires multi_shots=true - More than five shots:
"multi_prompt" accepts at most 5 items - An empty array:
"multi_prompt" requires at least 1 item - A shot without
prompt:"prompt" is required in "multi_prompt[0]" - A shot without
duration:"duration" is required in "multi_prompt[0]" - A shot prompt that is empty or over 500 characters:
"multi_prompt[0].prompt" has an unsupported length - A shot length outside 1 to 12 or not a whole number:
"multi_prompt[0].duration" is outside its supported range - A key other than
promptandduration:field "name" is not supported in "multi_prompt[0]" - Shot lengths do not add up to
duration:Kling V3 shot durations must sum to duration
elements
object[]
Optional
Up to three named subjects (a character, a product, a prop), each defined once with pictures.
Items: ≤ 3
- An array of at most three objects. Each object accepts these keys and no others:
elements[].name(string, required): the element’s name, at least 1 character.elements[].description(string, optional): what the element is. If you leave it out, thenameis used as the description.elements[].element_input_urls(array of strings, required): 1 to 4 public HTTPS links that show the element.elements[].element_input_audio_urls(array of strings, optional): exactly one public HTTPS audio link for the element.elements[].start_timeandelements[].end_time(integers, optional): times in milliseconds, each a whole number from 0 to 30000. Send both or neither.end_timemust be greater thanstart_time, andend_time - start_timemust be from 3000 to 8000 (3 to 8 seconds).- The limits on links apply to each element on its own: every entry may have its own four links and one audio link.
If the value is wrong
- More than three elements:
"elements" accepts at most 3 items - An element that is not an object:
"elements[0]" must be an object - An element without
name:"name" is required in "elements[0]" - An element without
element_input_urls:"element_input_urls" is required in "elements[0]" - An empty
name:"elements[0].name" has an unsupported length - More than four links:
"elements[0].element_input_urls" accepts at most 4 items - An empty
element_input_urlsarray:"elements[0].element_input_urls" requires at least 1 item - A link that is not https://:
"elements[0].element_input_urls[1]" must be a public HTTPS URL - More than one audio link:
"elements[0].element_input_audio_urls" accepts at most 1 items start_timeorend_timeoutside 0 to 30000, or not whole:"elements[0].start_time" is outside its supported range- A key that an element does not accept:
field "color" is not supported in "elements[0]" - Only one of
start_timeandend_time,end_timenot afterstart_time, or a segment shorter than 3 s or longer than 8 s:Kling V3 element segment must provide a 3-8 second start_time/end_time range
Input media limits
The gateway reads every input before the task is created and refuses one outside these limits with a 400 bad_request that names the input. Nothing is charged.
- The gateway checks only that every image, element link and audio link is a public HTTPS link. It does not measure size, format or dimensions before the task is created, so an input the model cannot use fails the task after submission; the message says what to change and the whole reservation is returned.
- Have a local file? Upload it with
POST /v1/filesand pass the returneddata.url.
Multi-shot rules
These are checked in this order when the task is created; a request that breaks one is refused with 400 bad_request and costs nothing.
- Text-only multi-shot is not available: a multi-shot video always starts from one image.
- A multi-shot request is billed for
durationseconds, which is the sum of its shots.
Fields this model does not accept
Sending one of these is refused before anything is charged, instead of being ignored:
reference_images,reference_videos,reference_audios,generate_audio,seed,quality,watermark,task_type,output_format→field "reference_images" is not supported by model kling-v3(with the field you sent).- Any other unknown field →
unknown field: <name>.
Request examples
Text to video
A 5-second clip at the pro tier (1080p) with sound.
First frame
The video starts from the image.
First and last frame
The video moves from the first image to the second, at the cheaper std tier (720p).
Multi-shot
Two 3-second shots from one first-frame image. The shot lengths (3 + 3) equal duration (6).
Reusable element
Defines one named element from two pictures. The element is named product and its description is optional.
Responses
Create a task (201)
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.
Finished task
GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.
Output fields
Failed task
A failed task is still HTTP 200 on GET /v1/tasks/{task_id}: the failure is in the body. The reservation is returned in full, so nothing is charged.
Complete example
Create a task, wait for it with the server’s polling hint, and print the result URLs. Set BEATAPI_API_KEY in your environment and install requests.
Billing
sounddoes not change the price: it depends ondurationandresolutiononly, so the price rows apply with or without sound.- The price is per second of video, at the tier you choose: the list below shows 8-second clips, so divide by 8 for the rate (about 0.13 at
pro). - The number of seconds is
duration, or 5 when you leave it out; for a multi-shot request it is the sum of the shots, which equalsduration.usage.billable_duration_secondson the task shows it. - The price is reserved when the task is created and settled when the video is ready. A failed task, including one refused by moderation after submission, is refunded in full.
Common errors
HTTP errors at a glance
Errors before a task exists arrive as a non-2xx response, and nothing is charged. Branch on error.code or error.retryable; message names the problem. The full list and retry policy are on Errors.
Authentication
Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.
Headers
Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.
Request
The model to run.
Value: kling-v3
If the value is wrong
- Missing:
"model" is required - An image model sent to this endpoint:
"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
What happens in the video: subject, action, camera movement and style.
Length: 1–5000 characters
- Length is counted in characters (a CJK character counts as one).
- It is required in every mode, including multi-shot, where each shot also has its own prompt in
multi_prompt.
If the value is wrong
- Missing:
"prompt" is required - Empty or longer than the limit:
"prompt" has an unsupported length
Shape of the video as width:height.
Allowed values: 16:9, 9:16, 1:1
Default: 16:9
- The default is
16:9.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [16:9 9:16 1:1]
Length of the video in seconds, a whole number. It is what you are billed for.
Default: 5
Range: 3–15
- If you leave it out,
5is used and billed. - With
multi_shots: true, thedurationof the shots inmulti_promptmust add up to this number exactly. If you leavedurationout, they must add up to 5.
If the value is wrong
- Outside the range, not a whole number, or sent as a string:
"duration" is outside its supported range - Multi-shot lengths that do not add up to
duration:Kling V3 shot durations must sum to duration
Up to three named subjects (a character, a product, a prop), each defined once with pictures.
Items: ≤ 3
- An array of at most three objects. Each object accepts these keys and no others:
elements[].name(string, required): the element’s name, at least 1 character.elements[].description(string, optional): what the element is. If you leave it out, thenameis used as the description.elements[].element_input_urls(array of strings, required): 1 to 4 public HTTPS links that show the element.elements[].element_input_audio_urls(array of strings, optional): exactly one public HTTPS audio link for the element.elements[].start_timeandelements[].end_time(integers, optional): times in milliseconds, each a whole number from 0 to 30000. Send both or neither.end_timemust be greater thanstart_time, andend_time - start_timemust be from 3000 to 8000 (3 to 8 seconds).- The limits on links apply to each element on its own: every entry may have its own four links and one audio link.
If the value is wrong
- More than three elements:
"elements" accepts at most 3 items - An element that is not an object:
"elements[0]" must be an object - An element without
name:"name" is required in "elements[0]" - An element without
element_input_urls:"element_input_urls" is required in "elements[0]" - An empty
name:"elements[0].name" has an unsupported length - More than four links:
"elements[0].element_input_urls" accepts at most 4 items - An empty
element_input_urlsarray:"elements[0].element_input_urls" requires at least 1 item - A link that is not https://:
"elements[0].element_input_urls[1]" must be a public HTTPS URL - More than one audio link:
"elements[0].element_input_audio_urls" accepts at most 1 items start_timeorend_timeoutside 0 to 30000, or not whole:"elements[0].start_time" is outside its supported range- A key that an element does not accept:
field "color" is not supported in "elements[0]" - Only one of
start_timeandend_time,end_timenot afterstart_time, or a segment shorter than 3 s or longer than 8 s:Kling V3 element segment must provide a 3-8 second start_time/end_time range
A first frame, or a first and a last frame.
Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- One link: the video starts from this image. Two links:
images[0]is the first frame andimages[1]the last. - Multi-shot (
multi_shots: true) takes exactly one image. - There are no reference-image fields on this model; pictures of a subject go in
elements.
If the value is wrong
- More than two links:
"images" accepts at most 2 items - An empty array:
"images" requires at least 1 item - Not an https:// link:
"images[0]" must be a public HTTPS URL multi_shots: truewith no image or two images:Kling V3 multi-shot mode requires exactly one image
The shots of a multi-shot video, in order: one to five objects, each with its own prompt and length.
Items: 1–5
- Each shot is an object with two required fields, and no others are accepted:
multi_prompt[].prompt(string, required): what happens in this shot, 1 to 500 characters.multi_prompt[].duration(integer, required): the length of this shot in whole seconds, 1 to 12.- The shot lengths must add up to the request’s
duration(5 whendurationis left out), and that total is at most 15. - Only valid with
multi_shots: true.
If the value is wrong
- Sent without
multi_shots: true:"multi_prompt" requires multi_shots=true - More than five shots:
"multi_prompt" accepts at most 5 items - An empty array:
"multi_prompt" requires at least 1 item - A shot without
prompt:"prompt" is required in "multi_prompt[0]" - A shot without
duration:"duration" is required in "multi_prompt[0]" - A shot prompt that is empty or over 500 characters:
"multi_prompt[0].prompt" has an unsupported length - A shot length outside 1 to 12 or not a whole number:
"multi_prompt[0].duration" is outside its supported range - A key other than
promptandduration:field "name" is not supported in "multi_prompt[0]" - Shot lengths do not add up to
duration:Kling V3 shot durations must sum to duration
Turns on storyboard mode: the video is made of the shots listed in multi_prompt. The default is false.
Default: false
- Needs exactly one image in
imagesand amulti_promptwhose shot lengths add up toduration. Withoutmulti_shots: true,multi_promptis refused. - Checks run in this order: one image, then
multi_promptpresent, then the lengths.
If the value is wrong
- Not true or false:
"multi_shots" must be a boolean - No image or more than one image:
Kling V3 multi-shot mode requires exactly one image multi_promptmissing:Kling V3 multi-shot mode requires multi_prompt- Shot lengths do not add up to
duration:Kling V3 shot durations must sum to duration
The quality tier: std renders at 720p, pro renders at 1080p. pro costs more per second. The names are std and pro, not pixel sizes.
Allowed values: std, pro
Default: pro
- If you leave it out,
prois used and billed. 4K,720pand1080pare not accepted: sendstdorpro.
If the value is wrong
- A value not in the list (for example
720por4K):"resolution" must be one of: [std pro]
Whether the video has a generated soundtrack.
- If you leave it out, sound follows
multi_shots: on for a multi-shot request, off otherwise. Sendtrueorfalseto decide for yourself.
If the value is wrong
- Not true or false:
"sound" must be a boolean
Response
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

