Kling 3.0 Motion Control on Sume: four routes, one stored model id
POST /v1/kling/3.0/motion-control and three aliases all store kling/3.0/motion-control. How to pick a route, what the body needs, and what the job reserves.

Sume exposes Kling 3.0 Motion Control through four submit paths, and all four create the same kind of job with the same stored model id, kling/3.0/motion-control. If you only want to animate a still with a motion video, call POST /v1/kling/3.0/motion-control and ignore the other three. The aliases exist so that agent tools and the avatar-face wording reach the same worker.
The behaviour below is read from the repository's motion-control reference on origin/main on 2026-10-03, not from a vendor page, so it describes how Sume accepts and bills the request, not what the model can do at its best.
The four paths
The primary invoke is POST /v1/kling/3.0/motion-control. A face-control alias, POST /v1/avatar-1.0/motion-control, takes the same body. Two model-run twins, POST /v1/models/kling/3.0/motion-control/runs and POST /v1/models/sume/avatar-1.0/motion-control/runs, do the same through the model-runs shape. All four accept Idempotency-Key, and reads use the standard GET /v1/jobs/:id/status and /result.
| Route | Role | Stored model id |
|---|---|---|
| POST /v1/kling/3.0/motion-control | Primary invoke | kling/3.0/motion-control |
| POST /v1/avatar-1.0/motion-control | Face-control alias | kling/3.0/motion-control |
| POST /v1/models/kling/3.0/motion-control/runs | Canonical model-run twin | kling/3.0/motion-control |
| POST /v1/models/sume/avatar-1.0/motion-control/runs | Face-control model-run alias | kling/3.0/motion-control |
What the body needs
The request needs exactly one visual source, either a public HTTPS image_url or a ready avatar by avatar_id or avatar_handle. It also needs a motion_video_url that drives all output motion and a duration_seconds between 1 and 30. duration_seconds is the length of your motion video; it is a reservation basis only, and the provider has no duration knob, so output length follows the driving video.
Optional fields are a prompt that steers appearance only, keep_original_sound (default true, false gives a silent clip), and character_orientation, which is video by default or image. The body is strict: Video Router vocabulary such as reference_image_urls, reference_video_urls or a model field is rejected, so this route cannot be used to reach Kling text-to-video reference inputs.
What it reserves
The reservation is ceil(duration_seconds) times the motion-control list rate times 1.25, held at admission, captured on completion and refunded on failure. The reference states the list rate it was priced from; read the current Sume rate through an admission preview before a large batch rather than copying a figure from a blog post.
What this is not
It is not the Video Router kling-3 text-to-video and start/end-frame model, and not the still-plus-audio talking-head product. If you want to describe a new scene in words, use POST /v1/videos with a catalog model. Motion control starts from a picture and a motion clip you already have.
How to choose between the routes
Pick one route per codebase and stay on it. The primary invoke is the shortest path for a script. The model-run twin is the better fit if the rest of your integration already submits through the model-runs shape. The face-control alias exists for callers that think in terms of an avatar; it takes the same body, so there is nothing extra to learn.
Because all four store the same model id, your reporting does not split by route. A query for jobs with model: "kling/3.0/motion-control" returns everything, whichever path was used. That also means a migration from one route to another is safe in the middle of a project: jobs already created keep their record, and new ones appear under the same model.
Sources
Related posts
More in Developers
- tts_language_script_mismatch: Korean TTS needs a Hangul syllable
Sume TTS returns 400 tts_language_script_mismatch when language is ko but the text has no Hangul syllable. Usual cause: UTF-8 decoded as Latin-1. Fix it.
- Kotlin 2.4.20 allDistinctBy: unique Idempotency-Keys per batch
Kotlin 2.4.20 adds allDistinctBy. Use it to assert one Idempotency-Key per intent before a batch of Sume image submits, then post with java.net.http.
- Calling the Sume API from Kotlin: no SDK, so write the poll loop
Sume publishes a TypeScript SDK and no Kotlin package. The documented submit, poll, fetch loop works from OkHttp or Ktor; the deadline lives in your client.
- Kubb for the Sume OpenAPI spec: Zod schemas and SWR hooks
Kubb parses an OpenAPI spec once and feeds plugins for TypeScript, Zod and SWR. Here is how that maps to Sume's 3.0.3 spec, jobs and the polling stop rule.
Written by Sume