Queue a 30 s H3 Max Recast job: the reserve at 768p and 1080p
H3 Max Recast swaps people in a 5 to 30 s video. Price arithmetic for a 30 s source at 768p and 1080p, plus the Python to submit it and poll it.

For a 30-second source video, a Recast job at 768p reserves $11.25 on Sume, and at 1080p it reserves $16.88. The model charges per second of the inspected source length, at a list of $0.30 or $0.45, times the 1.25 house margin, rounded up to the cent. Because the price follows the source, trim your input before you queue it.
What Recast does
H3 Max Recast, id h3-max-recast, replaces the primary people in one source video with the people in 1 to 4 reference photos. The source must be 5 to 30 seconds long, with no shot longer than 15 seconds. Output is 768p by default, or 1080p, and it keeps the source's motion, camera, cuts and sound. A prompt is optional.
The duration is not something you set. It is the inspected length of the source, rounded up. Sume's docs also note that the edit reserve is a hint, since the provider does not return an output duration, so treat the reserve as the upper estimate and check your usage record after capture.
A practical consequence: the source clip is the budget. If your edit only needs the first 12 seconds of a 30-second take, cut the file first. At 768p that is $3.60 list, or $4.50 billed, instead of $11.25, and the output will be the length you wanted anyway.
Price arithmetic
The catalog lists list prices per second, taken from fal on 2026-10-01, and Sume bills list times 1.25. Here is the math for sources of 5, 15 and 30 seconds.
| Source length | 768p list | 768p billed | 1080p list | 1080p billed |
|---|---|---|---|---|
| 5 s | $1.50 | $1.875, up to $1.88 | $2.25 | $2.8125, up to $2.82 |
| 15 s | $4.50 | $5.625, up to $5.63 | $6.75 | $8.4375, up to $8.44 |
| 30 s | $9.00 | $11.25 | $13.50 | $16.875, up to $16.88 |
Submit and poll
On /v1/videos, send the source in input_references as a video_url and one image_url for each new person. The code below sends one source and one photo, waits for a terminal state and stops if the job fails. Replace both URLs with public HTTPS files that you control.
import json, os, time, urllib.request, urllib.error
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"], "Content-Type": "application/json"}
def call(method, url, body=None, extra=None):
req = urllib.request.Request(url, method=method, headers={**H, **(extra or {})},
data=json.dumps(body).encode() if body else None)
try:
with urllib.request.urlopen(req, timeout=30) as r:
return r.status, json.loads(r.read())
except urllib.error.HTTPError as e:
return e.code, json.loads(e.read() or b"{}")
body = {"model": "h3-max-recast", "resolution": "768p",
"prompt": "Keep everything else the same.",
"input_references": [
{"type": "video_url", "video_url": {"url": "https://cdn.example.com/source-30s.mp4"}},
{"type": "image_url", "image_url": {"url": "https://cdn.example.com/new-person.jpg"}}]}
code, job = call("POST", "https://api.sume.com/v1/videos", body, {"Idempotency-Key": "recast-demo-001"})
print(code, job)
while code == 202 or code == 200:
time.sleep(10)
code, job = call("GET", job["polling_url"])
print(job.get("status"))
if job.get("status") in ("completed", "failed", "cancelled"):
break
Queue behaviour
Recast jobs are paid generation jobs, so they follow the same admission rules as the others: they can wait as queued while a workspace slot is busy, and queue_full appears only when the queue is also full. On a Pro plan with 24 accepted jobs, a batch of 30 Recast jobs gets 429 queue_full on the 25th at once, so pace it, and resend with the same key.
You can cancel a queued Recast job, but only before generation starts. After that, Sume returns 409 job_generation_already_started and the job runs to the end.
The reserve and the final charge can differ. The reserve is taken at submit from the estimate, and the capture happens on completion. Read the usage object on the poll response, which carries usage.cost, to see what Sume billed, and reconcile it against your own table above.
Checklist
- Trim to the part you need. A 30-second source costs three times a 10-second one.
- Keep every shot at or under 15 seconds, or the source is rejected.
- Use clear, front-facing reference photos, one for each person you want in the output.
- Check the reserve against your balance first. A 402 insufficient_credits means the balance is below the reserve.
Sources
Related posts
More in Developers
- queue_admission_unavailable: a failed Sume job you can retry
If Sume cannot evaluate generation admission, the job fails with queue_admission_unavailable, retryable true, and is refunded. Read it, then create again.
- No language warning on Sume TTS? Raw voice ids skip the check
Sume's voice-language check needs library metadata. Send a raw voice id it cannot look up and no mismatch warning appears. How to add your own safety net.
- Read Sume rate limit headers with curl: remaining, reset, retry-after
Run curl -D - on any /v1 route to read ratelimit-limit, ratelimit-remaining, ratelimit-reset, and retry-after on a 429. Anonymous reads are 4x Free writes.
- H3 Max Recast and the 15-second shot rule: split a long take first
Recast accepts 5 to 30 seconds of source, but no single shot longer than 15 seconds. Cut a longer take with Sume's Video Trim, then recast each part.
Written by Sume