Kling video and image API
Kling video, image, motion-control, avatar, and lip-sync tasks on Essevin — endpoints, request contract, and task lifecycle.
Kling on Essevin is an asynchronous API: submit a task, then poll the Essevin task ID. Use a key from the Kling plan group and confirm the exact model IDs with GET /v1/models before sending paid work.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /v1/images/generations | Submit a Kling image or image-expand task |
| POST | /v1/kling/faces | Detect faces before lip sync; billed per call |
| POST / GET | /v1/kling/subjects | Create / list custom subjects |
All requests use Authorization: Bearer sk-your-key and Content-Type: application/json. The body is decoded strictly: only the fields listed below are accepted. Any other field — including size, response_format and user from OpenAI habits, n on a video request, and top-level image_url / video_url — an unknown field inside a nested object, or a second JSON value after the body, returns 400 before any task is created, and nothing is billed. Set the video frame with resolution and aspect_ratio.
| Endpoint | Accepted fields |
|---|---|
↳ each images[] item | url, file_id, usage |
↳ each videos[] item | url, file_id, reference_type, keep_original_sound |
↳ each subjects[] item | id, name |
↳ shots | mode, segments (each with index, prompt, duration) |
POST /v1/images/generations | model, prompt, quality, n, images (each with url, file_id), extra |
POST /v1/kling/faces | videos (each with url, file_id) |
POST /v1/kling/subjects | name, description, reference_type, frontal_image_url, reference_image_urls, video_url, voice_id, tag_ids |
The exact error when size is sent (the face-detection endpoint returns the same one):
{
"error": {
"message": "request body does not match the JSON contract: json: unknown field \"size\"",
"type": "invalid_request_error"
}
}Model matrix
| Model ID | Duration | Reference images | Reference video | Subjects | Shots | Notes |
|---|---|---|---|---|---|---|
kling-v3-turbo | 3-15 s | No | No | Yes | No | Fixed voice; callers cannot select one |
kling-v3-omni | 3-15 s | Up to 7 (also subject to combined limits) | feature | Yes | Yes | base is not priced; 4K silent feature is not currently priced |
kling-v3 | 3-15 s | Up to 6 | No | Yes | Yes | Ordinary generation and image references |
kling-o1 | 3-10 s | Up to 4 | feature | No | No | With no reference generation input, duration is 5 or 10 s |
kling-v2-6 | Only 5 or 10 s | Up to 4 | No | No | No | Audio 720P is not priced |
kling-v2-5-turbo | 5-10 s | Up to 3 | No | No | No | 720P / 1080P only |
kling-v2-1, kling-v2-0 | 5-10 s | No | No | No | No | Ordinary text-to-video only |
kling-v1-6 | 5-10 s | No | base | No | No | Base video editing uses multi_elements pricing |
kling-v3-motion-control | source duration | 1 image + 1 video | Scene-specific | No | No | 720P / 1080P / 2K / 4K |
kling-v2-6-motion-control | source duration | 1 image + 1 video | Scene-specific | No | No | 720P / 1080P |
kling-avatar | source duration | 1-5 images | No | No | No | sound_file XOR audio_id |
kling-lip-sync | source duration | No | No | No | No | session_id + one face_choose item |
The matrix's reference-image count means only usage: reference, not first/last frames or the total length of images[]. Although the v3 Omni model configuration allows 8, the API also enforces reference images + subjects ≤7 without a reference video and ≤4 with one. Thus image-reference-only requests accept at most 7; other variants remain subject to their smaller individual limits.
Kling image IDs are kling-image-v3, kling-image-v3-omni, kling-image-o1, kling-image-v2-1, kling-image-v2-1-i2i, kling-image-v2-1-multi-ref, and kling-image-expand. They use the image endpoint, accept n from 1 to 9, and are billed per output image. Use the model catalog for the exact quality tiers available to the current key.
Request contract
Media locators
Each images[] or videos[] item must contain exactly one of:
{ "url": "https://cdn.example.com/file.png" }or
{ "file_id": "your-file-id" }url must be an absolute, publicly reachable http:// or https:// URL. Empty strings, relative paths, file://, ftp://, private / loopback / link-local addresses, URLs with embedded credentials, and both fields together are rejected synchronously at submission. The same rule applies to the image endpoint, face detection, and the avatar extra.sound_file.
A non-compliant asset fails minutes after submission
The gateway validates request structure and counts only. Content limits — resolution, format, size, duration — are enforced by Kling asynchronously during task execution, so a non-compliant asset fails minutes after submission. Make sure assets are stably downloadable from the public internet and meet Kling's official image / video / audio specs before submitting.
Ordinary video generation
Use images[] for frames or image references and videos[] for one reference/edit video. Do not use OpenAI's image_url or video_url fields at the top level.
{
"model": "kling-v3-omni",
"prompt": "<<<element_1>>> and <<<element_2>>> rotate slowly on a clean studio table",
"duration": 5,
"resolution": "1080p",
"audio": false,
"images": [
{ "url": "https://cdn.example.com/first.png", "usage": "first_frame" },
{ "file_id": "last-frame-file-id", "usage": "last_frame" },
{ "url": "https://cdn.example.com/reference-a.png", "usage": "reference" },
{ "file_id": "reference-b-file-id", "usage": "reference" }
],
"videos": [
{
"url": "https://cdn.example.com/character-motion.mp4",
"reference_type": "feature",
"keep_original_sound": false
}
],
"subjects": [
{ "id": "subject-92951593344", "name": "cat" },
{ "id": "subject-92951593345", "name": "dog" }
]
}For ordinary generation, images[].usage is required and is one of first_frame, last_frame, or reference. There can be at most one first frame and one last frame; a last frame requires a first frame. When more than two reference images are present, a last frame is not supported. With kling-v2-1, providing both first and last frames restricts resolution to 1080p. There is at most one videos[] item, and its reference_type is required. A feature video is accepted only by kling-v3-omni and kling-o1. A base video is accepted only by kling-v1-6; it must be the only media input and cannot be combined with images or subjects.
Kling's coupling limits also apply: with a reference video, reference image count plus subject count is at most 4; without a reference video it is at most 7. Empty prompts are allowed only when a media input supplies the request. aspect_ratio is limited to 16:9, 9:16, or 1:1, and is not gateway-filled when omitted. Omitted duration, resolution, and audio normalize to 5 seconds, 720P, and silent output; kling-v2-6 accepts only 5 or 10 seconds.
Ordinary video models (every model in the matrix except motion control, avatar and lip sync) accept no extra keys at all; sending one returns 400. Use the structured fields on this page instead.
Resolution and audio
resolution is one of 720p, 1080p, 2k or 4k (case-insensitive), and audio is a boolean. Any combination outside this table is rejected at submission with 400: model "<model ID>" does not support billing bucket "<tier>" for this request.
| Model ID | Resolutions | Audio |
|---|---|---|
kling-v3-turbo | 720p / 1080p / 2k / 4k | A single price tier; audio does not change the price |
kling-v3-omni | 720p / 1080p / 2k / 4k; 720p / 1080p / 2k with a feature reference video | Audio or silent; silent only with a reference video |
kling-v3 | 720p / 1080p / 2k / 4k | Audio or silent |
kling-o1 | 720p / 1080p / 2k / 4k | Silent only |
kling-v2-6 | 720p / 1080p / 2k / 4k; 1080p and up with audio | Audio or silent |
kling-v2-5-turbo | 720p / 1080p | Silent only |
kling-v2-1, kling-v2-0 | 720p / 1080p / 2k / 4k | Silent only |
kling-v1-6 | 720p / 1080p / 2k / 4k | Silent only; a base video edit ignores audio |
kling-v3-motion-control | 720p / 1080p / 2k / 4k | No audio generated |
kling-v2-6-motion-control | 720p / 1080p | No audio generated |
kling-avatar | 720p / 1080p | From the input audio |
kling-lip-sync | Does not affect the price | From the input audio |
Subjects and shots
subjects[] uses fixed subject IDs. Every item requires a non-empty id; name is optional. Subjects are supported by kling-v3-turbo, kling-v3, and kling-v3-omni only. For kling-v3, Kling also requires at least one images[] item with usage: "reference" whenever subjects are present. Items are positional: subjects[0] is <<<element_1>>>, subjects[1] is <<<element_2>>>, and so on. Every supplied subject must be referenced in the prompt, and a prompt must not reference <<<element_N>>> unless that subject exists.
Shots are supported by kling-v3 and kling-v3-omni only:
{
"model": "kling-v3-omni",
"prompt": "A short product story in two shots",
"duration": 5,
"shots": {
"mode": "customize",
"segments": [
{ "index": 1, "prompt": "The box opens", "duration": 2 },
{ "index": 2, "prompt": "The product is revealed", "duration": 3 }
]
}
}mode is intelligence or customize. Intelligence mode must omit segments; customize mode requires them. There can be at most six custom segments; they are numbered consecutively from 1, have non-empty prompts of at most 512 characters, last at least one second, and their durations must sum exactly to the request duration. Use structured shots; raw extra.multi_shot, extra.shot_type, and extra.multi_prompt are rejected.
Motion control
Motion-control tasks require exactly one video followed by exactly one person image. The scene determines their meaning, so do not send usage on the image or reference_type on the video. videos[].keep_original_sound is a boolean and maps to Kling's keep_original_sound flag. The only additional parameter currently verified is extra.character_orientation (image or video). Motion-control duration comes from the input video and must be omitted; the output is temporary.
{
"model": "kling-v3-motion-control",
"prompt": "Follow the dancer's movement",
"resolution": "1080p",
"images": [{ "file_id": "person-image-file-id" }],
"videos": [{ "url": "https://cdn.example.com/dance.mp4", "keep_original_sound": true }],
"extra": { "character_orientation": "video" }
}Avatar and lip sync
Avatar (kling-avatar) requires 1-5 person images, no videos, and exactly one of extra.sound_file (an HTTP(S) audio URL) or extra.audio_id. The duration is derived from the audio input; omit duration.
Lip sync (kling-lip-sync) accepts no images. First call face detection with one or more media locators:
curl https://api.essevin.com/v1/kling/faces \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"videos":[{"file_id":"source-video-file-id"}]}'The face-detection body accepts only a videos array, each item with exactly one of url / file_id under the same media-locator rules. Invalid JSON or any other field returns 400 request body does not match the JSON contract: …; a missing or empty videos returns 400 videos is required and must contain at least one item.
Then submit one face_choose item for the returned session:
{
"model": "kling-lip-sync",
"extra": {
"session_id": "face-session-id",
"face_choose": [
{ "face_id": "face-1", "sound_file": "https://cdn.example.com/voice.mp3" }
]
}
}face_choose must contain exactly one item with a non-empty face_id and sound_file. The source audio/video determines duration. Raw extra.voice_list and voice_ids are intentionally unavailable until a matching Kling capability is confirmed.
Lip-sync bills a five-second minimum
Lip-sync billing is per second with a five-second minimum, so a four-second result is billed as five seconds.
Custom subjects
| Field | Rule |
|---|---|
name | Required, at most 20 characters |
description | Optional, at most 100 characters |
reference_type | Required, image_refer or video_refer |
frontal_image_url | Required with image_refer: the front-facing image |
reference_image_urls | Required with image_refer: 1–3 URLs, none repeating the front image or each other |
video_url | Required with video_refer; not allowed with image_refer |
voice_id | Only with video_refer |
tag_ids | Optional; each non-empty and unique |
video_refer accepts no image fields. Every URL must be a publicly reachable absolute http(s) address, under the same rules as media locators.
Submit and poll
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model":"kling-v3","prompt":"A red ball rolls across a white table","duration":5,"resolution":"720p"}'A successful submit returns 202 with the task ID in id, shaped like kt57x<task-id>. Kling image generation (POST /v1/images/generations) is asynchronous too and also returns 202 with an id in the same shape. Poll either kind of task the same way, without a billing header:
-H "Authorization: Bearer sk-your-key"status moves through queued → processing → completed or failed; only those last two are terminal, so treat any other value as still running. A completed task carries the output URLs in outputs, served from the console.essevin.com domain — signed links valid for 6 hours from the moment the task completes. Querying again returns the same URL without extending it, and an expired link returns 410, so download results within that window. Only a task that completes successfully is billed; a failed task never is.
The balance check applies to video submissions, not image
Submitting a Kling video task checks available balance minus the estimated cost of your in-flight tasks minus this request's own estimate; if that falls short you get a 402 with code insufficient_balance. The estimate is released automatically once the task ends. Lip sync (kling-lip-sync) cannot be estimated in advance and reserves nothing. Kling image generation reserves nothing either — it is only blocked once your balance is at or below zero. A Kling task, image tasks included, that is still unfinished 2 hours after creation is marked failed and not billed. Tasks cannot be cancelled; for the other rules shared by every video family, see Video generation.
Kling image inputs and outputs
POST /v1/images/generations accepts only these JSON fields. All image variants are asynchronous. Any other field, such as size, aspect_ratio, image, mask, response_format, style or user, returns 400; the error format is shown above.
| Field / type | Rule |
|---|---|
model · string | Required; an image ID from the model matrix |
prompt · string | Prompt; provide this or a non-empty images array |
quality · string | Default 1k; 1k / 2k / 4k subject to the model catalog |
n · integer | Default 1; range 1–9 |
images · array | Exactly one of url / file_id per item; no usage |
extra · object | Expansion only: the four ratios below |
Available quality values and reference image counts per model:
| Model ID | quality | Reference images |
|---|---|---|
kling-image-v3 | 1k / 2k | 0–1 |
kling-image-v3-omni, kling-image-o1 | 1k / 2k / 4k | 0–10 |
kling-image-v2-1 | 1k / 2k | None |
kling-image-v2-1-i2i | 1k / 2k | Exactly 1 |
kling-image-v2-1-multi-ref | 1k / 2k | 2–4 |
kling-image-expand | 1k | Exactly 1 |
Image submissions return these 400 errors. Each line starting with # is the trigger and the next line is the verbatim error.message:
# A field outside the table
request body does not match the JSON contract: json: unknown field "<field>"
# Both prompt and images are empty
prompt and input images cannot both be empty
# An images[] item with neither or both of url / file_id
images[<index>] must provide exactly one of url or file_id
# url that is not a public absolute http(s) address
images[<index>].url must be a publicly accessible absolute http(s) URL
# usage on an images[] item
images[<index>].usage is not part of the image generation API; remove this field
# Images sent to kling-image-v2-1
model "kling-image-v2-1" is a text-to-image model and does not accept input images
# kling-image-v2-1-i2i without exactly 1 image
model "kling-image-v2-1-i2i" requires exactly 1 input image
# kling-image-v2-1-multi-ref without 2–4 images
model "kling-image-v2-1-multi-ref" requires 2 to 4 input images
# Expansion without exactly 1 image
image expansion requires exactly 1 input image
# Expansion extra with a key other than the four ratios
extra.<key> is not a verified parameter of the image expansion API
# Expansion ratio that is not a number from 0 to 2
extra.<key> must be a number between 0 and 2
# All four ratios are 0
the four expansion ratios cannot all be 0
# Expanded area over 3x the original
expanded area cannot exceed 3x the original image
# extra on a non-expansion model
model "<model ID>" does not accept unverified extra parameters
# A quality tier the model does not offer
model "<model ID>" does not support quality tier "<value>"
# n outside 1–9
n must be between 1 and 9, got <value>
# More reference images than the model allows
model "<model ID>" accepts at most <max> input images, got <count>Text-to-image request body (change model and follow its constraints for another variant):
{
"model": "kling-image-v3",
"prompt": "A ceramic teapot on a sunlit table",
"quality": "1k",
"n": 1
}Expansion request: each ratio is a number from 0–2, default 0; not all zero, and (1+left+right) × (1+up+down) ≤ 3:
{
"model": "kling-image-expand",
"images": [
{
"url": "https://example.com/input.png"
}
],
"extra": {
"left_expansion_ratio": 0.5,
"right_expansion_ratio": 0.5,
"up_expansion_ratio": 0,
"down_expansion_ratio": 0
}
}Submission returns HTTP 202; read the top-level id:
{
"id": "ktEXAMPLE",
"object": "image.generation.task",
"status": "queued",
"model": "kling-image-v3",
"requested_images": 1
}{
"id": "ktEXAMPLE",
"status": "completed",
"outputs": [
"https://api.essevin.com/example-signed-image.png"
]
}{
"id": "ktEXAMPLE",
"status": "failed",
"error": {
"code": "timeout",
"message": "task did not reach a billable terminal state within 2 hours; polling stopped"
}
}Failures
At submission
A submission error creates no task and bills nothing. Every error explains itself in error.message.
| HTTP | Case | What to do |
|---|---|---|
| 400 | A field, value or combination is invalid; type is invalid_request_error | Fix what the message names and resubmit |
| 400 | An image model sent to the video endpoint: model "<model ID>" is an image model; use /v1/images/generations | Use the image endpoint |
| 402 | Not enough balance for the video reservation; code is insufficient_balance | Top up, or wait for in-flight tasks to end |
| 404 | Model ID not in the catalog: model "<model ID>" is not in the Kling catalog for video, model "<model ID>" is not an image model in this catalog for images | Check the ID with GET /v1/models |
| 429 / 5xx | Busy or temporarily unavailable | Retry shortly |
Video submissions return these 400 errors. Each line starting with # is the trigger and the next line is the verbatim error.message; <model ID> is the model ID, such as kling-v3:
# No prompt and no media at all (except lip sync)
prompt and input media cannot both be empty
# Negative duration
duration cannot be negative
# duration sent to a model whose length comes from the input (motion control, avatar, lip sync)
duration of model <model ID> is determined by the input media; do not pass duration
# duration outside the model range
model <model ID> supports <min> to <max> seconds, got <value>
# kling-o1 without reference inputs and a duration other than 5 or 10
Kling O1 without reference media only supports duration 5 or 10 seconds
# kling-v2-6 with a duration other than 5 or 10
model kling-v2-6 only supports a duration of 5 or 10 seconds, got <value>
# aspect_ratio other than 16:9 / 9:16 / 1:1
aspect_ratio="<value>" is invalid; allowed values: 16:9 / 9:16 / 1:1
# Non-empty voice_ids (the message starts with this)
voice_ids is not available yet
# An extra key this model does not accept
extra.<key> is not in the verified parameter contract of model <model ID>
# Shot, subject, voice or original-sound parameters inside extra (use the structured fields)
extra.<key> cannot be passed through; use the structured shots parameter
extra.element_list cannot be passed through; use the structured subjects parameter
extra.voice_list is reserved; use voice_ids instead (voice selection is not available yet)
extra.keep_original_sound cannot be passed through; use videos[].keep_original_sound
# Media item with neither or both of url / file_id; url that is not a public absolute http(s) address
<images>[<index>] must provide exactly one of url or file_id
<images>[<index>].url must be a publicly accessible absolute http(s) URL
# Invalid usage / reference_type value
images[<index>].usage="<value>" is invalid; allowed values: first_frame / last_frame / reference
videos[<index>].reference_type="<value>" is invalid; allowed values: feature / base
# Ordinary generation missing usage / reference_type, or more than 1 video
images[<index>].usage is required for standard Kling video requests
videos[0].reference_type is required for standard Kling video requests; allowed values: feature / base
standard Kling video requests accept at most 1 videos input
# First- and last-frame rules
at most 1 first-frame image is allowed
at most 1 last-frame image is allowed
a last frame requires a first frame with usage=first_frame
Kling 2.1 first/last-frame generation only supports 1080p
a last frame is not supported with more than 2 reference images (got <count>)
# Reference video type not supported by the model, or base mixed with images / subjects
model <model ID> has no confirmed feature reference-video capability or price tier
model <model ID> has no confirmed base video-edit price tier
base video edit cannot be combined with images or subjects; only a single video to edit is accepted
# Reference image counts
with a reference video, reference images + subjects cannot exceed 4, got <total> (<images> images + <subjects> subjects)
without a reference video, reference images + subjects cannot exceed 7, got <total> (<images> images + <subjects> subjects)
model <model ID> supports at most <max> reference images, got <count>
model <model ID> does not support reference-based generation
# Subjects
subjects[<index>].id is required (Kling fixed subjects must carry an Id)
model <model ID> does not support subjects (fixed subjects)
model <model ID> requires at least 1 image with usage=reference when subjects are used
prompt references "<<<element_N>>>" but no subjects were provided
prompt references "<<<element_N>>>" but subjects only has <count> items
subjects[<index>] is not referenced in prompt as <<<element_<N>>>>
# Shots
model <model ID> does not support shots (multi-shot storyboard)
shots.mode="<value>" is invalid; allowed values: intelligence / customize
shots.mode=customize requires segments
shots.mode=intelligence does not accept segments; shots are generated by the model
at most 6 shot segments are allowed, got <count>
shots.segments[<index>].index must be numbered consecutively from 1, got <value>
shots.segments[<index>].prompt cannot be empty
shots.segments[<index>].prompt exceeds 512 characters
shots.segments[<index>].duration must be at least 1 seconds
sum of shot durations (<sum> s) must equal the total duration (<total> s)
# Motion control
motion control requires exactly 1 motion video and 1 character image
motion control images[<index>] does not accept usage; the character image role is fixed by the scene
motion control videos[<index>] does not accept reference_type; the motion video role is fixed by the scene
extra.character_orientation must be image or video
# Avatar
Kling avatar requires at least 1 character image
model <model ID> supports at most 5 character images, got <count>
Kling avatar does not accept videos input
Kling avatar requires exactly one of extra.sound_file or extra.audio_id
extra.sound_file must be a non-empty string
extra.audio_id must be a non-empty string
extra.sound_file must be a publicly accessible http(s) audio URL
# Lip sync
Kling lip-sync does not accept images; use extra.session_id and extra.face_choose
Kling lip-sync requires a non-empty extra.session_id
Kling lip-sync requires an extra.face_choose array with exactly 1 item
extra.face_choose[0].<key> is not part of the lip-sync contract
extra.face_choose[0].face_id must be a non-empty string or a non-negative integer
extra.face_choose[0].sound_file must be a non-empty string
extra.face_choose[0].sound_file must be a publicly accessible http(s) audio URL
# No price tier for the resolution / audio / reference-video combination
model "<model ID>" does not support billing bucket "<tier>" for this requestFailed tasks
A failed task still answers the query with HTTP 200. status is failed, error.code is a stable error code and error.message explains it; branch on error.code, show error.message, and decide success or failure from status. Older failed tasks may omit error.code. An excerpt:
{
"id": "ktEXAMPLE",
"object": "video.generation.task",
"model": "kling-v3",
"status": "failed",
"created": 1790000000,
"error": {
"code": "timeout",
"message": "task did not reach a billable terminal state within 2 hours; polling stopped"
}
}The query result's object is video.generation.task for both video and image tasks, and kling.subject.task for custom subjects. error.message is always English with fixed wording. The usual causes are media that falls outside Kling's official specs (resolution, format, size, duration) or a content moderation refusal. The table shows video wording; image tasks say image generation and reference image, custom subjects say subject creation. Each message says what to do next; after either 2-hour timeout, resubmit.
| Case | error.code | error.message |
|---|---|---|
| Prompt refused by moderation | input_sensitive | the prompt was rejected by content moderation; rephrase it and submit again |
| Reference media refused by moderation | input_sensitive | the reference media was rejected by content moderation; replace it and submit again |
| Moderation, source not reported | input_sensitive | the prompt or reference media was rejected by content moderation; revise it and submit again |
| Output blocked by moderation | output_video_sensitive (image: safety_rejected) | the generated result was blocked by content moderation; adjust the prompt or reference media and submit again |
| Concurrency ceiling reached | rate_limited | this model is at its concurrency limit right now; please retry shortly |
| Model version retired | unsupported_model | this model version is no longer available; switch to another model and submit again |
| Prompt too long | invalid_request | the prompt is too long for this model (at most 2500 characters); shorten it and submit again |
| Parameters or media rejected | invalid_request | the request was rejected as invalid by the model; check the parameters and media against the documented limits, then submit again |
| Reference media unreadable | reference_input_invalid | a reference image or video is missing or could not be read; make sure every URL is publicly reachable and points to a supported file, then submit again |
| Generation failed (other) | generation_failed | video generation failed; please retry, and contact support with the task ID if it keeps failing |
| Stopped before finishing | generation_failed | video generation was stopped before it finished; please retry, and contact support with the task ID if it keeps failing |
| Task could not be tracked | generation_failed | Ends with contact support with the task ID |
| Still unfinished 2 hours after creation | timeout | task did not reach a billable terminal state within 2 hours; polling stopped |
| Custom subject still unfinished after 2 hours | timeout | subject task did not reach a terminal state within 2 hours; polling stopped |
| Task ended with no output | no_output | video generation finished without a usable output; please retry, and contact support with the task ID if it keeps failing |
| Custom subject ended without a subject ID | no_output | subject creation finished without returning a subject ID; check the media and create it again |
A failed task is never billed.
Rates
Kling bills video generation per second of output video, at the rate for the model's resolution and its silent / audio / reference-video variant — not by video token. Official list prices are on the pricing page. Your own rate is the one shown in the signed-in model catalog, and each request's actual charge is in your usage record.