Skip to content
Menu

Routes & endpoints

View .md

Beacon serves everything under /beacon. The site root / belongs to the host application. Paths below are absolute; replace the origin with your host’s.

PrefixWhat
/beaconThe React UI (app.MapBeaconUi()).
/beacon/apiREST API and SignalR hub (app.MapBeaconApi(), MapLoginEndpoints, MapSetupEndpoints).
/beacon/mcpMCP server (app.MapBeaconMcp()).
/.well-known/…MCP discovery documents (app.MapMcpDiscovery()).

The UI is a single-page app with the router mounted at /beacon. Every path below is under /beacon, for example /beacon/queries. Signed-out visitors are sent to /beacon/login. On a new installation, open /beacon/setup to create the first admin.

“Project access” means a user with a Viewer or Editor role, or an Admin. A user who holds only functional permissions does not see those pages. The UI hides what a user cannot use; the API enforces it.

PathPageWho sees it
/login, /logoutSign in, sign outAnyone
/setupFirst-run setup: create the super adminAnyone, while no admin exists
/errorError pageAnyone
/, /homeHome: KPIs, trends, activity, uptimeEveryone signed in
/aboutAbout BeaconEveryone signed in
/settingsYour settings and passwordEveryone signed in
/control-towerControl Tower: health of subscriptions and contractsProject access
/data-sources, /data-sources/:idData sources list and detailList: project access or DataSourceAdmin. Detail: project access
/data-sources/:id/relationshipsSchema relationships and schema healthProject access
/projects, /projects/new, /projects/:idProjects: members, linked data sources, documentationProject access
/data-quality, /data-quality/:idData contracts overview and detailProject access
/migration-jobs, /migration-jobs/new, /migration-jobs/:id, /migration-historyData migrationMigrationOperator or Admin, only when Beacon:Migrations:Enabled is on
/ai-actors, /ai-actors/:id, /ai-actors/:id/editAI actorsProject access
/queries, /queries/new, /queries/:id, /queries/:id/editQueries list, new query, detail, editorProject access
/queries/:id/versions, /queries/:id/versions/:versionIdQuery versionsProject access
/subscriptions, /subscriptions/:idSubscriptions list and detailProject access
/notifications, /notifications/:idNotification history and detailProject access
/recipientsRecipientsProject access (changes: SecurityAdmin or Admin)
/tasks, /tasks/:idTasksProject access
/api-keysAPI keysProject access, Auditor or UserAdmin
/mcp-settingsMCP guardrail settingsAuditor (read) or SecurityAdmin
/mcp-playgroundTry the MCP tools in the browserProject access
/mcp-learningLearned patterns and documentation patchesProject access
/approvals, /approvals/:id, /approvals/changes/:idApprovals of query changes and other changesApprover or Admin
/usersUser managementUserAdmin or Admin
/admin-settingsAdmin settings, LLM providerAuditor (read) or SecurityAdmin

Any other path under /beacon redirects to /beacon/home.

These answer without a session. Everything else requires one, an API key or a bearer token.

Method and pathWhatNotes
GET /beacon/api/healthHealth check200 {"status":"ok"} when the metadata database answers within 5 seconds, otherwise 503 problem.
GET /beacon/api/auth/meThe current session, if any
GET /beacon/api/auth/ssoWhether SSO is offered, for the login page
GET /beacon/api/csrfAntiforgery token for the UI400 for callers authenticated by an Authorization header.
POST /beacon/api/auth/loginPassword sign-inMapped only while password sign-in is on or a break-glass account is configured. 10 attempts per minute per client IP, then 429 with Retry-After.
POST /beacon/api/auth/logoutSign out; ?everywhere=true signs out every session of the user
GET /beacon/api/auth/sso/challengeStart the OIDC sign-in
GET /beacon/api/setup/statusWhether first-run setup is openMapped when user management is on.
POST /beacon/api/setup/superadminCreate the super admin with the setup tokenThrottled per IP. 403 wrong token, 409 lost a race, 400 already set up.
GET /beacon/api/setup/rolesRoles, for the setup pageAnonymous only while setup is open.
GET /.well-known/oauth-protected-resourceMCP protected-resource metadata (RFC 9728)Also at /.well-known/oauth-protected-resource/beacon/mcp.
GET /.well-known/mcp/server-card.jsonMCP server card
/signin-oidcOIDC callbackWhen OIDC is enabled. Path set by CallbackPath.
GET /signout-oidcFront-channel sign-outOnly with EnableFrontChannelLogout.

Until the first admin exists, the anonymous API routes above, the health check included, answer with a redirect to /beacon/setup. Only the setup routes and the MCP discovery documents answer normally.

All groups are under /beacon/api and need a signed-in session, an API key (Authorization: Bearer sk-sem_…) or a bearer JWT. For callers with a scope (API keys, mapped MCP callers), every request other than GET, HEAD or OPTIONS, and a few marked reads, need the Execute scope. Cookie sessions send the antiforgery header X-XSRF-TOKEN on state-changing requests.

Functional permissions named below are held by Admins too. A by-id request on a resource in a project you cannot read answers 404; one you can read but may not act on answers 403.

