Uptimeify Docs
Introduction

Permissions by endpoint

Which role, token type and token scope each endpoint needs, and which error code a refused call returns.

Every call is checked in this order. The first check that fails decides the answer:

  1. Authentication. No token, or a revoked, expired or mistyped one: 401 unauthorized.
  2. Token type. A customer-bound token on an organization-wide path: 403 customerScopedTokenForbidden. A token with scopes that lacks the scope of the path: 403 apiTokenScopeForbidden. The message and data.requiredScope name the missing scope, for example api.write.monitors. See Token Scopes.
  3. Role. An organization API token (wsm_…) acts with the current role of the user who created it. If that user is deactivated or deleted, the token acts as readonly. Old tokens without a recorded issuer act as admin. A role that is not allowed gets 403 with the code in the table below.
  4. Customer scope. readonly users, editors assigned to customers and customer-bound tokens only reach their own customers. A specific resource outside that scope answers 404 with the resource's not-found code, never 403. An API token, organization-wide or customer-bound, follows the current role and customer assignment of the user who created it: if that user is assigned to customers, the token reaches only those customers (a customer-bound token reaches its customer only while that user still has it). If the user is deactivated or deleted, the token reaches no customer at all.
  5. Module. Status pages need the status pages module (403 statusPagesModuleDisabled). Incident Management must be enabled for the organization (403 imNotEnabled).

Every refused call carries a stable data.code and an English statusMessage that says what is missing. Branch on the code; the message may be reworded.

Roles: admin and editor are organization roles, readonly is the customer self-service role, responder exists for Incident Management only. Global supporters never change customer data (403 forbidden). Agent tokens (wsma_…, connected apps) reach only the paths their scopes allow; every other path answers 403 agentTokenReadOnly with data.reason.

Monitors

MethodPathWho may call itScopeRefused with
GET/api/websites/:id, /api/<type>-monitors/:idAny role within its customer scopeapi.read.monitors404 websiteNotFound / monitorNotFound
POST/api/websites, /api/<type>-monitorsadmin, editor. readonly and customer-bound tokens create self_service monitors for their own customer if the package allows self-service. Only admin may set managementType.api.write.monitorsforbidden, selfServiceNotAllowed, selfServiceQuotaReached, quota codes
PATCH/api/websites/:id, /api/<type>-monitors/:idadmin, editor. Customer-bound callers change self_service monitors, managed ones only with canEditManaged. Changing managementType needs an organization-wide admin.api.write.monitorsforbidden, managed_by_organization, managementTypeOrgOnly
DELETE/api/websites/:id, /api/<type>-monitors/:idLike PATCH, but never readonly (nor a token its user created)api.write.monitorsreadonlyMayNotDelete, managed_by_organization
POST/api/websites/:id/heartbeat-token/rotateLike PATCHapi.write.monitorsas PATCH
GET, POST, DELETE/api/monitor-tagsAny role within its customer scopeapi.read.monitors / api.write.monitorsforbidden, badRequest
GET/api/tags, /api/tags/:idAny role in the organizationapi.read.monitors404 tagNotFound
POST, PATCH, DELETE/api/tags, /api/tags/:idAny role; customer-bound callers create and change tags of their customers only, never organization-wide tagsapi.write.monitorsforbidden, authorizingUserUnresolved
GET/api/maintenance-windows/:idAny role within its customer scopeapi.read.monitorsforbidden
POST/api/maintenance-windowsAny role except global supporters. Customer-bound callers anchor the window to their customer.api.write.monitorsforbidden, tagOnlyNeedsCustomer
PATCH, DELETE/api/maintenance-windows/:idCustomer windows: within the customer scope. Organization-wide windows: admin or editor with organization-wide access.api.write.monitorsforbidden, customerScopedTokenForbidden
GET/api/monitoring-locations/countriesAny authenticated callerapi.read.monitors-

<type> is dns, ftp, icmp, imap-pop, smtp, ssh or tcp; all seven follow the same rules.

Customers

MethodPathWho may call itScopeRefused with
GET/api/customers, /api/customers/:idAny role; restricted callers see their own customersapi.read.customers404 customerNotFound
POST/api/customersadmin, organization-wide editor. Not customer-bound tokens. Permission fields are applied for admin only.api.write.customersforbidden, customerScopedTokenForbidden
PATCH/api/customers/:idadmin, editor. Changing the package or permission fields needs admin.api.write.customersforbidden, packageOrgOnly
DELETE/api/customers/:idadmin, editor (an editor assigned to customers only within that scope, never the last of them; userAction=delete stays admin). Not customer-bound tokens.api.write.customersforbidden, customerUserDeleteAdminOnly, cannotDeleteOwnLastCustomer
POST/api/customers/:id/ips, /api/customers/:id/domainsAny role within its customer scope, readonly included (as self_service, if the package allows it)api.write.customersforbidden, selfServiceNotAllowed, selfServiceQuotaReached, quota codes
GET/api/customer-ips/:id, /api/customer-domains/:idAny role within its customer scopeapi.read.customers404 ipNotFound / domainNotFound
PATCH/api/customer-ips/:id, /api/customer-domains/:idadmin, editor; customer-bound callers for self_service entriesapi.write.customersforbidden, managed_by_organization, managementTypeOrgOnly
DELETE/api/customer-ips/:id, /api/customer-domains/:idLike PATCH, never readonlyapi.write.customersreadonlyMayNotDelete

