REST async · one key · updated 2026-10-02

Kling API

Kling v3.0 text-to-video, image-to-video and motion control through one REST endpoint — with the price of every host that serves it, side by side.

API at a glance

EndpointPOST https://videorouter.sh/api/v1/videos
AuthenticationAuthorization: Bearer llmr_sk_live_...
LifecycleAsync job: queued → in_progress → completed | failed. Polling is free.
Model idskling-o3, kling-v3, kling-v2.6, kling-motion-control, kling-v3-turbo
BillingPer requested second, charged once at job creation; failed-upstream jobs are not billed. Flat 2% platform fee.
Provider choiceUnpinned requests route to the cheapest healthy host and fail over; append /<host> to prefer one.

Models

Provider comparison — kling-video-v3-omni

Host720p1080p2160p
SandBase$0.0588$0.0784$0.294
MachGen$0.067$0.09$0.336
Tencent TokenHub$0.084$0.112$0.42
WaveSpeedAI$0.084$0.112$0.42

USD per second, before the 2% platform fee. Bold = cheapest at that tier.

Examples

curl https://videorouter.sh/api/v1/videos \
  -H "Authorization: Bearer $VIDEOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "kling-v3.0-std", "prompt": "a paper airplane gliding over a city", "duration_secs": 5}'
# -> {"id": "video_...", "status": "queued"}
curl https://videorouter.sh/api/v1/videos/$ID -H "Authorization: Bearer $VIDEOROUTER_API_KEY"
import time, requests
H = {"Authorization": "Bearer llmr_sk_live_..."}
job = requests.post("https://videorouter.sh/api/v1/videos", headers=H, json={
    "model": "kling-v3.0-std", "prompt": "a paper airplane gliding over a city", "duration_secs": 5}).json()
while job["status"] not in ("completed", "failed"):
    time.sleep(5)
    job = requests.get(f"https://videorouter.sh/api/v1/videos/{job['id']}", headers=H).json()
print(job["data"][0]["url"] if job["status"] == "completed" else job["error"])
const H = { Authorization: "Bearer llmr_sk_live_...", "Content-Type": "application/json" };
let job = await (await fetch("https://videorouter.sh/api/v1/videos", { method: "POST", headers: H,
  body: JSON.stringify({ model: "kling-v3.0-std", prompt: "a paper airplane gliding over a city", duration_secs: 5 }) })).json();
while (!["completed", "failed"].includes(job.status)) {
  await new Promise(r => setTimeout(r, 5000));
  job = await (await fetch(`https://videorouter.sh/api/v1/videos/${job.id}`, { headers: H })).json();
}
console.log(job.data?.[0]?.url ?? job.error);

Model id used: kling-v3.0-std. More in examples.

Notes

Three tiers, three model ids
Kling v3.0 Std, Pro and 4K are separate model strings — kling-v3.0-std, -pro, -4k — so promoting a draft to a final render is a one-word change.
Several hosts per tier
Kling is resold by multiple providers at different rates. The price table shows cheapest vs priciest per model.
Beyond text-to-video
Kling O3 (omni), Turbo and Motion Control are in the same catalog and the same request shape.
No Kling account needed
One VideoRouter key; no separate Kuaishou/Kling developer onboarding.

FAQ

Does Kling have an official API?

Yes, but it is also resold by several third-party hosts. Prices and reliability differ, which is why comparing hosts matters.

How do I switch between Std, Pro and 4K?

Change the model field: kling-v3.0-std, kling-v3.0-pro or kling-v3.0-4k. There is no separate quality parameter.

Can I pin a specific Kling provider?

Yes — suffix the model with a host, e.g. kling-v3.0-std/novita, as a preference; add provider.only with allow_fallbacks: false for a hard pin. Without a suffix, requests route to the cheaper healthy host.

Is Kling 4.0 available?

Kling 4.0 was announced on September 28, 2026 but is not yet available through any host in the VideoRouter catalog; Kling v3.0 is the current generation.

Guides

Using Kling is one part of the job.

VideoRouter puts it next to dozens of other video and image models behind one API key, so you can compare providers, prices and fail over automatically. Compare providers on VideoRouter →