Why a Kling motion control job shows type avatar_image_to_video
Sume stores Kling motion control as type avatar_image_to_video with model kling/3.0/motion-control. The model id, not the type, tells it apart from Fabric.
A Kling motion control job on Sume has type: "avatar_image_to_video" and model: "kling/3.0/motion-control". That is on purpose: motion control shares the job type of the VEED Fabric still-plus-audio product, and the public model id is what separates the two. If you filter your job list by type alone, you will mix them.
What is stored
All four submit routes create the same kind of job: POST /v1/kling/3.0/motion-control, POST /v1/avatar-1.0/motion-control, and the two model-run twins under /v1/models/. The face-control alias and its model-run twin never store sume/avatar-1.0/motion-control. They store the Kling id as well, so a report of your jobs by model shows one name no matter which route you called.
The submit envelope returns job.id, status_url, result_url, job.model and usage.billable_amount_usd_micros, the same shape as every other Sume submit.
What it means for your code
Do three things in a pipeline that tracks cost or concurrency.
- Group by
model, not bytype.kling/3.0/motion-controlis the key for a motion job;veed/fabric-1.0is the key for a talking still. - Do not expect a new job type. There is none for motion control, and Sume does not plan one in the doc that defines the surface.
- Use the job id as your join key. The lifecycle is the standard
GET /v1/jobs/:id/statusandGET /v1/jobs/:id/resultfor both.
Three jobs, one type
| Surface | Stored model | Input |
|---|---|---|
| Kling motion control | kling/3.0/motion-control | still or avatar + motion video |
| Fabric talking head | veed/fabric-1.0 | still + audio |
| Face-control alias | kling/3.0/motion-control | same body as motion control |
A reporting query
A spend report that wants motion control only should select rows where model = 'kling/3.0/motion-control'. A report that wants every image-to-avatar job can select the type. Pick the key that matches the question, and the numbers do not get mixed.
The same rule helps when you read the Sume docs. The page that defines motion control says it is not Video 1.0 kling-3 (text or frame to video) and not the Fabric product. Three look-alike surfaces, three different model ids.
A common mistake
The mistake to avoid is a dashboard that counts every avatar_image_to_video job as a talking head. A team that adds motion control to an existing Fabric pipeline will see the count go up, and the cost per job change too, because motion control bills per second of output while Fabric bills on its own card. The type is the same, the economics are not, so the model id is the safe column to group on.
Concurrency works on the same principle. Slots are held by job type, so a motion control job and a Fabric job compete for the same slot class. If you run both at volume, plan for the slots together, and read the page on job types and concurrency for the current numbers.
Related posts
More in Developers
- Why Sume MCP results show [redacted]: the redaction field list
Sume MCP omits api_key fields and masks secrets and signed URLs as [redacted] in tool results. That is intended, not a failed call.
- Windows PowerShell: install the Sume CLI, watch a 30 s render
Install the Sume CLI on Windows with one irm | iex line, set SUME_API_KEY, then use jobs watch and jobs download on a 30-second video job without resubmitting.
- X Ads API media upload: simple for images, chunked for all media
X's Ads API lists POST media/upload for images only and a chunked upload for all media. Use the chunked route for video you render with Sume.
- Grok Imagine video extension vs chaining clips on Sume
xAI extends a Grok Imagine clip from its final frame. Sume has no extend call for Grok: save the last frame and submit it as first_frame on the next job.
Written by Sume