Skip to content

A signed URL to an asset

POST
/api/v1/assets/{id}/signed-url
curl --request POST \
--url http://localhost:3000/api/v1/assets/example/signed-url \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "expiresIn": 604800 }'

Asset bytes are private: /a/{id} serves people who can see the asset. A signed URL lets anyone who holds it in until it expires, originals, renditions and downloads alike, while the asset may be used. Takes share on it; only an approved, unexpired asset out of embargo. To serve it to anyone for good, PATCH it public: true instead.

Scope: write.

id
required
string

Asset id

Media typeapplication/json
object
expiresIn

Seconds it works for: a minute to a year, a week when left out

integer
default: 604800 >= 60 <= 31536000

The URL

Media typeapplication/json
object
data
required
object
url
required

The original, its name at the end; add a rendition after the id, /a/{id}/w_800,f_webp/summer-hero.webp?s=…, or ?download

string format: uri
expiresAt
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)))$/
Examplegenerated
{
"data": {
"url": "https://example.com",
"expiresAt": "2026-04-15T12:00:00Z"
}
}

An error

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