Skip to content
lumalabs.ai

Files

Upload a file
$ luma-agents-cli files create
POST/files
List files
$ luma-agents-cli files list
GET/files
Complete a presigned upload
$ luma-agents-cli files complete
POST/files/{file_id}/complete
Get a file
$ luma-agents-cli files get
GET/files/{file_id}
Delete a file
$ luma-agents-cli files delete
DELETE/files/{file_id}
ModelsExpand Collapse
create_file_response: object { id, file, state, upload }

Result of POST /files. In the multipart (inline) flow upload is null and the file is already pending ingest. In the presigned (JSON) flow upload carries the PUT envelope and the file stays pending until you call POST /files/{file_id}/complete. Top-level id and state are conveniences that mirror file.id and file.state; the full record is always under file.

id: string

File identifier.

file: object { id, created_at, mime_type, 8 more }

A file in the caller's namespace.

id: string

File identifier, referenced as ImageRef.file_id.

created_at: string

Creation timestamp.

mime_type: string

MIME type of the stored bytes (for example, image/jpeg).

purpose: "input" or "reference"

How the file is intended to be used in a generation. input is the primary subject (e.g. the source image for an edit); reference is style/content guidance.

"input"
"reference"
size_bytes: number

Size of the stored object in bytes.

state: "pending" or "ready" or "failed" or "deleted"

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

"pending"
"ready"
"failed"
"deleted"
deleted_at: optional string

Soft-delete timestamp, if the file was deleted.

expires_at: optional string

TTL set at upload, if any. After this time Luma may automatically delete the file and reclaim its bytes — you don't need to call DELETE yourself.

failure_reason: optional string

Human-readable reason when state is failed.

filename: optional string

Original filename supplied at upload, if any.

user_id: optional string

The opaque end-user tag supplied at upload, echoed back unchanged. Abuse-attribution only; not an access-control primitive.

state: "pending" or "ready" or "failed" or "deleted"

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

"pending"
"ready"
"failed"
"deleted"
upload: optional object { expires_at, method, url, headers }

Where to PUT the file bytes for a presigned (JSON) upload. Issue an HTTP PUT of the raw bytes to url with the given headers, then call POST /files/{file_id}/complete.

expires_at: string

When the presigned URL expires.

method: string

HTTP method to use for the upload — always PUT.

url: string

Presigned S3 URL to PUT the bytes to.

headers: optional map[string]

Headers that must be sent with the PUT request.

file: object { id, created_at, mime_type, 8 more }

A file in the caller's namespace.

id: string

File identifier, referenced as ImageRef.file_id.

created_at: string

Creation timestamp.

mime_type: string

MIME type of the stored bytes (for example, image/jpeg).

purpose: "input" or "reference"

How the file is intended to be used in a generation. input is the primary subject (e.g. the source image for an edit); reference is style/content guidance.

"input"
"reference"
size_bytes: number

Size of the stored object in bytes.

state: "pending" or "ready" or "failed" or "deleted"

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

"pending"
"ready"
"failed"
"deleted"
deleted_at: optional string

Soft-delete timestamp, if the file was deleted.

expires_at: optional string

TTL set at upload, if any. After this time Luma may automatically delete the file and reclaim its bytes — you don't need to call DELETE yourself.

failure_reason: optional string

Human-readable reason when state is failed.

filename: optional string

Original filename supplied at upload, if any.

user_id: optional string

The opaque end-user tag supplied at upload, echoed back unchanged. Abuse-attribution only; not an access-control primitive.

file_list: object { data, has_more, next_cursor }

Keyset-paginated page of files, newest first. When has_more is true, pass next_cursor back as the cursor query parameter to fetch the next page. next_cursor is opaque.

data: array of File { id, created_at, mime_type, 8 more }

Files in this page.

id: string

File identifier, referenced as ImageRef.file_id.

created_at: string

Creation timestamp.

mime_type: string

MIME type of the stored bytes (for example, image/jpeg).

purpose: "input" or "reference"

How the file is intended to be used in a generation. input is the primary subject (e.g. the source image for an edit); reference is style/content guidance.

"input"
"reference"
size_bytes: number

Size of the stored object in bytes.

state: "pending" or "ready" or "failed" or "deleted"

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

"pending"
"ready"
"failed"
"deleted"
deleted_at: optional string

Soft-delete timestamp, if the file was deleted.

expires_at: optional string

TTL set at upload, if any. After this time Luma may automatically delete the file and reclaim its bytes — you don't need to call DELETE yourself.

failure_reason: optional string

Human-readable reason when state is failed.

filename: optional string

Original filename supplied at upload, if any.

user_id: optional string

The opaque end-user tag supplied at upload, echoed back unchanged. Abuse-attribution only; not an access-control primitive.

has_more: boolean

Whether more files exist beyond this page.

next_cursor: optional string

Opaque cursor for the next page, when has_more is true.

file_purpose: "input" or "reference"

How the file is intended to be used in a generation. input is the primary subject (e.g. the source image for an edit); reference is style/content guidance.

"input"
"reference"
file_state: "pending" or "ready" or "failed" or "deleted"

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

"pending"
"ready"
"failed"
"deleted"
presigned_upload: object { expires_at, method, url, headers }

Where to PUT the file bytes for a presigned (JSON) upload. Issue an HTTP PUT of the raw bytes to url with the given headers, then call POST /files/{file_id}/complete.

expires_at: string

When the presigned URL expires.

method: string

HTTP method to use for the upload — always PUT.

url: string

Presigned S3 URL to PUT the bytes to.

headers: optional map[string]

Headers that must be sent with the PUT request.