Permissions and scopes
The permissions an API key can hold, the ones only API keys can have, and which endpoints need which.
PilotFox has one permission vocabulary for people, API keys, share links and MCP tokens. A permission is written
resource:action, such as analytics:read. In API requests and responses, a set of permissions is an object of
resource → actions:
{ "analytics": ["read"], "goals": ["read", "write"], "ingest": ["write"] }Every endpoint under /api/v1 requires one permission, listed at the end of this page,
except a few public, account and instance-administration endpoints. PilotFox checks it against what the caller holds
on the site or organization of the request.
Roles and permissions
People get permissions from their role in the organization. Each role holds everything the role before it holds, and more. An API key holds exactly the permissions it was created with: any of those its creator's role holds, plus, for a key created by an owner or an admin, the key-only ones.
| Permission | What it allows | Viewer | Member | Editor | Admin | Owner |
|---|---|---|---|---|---|---|
site:read | List the organization's sites, read a site's install snippet and proxy-secret status, verify an install. | yes | yes | yes | yes | yes |
analytics:read | The reports: overview, time series, breakdowns, pages, heatmap, event summaries, errors, geography, web vitals, retention, journeys, realtime counts, bots, annotations, the organization overview. Also a site's details and your own email report subscriptions. | yes | yes | yes | yes | yes |
sessions:read | Individual sessions and raw events: the session and event lists, a session's timeline, live visitors and their locations, the session map timeline, the sessions behind goals, funnels and journeys, error occurrences. Also needed to filter by some dimensions. | yes | yes | yes | yes | yes |
users:read | Identified users, their profiles, traits and sessions. | yes | yes | yes | yes | yes |
replay:read | Session replays. | yes | yes | yes | yes | yes |
goals:read, funnels:read, segments:read | The saved goals, funnels and segments, and their reports. | yes | yes | yes | yes | yes |
annotations:read | Private annotations, and who created each annotation (others see public ones only). | yes | yes | yes | yes | yes |
revenue:read | Revenue reports, recorded payments, the status of payment provider connections. | yes | yes | yes | yes | yes |
affiliates:read | Affiliates and their reports. | yes | yes | yes | yes | yes |
searchConsole:read | Google Search Console reports of a linked site. | yes | yes | yes | yes | yes |
users:write | Identify a visitor by hand, edit a user's traits. | yes | yes | yes | yes | |
goals:write, funnels:write, segments:write, annotations:write | Create, change and delete goals, funnels, segments and annotations. | yes | yes | yes | yes | |
site:update | Change a site's settings, connect payment providers, Search Console and notifications, manage the proxy secret. | yes | yes | yes | ||
users:delete | Erase a user and their data. | yes | yes | yes | ||
replay:delete | Delete a session replay. | yes | yes | yes | ||
imports:read, imports:write | See and run data imports. | yes | yes | yes | ||
exports:read | Export a site's raw events (also needs sessions:read). | yes | yes | yes | ||
shareLink:read, shareLink:write | List, create and revoke share links. | yes | yes | yes | ||
affiliates:write | Create, change and delete affiliates, open and close their portal links. | yes | yes | yes | ||
site:create, site:delete | Create and delete sites. | yes | yes | |||
apiKey:create, apiKey:read, apiKey:delete | Create, list and delete the organization's API keys. | yes | yes | |||
organization:update | Manage the organization's Google Search Console connections. | yes | yes | |||
member:update | Choose which sites a restricted member sees. | yes | yes | |||
team:update | Choose which sites a team sees. | yes | yes | |||
organization:delete | Delete the organization (in the dashboard). | yes |
organization:delete and a few more permissions of the roles (member:create, member:delete, invitation:create,
invitation:cancel, team:create, team:delete, ac:*), as well as apiKey:update, are used by no /api/v1
endpoint: the dashboard manages the organization, its members, invitations and teams through /api/auth, which takes a
signed-in session only. On an API key they grant nothing.
Restricted members. A member whose access is limited to some sites sees only the sites granted to them (directly or through a team), with the role of that grant (viewer, member or editor; the highest when several reach a site); across the organization they count as a viewer. A member who sees every site holds, on each site, the higher of their role and any grant they have there. Owners and admins always see every site.
Key-only permissions
Two permissions belong to no role. Only API keys can hold them, and only owners and admins can grant them:
| Permission | What it allows |
|---|---|
ingest:write | Send events and identify users from your server: POST /api/v1/ingest/events and POST /api/v1/ingest/identify. |
revenue:write | Record payments from a billing system PilotFox does not connect to: POST /api/v1/sites/{siteId}/payments, and its refund and delete calls. |
Their endpoints refuse every other credential with 401, whatever it holds: a signed-in owner, a share link or an MCP
token cannot call them.
Give these permissions to dedicated keys: an ingest key needs nothing else, and a key that records payments needs
nothing but revenue:write.
Site restrictions
A key created with a list of sites (siteIds) reaches only those sites:
| Endpoint | With a site outside the list |
|---|---|
/api/v1/sites/{siteId}/… | 404 Site not found, as for a site that does not exist. |
/api/v1/orgs/{orgId}/… | 403, except GET /orgs/{orgId}/sites and GET /orgs/{orgId}/overview, which list and sum up the key's own sites only. |
POST /api/v1/ingest/events | The event is rejected with forbidden_site; the others in the batch are taken. |
POST /api/v1/ingest/identify | 404 Site not found. |
A key with a site list also gets 403 where an endpoint needs access to every site of the organization: saving,
changing or deleting a segment or an annotation for the whole organization ("scope": "org"), and linking a Search
Console property (see below).
Share links and public sites
Two kinds of caller read a site's data without belonging to its organization:
- Share links. A share link's token (
x-share-tokenheader or?share=) holds the scopes chosen when the link was made:analytics:read(the default), and optionallysessions:read,users:readandreplay:read. Its creator must hold every scope on the site. A share link only reads, and only endpoints marked share links below accept it. - Public sites. A site whose settings make it public opens the endpoints marked public sites below to everyone
for reading, with no credential needed: anyone gets
analytics:readthere, on top of what they already hold.
Neither can filter by the dimensions that need sessions:read
unless a share link carries that scope.
Checks beyond the endpoint's permission
A few endpoints check more than the permission listed for them, and answer 403 when the check fails. Paths are
relative to /api/v1:
- Creating an API key (
POST /orgs/{orgId}/api-keys) needs a signed-in person: API keys and MCP tokens are refused. - Starting a Search Console connection (
POST /orgs/{orgId}/search-console/connect) needs a signed-in person: API keys and MCP tokens are refused. - Linking a Search Console property (
PUT /sites/{siteId}/search-console), and listing the connections and properties to link from (GET /sites/{siteId}/search-console/connectionsand…/properties), need access to every site of the organization: a member who sees every site, or an API key without a site list. - Saving, changing or deleting a segment or an annotation for the whole organization (
"scope": "org") needs access to every site of the organization, withsegments:writeorannotations:writein the member's own role (a site grant is not enough), or an API key without a site list. Through MCP, an annotation can be neither public nor for the whole organization. - Creating a share link (
POST /sites/{siteId}/share-links) needs every scope of the link on the site; MCP tokens are refused. - Opening an affiliate's portal link (
POST /sites/{siteId}/affiliates/{id}/share) also needsrevenue:read; MCP tokens are refused. - Pointing a Slack or Discord notification at a URL, or switching it on (
PUT /sites/{siteId}/notifications/slackor…/discord) also needsrevenue:read, since the webhook then receives every sale. The webhook keeps receiving sales only while the member or API key that set its URL still hasrevenue:readon the site; see Slack and Discord webhooks. - Email report subscriptions (
GETandPUT /sites/{siteId}/reports) belong to a person: a signed-in session or an MCP token acting for one; API keys are refused. - Exporting raw events (
GET /sites/{siteId}/export) also needssessions:read. - A payment's journey (
GET /sites/{siteId}/payments/{paymentId}/journey) also needssessions:read. - Making a site public (
PATCH /sites/{siteId}withsettings.public: true), or creating one public (POST /orgs/{orgId}/siteswithsettings.public: true), also needsanalytics:read; a refused creation creates nothing. - Filtering by an identity dimension or another sessions-only dimension needs
sessions:read(a400); see Query parameters. - MCP OAuth tokens act as their user: everywhere they hold the user's current permissions, limited to the scopes the user approved, in one organization. See MCP with OAuth.
Some answers also leave fields out for a caller without a second permission:
- Payments (
GET /sites/{siteId}/payments):customer_email,session_id,visitor_id,user_idandcredited_session_idarenullwithoutsessions:read. - Affiliates (
GET /sites/{siteId}/affiliates/statsand…/{id}/report):payments,revenue,commissionandconversion_ratearenull, and a report'srecent_paymentsempty, withoutrevenue:read. - Annotations (
GET /sites/{siteId}/annotations): withoutannotations:read, only the public annotations, withcreatedByset tonull.
Permission per endpoint
The tables below follow the sections of the API reference, and each endpoint links to its reference page. They are generated from the same OpenAPI document, which the API builds from each route's access rule, so they say exactly what the API enforces:
- Permission is what the caller must hold on the site (
/api/v1/sites/{siteId}/…) or in the organization (/api/v1/orgs/{orgId}/…). A signed-in session or an API key holding it is accepted, unless the notes say otherwise. - API keys limited to some sites are refused (
403) on the organization endpoints, except where the notes say keys limited to some sites: their sites only. - Share links and public sites mean those callers are accepted too (see above). Checked by the endpoint marks a public endpoint that reads a credential itself.
- Endpoints outside
/api/v1(the tracker's, the map tiles, MCP and the sign-in endpoints under/api/auth) need no permission; their notes say which credential they take. Each MCP tool needs the permission of the endpoint it calls.
Each GET under /api/v1 also answers HEAD with the same permission, except the export, the realtime stream and
favicons.
System
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/config | — | public: no credential needed |
GET /api/v1/health | — | public: no credential needed |
GET /api/v1/ready | — | public: no credential needed |
Account
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/me | — | signed-in session only |
GET /api/v1/me/deletion | — | signed-in session only |
GET /api/v1/me/reports | — | signed-in session only |
Organizations
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/orgs/{orgId}/members/{memberId}/site-access | member:update | |
PUT /api/v1/orgs/{orgId}/members/{memberId}/site-access | member:update | |
GET /api/v1/orgs/{orgId}/overview | analytics:read | keys limited to some sites: their sites only |
GET /api/v1/orgs/{orgId}/teams/{teamId}/sites | team:update | |
PUT /api/v1/orgs/{orgId}/teams/{teamId}/sites | team:update |
API keys
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/orgs/{orgId}/api-keys | apiKey:read | |
POST /api/v1/orgs/{orgId}/api-keys | apiKey:create | |
DELETE /api/v1/orgs/{orgId}/api-keys/{keyId} | apiKey:delete |
Sites
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/orgs/{orgId}/sites | site:read | keys limited to some sites: their sites only |
POST /api/v1/orgs/{orgId}/sites | site:create | |
GET /api/v1/sites/{siteId} | analytics:read | share links, public sites |
PATCH /api/v1/sites/{siteId} | site:update | |
DELETE /api/v1/sites/{siteId} | site:delete | |
GET /api/v1/sites/{siteId}/proxy-secret | site:read | |
POST /api/v1/sites/{siteId}/proxy-secret | site:update | |
DELETE /api/v1/sites/{siteId}/proxy-secret | site:update | |
GET /api/v1/sites/{siteId}/snippet | site:read | |
POST /api/v1/sites/{siteId}/verify-install | site:read |
Share links
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/share | — | share link token, checked by the endpoint |
GET /api/v1/sites/{siteId}/share-links | shareLink:read | |
POST /api/v1/sites/{siteId}/share-links | shareLink:write | |
DELETE /api/v1/sites/{siteId}/share-links/{id} | shareLink:write |
Analytics
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/breakdown | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/favicons/{domain} | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/heatmap | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/overview | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/pages | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/pages/trends | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/timeseries | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/vitals | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/vitals/breakdown | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/vitals/timeseries | analytics:read | share links, public sites |
Events
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/events | sessions:read | share links |
GET /api/v1/sites/{siteId}/events/autocapture | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/events/names | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/events/properties | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/events/summary | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/events/timeseries | analytics:read | share links, public sites |
Errors
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/errors | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/errors/summary | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/errors/{fingerprint} | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/errors/{fingerprint}/occurrences | sessions:read | share links |
Geography
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/geo/cities | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/geo/countries | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/geo/points | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/geo/regions | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/geo/timeline | sessions:read | |
GET /maps/tiles/boundaries/{z}/{x}/{y}.mvt | — | public: no credential needed |
Live
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/geo/live | sessions:read | |
GET /api/v1/sites/{siteId}/live | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/live/stream | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/live/visitors | sessions:read |
Bots
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/bots/ai | analytics:read | |
GET /api/v1/sites/{siteId}/bots/breakdown | analytics:read | |
GET /api/v1/sites/{siteId}/bots/overview | analytics:read | |
GET /api/v1/sites/{siteId}/bots/timeseries | analytics:read |
People
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/traits/keys | users:read | share links |
GET /api/v1/sites/{siteId}/traits/values | users:read | share links |
GET /api/v1/sites/{siteId}/users | users:read | share links |
POST /api/v1/sites/{siteId}/users/identify | users:write | |
GET /api/v1/sites/{siteId}/users/summary | users:read | share links |
GET /api/v1/sites/{siteId}/users/{userId} | users:read | share links |
DELETE /api/v1/sites/{siteId}/users/{userId} | users:delete | |
GET /api/v1/sites/{siteId}/users/{userId}/sessions | users:read | share links |
PUT /api/v1/sites/{siteId}/users/{userId}/traits | users:write |
Sessions
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/sessions | sessions:read | share links |
GET /api/v1/sites/{siteId}/sessions/summary | sessions:read | share links |
GET /api/v1/sites/{siteId}/sessions/{sessionId} | sessions:read | share links |
Goals
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/goals | goals:read | |
POST /api/v1/sites/{siteId}/goals | goals:write | |
POST /api/v1/sites/{siteId}/goals/preview | goals:write | |
GET /api/v1/sites/{siteId}/goals/stats | goals:read | |
GET /api/v1/sites/{siteId}/goals/{id} | goals:read | |
PATCH /api/v1/sites/{siteId}/goals/{id} | goals:write | |
DELETE /api/v1/sites/{siteId}/goals/{id} | goals:write | |
GET /api/v1/sites/{siteId}/goals/{id}/conversions | sessions:read | share links |
GET /api/v1/sites/{siteId}/goals/{id}/timeseries | goals:read |
Funnels
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/funnels | funnels:read | |
POST /api/v1/sites/{siteId}/funnels | funnels:write | |
POST /api/v1/sites/{siteId}/funnels/analyze | funnels:read | |
GET /api/v1/sites/{siteId}/funnels/{id} | funnels:read | |
PATCH /api/v1/sites/{siteId}/funnels/{id} | funnels:write | |
DELETE /api/v1/sites/{siteId}/funnels/{id} | funnels:write | |
GET /api/v1/sites/{siteId}/funnels/{id}/report | funnels:read | |
GET /api/v1/sites/{siteId}/funnels/{id}/sessions | sessions:read | share links |
Journeys
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/journeys | analytics:read | share links, public sites |
GET /api/v1/sites/{siteId}/journeys/sessions | sessions:read | share links |
GET /api/v1/sites/{siteId}/retention | analytics:read | share links, public sites |
Segments
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/segments | segments:read | |
POST /api/v1/sites/{siteId}/segments | segments:write | |
GET /api/v1/sites/{siteId}/segments/{id} | segments:read | |
PATCH /api/v1/sites/{siteId}/segments/{id} | segments:write | |
DELETE /api/v1/sites/{siteId}/segments/{id} | segments:write |
Annotations
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/annotations | analytics:read | share links, public sites |
POST /api/v1/sites/{siteId}/annotations | annotations:write | |
PATCH /api/v1/sites/{siteId}/annotations/{id} | annotations:write | |
DELETE /api/v1/sites/{siteId}/annotations/{id} | annotations:write |
Replays
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/replays | replay:read | share links |
GET /api/v1/sites/{siteId}/replays/{sessionId} | replay:read | share links |
DELETE /api/v1/sites/{siteId}/replays/{sessionId} | replay:delete | |
GET /api/v1/sites/{siteId}/replays/{sessionId}/chunks | replay:read | share links |
Revenue
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/payments | revenue:read | |
POST /api/v1/sites/{siteId}/payments | revenue:write | API keys only |
DELETE /api/v1/sites/{siteId}/payments/{paymentId} | revenue:write | API keys only |
GET /api/v1/sites/{siteId}/payments/{paymentId}/journey | revenue:read | |
POST /api/v1/sites/{siteId}/payments/{paymentId}/refund | revenue:write | API keys only |
GET /api/v1/sites/{siteId}/revenue/breakdown | revenue:read | |
GET /api/v1/sites/{siteId}/revenue/subscriptions/breakdown | revenue:read | |
GET /api/v1/sites/{siteId}/revenue/subscriptions/summary | revenue:read | |
GET /api/v1/sites/{siteId}/revenue/subscriptions/timeseries | revenue:read | |
GET /api/v1/sites/{siteId}/revenue/summary | revenue:read | |
GET /api/v1/sites/{siteId}/revenue/timeseries | revenue:read |
Payment providers
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/integrations/dodo | revenue:read | |
PUT /api/v1/sites/{siteId}/integrations/dodo | site:update | |
DELETE /api/v1/sites/{siteId}/integrations/dodo | site:update | |
POST /api/v1/sites/{siteId}/integrations/dodo/rematch | site:update | |
POST /api/v1/sites/{siteId}/integrations/dodo/sync | site:update | |
GET /api/v1/sites/{siteId}/integrations/polar | revenue:read | |
PUT /api/v1/sites/{siteId}/integrations/polar | site:update | |
DELETE /api/v1/sites/{siteId}/integrations/polar | site:update | |
POST /api/v1/sites/{siteId}/integrations/polar/rematch | site:update | |
POST /api/v1/sites/{siteId}/integrations/polar/sync | site:update | |
GET /api/v1/sites/{siteId}/integrations/stripe | revenue:read | |
PUT /api/v1/sites/{siteId}/integrations/stripe | site:update | |
DELETE /api/v1/sites/{siteId}/integrations/stripe | site:update | |
POST /api/v1/sites/{siteId}/integrations/stripe/rematch | site:update | |
POST /api/v1/sites/{siteId}/integrations/stripe/sync | site:update | |
GET /api/v1/sites/{siteId}/revenue/connections | revenue:read |
Affiliates
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/affiliate-portal | — | affiliate portal token, checked by the endpoint |
GET /api/v1/sites/{siteId}/affiliates | affiliates:read | |
POST /api/v1/sites/{siteId}/affiliates | affiliates:write | |
GET /api/v1/sites/{siteId}/affiliates/stats | affiliates:read | |
PATCH /api/v1/sites/{siteId}/affiliates/{id} | affiliates:write | |
DELETE /api/v1/sites/{siteId}/affiliates/{id} | affiliates:write | |
GET /api/v1/sites/{siteId}/affiliates/{id}/report | affiliates:read | |
POST /api/v1/sites/{siteId}/affiliates/{id}/share | affiliates:write | |
DELETE /api/v1/sites/{siteId}/affiliates/{id}/share | affiliates:write |
Search Console
Notifications
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/reports/unsubscribe | — | public: no credential needed |
POST /api/v1/reports/unsubscribe | — | public: no credential needed |
GET /api/v1/sites/{siteId}/notifications | site:update | |
PUT /api/v1/sites/{siteId}/notifications/discord | site:update | |
DELETE /api/v1/sites/{siteId}/notifications/discord | site:update | |
PUT /api/v1/sites/{siteId}/notifications/email | site:update | |
PUT /api/v1/sites/{siteId}/notifications/slack | site:update | |
DELETE /api/v1/sites/{siteId}/notifications/slack | site:update | |
POST /api/v1/sites/{siteId}/notifications/test | site:update | |
GET /api/v1/sites/{siteId}/reports | analytics:read | |
PUT /api/v1/sites/{siteId}/reports | analytics:read | |
GET /api/v1/sites/{siteId}/reports/preview | analytics:read |
Imports
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/imports | imports:read | |
POST /api/v1/sites/{siteId}/imports | imports:write | |
GET /api/v1/sites/{siteId}/imports/{id} | imports:read | |
DELETE /api/v1/sites/{siteId}/imports/{id} | imports:write | |
POST /api/v1/sites/{siteId}/imports/{id}/cancel | imports:write |
Exports
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/sites/{siteId}/export | exports:read |
Ingest
| Endpoint | Permission | Notes |
|---|---|---|
POST /api/v1/ingest/events | ingest:write | API keys only |
POST /api/v1/ingest/identify | ingest:write | API keys only |
Tracker
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/c/{publicId} | — | public: no credential needed |
POST /api/e | — | public: no credential needed |
POST /api/i | — | public: no credential needed |
GET /api/r.js | — | public: no credential needed |
POST /api/rec/{publicId} | — | public: no credential needed |
GET /api/s.js | — | public: no credential needed |
MCP
| Endpoint | Permission | Notes |
|---|---|---|
GET /.well-known/{*} | — | public: no credential needed |
GET /api/mcp | — | public: no credential needed |
POST /api/mcp | — | API key or MCP OAuth token |
DELETE /api/mcp | — | public: no credential needed |
Auth
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/auth/{*} | — | signed-in session or no credential |
POST /api/auth/{*} | — | signed-in session or no credential |
PATCH /api/auth/{*} | — | signed-in session or no credential |
DELETE /api/auth/{*} | — | signed-in session or no credential |
Admin
| Endpoint | Permission | Notes |
|---|---|---|
GET /api/v1/admin/backups | — | system administrators only (signed-in session) |
DELETE /api/v1/admin/backups/copies/{name} | — | system administrators only (signed-in session) |
GET /api/v1/admin/backups/remote | — | system administrators only (signed-in session) |
POST /api/v1/admin/backups/restore | — | system administrators only (signed-in session) |
GET /api/v1/admin/backups/runs | — | system administrators only (signed-in session) |
POST /api/v1/admin/backups/runs | — | system administrators only (signed-in session) |
PUT /api/v1/admin/backups/schedule | — | system administrators only (signed-in session) |
GET /api/v1/admin/jobs | — | system administrators only (signed-in session) |
GET /api/v1/admin/orgs | — | system administrators only (signed-in session) |
GET /api/v1/admin/sites | — | system administrators only (signed-in session) |
GET /api/v1/admin/stats | — | system administrators only (signed-in session) |