/supabase/proxy/. The HTTP method, query parameters, and JSON body are forwarded as-is; the upstream status code and body are returned verbatim.
Scoping Rules
Naive holds an org-wide Supabase access token, so every request is validated against the app before it is forwarded:| Path pattern | Rule |
|---|---|
v1/projects/{ref}/** | {ref} must be this app’s Supabase project ref (visible as supabase.projectRef on GET /v1/apps/:id). |
DELETEon the project itself — useDELETE /v1/apps/:idso all linked infrastructure is cleaned up together.- All org/account-level paths (listing organizations, creating projects, other projects) —
403 forbidden.
frontend_only apps have no Supabase project and return 501 feature_not_configured.
Methods
GET, POST, PATCH, PUT, DELETE, with JSON bodies.
Useful Operations
| Operation | Method + path |
|---|---|
| Run SQL | POST v1/projects/{ref}/database/query |
| Apply a tracked migration | POST v1/projects/{ref}/database/migrations |
| Auth config | GET / PATCH v1/projects/{ref}/config/auth |
| Storage config | GET / PATCH v1/projects/{ref}/config/storage |
| Edge functions | GET / PUT v1/projects/{ref}/functions |
| Project secrets | GET / POST v1/projects/{ref}/secrets |
| PostgREST config | GET / PATCH v1/projects/{ref}/postgrest |
| API keys | GET v1/projects/{ref}/api-keys |
| Project health | GET v1/projects/{ref}/health |
Data Plane Passthrough
Beyond the Management API (api.supabase.com), four data-plane passthroughs hit the app’s own Supabase project URL with the service-role key injected. Each backs a first-class primitive:
| Route | Forwards to | Primitive |
|---|---|---|
ANY /v1/apps/:id/db/rest/* | {projectUrl}/rest/v1/* (PostgREST) | Database |
ANY /v1/apps/:id/storage/proxy/* | {projectUrl}/storage/v1/* | Storage |
ANY /v1/apps/:id/auth/proxy/* | {projectUrl}/auth/v1/* (GoTrue) | Auth |
ANY /v1/apps/:id/functions/proxy/* | {projectUrl}/functions/v1/* | Edge Functions |
Prefer, Range, Accept, Accept-Profile, Content-Profile) are forwarded on db/rest.
Errors
403