ApiframeApiframe Docs
Video GenerationKling

Kling 3.0 Motion Control

Kling 3.0 Motion Control — transfer motion from a reference video onto a character image.

POST /v2/videos/generatemodel: "kling-3.0-motion-control"

Kling 3.0 Motion Control transfers the motion from a reference video onto the character in a reference image. The generated character, backgrounds, and other elements come from the image, while the actions follow the reference clip. Both image and video are required.

See Video Generation overview for common request fields, response format, and error codes.

Model-specific parameters

ParameterTypeDefaultDescription
klingParams.imagestringRequired. URL of the reference character image. .jpg/.jpeg/.png, max 10MB, 340–3850px, aspect ratio 1:2.5 to 2.5:1
klingParams.videostringRequired. URL of the motion reference video. .mp4/.mov, max 100MB, 3–30s (see character_orientation)
klingParams.modestring"pro"Generation mode: "std" (720p, cost-effective) or "pro" (1080p, higher quality)
klingParams.character_orientationstring"image""image" keeps the orientation of the person in the image (max 10s clip); "video" follows the orientation of the characters in the video (max 30s clip)
klingParams.keep_original_soundbooleantrueKeep the reference video's original audio track

Credit cost

Pricing is per second of output. The output length matches the reference video, so the total credit cost is credits-per-second × ceil(reference video duration). The reference video's duration is measured server-side before the job is queued.

VariantCredits / sec
std12
pro21

Examples: a 5-second reference clip in pro mode costs 21 × 5 = 105 credits; a 10-second clip in std mode costs 12 × 10 = 120 credits.

The reference video must be 3–10s when character_orientation is "image", or 3–30s when it is "video". Requests with a clip outside that range are rejected before any credits are charged.

Example result

Once the job is COMPLETED, the result object on GET /v2/jobs/:id looks like:

{
  "videoUrl": "https://cdn2.apiframe.ai/videos/b2c3d4e5-f6a7-8901-bcde-f23456789012.mp4"
}

See Result format for field details.

Code examples

curl -X POST https://api.apiframe.ai/v2/videos/generate \
  -H "X-API-Key: afk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "the character dances energetically",
    "model": "kling-3.0-motion-control",
    "klingParams": {
      "image": "https://example.com/character.png",
      "video": "https://example.com/dance.mp4",
      "mode": "pro",
      "character_orientation": "video",
      "keep_original_sound": true
    }
  }'
import requests

response = requests.post(
    "https://api.apiframe.ai/v2/videos/generate",
    headers={
        "X-API-Key": "afk_your_api_key_here",
        "Content-Type": "application/json",
    },
    json={
        "prompt": "the character dances energetically",
        "model": "kling-3.0-motion-control",
        "klingParams": {
            "image": "https://example.com/character.png",
            "video": "https://example.com/dance.mp4",
            "mode": "pro",
            "character_orientation": "video",
            "keep_original_sound": True,
        },
    },
)
print(response.json())
const response = await fetch("https://api.apiframe.ai/v2/videos/generate", {
  method: "POST",
  headers: {
    "X-API-Key": "afk_your_api_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    prompt: "the character dances energetically",
    model: "kling-3.0-motion-control",
    klingParams: {
      image: "https://example.com/character.png",
      video: "https://example.com/dance.mp4",
      mode: "pro",
      character_orientation: "video",
      keep_original_sound: true,
    },
  }),
});
console.log(await response.json());

Try it

POST/v2/videos/generateTry it

On this page