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
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.