25 Kling motion control clips of 8 seconds: $31.50 and the Pro queue

Twenty-five 8-second Kling 3.0 motion control jobs cost $31.50 on Sume. The Pro plan accepts 24 at once, so the 25th needs a second wave. The math.

4 min readSume
All posts

Twenty-five Kling 3.0 Motion Control clips of 8 seconds each cost $31.50 on Sume: 200 seconds at $0.1575 per second. On the Pro plan, which accepts 24 jobs at a time (4 processing plus 20 queued), the 25th submit returns 429 queue_full until a slot frees. Submit 24, wait, then send the last one.

The money and the queue are two separate limits. The balance check returns 402; the queue check returns 429.

The cost

The rate is ceil(duration_seconds) times $0.126 times 1.25. For an 8-second clip that is $1.26, and 25 clips are $31.50. Every job is reserved at admit, captured on completion, and refunded on failure.

25 Kling motion control clips of 8 seconds at $0.1575 per second
ClipsSeconds eachTotal secondsCost
188$1.26
10880$12.60
248192$30.24
258200$31.50

The queue limit

Concurrency on Sume is a pair of numbers per plan: jobs processing and jobs accepted in total. The values are Free 1 and 6, Pro 4 and 24, Startup 8 and 48, Scale 20 and 120. A batch of 25 fits on Startup and Scale in one go. On Pro it does not, and on Free only 6 are accepted.

  • A rejected submit creates no job and reserves nothing.
  • A 402 means the balance cannot cover the reservation; it is not retried by waiting for the queue.
  • A 429 means wait for a job to finish and submit again.

A submit loop that respects both

Send the first 24, poll their status, and top the queue up as jobs complete. Use one stable idempotency key per clip, so a retry of the same clip after a 429 does not create a duplicate once it is accepted.

import json
import os
import urllib.error
import urllib.request

URL = 'https://api.sume.com/v1/kling/3.0/motion-control'
KEY = os.environ['SUME_API_KEY']

def submit(n):
    body = {
        'image_url': 'https://example.com/mascot.png',
        'motion_video_url': f'https://example.com/clip-{n}.mp4',
        'duration_seconds': 8,
        'character_orientation': 'video',
        'mode': 'async',
    }
    req = urllib.request.Request(URL, json.dumps(body).encode(), {
        'Authorization': f'Bearer {KEY}',
        'Content-Type': 'application/json',
        'Idempotency-Key': f'batch-8s-{n:03d}',
    })
    try:
        with urllib.request.urlopen(req) as res:
            return res.status
    except urllib.error.HTTPError as err:
        return err.code  # 402 balance, 429 queue_full

print(submit(1))

Pick the plan by the batch

If you run batches of 25 or more as a routine, the accepted number is a reason to look at Startup. If you run a handful a day, Pro is enough and the loop above handles the overflow. For a run ten times this size, read the reserve, capture, and refund breakdown for 100 clips.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume