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.

4 min readSume
All posts

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.

Read 2026-10-02 from docs.sume.com
ResponseMeansFix
404 previous_run_not_foundUnknown id, or another owner's runCheck the id and the key
400 previous_run_format_mismatchThe run belongs to a different FormatContinue it on the Format where it started
409 previous_run_not_terminalThe run has not finishedPoll it, then call again
400 previous_run_not_resumableNo thread, or not completed and no artifactsStart 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_id is set.
  • Continue only if the run completed or artifacts[] is non-empty.
  • Otherwise start a fresh run with a new Idempotency-Key and the full brief.
  • Compare usage.billable_amount_usd_micros with 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

All Formats posts

Written by Sume