Higgsfield polling: 2 to 10 seconds with jitter, vs Sume
Higgsfield says start polling at 2 seconds, grow to 10, add jitter. Sume's video docs poll every 30 seconds and honor next_poll_after_seconds. How to pick.

Higgsfield's polling page says to start at a two-second interval and grow it gradually up to ten seconds, multiplying by 1.5 each time, with random jitter of up to half a second. Sume's video docs poll every 30 seconds, and the jobs guide tells you to honor next_poll_after_seconds when it is present and otherwise back off exponentially.
Higgsfield's loop
Higgsfield's example stops on completed, failed, nsfw or canceled, uses a 30-second HTTP timeout per request, and treats the HTTP codes this way: keep polling on a 200 with a non-terminal status, stop on 401 or 404, and retry 5xx and network errors with backoff. It also names webhooks as the main route for production, with polling as the recovery path.
Sume's loop
The Sume /v1/videos page uses a 30-second sleep between polls and says video typically takes 30 seconds to several minutes. The jobs guide is more precise: stop on a terminal state, and read result_ready before fetching the result. A fast interval buys little when a clip takes minutes, and a status read can itself be rate limited.
| Item | Higgsfield | Sume |
|---|---|---|
| Starting interval | 2 seconds | 30 seconds in the video example |
| Growth | x1.5 up to 10 seconds | Honor next_poll_after_seconds, else exponential backoff |
| Jitter | 0 to 0.5 seconds added | Not specified; add your own |
| Stop states | completed, failed, nsfw, canceled | completed, failed, cancelled on /v1/videos |
| Preferred in production | Webhooks | Webhooks with polling as fallback |
A runnable Sume loop
Here is a Sume poll loop for the video route. It sleeps 30 seconds, stops on a terminal status and returns the first content URL.
import os, time, requests
HEADERS = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
def wait_for_video(polling_url: str, interval: int = 30):
while True:
job = requests.get(polling_url, headers=HEADERS, timeout=30).json()
if job["status"] == "completed":
return job["unsigned_urls"][0]
if job["status"] in ("failed", "cancelled"):
raise RuntimeError(job.get("error", job["status"]))
time.sleep(interval)
What to carry over
Port the Higgsfield habits that carry over: a per-request HTTP timeout, a stop on 401, and jitter when many workers poll at once. Drop the two-second start: for video it only spends your read budget.
Sources
Related posts
More in Developers
- Higgsfield statuses: nsfw and canceled mapped to Sume job states
Higgsfield returns queued, in_progress, completed, failed, nsfw or canceled. How each maps to Sume's video and job statuses, including cancelled vs canceled.
- Higgsfield upload URL: 1 hour, MP4 and WAV. Sume takes public URLs
Higgsfield inputs go through a presigned upload that expires in one hour. Sume has no upload step: pass public HTTPS URLs in frame_images or input_references.
- Higgsfield webhook retries: two hours vs Sume's ten attempts
Higgsfield retries 5xx for up to two hours and wants a reply in ten seconds. Sume makes 10 attempts, 30 seconds apart, then lets you redeliver by hand.
- Ideogram color_palette parameter: brand colours in Sume prompts
Ideogram's API takes a color_palette parameter. The Sume image API has no palette field, so brand colours go in the prompt and a reference swatch image.
Written by Sume