Rendley docs

Uploads

#List uploads

GET/v1/uploads

List uploads for a project, or get a single upload when a file hash is provided. An optional role filter scopes the list to one lifecycle role (the editor's hash sync passes role=library so pending/transient files are invisible to its reconciliation; the pending poller passes role=pending).

Query parameters

project_idstringRequired

Project ID

hashstringOptional

File hash to fetch a single upload

rolestringOptional

Filter by lifecycle role

Response codes
200

OK

400

Bad Request

401

Unauthorized

403

Forbidden

#Create an upload

POST/v1/uploads

Create a single upload and get a presigned URL to upload the file bytes to.

Request body

durationnumberOptional
file_hashstringRequired
file_sizeintegerOptional
media_idstringRequired
metadatastringOptional
mime_typestringOptional
original_file_namestringOptional
project_idstringRequired
role"library" | "pending" | "staged" | "transient"Optional

Role is the sync-lifecycle tag: "library" (reconciled by the editor's hash sync), "pending" (awaiting auto-injection into the library; invisible to the sync), "staged" (agent/AI workflow file; invisible to the sync AND not auto-injected — adopted to library only when explicitly referenced) or "transient" (never a library asset). Defaults to "library", or "pending" when Source is "mcp".

source"editor" | "mcp" | "agent" | "export" | "ai" | "duplicate"Optional

Source is provenance: which flow created the upload.

Response codes
200

OK

400

Bad Request

401

Unauthorized

403

Forbidden

#Delete an upload

DELETE/v1/uploads

Delete an upload from a project by its file hash. With scope=library the delete only applies to role=library rows (a no-op otherwise) — the editor's hash sync uses this so it can never remove pending or transient files. Without scope, any role is deleted (daemons/cleanup flows rely on this).

Query parameters

project_idstringRequired

Project ID

hashstringRequired

File hash of the upload to delete

scopestringOptional

Restrict the delete to a lifecycle role

Response codes
200

OK

400

Bad Request

401

Unauthorized

403

Forbidden

#Complete an upload

POST/v1/uploads/{id}/complete

Mark a single upload as completed by its ID.

Path parameters

idstring

Upload ID

Response codes
200

OK

401

Unauthorized

404

Not Found

Retag role=pending and role=staged uploads to role=library for the given file hashes, making them visible to the editor's hash sync, and return the hashes that flipped. For pending rows call only AFTER the project JSON referencing these files has been saved; staged rows are adopted by the editor at the moment it would otherwise upload the bytes.

Request body

file_hashesstring[]Required
project_idstringRequired
Response codes
200

OK

400

Bad Request

401

Unauthorized

403

Forbidden

#Create a batch of uploads

POST/v1/uploads/batch

Create multiple uploads at once, returning presigned URLs for accepted files and reasons for rejected ones.

Request body

filesobject[]Required
durationnumberOptional
file_hashstringRequired
file_sizeintegerOptional
media_idstringRequired
metadatastringOptional
mime_typestringOptional
original_file_namestringOptional
project_idstringRequired
role"library" | "pending" | "staged" | "transient"Optional

Role is the sync-lifecycle tag: "library" (reconciled by the editor's hash sync), "pending" (awaiting auto-injection into the library; invisible to the sync), "staged" (agent/AI workflow file; invisible to the sync AND not auto-injected — adopted to library only when explicitly referenced) or "transient" (never a library asset). Defaults to "library", or "pending" when Source is "mcp".

source"editor" | "mcp" | "agent" | "export" | "ai" | "duplicate"Optional

Source is provenance: which flow created the upload.

project_idstringRequired
Response codes
200

OK

400

Bad Request

401

Unauthorized

403

Forbidden

#Complete a batch of uploads

POST/v1/uploads/batch/complete

Mark a batch of uploads as completed by their upload IDs.

Request body

upload_idsstring[]Required
Response codes
200

OK

400

Bad Request

401

Unauthorized

#Abort a multipart upload

POST/v1/uploads/multipart/abort

Abort an in-progress multipart upload.

Request body

s3_upload_idstringRequired
upload_idstringRequired
Response codes
200

OK

400

Bad Request

401

Unauthorized

#Complete a multipart upload

POST/v1/uploads/multipart/complete

Complete a multipart upload by submitting the uploaded parts.

Request body

partsobject[]Required
etagstringRequired
part_numberintegerRequired
s3_upload_idstringRequired
upload_idstringRequired
Response codes
200

OK

400

Bad Request

401

Unauthorized

#Initiate a multipart upload

POST/v1/uploads/multipart/initiate

Initiate a multipart upload and get presigned URLs for each part.

Request body

durationnumberOptional
file_hashstringRequired
file_sizeintegerOptional
media_idstringRequired
metadatastringOptional
mime_typestringOptional
original_file_namestringOptional
part_countintegerRequired
project_idstringRequired
role"library" | "pending" | "staged" | "transient"Optional

Role is the sync-lifecycle tag: "library" (reconciled by the editor's hash sync), "pending" (awaiting auto-injection into the library; invisible to the sync), "staged" (agent/AI workflow file; invisible to the sync AND not auto-injected — adopted to library only when explicitly referenced) or "transient" (never a library asset). Defaults to "library", or "pending" when Source is "mcp".

source"editor" | "mcp" | "agent" | "export" | "ai" | "duplicate"Optional

Source is provenance: which flow created the upload.

Response codes
200

OK

400

Bad Request

401

Unauthorized

403

Forbidden