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.

5 min readSume
All posts

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.

Polling guidance, read 2026-10-02
ItemHiggsfieldSume
Starting interval2 seconds30 seconds in the video example
Growthx1.5 up to 10 secondsHonor next_poll_after_seconds, else exponential backoff
Jitter0 to 0.5 seconds addedNot specified; add your own
Stop statescompleted, failed, nsfw, canceledcompleted, failed, cancelled on /v1/videos
Preferred in productionWebhooksWebhooks 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

All Developers posts

Written by Sume