{"id":"kling-v3","modality":"video","name":"Kling V3","description":"Animate a start frame.","price_description":"Standard: 720p 12.6¢/second with audio, 8.4¢/second without; Pro: 1080p 16.8¢/second with audio, 11.2¢/second without, 4K 42¢/second.","logo_url":"https://imagedelivery.net/yn_JX_LzJpQI9TTynGwR_Q/98c62d94-c29d-4545-0911-9d8ff8712a00/public","input_schema":{"type":"object","properties":{"num_outputs":{"default":1,"description":"Number of outputs generated per job. Only 1 is supported.","type":"integer","enum":[1]},"prompt":{"maxLength":2500,"pattern":"[^\\s\\x1C-\\x1F]","type":"string","description":"Generation prompt. At most 2500 characters."},"multi_prompt":{"items":{"additionalProperties":false,"description":"One shot of a published multi-shot storyboard.","properties":{"prompt":{"description":"The prompt for this shot.","type":"string"},"duration_ms":{"default":5000,"description":"Duration of this shot in milliseconds.","enum":[1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000,15000],"type":"integer"}},"required":["prompt"],"type":"object"},"maxItems":6,"minItems":1,"type":"array","description":"Multi-shot storyboard; each shot carries its own prompt and duration. Shot durations must sum to at most 15000 ms, and the storyboard replaces `prompt` — supply one or the other, never both. A shot's prompt has no length limit, unlike the single `prompt` field. 1 to 6 items."},"shot_type":{"enum":["customize","intelligent"],"type":"string","description":"How a multi-shot storyboard is cut. 'customize' honours each shot's declared duration; 'intelligent' lets the model determine the shot structure. Ignored unless `multi_prompt` is supplied."},"generate_audio":{"default":true,"description":"Whether to generate native audio for the video.","type":"boolean"},"negative_prompt":{"maxLength":2500,"type":"string","description":"What to avoid in the generated video. At most 2500 characters."},"aspect_ratio":{"description":"Output aspect ratio.","enum":["16:9","9:16","1:1"],"type":"string"},"resolution":{"description":"Output resolution.","enum":["1080p","4K","720p"],"type":"string"},"duration_ms":{"description":"Duration in ms.","enum":[3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000,15000],"type":"integer"},"start_image":{"discriminator":{"propertyName":"source"},"oneOf":[{"additionalProperties":false,"description":"A file uploaded via POST /v3/files, referenced by the returned url.","properties":{"source":{"type":"string","enum":["url"]},"url":{"description":"A URL returned by POST /v3/files.","format":"uri","type":"string"}},"required":["source","url"],"type":"object"},{"additionalProperties":false,"description":"An existing asset you own, referenced by its id.","properties":{"source":{"type":"string","enum":["asset"]},"asset_id":{"description":"The asset's id (`asset_<uuid>`), as issued by the server — a completed generation publishes one per output as `outputs[].asset_id`. Do not construct one or derive it from any other id.","type":"string"}},"required":["source","asset_id"],"type":"object"}],"description":"Start frame. At most 10.4 MB.","media_type":"image","role":"start_frame","max_file_size_bytes":10485760},"cfg_scale":{"maximum":1.0,"minimum":0.0,"type":"number","description":"How closely the model follows the prompt. From 0 to 1."},"end_image":{"discriminator":{"propertyName":"source"},"oneOf":[{"additionalProperties":false,"description":"A file uploaded via POST /v3/files, referenced by the returned url.","properties":{"source":{"type":"string","enum":["url"]},"url":{"description":"A URL returned by POST /v3/files.","format":"uri","type":"string"}},"required":["source","url"],"type":"object"},{"additionalProperties":false,"description":"An existing asset you own, referenced by its id.","properties":{"source":{"type":"string","enum":["asset"]},"asset_id":{"description":"The asset's id (`asset_<uuid>`), as issued by the server — a completed generation publishes one per output as `outputs[].asset_id`. Do not construct one or derive it from any other id.","type":"string"}},"required":["source","asset_id"],"type":"object"}],"description":"End frame. At most 10.4 MB.","media_type":"image","role":"end_frame","max_file_size_bytes":10485760},"quality":{"type":"string","enum":["standard","pro"],"description":"Quality level to generate at. `standard` — the 720p tier. `pro` — the high-resolution tier, at 1080p and 4K.","default":"standard"}},"required":["aspect_ratio","duration_ms"],"additionalProperties":false,"anyOf":[{"required":["aspect_ratio","duration_ms","resolution","start_image"],"properties":{"end_image":false,"quality":{"enum":["pro"]},"resolution":{"enum":["1080p","4K"]}}},{"required":["aspect_ratio","duration_ms","end_image","resolution","start_image"],"properties":{"quality":{"enum":["pro"]},"resolution":{"enum":["1080p","4K"]}}},{"required":["aspect_ratio","duration_ms","resolution"],"properties":{"end_image":false,"quality":{"enum":["pro"]},"resolution":{"enum":["1080p","4K"]},"start_image":false}},{"required":["aspect_ratio","duration_ms","start_image"],"properties":{"end_image":false,"quality":{"enum":["standard"]},"resolution":{"enum":["720p"]}}},{"required":["aspect_ratio","duration_ms","end_image","start_image"],"properties":{"quality":{"enum":["standard"]},"resolution":{"enum":["720p"]}}},{"required":["aspect_ratio","duration_ms"],"properties":{"end_image":false,"quality":{"enum":["standard"]},"resolution":{"enum":["720p"]},"start_image":false}}]},"output_schema":{"description":"One item of a job's `outputs[]` (`GET /v3/jobs/{job_id}`). `outputs` is\nalways an array, even for a single output.\n\nEvery key is always present. The ones a modality carries no value for\nserialize as null — an image output reports `duration_ms: null` and\n`fps: null`, an audio output `width: null` — so the shape is one object\nrather than one per modality. `url` and `asset_id` go null on an expired\noutput, which has metadata but no retrievable bytes.\n\nA voice-clone job's output is a voice rather than a file: it reports\n`voice_id` and leaves `url`, `content_type`, and `asset_id` null, since\nthere are no bytes to fetch and nothing to pass back as a media input.","properties":{"status":{"description":"The state of a single output within a job's result.","enum":["COMPLETED","FAILED","EXPIRED"],"type":"string","default":"COMPLETED"},"asset_id":{"type":["string","null"],"description":"This output's asset id — server-issued, and opaque. Pass it as `{\"source\": \"asset\", \"asset_id\": ...}` in a later submit's media inputs to reuse this output as a reference. Null once the output has expired, since its bytes are no longer retrievable."},"voice_id":{"type":["string","null"],"description":"The voice a voice-clone job created (`voice_<uuid>`). Send it back as `voice_id` on a text-to-speech submit to speak with this voice; it stays usable by the account that created it. Null for every other kind of output."},"url":{"type":["string","null"],"description":"Presigned download URL for the output bytes. Null once the output has expired.","format":"uri"},"content_type":{"type":["string","null"],"description":"MIME type of the output bytes."},"width":{"type":["integer","null"],"description":"Width in pixels; null for an output with no frame (audio)."},"height":{"type":["integer","null"],"description":"Height in pixels; null for an output with no frame (audio)."},"duration_ms":{"type":["integer","null"],"description":"Duration in milliseconds; null for a still image."},"fps":{"type":["integer","null"],"description":"The video's measured frame rate; null for a non-video output and for a video that has not been probed yet."},"error":{"properties":{"code":{"description":"Universal error code space. Modeled after gRPC status codes.\n\nEvery exception in the system carries an ErrorCode. SDK clients map\n3rd-party errors to these codes at the lowest level. Retry logic,\nHTTP status mapping, and OTEL metrics all key off this enum.\n\nNOTE: The semantic meaning of these error codes is roughly mapped from the\n    semantic of the gRPC status codes: see\n    https://grpc.io/docs/guides/status-codes/ for details.","enum":["UNKNOWN","INVALID_ARGUMENT","NOT_FOUND","GONE","ALREADY_EXISTS","ALREADY_IN_PROGRESS","UNAUTHORIZED","PERMISSION_DENIED","INSUFFICIENT_BALANCE","MODERATION_FAILED","FAILED_PRECONDITION","CANCELLED","DEADLINE_EXCEEDED","RESOURCE_EXHAUSTED","UNAVAILABLE","INTERNAL"],"type":"string"},"message":{"description":"Human-readable summary of the error. Fixed per condition — match on `code`, not on this text.","type":"string"},"retryable":{"default":false,"description":"Whether retrying the same request can succeed. Describes the condition, not a promise — pair with `retry_after` when present.","type":"boolean"},"retry_after":{"type":["integer","null"],"description":"Seconds to wait before retrying; set when the error is retryable. Mirrors the `Retry-After` response header."},"param":{"type":["string","null"],"description":"The primary offending input field, when the error is about one specific field."},"details":{"items":{"description":"One field-level validation problem in a request body.\n\n`field` is the dotted path to the offending input (e.g. `input.resolution`);\n`allowed` lists the accepted values when the field is an enum, so a caller\ncan fix it without re-fetching the model schema.","properties":{"field":{"description":"Dotted path to the offending input (e.g. `input.resolution`).","type":"string"},"message":{"description":"What is wrong with this field's value.","type":"string"},"reason":{"type":["string","null"],"description":"Machine-readable hint for which constraint failed (\"required\", \"enum\", \"type\", …)."},"allowed":{"items":{"type":"string"},"type":["array","null"],"description":"Accepted values for an enum, or accepted field names on the first unknown-field violation. Omitted on subsequent unknown fields."}},"required":["field","message"],"type":"object"},"type":["array","null"],"description":"Every field-level problem, when the error is a validation failure — all of them at once, not just the first."},"replaced_by":{"type":["string","null"],"description":"The id of a successor model, set when the requested model has been retired (code `GONE`) and replaced; null otherwise. Lets a client programmatically migrate off a retired model."},"billing":{"description":"Balance, price, and where to add funds — set when the request was refused for funds (code `INSUFFICIENT_BALANCE`); null otherwise.","properties":{"balance":{"description":"Spendable balance on the account this request bills, at the moment it was refused. The same value `GET /balance` returns.","type":"number"},"required":{"type":["number","null"],"description":"What this request needed. Null when the refusal is a funding precondition rather than a priced one — an upload is not priced, and some models cannot be quoted until their inputs are measured (`POST /models/{model}/estimate` says so explicitly)."},"currency":{"default":"USD","description":"ISO-4217 code the amounts above are denominated in.","type":"string"},"funding_url":{"description":"Where a human can add funds to the account this request bills. The API itself cannot add them.","type":"string"},"reason":{"type":["string","null"],"description":"Why the automatic top-up did not fund the balance, when known. `card_declined`: the card that pays for automatic top-ups was declined, and the payment method must be updated on the billing page before a top-up can succeed. Clients MUST tolerate unrecognized values: new reasons may be added at any time."}},"required":["balance","funding_url"],"type":["object","null"]}},"required":["code","message"],"type":["object","null"],"description":"Why this item failed — present on a failed item within an otherwise-completed batch."}},"type":"object"}}