Model guide

Kling Motion Control API: make a character copy a video

Kling Motion Control puts the character from one picture into the movement of a real video. This guide covers what to send, how the per-second billing works and how to call Kling 3.0 and 2.6 Motion Control through one API.

What motion control does

Kling Motion Control takes two things: a picture of a character and a video of someone moving. It makes a new clip in which the character from the picture performs the movement from the video, with the same timing, gestures and body language. It is how people make dance trends, mascot videos and product spokespeople that move like a real actor without filming the character itself.

Revana carries two versions:

Kling Motion Control versions compared
ModelModel idResolutionPrice per secondRoutes
Kling 3.0 Motion Controlkling-3.0-motion-control720p, 1080p$0.13 at 720p, $0.17 at 1080ptwo routes
Kling 2.6 Motion Controlkling-2.6-motion-control720p, 1080p$0.07 at 720p, $0.12 at 1080ptwo routes

Kling 3.0 is the newer model. Kling 2.6 costs about half as much at 720p, so it is worth testing on your footage first.

What to send

  • image_url: the character, ideally full body, facing the camera, on a plain background. This is who appears in the result.
  • video_url: the motion clip. One person, clearly visible, with a steady camera works best. The result follows its length.
  • resolution: 720p or 1080p. Send it every time.
  • prompt: optional, to describe the setting or details that are not in the picture.

Both files must be links the API can fetch. To send a file from your computer, upload it first with POST /v1/uploads (clips up to 50 MB) and use the link it returns; it stays valid for 14 days.

How motion control is billed (October 2026)

The price is per second of video, and the length is set by your motion clip, rounded up to the next whole second. A 7.4 second dance clip is billed as 8 seconds.

Kling Motion Control cost per clip length
ModelResolution5 s clip10 s clip15 s clip
Kling 3.0 Motion Control720p$0.65$1.30$1.95
Kling 3.0 Motion Control1080p$0.85$1.70$2.55
Kling 2.6 Motion Control720p$0.35$0.70$1.05
Kling 2.6 Motion Control1080p$0.60$1.20$1.80

Trim the motion clip to the part you need before you send it: every extra second is billed. Set max_cost_usd to the most you expect to pay for your clip length, and a job that would cost more is refused instead of run. A failed job costs nothing, and credit is prepaid from $10 with no subscription; see the pricing page.

Make a motion control clip

Send POST /v1/generations with both links, then poll until the job has succeeded or failed. With a 10 second motion clip at 720p, this costs $1.30.

cURL
export REVANA_API_KEY="sr_live_..."

# 1. Submit the job (returns 202 with the generation id)
curl https://api.revana.si/v1/generations \
  -H "Authorization: Bearer $REVANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kling-3.0-motion-control",
    "input": {
      "prompt": "The mascot dances on a sunny rooftop, city skyline behind.",
      "image_url": "https://example.com/mascot-full-body.png",
      "video_url": "https://example.com/dance-10s.mp4",
      "resolution": "720p"
    },
    "max_cost_usd": 1.6
  }'

# 2. Poll with the id from step 1 until status is "succeeded" or "failed"
curl https://api.revana.si/v1/generations/gen_01JC2V8K5T \
  -H "Authorization: Bearer $REVANA_API_KEY"
Python
import os
import time

import requests

API = "https://api.revana.si/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['REVANA_API_KEY']}"}

resp = requests.post(f"{API}/generations", headers=HEADERS, json={
    "model": "kling-3.0-motion-control",
    "input": {
        "prompt": "The mascot dances on a sunny rooftop, city skyline behind.",
        "image_url": "https://example.com/mascot-full-body.png",
        "video_url": "https://example.com/dance-10s.mp4",
        "resolution": "720p",
    },
    "max_cost_usd": 1.6,
})
resp.raise_for_status()
job = resp.json()

while job["status"] in ("queued", "running"):
    time.sleep(5)
    job = requests.get(f"{API}/generations/{job['id']}", headers=HEADERS).json()

if job["status"] == "succeeded":
    print(job["output"]["urls"], job["cost_usd"])
else:
    print("Failed:", job["error"])
Node.js
// Node 18 or later. Save as generate.mjs and run: node generate.mjs
const API = "https://api.revana.si/v1";
const headers = {
  Authorization: `Bearer ${process.env.REVANA_API_KEY}`,
  "Content-Type": "application/json",
};

const res = await fetch(`${API}/generations`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    model: "kling-3.0-motion-control",
    input: {
      prompt: "The mascot dances on a sunny rooftop, city skyline behind.",
      image_url: "https://example.com/mascot-full-body.png",
      video_url: "https://example.com/dance-10s.mp4",
      resolution: "720p",
    },
    max_cost_usd: 1.6,
  }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
let job = await res.json();

while (job.status === "queued" || job.status === "running") {
  await new Promise((r) => setTimeout(r, 5000));
  job = await (await fetch(`${API}/generations/${job.id}`, { headers })).json();
}

if (job.status === "succeeded") console.log(job.output.urls, job.cost_usd);
else console.error("Failed:", job.error);
Response
{
  "id": "gen_01JC2V8K5T",
  "model": "kling-3.0-motion-control",
  "status": "succeeded",
  "output": {
    "urls": [
      "https://cdn.revana.si/g/gen_01JC2V8K5T/0.mp4"
    ],
    "duration_s": 10
  },
  "cost_usd": 1.3,
  "attempts": 1,
  "error": null,
  "created_at": "2026-10-28T10:14:02Z",
  "completed_at": "2026-10-28T10:15:31Z"
}

Getting a clean result

  • Match the framing. A full-body character with a full-body dance clip works far better than a head-and-shoulders portrait with a full-body clip.
  • One mover. Use a clip with one person moving. Crowds and cuts confuse which motion to copy.
  • Steady camera. A locked-off or slowly moving camera keeps the background stable.
  • Draft at 720p. Check the motion transfer on Kling 2.6 at 720p, then render the keeper at 1080p on Kling 3.0.

For Kling's text and image to video models, see the Kling 3.0 API guide. Both motion control models are on the models page, with every field in the docs. Get an API key to try them.

Frequently asked questions

How much does Kling Motion Control cost?

In October 2026, Kling 3.0 Motion Control costs $0.13 per second at 720p and $0.17 at 1080p. Kling 2.6 Motion Control costs $0.07 and $0.12. The length is set by your motion clip.

What does Kling Motion Control need?

A character picture in image_url, a motion clip in video_url and a resolution of 720p or 1080p. A prompt is optional.

How long is a Kling Motion Control video?

As long as the motion clip you send. You are billed per second of it, rounded up to a whole second.

What is the difference between Kling 3.0 and Kling 2.6 Motion Control?

Kling 3.0 is the newer model. Kling 2.6 costs less per second. Both take the same inputs and offer 720p and 1080p.

Can I upload my own motion video?

Yes. Upload it with POST /v1/uploads (video up to 50 MB) and pass the returned link in video_url.

Try Kling Motion Control with one key

One API key for both motion control models and every other video and image model. Prepaid credit from $10, charged only for clips that are delivered.