find_files. Eleven methods here. API detail: Files.
upload
POST /v1/files, multipart/form-data — the one method in the client that does not send JSON. The file part carries the bytes; other parts are metadata:
title, description, tags (comma-separated) and folder are optional; the body is capped at 25 MiB. The stored file carries kind (derived from the content type), source: { type: "upload" } and, for an image, its width/height.
createUpload
POST /v1/files/uploads. A one-shot link for up to 60 MiB: PUT the bytes to upload_url within 15 minutes, with the same Content-Type and a Content-Length of exactly size_bytes. The PUT needs no key, so a browser can send the bytes straight to it. Its answer is the published file, with the id file_id already named.
import
POST /v1/files/imports. The API fetches a public http(s) URL server-side and stores it as a published file with source.type: "url_import". The client sends the Idempotency-Key for you, so a retried call replays the same file.
string
required
Public
http(s) URL; private and local hosts are refused.string
A human title.
string
A longer, searchable description.
string[]
Labels to filter by.
string
Put the file in this folder.
list
GET /v1/files. FileFilter extends the page query with:
"session" | "published"
Only scratch, or only published artifacts.
string
Only files a given session produced.
string
image, video, audio, document or other, or several comma-separated.string
None of these kinds, comma-separated.
string
Only files an agent’s sessions made.
string
Exactly these files: up to 100
fil_ ids, comma-separated.FileSourceType
Provenance —
upload, url_import, image_generation, …string
Only files carrying this tag.
string
Case-insensitive substring of the title, name or description.
"desc" | "asc"
Newest first (the default) or oldest first.
string
Only files in this folder. Case does not matter.
get
GET /v1/files/{id} — the metadata object.
update
PATCH /v1/files/{id}. Library metadata only — title, description (each a string, or null to clear), tags (replaces the list) and folder (a name, or null to take the file out of its folder). The bytes, name, scope and provenance never change.
move
POST /v1/files/move. Puts up to 100 files (ids) in a folder, or moves every file in the folder from: a rename, or a merge when folder is already in use. folder: null takes the files out of any folder. Name ids or from, not both. The answer is { object: "file_move", folder, file_ids }, where folder is the spelling that won: a name that matches an existing folder in another case takes that folder’s spelling. No file is ever deleted.
folders
GET /v1/files/folders. Every folder, newest first, in one page. Each has name, file_count, newest_at, cover_file_ids (up to four of its newest pictures and clips) and agent_id (the one agent that made every file in it, else null). Read a folder’s files with list({ folder }). See Folders.
download
GET /v1/files/{id}?download=true — the file decoded as UTF-8 text, through the API. A download is authorized by the same key as every other read; there is no unauthenticated URL unless you publish. For text only: an image, audio or video file comes back mangled, so use downloadBytes.
downloadBytes
publish
POST /v1/files/{id}/publish. The promotion boundary: session scratch becomes a durable org artifact. Idempotent — publishing twice is fine.
delete
DELETE /v1/files/{id}.
deleteMany
POST /v1/files/delete. Deletes up to 100 files in one request. An id the organization does not hold is skipped. The answer is { object: "file_delete", file_ids }, the ids that were deleted.