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.

5 min readSume
All posts

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.

previous_run_id refusals (Sume docs, read 2026-10-05)
RefusalMeaningWhat to do
404 previous_run_not_foundUnknown id, or a different owner has the runCheck the id and the key
400 previous_run_format_mismatchThe run started on a different FormatCall the Format where it started
409 previous_run_not_terminalThe run is not finishedPoll it, then call again
400 previous_run_not_resumableNo thread_id, or not completed and no artifactsStart 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

All Formats posts

Written by Sume