Fabric request: image_url and avatar_handle together are not allowed
Sume's VEED Fabric 1.0 body needs exactly one visual source: image_url or avatar_id / avatar_handle, never two. Valid bodies and audio rules.
A VEED Fabric 1.0 request on Sume must name exactly one visual source: an image_url, or an avatar by avatar_id or avatar_handle. The models page says you cannot send the two sources together, and the API reference describes each field as mutually exclusive with the others (read 2026-10-09). If a body carries both, fix the body and resubmit; a retry with the same content will fail again.
The valid shapes
The same rule applies to Sume's MiniMax H3 Max Lip Sync route, which takes the same body, and to Kling motion control. Three requests cover the cases.
| Body | Valid? | Why |
|---|---|---|
| image_url + audio_url + duration_seconds | Yes | One visual source |
| avatar_handle + audio_url + duration_seconds | Yes | Avatar resolved to its identity still |
| avatar_id + audio_url + duration_seconds | Yes | Same, by id |
| image_url + avatar_handle | No | Two visual sources |
| audio_url only | No | No visual source |
Which one to use
The models page recommends the image_url of a generated, inspected posed still as the preferred source for a person who speaks on camera. Use avatar_handle only when the user named that avatar. The point is control: a posed still you reviewed gives you the exact framing, while a handle resolves server-side to the avatar's identity still.
Everything else on the body is the same either way. audio_url must be a Sume-hosted URL (non-Sume hosts are rejected) under 10 MB, and duration_seconds is the measured audio length from 1 to 300. resolution is 480p or 720p, with 720p as the default. A 20-second track costs 20 x $0.1875 = $3.75 at 720p or 20 x $0.10 = $2.00 at 480p.
A pre-flight check
Validate on your side before you submit, so a mistake costs no reservation. Check that exactly one of the three visual fields is present, that the audio URL host is Sume's media host, that the file is under 10 MB, and that duration_seconds is a measured number, not a guess. Then send with an Idempotency-Key.
If a submit succeeds, store the job.id, poll GET /v1/jobs/:id/status, and fetch /result when it completes. Treat the first response as the record of the job, not the clip.
- One of: image_url, avatar_id, avatar_handle.
- audio_url on the Sume media host, under 10 MB.
- duration_seconds measured, 1 to 300.
Common ways the second source sneaks in
Two sources often appear through code, not by choice. A shared template that always sets image_url gets an avatar_handle added by a later step. A client library that merges default fields into every body does the same. A no-code tool that maps all columns of a row into the request adds a stale image column. The fix is the same: build the body from the route's schema, with one visual field, and drop the rest before sending.
Log the final body, minus secrets, next to the response's request id. When something fails, the id lets Sume support find the request, and the body tells you which field was extra.
Sources
Related posts
More in Developers
- Veo 3.1 preview ends October 22: what to change in each request
Google retires three Veo 3.1 preview ids on October 22, 2026 and names Omni as the replacement. A field-by-field list of what changes, and the Sume id to send.
- Vercel AI SDK chunkMs timeouts and a 55 s Sume jobs_wait
ai@7.0.136 stops chunkMs and firstChunkMs when the model response ends. stepMs still covers the step, so size it for a Sume jobs_wait slice of up to 55 s.
- Verify a Sume video callback signature in Python, empty secret refused
A short stdlib Python check for x-sume-webhook-signature on a /v1/videos callback: HMAC SHA-256 over timestamp.raw_body, rotated sume-v1 entries accepted.
- Verify a Sume webhook in Python with the standard library only
Check the sume-v1 HMAC in Python without a package: raw body, timestamp window, two signatures during rotation, and a refusal of an empty secret. 20 lines.
Written by Sume