WaveSpeed polls at 2 seconds minimum; Sume: next_poll_after_seconds
WaveSpeed says start polling near 2 seconds and back off to 5-10. Sume returns next_poll_after_seconds so the server sets the pace. A runnable loop for each.

WaveSpeedAI tells clients to start polling around 2 seconds, increase toward 5 to 10 seconds, and never poll faster than every 2 seconds. Sume's status endpoint can return next_poll_after_seconds, and the docs say a client must honor it when present and back off exponentially otherwise.
WaveSpeed's guidance is from its REST API docs and Sume's from Jobs and results and Webhooks, read 2026-10-02.
What is WaveSpeed's polling advice?
The page describes a three-step loop: POST the task, get a task id and a status URL, then GET /predictions/{TASK_ID}/result until the task finishes. The interval starts near 2 seconds and grows to 5 to 10 seconds. Anything faster than every 2 seconds is called out as something not to do. Documented error codes include 429 for rate limiting.
The page names a webhook verification route among its operations, but the part we fetched did not give webhook delivery details, so this post does not compare them.
What is Sume's polling contract?
Submit with mode: "async" and an Idempotency-Key. The response carries the job id, status_url, result_url and next_poll_after_seconds. Poll status_url and stop when terminal is true, then read result_url once result_ready is true.
If you would rather not poll, mode: "webhook" sends a signed terminal callback to a public HTTPS webhook_url. The docs still recommend keeping polling as a backup for missed deliveries.
| Question | WaveSpeed | Sume |
|---|---|---|
| Who sets the interval | Client: 2 s rising to 5-10 s | Server hint, else client backoff |
| Floor | Not faster than 2 s | None stated; honor the hint |
| Stop condition | completed, failed or other terminal state | terminal is true |
| Push alternative | Webhooks exist | mode: webhook, terminal events only |
What does a Sume loop look like?
This is the loop from the earlier posts, set to a 20-minute client-side deadline, which the docs call reasonable for video. It sleeps for the server hint when one is present and otherwise doubles up to 30 seconds.
import os, time, requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
BASE = "https://api.sume.com/v1/jobs"
def wait(job_id, deadline_s=1200):
end, delay = time.time() + deadline_s, 5
while time.time() < end:
r = requests.get(f"{BASE}/{job_id}/status", headers=H, timeout=30)
r.raise_for_status()
s = r.json()
if s.get("terminal"):
return s
time.sleep(s.get("next_poll_after_seconds") or delay)
delay = min(delay * 2, 30)
raise TimeoutError(f"still running: {job_id}")Which pace should you pick?
If a port keeps WaveSpeed's 2-second start, you will mostly burn requests: Sume's hint will usually be your better guide, and a rate-limited response carries retry-after. Sume sync mode waits at most 30 seconds on the submit call, so it only suits short jobs; for video use async or a webhook with polling as the fallback.
Sources
Related posts
More in Developers
- Webhook handler slower than 10 seconds: duplicate Sume deliveries
Sume gives each webhook attempt 10 seconds, then retries up to 10 times, 30s apart. A slow handler that succeeds late still gets duplicates. Ack first.
- Webhook returns a 301: Stripe, OpenAI and Sume count it as failed
A redirecting webhook URL never delivers on Stripe, OpenAI or Sume run webhooks. Register the final URL, and check http to https and trailing slashes first.
- Webhook returns 503 with Retry-After: how Sume spaces the retries
If your webhook endpoint answers 429 or 503 with Retry-After, Sume run webhooks wait at least that long, capped at one hour. Here is how to shed load safely.
- Webhook IP allowlist: GitHub and Stripe publish ranges, Sume does not
GitHub exposes webhook IPs via /meta and Stripe lists addresses. The Sume docs publish no sender ranges, so verify the signature and a 5-minute window.
Written by Sume