Skip to main content
The Storage primitive proxies a fullstack app’s Supabase Storage API (/storage/v1) with the project service-role key injected. App-scoped, on both the company mount (/v1/apps/:id/...) and per-user mount (/v1/users/:user_id/apps/:id/...). On per-user mounts the kit must enable the storage primitive.

Endpoint

MethodPathDescription
ANY/v1/apps/:id/storage/proxy/*Supabase Storage API passthrough (/storage/v1/*)
Everything after storage/proxy/ maps to the project’s /storage/v1/:
OperationMethod + path
List bucketsGET storage/proxy/bucket
Create bucketPOST storage/proxy/bucket
Get / delete bucketGET / DELETE storage/proxy/bucket/{id}
List objectsPOST storage/proxy/object/list/{bucket}
Upload objectPOST storage/proxy/object/{bucket}/{path}
Download objectGET storage/proxy/object/{bucket}/{path}
Delete objectsDELETE storage/proxy/object/{bucket} (body: { prefixes })
curl https://api.usenaive.ai/v1/apps/<app-id>/storage/proxy/bucket \
  -H "Authorization: Bearer nv_sk_live_..."
Binary uploads are best done with a Supabase signed upload URL (POST .../storage/v1/object/upload/sign/{bucket}/{path}) then a direct PUT of the bytes — the JSON proxy is intended for metadata and text/JSON content.

SDK

await naive.storage.createBucket("avatars", { public: true });
await naive.forUser(userId).storage.list("avatars", { prefix: "users/" });
See the Storage guide and the storage sub-client.