previous_run_not_resumable: a Format run with nothing to continue
Continuing a Format run with previous_run_id returns 400 previous_run_not_resumable when the run left no thread or artifacts. The four refusals and what to do.

400 previous_run_not_resumable means the run you named in previous_run_id left nothing to continue: it has no thread_id, and it neither completed nor produced any artifacts. Start a fresh run instead; the error's details show previous_run_status, has_thread and artifact_count so you can see why.
The refusals are listed in Runs and results and Errors and spend, read on 2026-10-02.
What are all four refusals?
A continuation is a new run that replays what an earlier run produced, so it can redo one part. Four checks guard it.
| Response | Means | Fix |
|---|---|---|
| 404 previous_run_not_found | Unknown id, or another owner's run | Check the id and the key |
| 400 previous_run_format_mismatch | The run belongs to a different Format | Continue it on the Format where it started |
| 409 previous_run_not_terminal | The run has not finished | Poll it, then call again |
| 400 previous_run_not_resumable | No thread, or not completed and no artifacts | Start a fresh run |
How do I check before I call?
You can read the answer off the earlier run's receipt. It is continuable when thread_id is not null, and it either completed or has a non-empty artifacts[]. A failed run that left work behind can be continued; one that left nothing cannot.
That asymmetry is useful. A run that failed after rendering three of five scenes is a good candidate. A run rejected before any generation, for example by an unattended block, usually has no artifacts, and the docs tell you to start fresh.
What does a continuation look like?
Name the earlier run, say what to redo, and bind the same schema again: output_schema is per run and is not inherited. Use a new Idempotency-Key, because the old one is bound to the receipt you already have.
curl -sS -X POST "https://api.sume.com/v1/formats/acme/live-commerce/runs" \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-8823-retry-sc7" \
-d '{
"previous_run_id": "arun_e43e6c5cb2b74052",
"instruction": "Retry scene 7 only. Keep the rest unchanged.",
"input": { "scene_id": "sc_7" },
"generation_spend_cap_usd": 8
}'What stays the same and what is new?
A continuation gets a new run id, a new receipt, its own spend cap and its own single webhook. The original run never changes. Both share thread_id, which is read-only. Never send a thread id yourself; that is 400 unknown_parameter.
artifacts[] on a continued run lists everything the whole conversation generated, while usage stays per run, so you pay for the new turn's generation only.
When should I not continue?
When the earlier run produced nothing, when it was on a different Format, or when you want a different brief entirely. In those cases start fresh with a new key. Continuing is a cost tool for partial work, not a way to force a run that never started.
A small guard in your client
The guard costs one read. A refused continuation is a 400 and costs nothing, but a blind fresh run on a run that did leave work behind spends on clips you already own.
- Read the earlier run's receipt first and check
thread_idis set. - Continue only if the run
completedorartifacts[]is non-empty. - Otherwise start a fresh run with a new
Idempotency-Keyand the full brief. - Compare
usage.billable_amount_usd_microswith the cap before raising a cap on the retry.
What about the spend cap on a continuation?
Each continuation has its own cap. Send generation_spend_cap_usd on the new run; omitting it inherits the Format's cap, which is $400 when the Format never set one. A retry of a single scene needs a fraction of a full show's cap, so set a small one on purpose.
A run that wants to spend past its cap fails with format_run_failed, so compare usage.billable_amount_usd_micros with usage.generation_spend_cap_usd_micros on the receipt before raising the number.
Can I continue a run that is still going?
No. 409 previous_run_not_terminal says the run has not finished. Poll status_url until the status is terminal, or take the webhook, then call again. That error is retryable once the earlier run settles; the not-resumable error is not.
If the earlier run is stuck, remember the force-finalize bounds: 90 minutes from creation, or sooner when the run is older than 25 minutes and silent for 10. After that it is failed and may be continuable if it left artifacts.
Sources
Related posts
More in Formats
- primary_output_key: how a Format run picks primary_output_url
A Format run resolves primary_output_url from three places in order. Why a text key gives a null URL, and when a failed run still returns no pointer.
- Q4 creative test matrix: 3 hooks by 3 Formats in one 9-item bulk run
Test creative style and hook together: nine Format runs for one SKU in a single Sume bulk queue, with a worst-case spend you can read before you submit.
- Renamed a Format handle? Old URLs work for 90 days: store invoke_url
A renamed Sume Format handle keeps resolving for 90 days. For stored integrations, persist the opaque skl_ invoke_url, which never changes across renames.
- Send a video to a Format run: URLs in input, not attachments
Format and Agent Completion attachments take images only. For video, put the media.sume.com URL in input; Format runs count it toward 10 videos per run.
Written by Sume