Browse documentation

Every table below is generated from the decorators in apps/server/controllers/*.controller.ts: the backend's npm run docs:routes writes docs/admin-routes.md, and this repo's npm run docs:sync splices that file between the markers below. apps/server/tests/route-manifest.unit.test.ts fails the backend build when the committed table no longer matches the code. Base paths declared as constants — the HTTP_ROUTES.* ones behind /rest/v1, /api/edge, /api/files and /realtime/v1/api/broadcast — are resolved, so every path here is one you can call.

Routes are mounted automatically by awilix-express's loadControllers, so this is the whole controller surface. Auth routes (/api/auth/*) are owned by Better Auth and are not in this table — see Auth. A handful of endpoints are mounted directly in app.ts and are listed under Outside the controllers.

Guards are the @before(...) chain, in order. adminOnly means adminGuard: a valid X-Platform-Token, or a session whose role is ADMIN. See request lifecycle.

Every response uses the shared envelope from helpers/api-response.helper.ts; errors use the shape described in the error reference.

AI assistant

Source: apps/server/controllers/ai.controller.ts

MethodPathHandlerGuards
POST/api/admin/ai/chatchatadminOnly
POST/api/admin/ai/modelsmodelsadminOnly
GET/api/admin/ai/providersprovidersadminOnly
POST/api/admin/ai/testtestadminOnly
GET/api/admin/ai/threadslistThreadsadminOnly
GET/api/admin/ai/threads/:idgetThreadadminOnly
PATCH/api/admin/ai/threads/:idrenameadminOnly
DELETE/api/admin/ai/threads/:idremoveadminOnly
POST/api/admin/ai/threads/:id/resolveresolveadminOnly

Auth admin: user administration by secret key

Source: apps/server/controllers/auth-admin.controller.ts

MethodPathHandlerGuards
POST/api/auth/admin/generate-linkgenerateLinksecretKeyOnly
POST/api/auth/admin/inviteinviteUserByEmailsecretKeyOnly
GET/api/auth/admin/userslistUserssecretKeyOnly
POST/api/auth/admin/userscreateUsersecretKeyOnly
GET/api/auth/admin/users/:idgetUserByIdsecretKeyOnly
PATCH/api/auth/admin/users/:idupdateUserByIdsecretKeyOnly
DELETE/api/auth/admin/users/:iddeleteUsersecretKeyOnly
GET/api/auth/admin/users/:id/factorslistFactorssecretKeyOnly
DELETE/api/auth/admin/users/:id/factors/:factorIddeleteFactorsecretKeyOnly
POST/api/auth/admin/users/:id/sign-outsignOutUsersecretKeyOnly

Auth: the project audit trail

Source: apps/server/controllers/admin-auth.controller.ts

MethodPathHandlerGuards
GET/api/admin/auth/audit-logsauditLogsadminOnly

Content: SQL snippets, saved log queries, reports

Source: apps/server/controllers/admin-content.controller.ts

MethodPathHandlerGuards
GET/api/admin/contentlistContentadminOnly
POST/api/admin/contentcreateContentadminOnly
GET/api/admin/content-folderslistFoldersadminOnly
POST/api/admin/content-folderscreateFolderadminOnly
PATCH/api/admin/content-folders/:idrenameFolderadminOnly
DELETE/api/admin/content-folders/:iddeleteFolderadminOnly
GET/api/admin/content/:idgetContentadminOnly
PATCH/api/admin/content/:idupdateContentadminOnly
DELETE/api/admin/content/:iddeleteContentadminOnly

Core: tables, dashboard, project info

Source: apps/server/controllers/admin-core.controller.ts

MethodPathHandlerGuards
GET/api/admin/connect-infoconnectInfoadminOnly
GET/api/admin/sessionsessionadminOnly
POST/api/admin/sqlsqladminOnly
POST/api/admin/sql/readonlysqlReadonlyadminOnly
GET/api/admin/tablestablesadminOnly

Database workflow: migration history, push, diff, dump, seed, reset, tests

Source: apps/server/controllers/admin-db.controller.ts

MethodPathHandlerGuards
POST/api/admin/db/diffdiffSchemaadminOnly
POST/api/admin/db/dumpdumpDatabaseadminOnly
GET/api/admin/db/migrationsmigrationHistoryadminOnly
POST/api/admin/db/migrationspushMigrationadminOnly
POST/api/admin/db/migrations/:version/repairrepairMigrationadminOnly
POST/api/admin/db/resetresetDatabaseadminOnly
POST/api/admin/db/seedseedDatabaseadminOnly
POST/api/admin/db/testtestDatabaseadminOnly

Database: indexes, enums, roles, privileges, publications, settings

Source: apps/server/controllers/admin-database.controller.ts

MethodPathHandlerGuards
GET/api/admin/database/column-privilegescolumnPrivilegesadminOnly
PUT/api/admin/database/column-privilegessetColumnPrivilegeadminOnly
GET/api/admin/database/configpostgresConfigadminOnly
PATCH/api/admin/database/configupdatePostgresConfigadminOnly
GET/api/admin/database/publicationslistPublicationsadminOnly
POST/api/admin/database/publicationscreatePublicationadminOnly
PATCH/api/admin/database/publications/:nameupdatePublicationadminOnly
DELETE/api/admin/database/publications/:namedropPublicationadminOnly
GET/api/admin/database/roleslistRolesadminOnly
POST/api/admin/database/rolescreateRoleadminOnly
PATCH/api/admin/database/roles/:nameupdateRoleadminOnly
DELETE/api/admin/database/roles/:namedropRoleadminOnly
GET/api/admin/schema/enumslistEnumsadminOnly
POST/api/admin/schema/enumscreateEnumadminOnly
PATCH/api/admin/schema/enums/:namealterEnumadminOnly
DELETE/api/admin/schema/enums/:namedropEnumadminOnly
GET/api/admin/schema/indexesschemaIndexesadminOnly
GET/api/admin/schema/table-statstableStatsadminOnly

Devices: push registration

Source: apps/server/controllers/device.controller.ts

MethodPathHandlerGuards
POST/api/devicesregisterauthMiddleware, registerDeviceValidator, validateRequest
DELETE/api/devicesunregisterauthMiddleware, unregisterDeviceValidator, validateRequest

Edge functions: invocation

Source: apps/server/controllers/edge-invoke.controller.ts

MethodPathHandlerGuards
GET/api/edge/:routeinvokeByRouteoptionalAuthMiddleware, edgeInvokeLimiter, edgeInvokeGuard
POST/api/edge/:routeinvokeByRouteoptionalAuthMiddleware, edgeInvokeLimiter, edgeInvokeGuard
PUT/api/edge/:routeinvokeByRouteoptionalAuthMiddleware, edgeInvokeLimiter, edgeInvokeGuard
PATCH/api/edge/:routeinvokeByRouteoptionalAuthMiddleware, edgeInvokeLimiter, edgeInvokeGuard
DELETE/api/edge/:routeinvokeByRouteoptionalAuthMiddleware, edgeInvokeLimiter, edgeInvokeGuard

Edge functions: management

Source: apps/server/controllers/edge-function.controller.ts

MethodPathHandlerGuards
GET/api/admin/edge-functionslistadminOnly
POST/api/admin/edge-functionscreateadminOnly
GET/api/admin/edge-functions/:idgetadminOnly
PATCH/api/admin/edge-functions/:idupdateadminOnly
DELETE/api/admin/edge-functions/:iddeleteadminOnly
POST/api/admin/edge-functions/:id/invokeinvokeadminOnly
GET/api/admin/edge-functions/:id/logslogsadminOnly

Files: authenticated storage API

Source: apps/server/controllers/file.controller.ts

MethodPathHandlerGuards
POST/api/filesupload...storageAuth, streamUpload.single('file')
DELETE/api/files/:idremovestorageAuth
POST/api/files/:id/finalizefinalizestorageIdentity
GET/api/files/:id/rawrawstorageAuth
GET/api/files/:id/urlgetUrlstorageAuth
POST/api/files/copycopyObjectstorageAuth
GET/api/files/list/:bucketlistObjectsstorageAuth
POST/api/files/movemoveObjectstorageAuth
GET/api/files/object-info/:bucket/*infoByKeystorageAuth
GET/api/files/object-url/:bucket/*urlByKeystorageAuth
GET/api/files/object/:bucket/*rawByKeystorageAuth
DELETE/api/files/object/:bucket/*removeByKeystorageAuth
POST/api/files/presignpresignstorageAuth

Git: inbound webhook

Source: apps/server/controllers/git-webhook.controller.ts

MethodPathHandlerGuards
POST/api/git/webhookwebhook—

Source: apps/server/controllers/admin-git.controller.ts

MethodPathHandlerGuards
GET/api/admin/git/authorizegitAuthorizeadminOnly
POST/api/admin/git/callbackgitCallbackadminOnly
POST/api/admin/git/linkgitLinkadminOnly
DELETE/api/admin/git/linkgitUnlinkadminOnly
GET/api/admin/git/reposgitReposadminOnly
GET/api/admin/git/statusgitStatusadminOnly
POST/api/admin/git/syncgitSyncadminOnly

Infrastructure: JWT signing keys, network access, log drains

Source: apps/server/controllers/admin-infrastructure.controller.ts

MethodPathHandlerGuards
GET/api/admin/auth/signing-keyssigningKeysadminOnly
POST/api/admin/auth/signing-keyscreateSigningKeyadminOnly
DELETE/api/admin/auth/signing-keys/:iddeleteSigningKeyadminOnly
POST/api/admin/auth/signing-keys/:id/revokerevokeSigningKeyadminOnly
POST/api/admin/auth/signing-keys/:id/rotaterotateSigningKeyadminOnly
GET/api/admin/log-drainslogDrainsadminOnly
POST/api/admin/log-drainscreateLogDrainadminOnly
PATCH/api/admin/log-drains/:idupdateLogDrainadminOnly
DELETE/api/admin/log-drains/:iddeleteLogDrainadminOnly
POST/api/admin/log-drains/:id/testtestLogDrainadminOnly
GET/api/admin/network-restrictionsnetworkRestrictionsadminOnly
PUT/api/admin/network-restrictionsupdateNetworkRestrictionsadminOnly
GET/api/admin/ssl-enforcementsslEnforcementadminOnly
PUT/api/admin/ssl-enforcementupdateSslEnforcementadminOnly

Integrations

Source: apps/server/controllers/integrations.controller.ts

MethodPathHandlerGuards
GET/api/admin/integrationslistadminOnly
DELETE/api/admin/integrations/:keydisconnectadminOnly
POST/api/admin/integrations/:key/connectconnectadminOnly

jwks.controller.ts

Source: apps/server/controllers/jwks.controller.ts

MethodPathHandlerGuards
GET/auth/v1/.well-known/jwks.jsonjwks—

Notifications

Source: apps/server/controllers/notification.controller.ts

MethodPathHandlerGuards
POST/api/notifications/sendsendauthMiddleware, requireRole(UserRole.ADMIN), sendNotificationValidator, validateRequest
POST/api/notifications/testtestauthMiddleware, testNotificationValidator, validateRequest

Observability: logs, metrics, advisors, jobs

Source: apps/server/controllers/admin-observability.controller.ts

GET /api/admin/logs accepts limit (default 500, capped at 5000), since (ISO timestamp or epoch ms), level, source (repeated or comma-separated) and q. It answers from platform.request_logs when log storage is on (logs.retention), and from the in-memory ring buffer otherwise; the response carries persisted, retentionDays and oldestAvailable alongside logs.

MethodPathHandlerGuards
GET/api/admin/backupsbackupsadminOnly
POST/api/admin/backupscreateBackupadminOnly
POST/api/admin/backups/clone-stagingcloneStagingadminOnly
GET/api/admin/backups/configbackupConfigadminOnly
PUT/api/admin/backups/configupdateBackupConfigadminOnly
GET/api/admin/backups/downloaddownloadBackupadminOnly
POST/api/admin/backups/exportexportProjectadminOnly
POST/api/admin/backups/export-fullexportFullProjectadminOnly
POST/api/admin/backups/extractextractBackupArchiveadminOnly
GET/api/admin/backups/listbackupsListadminOnly
POST/api/admin/backups/restorerestoreBackupadminOnly
POST/api/admin/backups/runrunBackupadminOnly
POST/api/admin/backups/uploaduploadBackupFileadminBackupUpload
GET/api/admin/logslogsapiKeyMiddleware, secretKeyOrAdmin
GET/api/admin/metrics/requestsrequestMetricsadminOnly
GET/api/admin/metrics/timeseriesmetricsTimeseriesadminOnly
GET/api/admin/performanceperformanceadminOnly
GET/api/admin/performance/index-advisorindexAdvisorStatusadminOnly
POST/api/admin/performance/index-advisoradviseIndexesadminOnly
POST/api/admin/performance/index-advisor/enableenableIndexAdvisoradminOnly
GET/api/admin/realtime/channelsrealtimeChannelsadminOnly
GET/api/admin/realtime/channels/:channel/presencerealtimePresenceadminOnly
GET/api/admin/realtime/configrealtimeConfigadminOnly
PATCH/api/admin/realtime/configupdateRealtimeConfigadminOnly
PATCH/api/admin/realtime/config/respect-rlsupdateRealtimeRespectRlsadminOnly
GET/api/admin/realtime/eventsrealtimeEventsadminOnly
GET/api/admin/realtime/queuerealtimeQueueadminOnly
GET/api/admin/statsstatsadminOnly

Operations: backups, imports, cron, retention

Source: apps/server/controllers/admin-operations.controller.ts

MethodPathHandlerGuards
GET/api/admin/cron/app/jobslistAppCronJobsadminOnly
GET/api/admin/cron/pg/jobslistPgCronJobsadminOnly
POST/api/admin/cron/pg/jobscreatePgCronJobadminOnly
PATCH/api/admin/cron/pg/jobs/:idtogglePgCronJobadminOnly
DELETE/api/admin/cron/pg/jobs/:iddeletePgCronJobadminOnly
GET/api/admin/cron/pg/jobs/:id/runspgCronJobRunsadminOnly
POST/api/admin/import/supabaseimportSupabaseadminOnly
PATCH/api/admin/jobs/:idconfigureJobadminOnly
POST/api/admin/jobs/:id/runrunJobNowadminOnly
GET/api/admin/jobs/alertslistJobAlertsadminOnly
GET/api/admin/jobs/runslistJobRunsadminOnly
GET/api/admin/migrationslistMigrationsadminOnly
POST/api/admin/migrationscreateMigrationadminOnly
GET/api/admin/migrations/:idgetMigrationadminOnly
POST/api/admin/migrations/:id/applyapplyMigrationadminOnly
POST/api/admin/migrations/:id/rollbackrollbackMigrationadminOnly
GET/api/admin/migrations/diffmigrationsDiffadminOnly

Queues: pgmq queues, messages and API exposure

Source: apps/server/controllers/admin-queues.controller.ts

MethodPathHandlerGuards
GET/api/admin/queueslistQueuesadminOnly
POST/api/admin/queuescreateQueueadminOnly
DELETE/api/admin/queues/:namedropQueueadminOnly
GET/api/admin/queues/:name/messagesbrowseMessagesadminOnly
POST/api/admin/queues/:name/messagessendMessageadminOnly
DELETE/api/admin/queues/:name/messages/:msgIddeleteMessageadminOnly
POST/api/admin/queues/:name/messages/:msgId/archivearchiveMessageadminOnly
GET/api/admin/queues/:name/permissionsqueuePermissionsadminOnly
PUT/api/admin/queues/:name/permissionssetQueuePermissionsadminOnly
POST/api/admin/queues/:name/purgepurgeQueueadminOnly
POST/api/admin/queues/:name/readreadMessagesadminOnly
POST/api/admin/queues/enableenableQueuesadminOnly
PUT/api/admin/queues/exposeexposeQueuesadminOnly

Realtime: broadcast

Source: apps/server/controllers/realtime-broadcast.controller.ts

MethodPathHandlerGuards
POST/realtime/v1/api/broadcastbroadcastoptionalAuthMiddleware, apiKeyMiddleware

REST: auto-generated table API

Source: apps/server/controllers/rest-api.controller.ts

MethodPathHandlerGuards
GET/rest/v1/:modelgetoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
HEAD/rest/v1/:modelheadoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
POST/rest/v1/:modelpostoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
PATCH/rest/v1/:modelpatchoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
DELETE/rest/v1/:modeldeleteoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
POST/rest/v1/batchbatchoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
GET/rest/v1/rpc/:fnrpcGetoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter
POST/rest/v1/rpc/:fnrpcPostoptionalAuthMiddleware, apiKeyMiddleware, restApiLimiter

Rows: table editor CRUD

Source: apps/server/controllers/admin-rows.controller.ts

MethodPathHandlerGuards
GET/api/admin/tables/:model/rowsrowsadminOnly
POST/api/admin/tables/:model/rowscreateRowadminOnly
PATCH/api/admin/tables/:model/rows/:idupdateRowadminOnly
DELETE/api/admin/tables/:model/rows/:iddeleteRowadminOnly

Schema: SQL, DDL, migrations, triggers

Source: apps/server/controllers/admin-schema.controller.ts

MethodPathHandlerGuards
GET/api/admin/rest/resourceslistRestResourcesadminOnly
GET/api/admin/schema/extensionslistExtensionsadminOnly
POST/api/admin/schema/extensions/:nameenableExtensionadminOnly
DELETE/api/admin/schema/extensions/:namedisableExtensionadminOnly
GET/api/admin/schema/functionslistFunctionsadminOnly
POST/api/admin/schema/functionscreateFunctionadminOnly
DELETE/api/admin/schema/functions/:signaturedropFunctionadminOnly
GET/api/admin/schema/graphschemaGraphadminOnly
DELETE/api/admin/schema/indexes/:namedropIndexadminOnly
GET/api/admin/schema/schemasschemaListadminOnly
GET/api/admin/schema/tablesschemaTablesadminOnly
POST/api/admin/schema/tablescreateTableadminOnly
DELETE/api/admin/schema/tables/:tabledropTableadminOnly
POST/api/admin/schema/tables/:table/columnsaddColumnadminOnly
DELETE/api/admin/schema/tables/:table/columns/:columndropColumnadminOnly
PATCH/api/admin/schema/tables/:table/columns/:column/defaultsetColumnDefaultadminOnly
PATCH/api/admin/schema/tables/:table/columns/:column/nullablesetColumnNullableadminOnly
PATCH/api/admin/schema/tables/:table/columns/:column/renamerenameColumnadminOnly
GET/api/admin/schema/tables/:table/indexeslistIndexesadminOnly
POST/api/admin/schema/tables/:table/indexescreateIndexadminOnly
GET/api/admin/schema/trigger-functionslistTriggerFunctionsadminOnly
GET/api/admin/schema/triggerslistTriggersadminOnly
POST/api/admin/schema/triggerscreateSchemaTriggeradminOnly
DELETE/api/admin/schema/triggers/:namedropSchemaTriggeradminOnly
POST/api/admin/schema/triggers/:name/enabledsetSchemaTriggerEnabledadminOnly
GET/api/admin/schema/typesschemaTypesadminOnly

Security: RLS, shield, rate limits

Source: apps/server/controllers/admin-security.controller.ts

MethodPathHandlerGuards
GET/api/admin/advisoradvisoradminOnly
GET/api/admin/api-keyslistApiKeysadminOnly
POST/api/admin/api-keyscreateApiKeyadminOnly
DELETE/api/admin/api-keys/:idrevokeApiKeyadminOnly
GET/api/admin/database/connectiondatabaseConnectionadminOnly
GET/api/admin/edge-secretslistSecretsadminOnly
PUT/api/admin/edge-secretssetSecretadminOnly
DELETE/api/admin/edge-secrets/:namedeleteSecretadminOnly
GET/api/admin/realtime/policiesrealtimePoliciesadminOnly
POST/api/admin/realtime/policiesrealtimeCreatePolicyadminOnly
DELETE/api/admin/realtime/policies/:namerealtimeDropPolicyadminOnly
GET/api/admin/rls/accessrlsAccessadminOnly
POST/api/admin/rls/policiesrlsCreatePolicyadminOnly
PUT/api/admin/rls/policiesrlsReplacePolicyadminOnly
DELETE/api/admin/rls/policiesrlsDropPolicyadminOnly
POST/api/admin/rls/simulaterlsSimulateadminOnly
POST/api/admin/rls/simulate/diffrlsSimulateDiffadminOnly
GET/api/admin/rls/tablesrlsTablesadminOnly
POST/api/admin/rls/tables/:table/presetrlsApplyPresetadminOnly
POST/api/admin/rls/tables/:table/rlsrlsToggleadminOnly
GET/api/admin/shieldshieldadminOnly
GET/api/admin/storage/connectionstorageConnectionadminOnly

Settings: settings groups and secrets

Source: apps/server/controllers/admin-settings.controller.ts

MethodPathHandlerGuards
GET/api/admin/auth/statusauthStatusadminOnly
GET/api/admin/settingssettingsListadminOnly
GET/api/admin/settings/:groupsettingsGetadminOnly
PUT/api/admin/settings/:groupsettingsPutadminOnly
DELETE/api/admin/settings/:groupsettingsDeleteadminOnly
POST/api/admin/settings/email/testsettingsEmailTestadminOnly
POST/api/admin/settings/push/testsettingsPushTestadminOnly
POST/api/admin/settings/sms/testsettingsSmsTestadminOnly
GET/api/admin/webhookswebhooksadminOnly
POST/api/admin/webhookscreateWebhookadminOnly
PATCH/api/admin/webhooks/:idupdateWebhookadminOnly
DELETE/api/admin/webhooks/:iddeleteWebhookadminOnly
GET/api/admin/webhooks/:id/deliverieswebhookDeliveriesadminOnly
POST/api/admin/webhooks/:id/testtestWebhookadminOnly
GET/api/admin/webhooks/eventslistWebhookEventsadminOnly

storage-render.controller.ts

Source: apps/server/controllers/storage-render.controller.ts

MethodPathHandlerGuards
GET/storage/v1/render/image/authenticated/:bucket/*renderAuthenticatedstorageAuth
GET/storage/v1/render/image/public/:slug/*renderPublic—
GET/storage/v1/render/image/sign/:bucket/*renderSigned—

Storage: bucket administration by secret key

Source: apps/server/controllers/storage-bucket.controller.ts

MethodPathHandlerGuards
GET/api/files/bucketlistapiKeyMiddleware, requireSecretKey
POST/api/files/bucketcreateapiKeyMiddleware, requireSecretKey
GET/api/files/bucket/:sluggetapiKeyMiddleware, requireSecretKey
PUT/api/files/bucket/:slugupdateapiKeyMiddleware, requireSecretKey
DELETE/api/files/bucket/:slugremoveapiKeyMiddleware, requireSecretKey
POST/api/files/bucket/:slug/emptyemptyapiKeyMiddleware, requireSecretKey

Storage: buckets, objects, tokens, CORS

Source: apps/server/controllers/admin-storage.controller.ts

MethodPathHandlerGuards
GET/api/admin/storage/bucket-deletionsbucketDeletionsadminOnly
GET/api/admin/storage/bucket-deletions/:idbucketDeletionStatusadminOnly
GET/api/admin/storage/bucketslistBucketsadminOnly
POST/api/admin/storage/bucketscreateBucketadminOnly
GET/api/admin/storage/buckets/:sluggetBucketadminOnly
PATCH/api/admin/storage/buckets/:slugupdateBucketadminOnly
DELETE/api/admin/storage/buckets/:slugdeleteBucketadminOnly
POST/api/admin/storage/buckets/:slug/copycopyBucketObjectadminOnly
GET/api/admin/storage/buckets/:slug/corsgetBucketCorsadminOnly
PUT/api/admin/storage/buckets/:slug/corsupsertBucketCorsadminOnly
DELETE/api/admin/storage/buckets/:slug/corsdeleteBucketCorsadminOnly
GET/api/admin/storage/buckets/:slug/filesbucketFilesadminOnly
POST/api/admin/storage/buckets/:slug/movemoveBucketObjectadminOnly
GET/api/admin/storage/buckets/:slug/objectslistBucketObjectsadminOnly
GET/api/admin/storage/buckets/:slug/objects/*bucketObjectRawadminOnly
DELETE/api/admin/storage/buckets/:slug/objects/*removeBucketObjectadminOnly
GET/api/admin/storage/buckets/:slug/tokenslistBucketTokensadminOnly
POST/api/admin/storage/buckets/:slug/tokenscreateBucketTokenadminOnly
DELETE/api/admin/storage/buckets/:slug/tokens/:idrevokeBucketTokenadminOnly
GET/api/admin/storage/buckets/:slug/webhookslistBucketWebhooksadminOnly
POST/api/admin/storage/buckets/:slug/webhooksaddBucketWebhookadminOnly
DELETE/api/admin/storage/buckets/:slug/webhooks/:idremoveBucketWebhookadminOnly
GET/api/admin/storage/filesstorageFilesadminOnly
POST/api/admin/storage/filesstorageUploadadminUpload
DELETE/api/admin/storage/files/:idstorageDeleteadminOnly
GET/api/admin/storage/files/:id/rawstorageFileRawadminOnly
GET/api/admin/storage/files/:id/renderstorageFileRenderadminOnly
GET/api/admin/storage/files/:id/urlstorageFileUrladminOnly

Storage: public and token API

Source: apps/server/controllers/storage-public.controller.ts

MethodPathHandlerGuards
GET/api/storage/:slug/files/:iddownload—
DELETE/api/storage/:slug/files/:idremovebucketTokenGuard('delete')
POST/api/storage/:slug/uploaduploadbucketTokenGuard('write'), streamUpload.single('file')

Storage: S3 endpoint and access keys

Source: apps/server/controllers/admin-storage-s3.controller.ts

MethodPathHandlerGuards
GET/api/admin/storage/s3connectionadminOnly
GET/api/admin/storage/s3/keyslistKeysadminOnly
POST/api/admin/storage/s3/keyscreateKeyadminOnly
DELETE/api/admin/storage/s3/keys/:idrevokeKeyadminOnly

Users: administration

Source: apps/server/controllers/admin-users.controller.ts

MethodPathHandlerGuards
GET/api/admin/usersusersadminOnly
POST/api/admin/userscreateUseradminOnly
GET/api/admin/users/:iduseradminOnly
PATCH/api/admin/users/:idupdateUseradminOnly
DELETE/api/admin/users/:iddeleteUseradminOnly
POST/api/admin/users/:id/demotedemoteadminOnly
POST/api/admin/users/:id/email-verificationsetEmailVerifiedadminOnly
POST/api/admin/users/:id/impersonateimpersonateadminOnly
POST/api/admin/users/:id/impersonate/stopstopImpersonatingadminOnly
POST/api/admin/users/:id/promotepromoteadminOnly
POST/api/admin/users/:id/reset-passwordresetPasswordadminOnly
POST/api/admin/users/:id/revoke-sessionsrevokeSessionsadminOnly
DELETE/api/admin/users/:id/sessions/:sessionIdrevokeSessionadminOnly
GET/api/admin/users/sessionssessionsadminOnly

Users: self-service

Source: apps/server/controllers/user.controller.ts

MethodPathHandlerGuards
DELETE/api/usersdeleteAccountauthMiddleware
PUT/api/users/imageupdateImageauthMiddleware, imageUpload.single('image')
PUT/api/users/usernameupdateUsernameauthMiddleware, updateUsernameValidator, validateRequest

Vault: encrypted secrets

Source: apps/server/controllers/admin-vault.controller.ts

MethodPathHandlerGuards
GET/api/admin/vaultlistSecretsadminOnly
POST/api/admin/vault/enableenableVaultadminOnly
POST/api/admin/vault/secretscreateSecretadminOnly
PATCH/api/admin/vault/secrets/:idupdateSecretadminOnly
DELETE/api/admin/vault/secrets/:iddeleteSecretadminOnly
GET/api/admin/vault/secrets/:id/revealrevealSecretadminOnly

Wrappers: foreign data wrappers

Source: apps/server/controllers/admin-wrappers.controller.ts

MethodPathHandlerGuards
GET/api/admin/wrapperslistWrappersadminOnly
POST/api/admin/wrappers/:wrapper/enableenableWrapperadminOnly
POST/api/admin/wrappers/serverscreateForeignServeradminOnly
DELETE/api/admin/wrappers/servers/:namedropForeignServeradminOnly
PUT/api/admin/wrappers/servers/:name/credentialssetForeignServerCredentialsadminOnly
POST/api/admin/wrappers/servers/:name/importimportForeignSchemaadminOnly
POST/api/admin/wrappers/tablescreateForeignTableadminOnly
DELETE/api/admin/wrappers/tables/:schema/:namedropForeignTableadminOnly

Notes on specific surfaces

The table above is generated from the controller decorators and is spliced in by npm run docs:sync. Anything written inside those markers is overwritten on the next sync, so per-route commentary belongs here instead. A note that belongs to a whole section goes in the backend's SECTION_NOTES (apps/server/lib/route-docs.ts), which is where its heading already lives.

API keys and database connection

/api/admin/api-keys and /api/admin/database/connection are mapped to the secrets.manage capability in the Console proxy: the first returns a freshly minted key on create, the second returns the database password. GET /api/admin/api-keys also mints the default publishable key on first read, so a project that predates the feature shows a usable key rather than an empty table. See API Keys.

/api/auth/admin/*

Guarded by secretKeyOnly: a valid secret project API key in the apikey header, and nothing else — not an operator session, not a publishable key. This is the client.auth.admin namespace in the SDK, and it is deliberately the only surface a secret key opens besides the data plane. The Studio admin API above, which runs SQL, DDL and backups, keeps its own operator authentication.

listUsers takes page and per_page, capped at 1000 rows. updateUserById routes password and role changes to their own guarded methods rather than merging them into one write: the profile patch refuses to write role on purpose, and going around that would reopen the escalation path that allowlist exists to close. invite does not echo the temporary password back — it has already gone out by email, and returning it would put a live credential in the caller's logs.

Outside the controllers

These are mounted directly in apps/server/app.ts rather than by a controller, so they carry no @before chain:

MethodPathWhat it isGuards
GET/Service descriptor: { name, docs, health }none
GET/api/health-check200 { message, status, db: "connected" }, or 503 { …, db: "disconnected" } when SELECT 1 failsnone
GET/api/docsSwagger UI over the generated OpenAPI documentnone
ALL/api/auth/*The whole Better Auth surface, mounted as one handler before the body parsersauthLimiter on credential endpoints, then Better Auth's own
GET/docs/sdk.mdThe SDK reference as raw Markdown, for agents and curlnone
GET/console/*308 redirect to the same path under /studionone
GET/studio/*Project Studio, when a build is presentStudio's own session
GET/<public-bucket>/*Static files for the public storage bucket, local driver onlynone

/api/health-check and /api/docs are unauthenticated by design; /api/docs describes routes but exposes no data. Block both at the edge if you do not want them public — see Traefik and TLS.

The Studio mount is deliberately non-fatal: if the Next build is missing or the filesystem is read-only, the server logs [studio] mount failed, /studio disabled and keeps serving the API. A missing Studio is never allowed to look like a network outage.

GET / answers with a small service descriptor naming the two paths a prober actually wants, and deliberately no version:

{ "name": "Motherbase API", "docs": "/api/docs", "health": "/api/health-check" }