PrefixCoversNotable rules
/auth/me, /auth/sso, /auth/permissionsCurrent user, SSO config, current permissionspermissions returns canRead, canWrite, isAdmin, permissions, migrationsEnabled.
/homeHome page: trends, activity, task summary, uptime, migration summarymigration-summary admits MigrationOperator.
/projectsProjects, linked data sources, members, access mode, repositories, documentation, imported documents, MCP contextMembers: project admins, UserAdmin. Access mode: UserAdmin (opening a restricted project: Admin). Unlinking a data source: Admin. Repository token: SecurityAdmin.
/data-sourcesData sources, connection test, metadata, metadata refreshCreate, test and delete: DataSourceAdmin. GET /{id}/metadata needs Execute scope. PUT /{id}/migration-writes: Admin. Forced refresh is rate limited per data source (429).
/data-sources/{id}/relationships, /data-sources/{id}/schema-healthSchema relationships: list, add, edit, verify, delete, discover; schema healthVerifying needs the Curate action.
/queriesQueries: list, detail, create, update, lock, change history, preview, step preview, publish as MCP toolNo delete route. Previews need Execute scope. PUT /{id}/mcp-tool: SecurityAdmin.
/queries/{id}/versions, /query-versionsVersions: list, detail, diff, restore
/query-folders, /queries/{id}/folderQuery folders and moving a query between them
/subscriptionsSubscriptions: list, create, detail, delete, reactivate, SLA, test run, recipients, anomaly chart, ownerChanges need Execute scope. PUT /{id}/owner: UserAdmin. No route changes the schedule.
/recipientsRecipientsCreate, update, delete: SecurityAdmin.
/notificationsNotification history and detailFiltered to the caller’s projects.
/tasksTasks: list, detail, resolve, assign, snooze, priority, watch, comments, executions, result history
/control-towerStatistics, health grid, subscription detailFiltered to the caller’s projects.
/data-qualityOverview, data contracts, evaluations, evaluate now, ownerChanges need Execute scope. PUT /contracts/{id}/owner: UserAdmin. Custom SQL rules: Admin.
/approvalsPending query approvals, change approvals (/approvals/changes), approve, rejectReading admits Approver; approve and reject require Approver.
/migrationsMigration jobs and executionsMapped only when Beacon:Migrations:Enabled is on. MigrationOperator.
/ai-actorsAI actors, think, pause, resume, refine, plansPUT /{id}/owner: UserAdmin.
/mcpMCP settings and locks, project settings, learned patterns, documentation patches, learning stats, playground tools, audit logSettings: read Auditor or SecurityAdmin, write SecurityAdmin. POST /tools/run needs Execute scope. GET /audit: Auditor.
/evalGolden examples, candidates, feedback, grounding re-check, eval runsAdmin.
/glossaryBusiness glossaryAdmin.
/api-keysYour API keys; /api-keys/admin for all keysCreate from a signed-in session only. GET /admin: Auditor or UserAdmin. DELETE /admin/{id}: UserAdmin.
/usersUsers, roles, enable/disable, sign out everywhereUserAdmin.
/user-settingsYour settings, change your password
/admin-settingsRuntime settings, LLM testRead: Auditor or SecurityAdmin. Write and test: SecurityAdmin (LLM connection and base URL: Admin).

The OpenAPI document at /openapi/v1.json lists every operation with its schema (see Host-mapped routes).

Every list endpoint takes the same query parameters:

ParameterDefaultRules
page0Zero-based. Negative values count as 0.
pageSize20Clamped to 1–200, never rejected.
sortthe list’s own orderComma-separated property names, - for descending, for example sort=-createdTime,name. Unknown names are ignored.

A paged response is { "items": [...], "totalCount": n, "pageCount": n }. Lists are filtered to the projects the caller can read in SQL, before paging, so counts never include rows you cannot see.

SituationResponse
No session, key or token on an API route401, application/problem+json: {"type":"about:blank","title":"Unauthorized","status":401}. API routes never redirect to the login page.
Signed in, but the role, scope or permission does not allow the action403 problem.
A resource that does not exist, or that is in a project you cannot read404 problem. Beacon does not reveal whether it exists.
Readable, but the action is not granted in that project403 problem.
A conflicting change (a stale approval hash, a membership race, a locked setting)409 problem. A locked setting uses type /errors/setting-locked.
Too many requests (sign-in, setup, forced metadata refresh)429.

The sample host also maps unhandled exceptions under /beacon/api to problem responses: 400 for business-rule errors (types /errors/invalid-operation, /errors/beacon) and 500 (/errors/internal) otherwise. That mapping is sample code; an embedding host supplies its own.

PathProtocolWho
/beacon/api/hubSignalRSigned-in users who can read project data, or who hold a functional permission whose pages use hub events; others get 403. The connection is closed when the session’s next check is due, and the client reconnects.

Events are sent only to the user they concern:

EventPayloadWhen
JobStatusChangedjobId, state, timestampA background job the user started changed state. Published by the host’s job runner (the sample’s Warp pipeline does).
NotificationCreatednotificationId, kindA notification was created.
ApprovalUpdatedapprovalId, statusAn approval request was approved or rejected.

A host turns the hub off with AddBeaconApiServices(x => x.Realtime = false).

PathWhat
/beacon/mcpMCP over Streamable HTTP. Needs the Execute scope: an API key (Authorization: Bearer sk-sem_…) or a mapped Entra bearer token. A 401 carries WWW-Authenticate: Bearer resource_metadata="…/.well-known/oauth-protected-resource".

The discovery documents are listed under Anonymous routes. Set Beacon:PublicBaseUrl so they advertise your public origin. See MCP server.

These come from the host, not from the Beacon packages. The sample host maps them; your host decides for itself.

PathWhat
/openapi/v1.jsonOpenAPI document of the REST API (app.MapOpenApi()). The UI’s typed client is generated from it.
/warpWarp job dashboard, sample host only. Signed-in Admins.