Bulk run items ignore on_active_run skip and reject
A Format bulk queue runs every item with on_active_run allow, so skip or reject on an item will not serialize it. Set concurrency to control parallel runs.

Inside a bulk queue, on_active_run does nothing you can rely on: the bulk controller executes every item with on_active_run: "allow", whatever the item says. If you want one child at a time, set the queue's concurrency to 1 instead of putting skip or reject on the items.
This trips people who copy a single-run body into a batch. On a single POST …/runs, skip records a skipped run when another run of that Format is in flight and reject answers 409 format_run_in_progress. Neither reaches the queue's children.
What each setting does on a single run versus a queue item
The default for a Format run is allow: runs go concurrently, and workspace generation concurrency still applies. Scheduled Actions default to skip, which is why the call docs warn not to copy an Action body into a Format call. The bulk docs add one more rule to that warning: the same field is overridden on every item.
| Value | On POST …/runs | On a bulk item |
|---|---|---|
| allow (default) | Runs concurrently with any run in flight | Used for every item |
| skip | Records a skipped run instead of starting | Ignored, the item runs |
| reject | 409 format_run_in_progress | Ignored, the item runs |
Use the window to control parallelism
concurrency is a required integer from 1 to 16 and says how many child runs stay in flight at once. The server starts the next queued item as soon as a slot frees, so a window of 1 gives you serial execution without any per-item flag. With 8 items and a window of 3, the create response already shows three running and five queued.
A larger window does not bypass admission. Each child still goes through ordinary Format-run admission: wallet, workspace generation concurrency and spend caps. A child that cannot start becomes a failed item with run_id: null, the create has already returned 202, and the window refills from the remaining items.
curl -sS -X POST "https://api.sume.com/v1/formats/sume/sume-close-camera-ugc/bulk-runs" \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"concurrency": 1,
"items": [
{ "instruction": "Hook variant A", "generation_spend_cap_usd": 5 },
{ "instruction": "Hook variant B", "generation_spend_cap_usd": 5 }
]
}'Why this suits creative tests
A creative test often wants the opposite of single-flight: many variants of one Format at once, which is what allow gives you. Format video runs call generation tools such as the Video Router catalog, which includes seedance-2.5, so the number of live clips is bounded by your window and your workspace's generation concurrency, not by a flag on the item.
Because the queue has no webhook and no queue-level cancel, pair a wide window with per-item caps. The worst-case spend is the item count times the per-item cap, and completed on the queue only means every item is terminal. Branch on counts.failed and counts.canceled, and read why a child failed on its own run receipt.
Sources
Related posts
More in Formats
- Revise 20 finished videos in one Sume bulk queue with previous_run_id
Each bulk item can carry previous_run_id, so one queue re-edits twenty finished runs. A preflight for thread_id, the repeated schema, and the cost per item.
- Bulk virtual try-on videos for a catalog: 100 SKUs per queue
Queue up to 100 try-on runs in one POST: concurrency 1 to 16, one garment image per item, a spend cap each, and how to read the failures afterwards.
- Calling a Formats by Sume entry: the sume handle, not yours
Formats by Sume run at POST /v1/formats/sume/{slug}/runs with any key holding formats:write. Your own handle returns 404, and a fork lives at your handle.
- Check a Format output schema against Sume size limits first
Sume rejects schemas deeper than 10 levels, over 5000 properties or 120,000 characters. A local counter that catches max_depth and max_string_length early.
Written by Sume