A 340-product catalog: four Sume bulk queues of 100, 100, 100 and 40
A bulk queue holds 1 to 100 items, so 340 product videos need four queues. Split the list, key each queue, and remember workspace concurrency still applies.

A Sume bulk queue accepts 1 to 100 items, so a 340-product catalog needs four queues: three of 100 items and one of 40. Each item is the same body as a single Format run, and each queue is created with POST /v1/formats/{handle}/{slug}/bulk-runs. Split the list in order, give every queue its own idempotency key, and keep a mapping from queue and item index back to your product rows.
The arithmetic and the limits
concurrency is a required integer from 1 to 16 and sets how many child runs stay in flight inside one queue. The docs also say that child runs still go through ordinary Format-run admission, including workspace generation concurrency, so creating four queues does not mean four times as many runs are processed at the same moment.
| Queue | Products | Items | Suggested Idempotency-Key |
|---|---|---|---|
| 1 | 1 to 100 | 100 | catalog-nov-q1 |
| 2 | 101 to 200 | 100 | catalog-nov-q2 |
| 3 | 201 to 300 | 100 | catalog-nov-q3 |
| 4 | 301 to 340 | 40 | catalog-nov-q4 |
Steps
Do the split in your own code so it is repeatable.
- Chunk the product list into slices of at most 100, keeping the original row number for each product.
- Send each slice as
items, with a per-itemgeneration_spend_cap_usdand, if you want per-item callbacks, acommunication.webhook_url. - Store each returned queue id (
frq_) with the slice it came from. - Poll each
status_urlwith backoff until the queue status iscompleted, then readcounts.failedandcounts.canceledand look at the items that did not complete.
What Sume does not do
There is no queue-level webhook, no list-queues endpoint and no cancel-queue endpoint. To stop work you cancel a child run, and the next queued item then takes the free slot. A bad item rejects the whole create with 400 invalid_request and details.index, so a typo in product 87 of queue 2 blocks queue 2 and nothing else.
Replaying a spent key returns 202 with the old queue, so do not reuse catalog-nov-q1 for a corrected list; use a new key and a new queue. And completed only means every item is terminal, so a queue with failures is still completed.
Keeping rows and videos together
Every item keeps its zero-based index within its queue, and the items come back in the order you submitted them. So product 137 in your sheet is item 36 of queue 2. Write that mapping down when you create the queue and not when you read the results.
The queue item gives only a status, a run id and a short error. To learn why a child failed, read the run receipt at GET /v1/format-runs/{run_id}. For a catalog of this size it is worth writing a small loop that lists the failed indexes, reads each receipt, and puts the failed rows into a fifth, smaller queue with new keys once you have fixed the cause.
Sources
Related posts
More in Formats
- Bulk queue key from a payload hash: same body 202, new body 409
Derive a Format bulk queue Idempotency-Key from a sha256 of its body. The same body replays 202 with the old queue; a changed body gives 409.
- Bulk queue spend ceiling: 100 items at $2 is $200; 16 live is $32
With generation_spend_cap_usd of $2 per bulk item, 100 items cap at $200 in total and 16 running items at $32 at once. Caps are ceilings, not prices.
- Bulk queue, empty wallet: failed items, fresh key, check balance
If the wallet runs out during a bulk run, later child runs fail admission and become failed items. Check the balance, then resubmit with a fresh key.
- Bulk queue worst case: 100 items x per-item cap, $300 not $40,000
Each child in a Sume bulk queue is a run with its own spend cap. 100 items at $3 cap at most $300; the default $400 cap would allow $40,000. Set caps per item.
Written by Sume