Files and uploads
Uploading a file into a space is a two-step, presigned flow: you register the file to get a short-lived upload URL, then PUT the bytes straight to storage. Registering requires space:contribute on the space; reading requires space:read.
Uploads never stream through the gateway — you always PUT to a presigned upload URL from your own environment. This is the right path for large files and for anything you want to keep in a space (unlike the transient /process API).
The flow
1. Register
Body fields:
fileName(required)mimeType(required) — drives both the stored record and the exactContent-Typethe PUT must send.size— bytes, optional.processingKind— optional; same five values as/process(doc-simple,doc-ocr,doc-auto,audio-transcribe,audio-transcribe-and-diarize).indexVectors/indexOntology— optional booleans, both defaulttrue(the file is indexed for search and the knowledge graph unless you opt out).
Any parentType/parentId in the body are ignored — the parent is forced to :spaceId.
Response — 201
uploadUrl is a presigned upload URL valid for 15 minutes (uploadExpiresAt).
2. Upload the bytes
PUT the raw file directly to uploadUrl. This goes directly to object storage, not through the gateway. The Content-Type must be exactly the mimeType you registered — a mismatch rejects the PUT.
3. Poll until terminal
Poll status until it settles:
Once terminal, the record’s urls object carries minted download links (valid ~1 hour):
urls.file— the original fileurls.processedMd— extracted markdown (once produced)urls.processedJson— structured / grounded JSON (once produced)
List files in a space
?limit defaults to 50, max 200. Files have no cursor — the list returns a single most-recent page. See Pagination and filtering.
Retry a failed file
Resets the file to waiting. Returns 409 if the file isn’t currently failed.
Accessing a file id from the wrong space returns 404 — existence is hidden across spaces (a space:read leak-guard). Org admins bypass space checks.
Org-level template files
Organization template files use the same presigned shape under POST /organization/templates.