250 clips on Black Friday: jobs Sume accepts at once
Sume accepts 6 jobs at once on Free, 24 on Pro, 48 on Startup, 120 on Scale (processing plus queued). Submit 250 clips in waves.

At the default settings a Sume workspace accepts this many paid generation jobs at once, counting both the ones processing and the ones queued: Free 6, Pro 24, Startup 48, Scale and Enterprise 120. The 25th submission on Pro returns 429 queue_full. So 250 clips on a Pro workspace cannot go in as one burst; they go in as waves that follow the queue.
Queued is not an error. Sume accepts valid jobs as queued while capacity remains, and workers move them into processing as concurrency slots open. Concurrency is a dispatch limit, not a submit limit.
Capacity by plan
From the Sume generation-admission docs. The dashboard Concurrency tab is the source of truth for your workspace, and generation_limits on a submit response gives the live numbers.
| Plan | Processing | Queue capacity | Accepted at once | wave_size_hint |
|---|---|---|---|---|
| Free | 1 | 5 | 6 | 4 |
| Pro | 4 | 20 | 24 | 18 |
| Startup | 8 | 40 | 48 | 36 |
| Scale | 20 | 100 | 120 | 90 |
| Enterprise | 20 | 100 | 120 | 90 |
A waves script
The wave_size_hint (with an empty queue) is max(1, floor(queue_capacity_remaining x 0.75)). It is a hint for how many to submit in one wave, not a concurrency limit. This script sends waves of 15, which fits under the Pro hint of 18, and waits for each wave to reach a terminal state before it sends the next. It stores nothing, so in production keep each job id and its idempotency key.
import asyncio, os
import httpx
WAVE = 15
BASE = "https://api.sume.com"
async def terminal(client, job_id):
while True:
s = (await client.get(f"{BASE}/v1/videos/{job_id}")).json()
if s["status"] in ("completed", "failed", "cancelled"):
return s["status"]
await asyncio.sleep(15)
async def submit(client, i):
r = await client.post(f"{BASE}/v1/videos", headers={"Idempotency-Key": f"bf-2026-clip-{i}"},
json={"model": "wan-3.0", "prompt": f"Product shot {i}", "duration": 6,
"resolution": "720p", "aspect_ratio": "9:16"})
r.raise_for_status()
return r.json()["id"]
async def main():
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
async with httpx.AsyncClient(headers=headers, timeout=60) as client:
for start in range(0, 250, WAVE):
ids = await asyncio.gather(*(submit(client, i) for i in range(start, min(start + WAVE, 250))))
print(start, await asyncio.gather(*(terminal(client, j) for j in ids)))
asyncio.run(main())If you hit queue_full anyway
Do not add more work for that workspace. Poll until at least one job is terminal, cancel queued jobs you no longer need, and retry with the same idempotency key. Cancel works only before generation starts; after that it returns 409 job_generation_already_started. A failed admission releases its reservation.
Also budget the credits. A submit with too few credits to reserve gets 402 insufficient_credits before any work starts, with required_credits and available_credits in details. Check the balance on Thursday, not on Friday morning.
- Never resubmit a paid request only because your client timed out; use the same key.
- Plan concurrency does not rise with purchased credits.
- Poll with backoff, not in a tight loop.
Related posts
More in Developers
- 402 or 429: which gate stops a 100-ad batch first on Sume?
A 100-ad batch hits 429 queue_full when the plan's accepted capacity runs out and 402 when the balance does. Which comes first depends on job price.
- Astro 7.3.8 actions: call the Sume video API, key stays on the server
Astro actions give a browser form a typed way to start a Sume video job and poll it, without the API key in client code. Zod 4 validation, 402 handling.
- Bun 1.4.3 EAI_AGAIN vs ETIMEOUT: retry a Sume submit safely
Bun 1.4.3 reports a temporary DNS failure as EAI_AGAIN, not ETIMEOUT. Update your retry check, and keep one Idempotency-Key across every Sume submit retry.
- Bun 1.4.3 fetch stream errors: catch a cut-off Sume video download
Bun 1.4.3 fixes response streams that ended cleanly after a transfer failure. Still check the byte count when you save a finished Sume video to disk.
Written by Sume