Three Demand Gen video hooks in one Sume bulk run
Queue three hook variants of one video in a single Sume Format bulk run (up to 100 items per request) so you can test which opening works.

To get three video variants in one pass, queue three items in a single Format bulk run with POST /v1/formats/{handle}/{slug}/bulk-runs; one request can hold up to 100 items. How many videos a Demand Gen campaign should carry is Google's call, and this post does not state it; check the current Google Ads guidance.
Make the three differ in the hook
The point of three videos is to give the campaign something to choose between. Three videos that differ only in the first seconds, the hook, test a clear variable and keep the rest of the ad constant.
Create the queue
A bulk request is a server-side queue of ordinary Format runs. Each item is one run with its own receipt. concurrency sets how many are in flight at once. Use a fresh Idempotency-Key for each batch, since replaying a spent key returns the old queue.
curl -sS -X POST "https://api.sume.com/v1/formats/your-handle/your-format/bulk-runs" \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"concurrency":3,"items":[
{"instruction":"Hook A: open on the problem, 15 s"},
{"instruction":"Hook B: open on the result, 15 s"},
{"instruction":"Hook C: open on a question, 15 s"}
]}'Poll and check
The key needs formats:write to create a queue and formats:read to poll it. Poll GET /v1/format-run-queues/{id}. A queue reaching completed means every item is terminal, not that all succeeded, so branch on counts.failed. The queue itself has no webhook; set communication.webhook_url per item.
- Keys made before the Formats API shipped lack these scopes; create a new key
- Cancel a single child with
POST /v1/format-runs/{run_id}/cancel - There is no public cancel-queue endpoint
- Read each child at
GET /v1/format-runs/{run_id}
Test one first
Spend one run on a test first. A bulk request starts the first concurrency items right away, so a wrong instruction costs three runs instead of one.
Sources
Related posts
More in Formats
- Detect that someone edited your Sume Format before the weekly run
Pin the Format's package_sha and version, and compare them right before a weekly run. If a teammate edited the Format, stop the run instead of paying for it.
- Edit a Format mid-batch: which version do queued items use?
A bulk queue dispatches items over time. If you edit the Format while it runs, later items can run the new package. Here is how to tell from the receipts.
- Flat Sume output schema for a spreadsheet row: null is an empty cell
Design a Sume output_schema that maps to one spreadsheet row. Optional fields become nullable strings, and a null becomes an empty cell when you write the CSV.
- Format run queue.position is always null: no queue depth published
The status response has a queue object, but position is null on purpose. Use queue.state and expires_at for waiting UX instead of a fake countdown.
Written by Sume