Skip to main content
Buckets and objects on the organization’s fullstack app. Nine methods: three on buckets, six on objects. Every one takes an optional app; without it the organization’s single fullstack app is used — none is 404 not_found, two or more is 409 ambiguous_app naming them. API detail: Storage.

buckets.list

GET /v1/apps/{id}/storage/buckets. A Bucket is { object: "bucket", name, public, created_at }.

buckets.create

POST /v1/apps/{id}/storage/buckets. Private unless public: true. An existing name is 409 name_conflict.

buckets.delete

DELETE /v1/apps/{id}/storage/buckets/{bucket}. A non-empty bucket is refused unless force: true, which empties it first.

list

GET /v1/apps/{id}/storage/buckets/{bucket}/objects, cursor-paginated, keys under prefix. A StorageObject is { object: "storage_object", bucket, key, size_bytes, content_type, etag, updated_at }.

upload

PUT /v1/apps/{id}/storage/buckets/{bucket}/objects/{key}, the bytes inline (up to 50 MiB). Uint8Array is sent as application/octet-stream, a string as text/plain; charset=utf-8, anything else is JSON-encoded as application/json; contentType overrides. A key may contain /; each segment is encoded for you.

download

GET /v1/apps/{id}/storage/buckets/{bucket}/objects/{key} — the bytes and the type they were stored under, through the API with your key.

remove

One DELETE /v1/apps/{id}/storage/buckets/{bucket}/objects/{key} per key, in order. A key that is already gone is not an error, and the call resolves with nothing once every key is gone.

signedUploadUrl

POST /v1/apps/{id}/storage/buckets/{bucket}/objects/{key}/upload-url. A SignedUrl is { object: "signed_url", url, method, expires_at }; PUT the bytes to url with the same Content-Type before expires_at. expiresSeconds is 60–3600, default 900.

signedUrl

GET /v1/apps/{id}/storage/buckets/{bucket}/objects/{key}?signed=true — a one-hour GET URL for handing to a browser or another service.