Docs

Start here

A signed read URL for a file you uploaded

GET/v1/uploads/{path}on https://api.auray.ai/v1

The second step of an upload, and a separate one by measurement: storage refuses to sign a read for an object that does not exist, so the read URL cannot come back beside the upload URL without pro…

The second step of an upload, and a separate one by measurement: storage refuses to sign a read for an object that does not exist, so the read URL cannot come back beside the upload URL without promising a file nobody has sent. PUT the bytes to upload_url, then ask here. The URL is good for seven days at most — long enough for any model's fetch and any queue — and never past the upload, which is deleted seven days after it landed: it is signed for what the upload has left, and expires_at says when; a fresh one can be asked for while the upload is kept. An upload kept past its seven days — while something of the account's is held after a report, or while a 3D draft of yours still uses it — is signed for seven days. It is what a catalogue model's _url field takes. An upload past its seven days that nothing keeps is 410 expired with reason: retention_ended, and nothing is signed, until the retention sweep deletes it, normally within minutes; it is 404 not_found after that.

path is the <user_id>/<file> the upload answered; another account's folder, a file that was never PUT, or one deleted after its seven days is 404 not_found. address picks the bucket the way it did on the upload, and any scope that may upload for that address reads back through it the account's files of the kinds that address takes — the kind it makes (image:write, 3d:write, …) or the older product name; the upload's read link names it, and a path of another kind is 404 not_found through it. The deprecated product picks a bucket by name and takes the scopes the upload by that product took — for external, external:write, or a kind's scope for the kinds of file some address of that kind takes, a path of another kind refused 403 insufficient_scope naming the scopes that would reach it. Naming neither looks only in the buckets whose own scope the key holds — the catalogue models' with external:write, then 3D's with 3d:write or threed:write. A key without external:write, as every key Account mints is, is refused 403 insufficient_scope there, with the address as the way out, unless our 3D's bucket holds the file and the key holds 3d:write or threed:write; so keep the query the read link carries. assets:read alone reads nothing back: it fetches what a job made, and an upload is something the caller sent.

#Authentication

Authorization: Bearer auray_sk_… — Through address, a scope that may upload for it — the kind it makes or the older product name — for a file of a kind it takes. Through product, the scopes the upload by that product takes. Naming neither address nor product, the bucket's own: external:write for the catalogue models' inputs, 3d:write or threed:write for 3D's. assets:read alone does not.

#Request

#Path parameters

NameTypeRequiredDescription
pathstringyes<user_id>/<file>, as the upload answered it.

#Query parameters

NameTypeRequiredDescription
addressstringnoThe address the file was uploaded for — what the upload's read link carries.
productstringnoDeprecated: name the address. Which product's bucket the path is in. One of "threed", "external".

#Example request

curl "https://api.auray.ai/v1/uploads/86e97633-…/chair-scan-3.glb?address=hitem3d%2Fhi3d%2Fsplit" \
  -H "Authorization: Bearer $AURAY_API_KEY"

#Responses

#200 OK

A signed read URL.

FieldTypeRequiredDefaultDescription
objectstringyes—One of "upload".
pathstringyes—
bucketstringyes—
urlstringyes—Signed; fetchable by anyone who holds it until expires_at: at most seven days, never past the upload. A URL.
expires_atstringyes—
request_idstringyes—

#400 Bad Request

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#401 Unauthorized

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#403 Forbidden

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#404 Not Found

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#410 Gone

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#429 Too Many Requests

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#503 Service Unavailable

A refusal.

The error body: error, message, docs (the entry that explains it) and request_id.

#Status codes

StatusMeaning
200A signed read URL.
400A refusal.
401A refusal.
403A refusal.
404A refusal.
410A refusal.
429A refusal.
503A refusal.

Every refusal names its code, and every code is explained at Errors.

Start typing to search every page of the documentation.

Up arrow Down arrow to moveEnter to openEscape to close