Skip to main content
There is one DELETE route. What it does depends on the revision: deleting a committed, non-default revision is exactly that, but deleting the draft (which is always the default) discards it instead — the draft itself disappears and the blob’s default pointer moves back to its parent, or to the newest other revision that is usable. The web labels these two outcomes Delete and Discard; the wire call is identical.

DELETE /revisions/:id

Requires Admin access to the revision’s blob — the one lifecycle operation with a higher bar than Write.

Path Parameters

The matrix

“Usable” means committed and ready. Resolving where the pointer goes on a discard walks the blob’s revisions newest-first, skipping unusable ones, so one usable revision behind a page of unusable ones is still found.

What is deleted with it

Deleting or discarding a revision deletes everything that belongs to it — its sessions, executions, objects and threads. A blob’s other revisions are untouched.

Response

Returns {"status": "success"} — no body beyond the status. The revision moves to deleting synchronously and the row itself disappears once the async worker finishes.

Errors

Example

failed_operation: which operation left a revision failed

Three flows land a revision at status: failed: a failed create, a failed commit (whose rollback moves phase back to draft), and a failed discard or delete. All three can leave phase: draft / status: failed with nothing on the row to say which one happened — so failed_operation records it. failed_operation is absent on every revision written before this field existed, and on every revision that never failed — treat an absent value on a failed revision as “failed, cause unknown”, and offer Reset and Delete without a labelled retry. It is cleared automatically the moment status returns to ready (through Reset), so a recovered revision never carries a stale cause.

See also