Skip to content

Edit an asset, or review what was proposed

PATCH
/api/v1/assets/{id}
curl --request PATCH \
--url http://localhost:3000/api/v1/assets/example \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "tags": [ "example" ], "fields": { "additionalProperty": "example" }, "title": "example", "description": "example", "creator": "example", "copyright": "example", "status": "draft", "reviewNote": "example", "proposedTags": [ "example" ], "proposedFields": { "additionalProperty": "example" }, "rights": { "license": "example", "territories": [ "example" ], "channels": [ "example" ], "embargo": "2026-04-15", "expires": "2026-04-15", "modelRelease": "released", "downloadable": true }, "origin": "shot", "parentAssetId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "generator": "example", "prompt": "example", "supersededBy": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "private": true, "public": true, "focus": { "x": 1, "y": 1 } }'

Also its rights (replaced whole), provenance (origin, parentAssetId, generator, prompt), and supersededBy: the asset that replaces it, which /api/v1/check then names. status moves it through its lifecycle: draft, proposed (in review), active (approved), archived, rejected. Submitting or reworking a draft takes write; any other move takes write with the approve ability. Whoever proposed an asset (proposedBy, the same key or person) can’t approve it: 403, someone else does.

Scope: write.

id
required
string

Asset id

Media typeapplication/json
object
tags

Replaces the whole set

Array<string>
<= 100 items
fields

Merges; null clears one unless it is required

object
key
additional properties
title
Any of:
string
<= 2000 characters
description
Any of:
string
<= 2000 characters
creator
Any of:
string
<= 2000 characters
copyright
Any of:
string
<= 2000 characters
status

“proposed” submits a draft for review; “active” approves it; “rejected” turns it down and keeps it, with reviewNote; “archived” retires it, and /a/{id} answers 410. Anything but submitting or reworking a draft takes approve

string
Allowed values: draft proposed active archived rejected
reviewNote
Any of:
string
<= 2000 characters
proposedTags

Replaces the pending suggestions; [] dismisses them all

Array<string>
<= 100 items
proposedFields

The suggested values to keep waiting, by key; the rest are dismissed. {} dismisses them all. Accept one by setting it in fields

object
key
additional properties
rights
Any of:
object
license
Any of:
string
<= 200 characters
territories

Countries it may run in (ISO 3166-1 alpha-2); empty: anywhere

Array<string>
<= 250 items
channels

What it may be used for, e.g. web, print, paid-social; empty: anything

Array<string>
<= 50 items
embargo
Any of:
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
expires
Any of:
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
modelRelease
Any of:
string
Allowed values: released missing not-needed
downloadable

Whether people outside the project may download the file itself; null follows its license (isDownloadable). Either way they see it.

boolean | null
origin
Any of:
string
Allowed values: shot licensed generated
parentAssetId
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
generator
Any of:
string
<= 200 characters
prompt
Any of:
string
<= 10000 characters
supersededBy
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
private

Only people with a grant on it, or on a collection it is in, and admins see it

boolean
public

Serve it at /a/{id} to anyone, for embedding, while it may be used. Takes share on it

boolean
focus
Any of:
object
x
required
number
<= 1
y
required
number
<= 1

The updated asset

Media typeapplication/json
object
data
required
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
projectId
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
sha256
required
string
filename
required
string
mime
required
string
size
required
integer
>= -9007199254740991 <= 9007199254740991
width
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
height
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
probe
required
Any of:
object
key
additional properties
metadata
required
Any of:
object
title
string
description
string
keywords
Array<string>
creator
string
copyright
string
capturedAt
string
camera
string
lens
string
gps
object
lat
required
number
lon
required
number
focus

The point crops keep in frame, 0 to 1 from the top left

object
x
required
number
y
required
number
tags
required
Array<string>
fields
required

The asset’s own values

object
key
additional properties
string | number | boolean
inherited
required

Values inherited from its collections; own values win

object
key
additional properties
string | number | boolean
status
required

Draft, proposed (in review), active (approved), archived or rejected

string
Allowed values: draft proposed active archived rejected
state
required

The status; expired for an approved asset past its last day of use; deleted, until restored or purged

string
Allowed values: draft proposed active expired archived rejected deleted
deletedAt
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
stackId
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
version
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
current
required

Its stack’s current approved version: the others are superseded by it

boolean
proposedBy
required

For a proposal: who made it, a person’s or an API key’s name

string | null
reviewNote
required

Why a person rejected it

string | null
proposedTags
required
Array<string>
proposedFields
required

Custom field values an agent suggested, waiting for a person to accept or dismiss

object
key
additional properties
string | number | boolean
working
required
Any of:
object
label
required
string
by
required

The agent’s name

string
until
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
rights
required
Any of:
object
license
required
string | null
territories
required

ISO 3166-1 alpha-2; empty: anywhere

Array<string>
channels
required

Empty: any use

Array<string>
embargo
required
Any of:
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
expires
required
Any of:
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
modelRelease
required
Any of:
string
Allowed values: released missing not-needed
downloadable

Set by a person; null or missing follows the license (see downloadable on its description)

boolean | null
origin
required
Any of:
string
Allowed values: shot licensed generated
parentAssetId
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
generator
required
string | null
prompt
required
string | null
c2pa
required
Any of:
object
manifests
required
integer
>= -9007199254740991 <= 9007199254740991
generator
required

The app that signed it

string | null
title
required
string | null
signedBy
required

The signing certificate’s organization, as the file claims it; not verified

string | null
actions
required
Array<string>
digitalSourceType
required

IPTC: digitalCapture, trainedAlgorithmicMedia…

string | null
softwareAgent
required

The tool the actions name, often the model

string | null
ingredients
required
integer
>= -9007199254740991 <= 9007199254740991
via
required
Any of:
string
Allowed values: agent import
supersededBy
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
private
required

Its own flag; it is private too when every collection it is in is

boolean
public
required

Served at /a/{id} to anyone while it may be used; otherwise to people who can see it, and signed URLs

boolean
collections
required
Array<string>
createdAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
updatedAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
Example
{
"data": {
"status": "draft",
"state": "draft",
"rights": {
"modelRelease": "released"
},
"origin": "shot",
"via": "agent"
}
}

An error

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
detail
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": "example"
}
}