Revisions

Each replacement creates a new immutable revision while the asset keeps one stable identity and delivery URL.

GET/api/assets/{asset_id}/versions
200 OK

List all retained revisions, newest first.

Required scopeassets:read
Response item
{
  "id": "revision_uuid",
  "versionNumber": 42,
  "byteSize": 2841024,
  "width": 2400,
  "height": 1600,
  "mime": "image/webp",
  "hash": "sha256...",
  "label": "Launch approved",
  "note": "Final color correction",
  "isCurrent": true,
  "scanStatus": "clean",
  "metadataStatus": "complete",
  "createdAt": "2026-08-17T18:31:00"
}
PATCH/api/assets/{asset_id}/versions/{version}
200 OK

Add or clear a revision label and note.

Required scopeassets:write
Request body
{
  "label": "Launch approved",
  "note": "Final color correction"
}
POST/api/assets/{asset_id}/versions/{version}/promote
200 OK

Make an older clean revision current without creating another revision.

Required scopeassets:write
When scanning is enabled, only revisions with scanStatus: clean can be promoted.
DELETE/api/assets/{asset_id}/versions/{version}
200 OK

Delete one retained revision and its cached transforms. Deleting the current revision requires force=true.

Required scopeassets:write
With force=true, the highest remaining revision becomes current. If no revisions remain, the file identity and bucket links are deleted.