Kling 3 API in Node: a silent clip with generate_audio false
Call Kling 3 on Sume from Node: send generate_audio false for the cheaper silent rate, add a last frame, poll and save. A 10-second silent clip costs $1.40.

To use Kling 3 by API on Sume, POST model: "kling-3" to /v1/videos and set generate_audio: false when you want a silent clip. A 10-second silent clip costs $1.40; the same clip with sound, which is the default, costs $2.10.
Kling 3 accepts a first frame and a last frame but no input_references. Duration is 4 to 15 seconds at 720p or 1080p, in 16:9, 9:16 or 1:1.
The script
Save as kling.mjs and run it with Node 18 or later. It sends a first and a last frame, then polls every ten seconds.
const H = { Authorization: `Bearer ${process.env.SUME_API_KEY}`, "Content-Type": "application/json" };
const frame = (url, frame_type) => ({ type: "image_url", image_url: { url }, frame_type });
const body = {
model: "kling-3",
prompt: "The door opens and warm light spills across the floor",
duration: 10,
resolution: "1080p",
aspect_ratio: "16:9",
generate_audio: false,
frame_images: [frame("https://example.com/door-closed.png", "first_frame"), frame("https://example.com/door-open.png", "last_frame")],
};
async function main() {
const r = await fetch("https://api.sume.com/v1/videos", { method: "POST", headers: H, body: JSON.stringify(body) });
if (r.status !== 202) throw new Error(`${r.status} ${await r.text()}`);
const { polling_url } = await r.json();
for (;;) {
const s = await (await fetch(polling_url, { headers: H })).json();
if (s.status === "completed") return console.log(s.unsigned_urls[0], s.usage?.cost);
if (["failed", "cancelled"].includes(s.status)) throw new Error(s.error ?? s.status);
await new Promise((res) => setTimeout(res, 10000));
}
}
main();The two Kling rates
The Kling row stores the provider list for both settings, and Sume sells at list times 1.25, rounded up to whole cents.
| generate_audio | Sume per second | 10 seconds |
|---|---|---|
| true (default) | $0.21 | $2.10 |
| false | $0.14 | $1.40 |
Common errors
Sending input_references to Kling returns 400 unsupported_capability, because the row advertises no reference types. Move to wan-3.0 or seedance-2.5 if you need them. Sending size, seed or provider.options returns 400 unsupported_parameter on every /v1/videos model.
A first frame URL that Sume cannot fetch fails the job. The poll response says which media type could not be downloaded; the URL stays private. Check the status and the error field before retrying, and reuse the same Idempotency-Key so a retry cannot double-submit.
- Ratios: 16:9, 9:16, 1:1 only.
- Use
GET /v1/videos/modelsto confirm limits before a bulk run.
Sources
Related posts
More in Developers
- Kling motion control with mode webhook: a Python verifier for rotation
Submit a Kling 3.0 motion control job with mode webhook and verify the sume-v1 signature in Python, including the two-entry header during a secret rotation.
- Korean captions: language ko does not choose the style
Setting language to ko on a caption job does not switch the style. The default is black-outline; a Latin style rejects Hangul with a 400. What to send instead.
- Let browsers start Sume jobs through your server, not with your key
Browsers must never hold a Sume API key. A server route authenticates the user, checks the input, derives an Idempotency-Key and returns only the status URL.
- List every Format run: no GET /v1/format-runs, page per Format
GET /v1/format-runs does not exist. List runs per Format with limit, next_cursor and has_more, or keep your own index of the data.id you stored at create.
Written by Sume