Skip to main content
Each project gets isolated object storage. Keys are tenant-relative — you see uploads/report.pdf, never a shared global namespace — and one project can never address another’s objects. Bytes move through short-lived signed URLs, so large uploads and downloads never proxy through the API.

CLI

The signed-URL flow (API / MCP)

Uploading is two steps — create the signed upload, then PUT the bytes:
byteLength must match the upload exactly, and the URL expires quickly — mint it right before sending. Downloads mirror the shape: POST .../storage/downloads with {"key": "..."} returns { url, expiresAt }. Over MCP:
Full contracts in the Storage API.

Deleting objects

Deletes are idempotent. Over the raw API the key travels as a single URL-encoded path segment (/ becomes %2F):
The CLI and MCP client handle the encoding for you.

Roles and billing

Listing and downloading need member; creating uploads requires active billing; deleting requires admin. Storage meters storage.objects per GB-month plus network.egress per GB — see the rate card.