Organization

All paths in this section are closed to customer-bound tokens (customerScopedTokenForbidden), except GET /api/organization and GET /api/package-configs.

MethodPathWho may call itScopeRefused with
GET/api/organization, /api/package-configsAny role in the organizationapi.read.organization-
PATCH/api/organizationadmin. API tokens cannot change automatic upgrades or the MFA policy.api.write.organizationforbidden, nonUserSessionForbidden
GET/api/usersAny role; restricted callers see users of their customersapi.read.organization-
POST, GET, PATCH, DELETE/api/users, /api/users/:idadmin with organization-wide accessapi.read.organization / api.write.organizationforbidden, customerScopedTokenForbidden, globalUserProtected
all/api/custom-fields, /api/custom-fields/:idReading: any role. Changing: admin.api.read.organization / api.write.organizationforbidden
all/api/escalation-config/:idadmin with organization-wide access, reading includedapi.read.alerts / api.write.alertsforbidden, customerScopedTokenForbidden
GET/api/organization/reports/:idAny role in the organizationapi.read.reports404 notFound
POST, PATCH, DELETE/api/organization/reports, /api/organization/reports/:idadminapi.write.reportsforbidden
all/api/organization/smtp, /api/organization/whitelabel/**, /api/organization/sso/**admin. Closed to tokens with scopes: use a token without scopes.-forbidden, ssoAdminOnly, apiTokenScopeForbidden

Notification channels

MethodPathWho may call itScopeRefused with
GET/api/notification-channels, /api/notification-channels/:idAny role; restricted callers see channels of their customers and organization channelsapi.read.alertsforbidden
POST, PATCH, DELETE/api/notification-channels, /api/notification-channels/:idOrganization channels: admin. Customer channels: admin, or readonly within its customer scope. editor cannot change channels.api.write.alertsforbidden

Status pages

The status pages module must be active. Customer-bound callers reach pages of their customers only; a page without a customer needs organization-wide access (403 forbidden).

MethodPathWho may call itScopeRefused with
GET/api/status-pages, /api/status-pages/:id, …/components, …/groups, /api/status-pages/maintenances/:id, /api/status-pages/domains/:idadmin, editor, readonlyapi.read.statuspagesforbidden, 404 statusPageNotFound
POST, PATCH, DELETE/api/status-pages, /api/status-pages/:id, components, groups, maintenances, POST /api/status-pages/domains, DELETE /api/status-pages/domains/:idadmin, editor; customer-bound users and tokens (also readonly) only self_service pages of their customersapi.write.statuspagesforbidden, statusPageLimitReached, managed_by_organization
GET, PATCH/api/status-pages/:id/designadmin, editor, readonlyapi.read.statuspages / api.write.statuspagesforbidden
POST/api/status-pages/domains/verify, /api/status-pages/domains/activateadminapi.write.statuspagesforbidden

Incident Management

Incident Management must be enabled for the organization (403 imNotEnabled; reading and changing /api/im/org-settings works without it). It needs the role admin, editor or responder without a customer assignment; readonly and customer-bound tokens get 403 imAccessDenied or 403 customerScopedTokenForbidden. Agent tokens cannot use Incident Management. Scopes: api.read.incidents for GET, api.write.incidents for every other method.

MethodPathWho may call itRefused with
GETevery /api/im/** path below except the two admin-only onesAny IM role (admin, editor, responder)imAccessDenied
POST, PATCH, DELETE/api/im/teams/:id/** (members, invite, tiers, escalations, overrides), /api/im/schedules/**, /api/im/tiers/:id/schedules, /api/im/sources/**, /api/im/routing/**, /api/im/statuspage-rules/**admin, or a team admin (imRole: admin) of that team. Inviting a new user needs admin.imTeamWriteDenied, forbidden
POST/api/im/teamsadminimTeamWriteDenied
POST, PATCH, DELETE/api/im/channels, /api/im/channels/:idOrganization channel: admin. Team channel: admin or team admin.imChannelWriteDenied
POST, PATCH, DELETE/api/im/outbound, /api/im/outbound/:idOrganization integration: admin. Team integration: admin or team admin.imOutboundWriteDenied, imTeamWriteDenied
PATCH/api/im/org-settingsadminforbidden
GET, PUT/api/im/notification-template, /api/im/users/:id/notification-settingsadmin, reading includedforbidden

An API token is never a team admin: team admin rights belong to a user. Changing team resources with a token therefore needs a token created by an admin.

On this page