Change only the CTA of a finished ad: previous_run_id on a Format
Re-do one line of a finished Sume Format ad without paying for the whole ad again: previous_run_id, a new key and cap, and the four refusals to expect.

To change only the call to action of an ad that a Format already made, send a new POST /v1/formats/{handle}/{slug}/runs with previous_run_id set to the finished run and an instruction that says what to change and what to keep. Sume replays to the agent what it produced, so the agent can redo one part and leave the rest. The docs describe live-commerce teams using this to retry a single scene without paying for the full show again. A continuation is a new run with a new id, a new receipt, its own spend cap and its own webhook, and the original run never changes.
The request
Use a new Idempotency-Key for the continuation, and a cap that suits a fraction of the first run. If you bound an output_schema on the first run, bind the same one again, because it is per run and not inherited.
curl -sS -X POST "https://api.sume.com/v1/formats/sume/sume-product-commercial/runs" \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: serum-ad-v1-cta-retry-1" \
-d '{
"previous_run_id": "arun_REPLACE_ME",
"instruction": "Change only the closing call to action to: Free shipping this week. Keep every other shot and the voice track unchanged.",
"generation_spend_cap_usd": 10
}'What can be continued
The run you name must be continuable. Its receipt has a thread_id that is not null, and it is completed or has a non-empty artifacts[]. A failed run that left work can be continued. A run that left nothing cannot. You must name previous_run_id, not a thread id. A thread id gets 400 unknown_parameter.
| Refusal | Meaning | What to do |
|---|---|---|
| 404 previous_run_not_found | Unknown id, or a different owner has the run | Check the id and the key |
| 400 previous_run_format_mismatch | The run started on a different Format | Call the Format where it started |
| 409 previous_run_not_terminal | The run is not finished | Poll it, then call again |
| 400 previous_run_not_resumable | No thread_id, or not completed and no artifacts | Start a new run |
What you pay for
The continuation spends under its own cap and shows its own usage. The artifacts[] of a continued run lists all media that the whole conversation generated, but the spend stays per run, so a receipt for the CTA change shows the CTA change and not the whole ad. Whether the agent redoes only the closing shot or more depends on your instruction, so name what must stay unchanged in plain words, as in the example.
Check the first receipt before you continue. If the first run was canceled, you pay for what it finished, and the continuation may have little to build on. If the first run is still queued or processing, the call returns 409 previous_run_not_terminal.
Variants from one master
The pattern scales to variants. Make one master ad. Then send one continuation per CTA, each with its own key, such as serum-ad-v1-cta-free-shipping and serum-ad-v1-cta-new-flavor, and a small cap. All continuations name the same previous_run_id, and each is a new run. Since they share a thread_id that is read-only, treat each continuation's own receipt as the record of that variant.
If a variant's direction is different from the master's, do not continue. Start a fresh run with the new brief, so the earlier turn does not pull the new one back.
Keep a small table in your own system: master run id, variant label, continuation run id, key and cap. The API lists runs for a Format at GET /v1/formats/{handle}/{slug}/runs, newest first with a limit of 1 to 100, but your table is what ties a CTA line to a run. Cancel is also available if a continuation goes the wrong way: POST /v1/format-runs/{run_id}/cancel is idempotent, and you pay for the generation that was finished before the cancel.
Sources
Related posts
More in Formats
- Check a Format run's video with ffprobe: duration and audio stream
Before you publish a Format run's clip, run ffprobe on primary_output_url, confirm an audio stream exists and compare its length with duration_ms.
- Continue a Sume Format run with previous_run_id after a review gate
Send previous_run_id on a new POST .../runs so the agent redoes one part. A yes/no review model decides whether to continue; each new run gets its own webhook.
- Cost per Reel from Format run receipts: sum billable_amount_usd_micros
Each Sume Format run receipt reports usage.billable_amount_usd_micros. Divide by 1,000,000 for dollars. A Python loop prices a Reel batch from its run ids.
- Cyber Monday price changed after render: rerun one SKU or continue it?
One SKU's price changed after its video rendered. Send a new run with new input, or continue the old run with previous_run_id. Here is when each fits.
Written by Sume