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.

4 min readSume
All posts

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.

Kling 3 on Sume, ten seconds (read 2026-10-07)
generate_audioSume per second10 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/models to confirm limits before a bulk run.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume