Skip to content

Superadmin Dashboard — Sections & APIs ​

Section-by-section reference for every Superadmin menu item: its route, the backend API it calls (method + path), the controller/service behind it, and the MongoDB collection(s) it writes.

No screenshots exist for this dashboard. Menu order and names come from app/src/layouts/SuperAdminLayout.tsx; routes from the /superadmin/* group in app/src/routes.tsx. UI-layout claims not confirmable from code are tagged > ⚠️ Unverified. See the Superadmin overview for role gating.

Architecture Overview ​

Most SA routes share router.use(verifyJwt, requireRole("superadmin")) in superadmin.routes.ts. Paths below show their mount prefix.

1. Dashboard — /superadmin/dashboard ​

Platform-wide KPI landing. Page: pages/superadmin/DashboardPage.tsx. Controller: superadmin.controller.ts.

  • Platform dashboard → GET /superadmin/dashboard (getDashboard) — aggregates org/credit/usage counts (read-only).

⚠️ Unverified — the exact cards rendered are not confirmable from code alone.

2. Organizations — /superadmin/organizations ​

Create, list, edit, delete organizations. Controllers: superadmin.controller.ts, deletion.controller.ts, emailAuth.controller.ts.

ActionMethod + PathHandlerCollection
List orgsGET /superadmin/organizationslistOrganizationsOrganization (read)
Get orgGET /superadmin/organizations/:orgIdgetOrganization— (read)
Create orgPOST /superadmin/organizationscreateOrganizationOrganization, User (admin)
Update orgPUT /superadmin/organizations/:orgIdupdateOrganizationOrganization
Delete orgPOST /superadmin/organizations/:orgUID/deletedeleteOrganizationOrganization (+ cascades)
Resend onboardingPOST /superadmin/resend-onboarding/:userUIDsuperadminResendOnboardingEmailToken

3. Tickets — /superadmin/tickets ​

Cross-org helpdesk view. Page: pages/superadmin/TicketsPage.tsx. Uses the shared ticket API (ticket.routes.ts): GET /api/tickets, /api/tickets/stats, /api/tickets/:id. Reads Ticket, TicketMessage, TicketEvent. See Customer → Tickets.

4. Superadmins — /superadmin/superadmins ​

Manage superadmin users. Two surfaces:

  • List (JWT) → GET /superadmin/superadmins (listSuperadmins, superadmin.controller.ts) — reads User (role superadmin).
  • CRUD (secret-guarded) → superadmin-setup.routes.ts, mounted at /setup, guarded by verifyWebhookSecret (the SUPERADMIN_API_SECRET header, not a JWT):
ActionMethod + PathHandlerCollection
Create superadminPOST /setup/superadminscreateSuperAdminUser
List superadminsGET /setup/superadminslistSuperAdminsUser (read)
Update superadminPUT /setup/superadmins/:idupdateSuperAdminUser
Delete superadminDELETE /setup/superadmins/:iddeleteSuperAdminUser
Delete superadmin (JWT)POST /superadmin/users/:userUID/deletedeleteSuperadminUser

The secret-guarded setup router exists so the first superadmin can be bootstrapped before any superadmin JWT exists.

5. System Config — /superadmin/system-config ​

Global default presets, voices, fees, and version history that every org inherits. Two routers:

Superadmin defaults (superadmin.routes.ts):

ActionMethod + PathHandlerCollection
Get default configGET /superadmin/system-configgetDefaultConfigSystemConfig (read)
Update addon ratesPUT /superadmin/system-config/addon-ratesupdateDefaultAddonRatesSystemConfig
Update platform feePUT /superadmin/system-config/platform-feeupdateDefaultPlatformFeeSystemConfig
Update P2P feePUT /superadmin/system-config/p2p-feeupdateDefaultP2pFeeSystemConfig
Locked-module displayPUT /superadmin/system-config/locked-module-displayupdateDefaultLockedModuleDisplaySystemConfig
Preset CRUDPOST/PUT/DELETE /superadmin/system-config/presets[/:presetId]createDefaultPreset / updateDefaultPreset / deleteDefaultPresetSystemConfig
VersionsGET /superadmin/system-config/versionslistDefaultVersionsConfigVersion (read)
RollbackPOST /superadmin/system-config/versions/:versionNumber/rollbackrollbackDefaultVersionSystemConfig, ConfigVersion
VoicesGET/POST/PUT/DELETE /superadmin/system-config/voices[/:voiceId]listDefaultVoices / createDefaultVoice / updateVoice / deleteVoiceSystemConfig (voices)

Permission-gated config (systemConfig.routes.ts, mounted at /api/v2/config): preset/voice/version CRUD with requireSuperadminForConfigMutation + requireConfigEditPermission — e.g. GET /api/v2/config/status, POST /api/v2/config/fork, GET /api/v2/config/presets, GET /api/v2/config/versions/diff. See Dynamic Agent Config.

6. Provider Registry — /superadmin/provider-registry ​

The AI provider/model registry (STT/TTS/LLM capabilities per language). Route file: providerModelRegistry.routes.ts (mounted at /api/config/provider-registry, requireRole("superadmin")). Service: providerModelRegistry.service.ts.

ActionMethod + PathCollection
Language keysGET /api/config/provider-registry/language-keys— (static)
Create entryPOST /api/config/provider-registryProviderModelRegistry
List entriesGET /api/config/provider-registryProviderModelRegistry (read)
Get entryGET /api/config/provider-registry/:id— (read)
Update entryPUT /api/config/provider-registry/:idProviderModelRegistry
Delete entryDELETE /api/config/provider-registry/:idProviderModelRegistry

7. Number Management — /superadmin/providers ​

⚠️ Unverified — /superadmin/providers and /superadmin/org-provisioning both render NumberManagementPage.tsx; the menu links to /superadmin/providers.

Telephony provider registry + per-org provider enablement + rates. Route file: superadmin-provisioning.routes.ts (mounted at /superadmin/provisioning). Controller: superadmin-provisioning.controller.ts.

ActionMethod + PathHandlerCollection
Adapter catalogGET /superadmin/provisioning/adapterslistAdapterCatalog— (read)
Create providerPOST /superadmin/provisioning/providerscreateProviderProvider
List providersGET /superadmin/provisioning/providerslistProvidersProvider (read)
Update providerPUT /superadmin/provisioning/providers/:providerUIDupdateProviderProvider
Deactivate providerPOST /superadmin/provisioning/providers/:providerUID/deactivatedeactivateProviderProvider
Set/get credentialsPUT/GET /superadmin/provisioning/providers/:providerUID/credentialssetProviderCredentials / getProviderCredentialsProvider (masked)
Credentials via loginPUT /superadmin/provisioning/providers/:providerUID/credentials/loginsetProviderCredentialsViaLoginProvider
List org providersGET /superadmin/provisioning/orgs/:orgUID/providerslistOrgProvidersOrgProviderEnablement (read)
Enable/disable for orgPOST /superadmin/provisioning/orgs/:orgUID/providers/:providerUID/{enable|disable}enableProviderForOrg / disableProviderForOrgOrgProviderEnablement
Set org ratesPUT /superadmin/provisioning/orgs/:orgUID/ratessetOrgRatesProvisioningRate
Price breakdownGET /superadmin/provisioning/orgs/:orgUID/providers/:providerUID/price-breakdowngetOrgProviderPriceBreakdown— (read)
Refresh costsPOST /superadmin/provisioning/orgs/:orgUID/providers/:providerUID/refresh-costsrefreshOrgProviderCostsProvider
Cross-org inventoryGET /superadmin/provisioning/inventorygetInventoryProvisionedNumber (read)

See Phone Number Provisioning.

8. Credit Management — /superadmin/credits ​

Recharge any org and view platform-wide credit totals. Controller: credit.controller.ts.

ActionMethod + PathHandlerCollection
Recharge orgPOST /superadmin/organizations/:orgId/rechargerechargeOrganizationCreditTransaction
Platform transactionsGET /superadmin/credit-transactionsgetPlatformTransactions— (read)
Platform credit summaryGET /superadmin/credit-summarygetPlatformCreditSummary— (read)

See Credit Management System.

9. Per-Org Rates — /superadmin/org-rates ​

Preferential per-org pricing overrides on top of the global defaults. Page: pages/superadmin/OrgRateManagementPage.tsx. Route file: orgConfigReplica.routes.ts (SA endpoints, mounted at /api/org-config). Controller: orgConfigReplica.controller.ts.

ActionMethod + PathHandlerCollection
Get org replicaGET /api/org-config/replica/:orgUIDgetSuperadminOrgReplicaOrgConfigReplica (read)
Per-org addon ratesGET/PUT /api/org-config/replica/:orgUID/addon-ratesgetSuperadminOrgAddonRates / setSuperadminOrgAddonRatesOrgConfigReplica
Per-org platform feeGET/PUT /api/org-config/replica/:orgUID/platform-feegetSuperadminPlatformFee / setSuperadminPlatformFeeOrgConfigReplica
Per-org P2P feeGET/PUT /api/org-config/replica/:orgUID/p2p-feegetSuperadminP2pFee / setSuperadminP2pFeeOrgConfigReplica
Per-org preset ratePUT/DELETE /api/org-config/replica/:orgUID/presets/:presetId/superadmin-ratesetSuperadminOrgRate / removeSuperadminOrgRateOrgConfigReplica
Per-second ratePUT/DELETE /api/org-config/replica/:orgUID/presets/:presetId/superadmin-rate-per-secsetSuperadminOrgRatePerSec / removeSuperadminOrgRatePerSecOrgConfigReplica

Also note telephony per-org rates (setOrgRates → ProvisioningRate) under Number Management. See Call Fee Model.

10. OAuth Clients — /superadmin/oauth-clients ​

CRM OAuth client credentials. Route file: superadmin-oauth.routes.ts (mounted at /superadmin/oauth-clients). Controller: superadminOAuth.controller.ts.

ActionMethod + PathHandlerCollection
Create clientPOST /superadmin/oauth-clientscreateOAuthClientCrmOAuthClient
List clientsGET /superadmin/oauth-clientslistOAuthClientsCrmOAuthClient (read)
Get clientGET /superadmin/oauth-clients/:idgetOAuthClient— (read)
Update clientPUT /superadmin/oauth-clients/:idupdateOAuthClientCrmOAuthClient
Delete (soft)DELETE /superadmin/oauth-clients/:iddeleteOAuthClientCrmOAuthClient
Regenerate secretPOST /superadmin/oauth-clients/:id/regenerate-secretregenerateClientSecretCrmOAuthClient

See Oktivo App Integration.

11. SIP Trunks — /superadmin/trunks ​

Create, sync, and manage SIP trunks. Route file: telephony.routes.ts (requireRole("superadmin")). Controller: telephony.controller.ts.

ActionMethod + PathHandlerCollection
Create trunkPOST /superadmin/sip-trunkscreateTrunkSIPTrunk
Create inbound trunkPOST /superadmin/sip-trunks/inboundcreateInboundTrunkEndpointSIPTrunk
List trunksGET /superadmin/sip-trunkslistTrunksSIPTrunk (read)
Get trunkGET /superadmin/sip-trunks/:trunkIdgetTrunk— (read)
Update trunkPUT /superadmin/sip-trunks/:trunkIdupdateTrunkSIPTrunk
Delete trunkDELETE /superadmin/sip-trunks/:trunkIddeleteTrunkSIPTrunk
Remove number from trunkPOST /superadmin/sip-trunks/:trunkId/remove-numberremoveNumberFromTrunkPhoneNumber, SIPTrunk
Sync trunksPOST /superadmin/sip-trunks/syncsyncTrunksSIPTrunk
List providersGET /superadmin/providers (telephony)listProvidersProvider (read)

External integration: LiveKit SIP + carriers. See SIP Trunk Overview.

12. Phone Numbers — /superadmin/phone-numbers ​

The platform number pool: add numbers, assign to orgs, change types. Route file: telephony.routes.ts. Controller: telephony.controller.ts.

ActionMethod + PathHandlerCollection
Add numbersPOST /superadmin/phone-numbersaddNumbersPhoneNumber
Pool statsGET /superadmin/phone-numbers/statsgetPoolStats— (read)
List all numbersGET /superadmin/phone-numberslistAllNumbersPhoneNumber (read)
Assign to orgPOST /superadmin/phone-numbers/:id/assign-orgassignNumberToOrgPhoneNumber
Unassign from orgPOST /superadmin/phone-numbers/:id/unassign-orgunassignNumberFromOrgPhoneNumber
Reassign trunkPOST /superadmin/phone-numbers/:id/reassign-trunkreassignNumberTrunkPhoneNumber
Delete numberDELETE /superadmin/phone-numbers/:iddeleteNumberPhoneNumber
Update number typePUT /superadmin/phone-numbers/:id/typeupdateNumberTypePhoneNumber
Inbound statsGET /superadmin/inbound/statsgetInboundStats— (read)

See Phone Number Assignment.

13. Benchmarks — /superadmin/benchmarks ​

Model benchmark runs. Route file: benchmark.routes.ts (mounted at /superadmin/benchmarks and /benchmarks; requireFeature("benchmark"), superadmin bypasses). Controller: benchmark.controller.ts. Pages: pages/shared/BenchmarkListPage.tsx, BenchmarkCreatorPage.tsx, BenchmarkResultsPage.tsx.

ActionMethod + PathHandlerCollection
Create benchmarkPOST /superadmin/benchmarkscreateBenchmark
List benchmarksGET /superadmin/benchmarkslistBenchmark (read)
RegistryGET /superadmin/benchmarks/registryregistry— (read)
Validate modelPOST /superadmin/benchmarks/validate-modelvalidateModel—
Browse orgs/customersGET /superadmin/benchmarks/browse/organizations[/:orgUID/customers]listOrganizations / listCustomers— (read)
Get / updateGET/PUT /superadmin/benchmarks/:idgetOne / updateBenchmark
Start / stop / judgePOST /superadmin/benchmarks/:id/{start|stop|judge}start / stop / judgeBenchmarkRun
DeleteDELETE /superadmin/benchmarks/:idremoveBenchmark

See Benchmark Pipeline.

14. Provider Capacity — /superadmin/provider-capacity ​

Concurrent-call capacity caps per provider. Route file: superadmin.routes.ts. Controller: providerCapacity.controller.ts.

ActionMethod + PathHandlerCollection
Capacity dashboardGET /superadmin/provider-capacity/dashboardgetProviderDashboard— (read)
Available providersGET /superadmin/provider-capacity/available-providersgetAvailableProviders— (read)
List capacityGET /superadmin/provider-capacitylistProviderCapacityProviderCapacity (read)
Create capacityPOST /superadmin/provider-capacitycreateProviderCapacityProviderCapacity
Update capacityPUT /superadmin/provider-capacity/:idupdateProviderCapacityProviderCapacity
Delete capacityDELETE /superadmin/provider-capacity/:iddeleteProviderCapacityProviderCapacity

See Concurrent Calling System.

15. Concurrency — /superadmin/concurrency ​

Platform concurrency allocation per org. Route file: concurrency.routes.ts (superadminConcurrencyRoutes, mounted under /superadmin/concurrency). Controller: concurrency.controller.ts.

ActionMethod + PathHandler
SA dashboardGET /superadmin/concurrency/dashboardgetSuperadminDashboard
Presets capacityGET /superadmin/concurrency/presets/capacitygetPresetsCapacity
Get org quotaGET /superadmin/concurrency/organizations/:orgUID/quotagetOrgQuota
Allocate org quotaPOST /superadmin/concurrency/organizations/:orgUID/quotaallocateOrgQuota

Quota allocation is stored on the Organization / concurrency config. See Concurrency Management System.

16. Bug Reports — /superadmin/bug-reports ​

Cross-org bug reports submitted by any user. Reports are submitted via bug-report.routes.ts (POST /bug-reports); superadmins review them via superadmin.routes.ts. Controller: bug-report.controller.ts.

ActionMethod + PathHandlerCollection
List reportsGET /superadmin/bug-reportslistBugReportsBugReport (read)
Get reportGET /superadmin/bug-reports/:idgetBugReport— (read)
Update statusPATCH /superadmin/bug-reports/:id/statusupdateBugReportStatusBugReport

See Bug Report System.

17. Account Settings — /superadmin/settings ​

The superadmin's own account. Page: pages/superadmin/AccountSettingsPage.tsx. Uses the shared auth/account endpoints (/auth/*).

Collections Written by This Dashboard ​

Primary collections: Organization, User, Role, SystemConfig, ConfigVersion, Provider, ProviderCapacity, ProviderModelRegistry, OrgProviderEnablement, CreditTransaction, ProvisioningRate, OrgConfigReplica, CrmOAuthClient, SIPTrunk, PhoneNumber, ProvisionedNumber, Benchmark, BenchmarkRun, BugReport. Full definitions in Data Collections.

How to Test (End-to-End) ​

  1. Prerequisites: a superadmin account; backend + frontend running.
  2. Organizations: create an org at /superadmin/organizations; confirm Organization + its admin User are created.
  3. System Config: change a default preset rate, save, confirm SystemConfig + a new ConfigVersion entry, then roll back and confirm the previous value returns.
  4. SIP Trunks: create a trunk, run sync, and confirm SIPTrunk reflects the live LiveKit state.
  5. Phone Numbers: add a number, assign it to an org, confirm PhoneNumber.orgUID updates.
  6. Superadmins: confirm POST /setup/superadmins fails without the SUPERADMIN_API_SECRET header and succeeds with it.

Troubleshooting ​

SymptomCauseFix
/superadmin/* redirects to loginUser is not role superadminLog in with a superadmin account
POST /setup/superadmins returns 401Missing SUPERADMIN_API_SECRET headerSend the secret header; see superadmin-setup.routes.ts
SIP trunk shows stale stateLive carrier/LiveKit state driftedRun POST /superadmin/sip-trunks/sync
Provider credentials show maskedBy design — only last-4 are returnedRe-set credentials to change them
Org still on old pricingPer-org override set in Per-Org RatesUpdate/remove the /replica/:orgUID override
Benchmark blocked by feature gateRole not resolved as superadminVerify the JWT role; superadmin bypasses requireFeature

Last updated: