Stitchflow
Atlassian Statuspage logo

Atlassian Statuspage User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedFeb 27, 2026

Summary and recommendation

The Statuspage REST API (base URL: `https://api.statuspage.io/v1`) uses a static API key passed as `Authorization: OAuth <key>` - the `OAuth` prefix is literal, not an OAuth 2.0 flow. Keys are org-scoped with full read/write access; no read-only key option exists.

As of January 31, 2026, keys are not re-displayable after creation and must be copied immediately.

Two distinct user surfaces exist in the API: `page_access_users` (audience-specific page viewers, managed per page) and org-level team member permissions (managed via `/organizations/{org_id}/permissions/{user_id}`). These are separate resources with separate endpoints and separate rate-limit behaviors.

For teams requiring IdP-driven lifecycle management, SCIM 2.0 is available via Atlassian Guard Standard at `https://api.atlassian.com/scim/directory/{directoryId}`. Stitchflow connects to Statuspage through an MCP server with ~100 deep IT/identity integrations, enabling automated provisioning workflows without building and maintaining direct API plumbing.

API quick reference

Has user APIYes
Auth methodAPI Key — passed as Authorization header (value: 'OAuth <api_key>') or as query param 'api_key='. The header value uses the literal string 'OAuth' as a prefix per official docs, but this is a static API key, not an OAuth 2.0 flow.
Base URLOfficial docs
SCIM availableYes
SCIM plan requiredAtlassian Guard Standard subscription (formerly Atlassian Access). SSO must be configured before enabling SCIM. Guard is billed per managed user (~$3–4/user/month) across the entire Atlassian organization.

Authentication

Auth method: API Key - passed as Authorization header (value: 'OAuth ') or as query param 'api_key='. The header value uses the literal string 'OAuth' as a prefix per official docs, but this is a static API key, not an OAuth 2.0 flow.

Setup steps

  1. Log in to https://manage.statuspage.io
  2. Click your avatar (bottom-left) > API info
  3. Click 'Create key', enter a descriptive name, copy the key immediately (as of Jan 31 2026 keys are no longer re-displayable after creation)
  4. Pass the key in requests as: -H 'Authorization: OAuth ' or as ?api_key=
  5. Note: only account owners can create/delete keys; keys are org-scoped and remain active even if the creating user's access is revoked

User object / data model

Field Type Description On create On update Notes
id string Unique identifier for the page access user system-generated immutable Used as path param in all single-user operations
email string Email address of the page access user required optional Primary identifier for audience-specific page login
external_login string External SSO login identifier for the user optional optional Used when SSO is configured for private/audience-specific pages
page_access_group_ids array[string] IDs of page access groups the user belongs to optional optional Requires audience-specific page type; controls which components/metrics the user sees
page_id string ID of the status page this user has access to path param path param Each page has its own set of page_access_users
created_at string (ISO 8601) Timestamp when the user was created system-generated immutable
updated_at string (ISO 8601) Timestamp of last update system-generated system-generated
user_id (org permissions) string Org-level team member user ID used in /organizations/{org_id}/permissions/{user_id} system-generated path param Distinct from page_access_user id; applies to internal team members, not audience-specific page viewers
roles (permissions payload) object Mapping of page IDs to sets of roles for RBAC-enabled pages n/a required in PUT /permissions body Omitting a page from the payload removes the user's access to that page

Core endpoints

List page access users

  • Method: GET
  • URL: https://api.statuspage.io/v1/pages/{page_id}/page_access_users
  • Watch out for: Unpaginated calls to this endpoint are rate-limited to 1 req/min. Always pass ?page=1&per_page=100 to use the 60 req/min paginated limit.

Request example

curl 'https://api.statuspage.io/v1/pages/{page_id}/page_access_users?page=1&per_page=100' \
  -H 'Authorization: OAuth your-api-key-goes-here'

Response example

[
  {
    "id": "abc123",
    "email": "user@example.com",
    "external_login": null,
    "page_id": "xyz789",
    "created_at": "2024-01-01T00:00:00Z"
  }
]

Get a single page access user

  • Method: GET
  • URL: https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{page_access_user_id}
  • Watch out for: Returns 404 if the user_id does not exist on the specified page.

Request example

curl 'https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{user_id}' \
  -H 'Authorization: OAuth your-api-key-goes-here'

Response example

{
  "id": "abc123",
  "email": "user@example.com",
  "external_login": null,
  "page_access_group_ids": [],
  "page_id": "xyz789"
}

Add (create) a page access user

  • Method: POST
  • URL: https://api.statuspage.io/v1/pages/{page_id}/page_access_users
  • Watch out for: Page must be switched to audience-specific type before page_access_users endpoints have any effect. Returns 409 on duplicate email.

Request example

curl 'https://api.statuspage.io/v1/pages/{page_id}/page_access_users' \
  -H 'Authorization: OAuth your-api-key-goes-here' \
  -d 'page_access_user[email]=user@example.com' \
  -d 'page_access_user[external_login]=ext_id'

Response example

{
  "id": "newuser456",
  "email": "user@example.com",
  "page_id": "xyz789",
  "created_at": "2025-01-01T00:00:00Z"
}

Update a page access user

  • Method: PATCH
  • URL: https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{page_access_user_id}
  • Watch out for: PUT is also available and behaves identically to PATCH for this resource.

Request example

curl 'https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{user_id}' \
  -H 'Authorization: OAuth your-api-key-goes-here' \
  -X PATCH \
  -d 'page_access_user[email]=new@example.com' \
  -d 'page_access_user[page_access_group_ids][]=grp_id'

Response example

{
  "id": "abc123",
  "email": "new@example.com",
  "page_access_group_ids": ["grp_id"]
}

Delete a page access user

  • Method: DELETE
  • URL: https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{page_access_user_id}
  • Watch out for: No response body on success. Returns 404 if user not found.

Request example

curl 'https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{user_id}' \
  -H 'Authorization: OAuth your-api-key-goes-here' \
  -X DELETE

Response example

HTTP 204 No Content

Get user's org-level permissions

  • Method: GET
  • URL: https://api.statuspage.io/v1/organizations/{organization_id}/permissions/{user_id}
  • Watch out for: Only applicable to internal team members (not page_access_users). Requires RBAC to be enabled on the page.

Request example

curl 'https://api.statuspage.io/v1/organizations/{org_id}/permissions/{user_id}' \
  -H 'Authorization: OAuth your-api-key-goes-here'

Response example

{
  "user_id": "usr_abc",
  "pages": {
    "page_id_1": ["role_a", "role_b"]
  }
}

Update user's org-level permissions

  • Method: PUT
  • URL: https://api.statuspage.io/v1/organizations/{organization_id}/permissions/{user_id}
  • Watch out for: Omitting a page from the payload removes the user's access to that page entirely. Non-RBAC pages should map to an empty hash.

Request example

curl 'https://api.statuspage.io/v1/organizations/{org_id}/permissions/{user_id}' \
  -H 'Authorization: OAuth your-api-key-goes-here' \
  -X PUT \
  -d 'permissions[page_id_1][]=role_a'

Response example

{
  "user_id": "usr_abc",
  "pages": { "page_id_1": ["role_a"] }
}

Get components for a page access user

  • Method: GET
  • URL: https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{page_access_user_id}/components
  • Watch out for: Also supports PATCH/PUT/POST/DELETE sub-endpoints to add, replace, or remove component visibility for the user.

Request example

curl 'https://api.statuspage.io/v1/pages/{page_id}/page_access_users/{user_id}/components' \
  -H 'Authorization: OAuth your-api-key-goes-here'

Response example

[
  { "id": "comp_abc", "name": "API", "status": "operational" }
]

Rate limits, pagination, and events

  • Rate limits: Manage API (authenticated): 60 requests per minute on a rolling window for paginated requests. Unpaginated GET requests to page_access_users and components endpoints are limited to 1 request per minute. Status API (public, read-only): not rate limited.
  • Rate-limit headers: Yes
  • Retry-After header: Yes
  • Rate-limit notes: HTTP 420 and HTTP 429 are both used for rate-limit responses depending on the API service version; implement handling for both. A Retry-After header is included in rate-limit responses. Strongly recommended to use paginated GET requests (?page=1&per_page=100) to avoid the 1 req/min unpaginated limit on page_access_users.
  • Pagination method: offset
  • Default page size: 100
  • Max page size: 100
  • Pagination pointer: page (offset index, 1-based) + per_page (page size). Exception: /pages/{page_id}/subscribers uses 'page' + 'limit' instead of 'per_page'.
Plan Limit Concurrent
All paid plans (Manage API, paginated) 60 requests/minute 0
All paid plans (Manage API, unpaginated GET to page_access_users / components) 1 request/minute 0
All plans (Status API, public read) Unlimited 0
  • Webhooks available: Yes
  • Webhook notes: Statuspage supports outbound subscriber webhooks. End users (subscribers) can register a webhook URL to receive POST notifications when incidents are created/updated/resolved or when component statuses change. These are subscriber-facing notification webhooks, not management-plane event webhooks for admin automation.
  • Alternative event strategy: For management-plane automation, use the authenticated REST API (polling) or integrate via PagerDuty, Opsgenie, or Jira Service Management integrations.
  • Webhook events: incident.create, incident.update, incident.resolve, component_update (status change)

SCIM API status

  • SCIM available: Yes

  • SCIM version: 2.0

  • Plan required: Atlassian Guard Standard subscription (formerly Atlassian Access). SSO must be configured before enabling SCIM. Guard is billed per managed user (~$3–4/user/month) across the entire Atlassian organization.

  • Endpoint: https://api.atlassian.com/scim/directory/{directoryId}

  • Supported operations: Create user (POST /Users), Get user (GET /Users/{userId}), List users (GET /Users), Update user (PUT /Users/{userId}), Patch user (PATCH /Users/{userId}), Deactivate user (PATCH /Users/{userId} active=false), Create group (POST /Groups), Get group (GET /Groups/{groupId}), List groups (GET /Groups), Update group membership (PATCH /Groups/{groupId})

Limitations:

  • Group sync is NOT available for Statuspage specifically; group sync is only available for Jira and Confluence instances
  • SCIM API keys expire after 1 year (enforced as of January 2025); annual rotation is mandatory
  • SSO must be configured as a prerequisite before SCIM can be enabled
  • SCIM base URL and API key are shown only once at creation time - must be copied immediately
  • Default groups (e.g., 'org-admins', 'atlassian-addons-admin') cannot be managed via SCIM
  • Updating a user's email address must be done via the SCIM provisioning API, not the Atlassian user management API
  • Site roles cannot be managed via SCIM API
  • Provisioned users have no product access by default until explicitly granted via group-based app access configuration

Common scenarios

Provisioning an audience-specific page viewer with component scoping: The target page must be set to audience-specific type before any page_access_users endpoint has effect.

POST to /v1/pages/{page_id}/page_access_users with email (and optionally external_login), then PATCH the user record to assign page_access_group_ids, then PATCH /components sub-endpoint to restrict component visibility.

Calls to this endpoint on non-audience-specific pages return no error but have no visible effect - a silent failure mode.

Bulk-listing page access users: Always paginate with ?page=1&per_page=100. Omitting pagination parameters triggers a separate rate-limit bucket of 1 request/minute on the page_access_users and components endpoints. The paginated path uses the standard 60 requests/minute rolling window. Iterate until a response returns fewer than 100 results.

SCIM provisioning via Atlassian Guard: SSO (SAML) must be configured before SCIM can be enabled. The SCIM base URL and API key are shown only once at setup - copy immediately. Configure your IdP with Create Users, Update User Attributes, and Deactivate Users enabled. Critical caveat: group sync does not apply to Statuspage. Statuspage team member access and page permissions must still be managed via the Manage API or manually after SCIM provisions the Atlassian account.

Provision an audience-specific page viewer and restrict their component visibility

  1. Ensure the target page is set to 'audience-specific' type in Statuspage settings
  2. POST /v1/pages/{page_id}/page_access_users with email and optional external_login
  3. Optionally create or retrieve a page_access_group via GET /v1/pages/{page_id}/page_access_groups
  4. PATCH /v1/pages/{page_id}/page_access_users/{user_id} with page_access_group_ids[] to assign the user to a group
  5. Use PATCH /v1/pages/{page_id}/page_access_users/{user_id}/components to set which components the user can see

Watch out for: If the page is not audience-specific, all page_access_users API calls will have no visible effect on the page.

Bulk-list all page access users with pagination

  1. Start with GET /v1/pages/{page_id}/page_access_users?page=1&per_page=100
  2. Check if the response contains exactly 100 results; if so, increment page and repeat
  3. Continue until a response returns fewer than 100 results (last page)

Watch out for: Omitting pagination parameters triggers the 1 req/min unpaginated rate limit. Always include both page and per_page parameters.

Automate team member provisioning via SCIM (Atlassian Guard)

  1. Subscribe to Atlassian Guard Standard at admin.atlassian.com
  2. Configure SSO (SAML) for the Atlassian organization - required before SCIM can be enabled
  3. Go to Security > User security > Identity providers, select your IdP directory, click 'Set up user provisioning'
  4. Copy the SCIM base URL (https://api.atlassian.com/scim/directory/{directoryId}) and API key immediately - they are shown only once
  5. Configure your IdP (Okta, Entra ID, Google Workspace) with the SCIM base URL and bearer token
  6. Enable Create Users, Update User Attributes, and Deactivate Users in the IdP provisioning settings
  7. Note: group sync will NOT apply to Statuspage; only user-level provisioning is supported
  8. Set a calendar reminder to rotate the SCIM API key before its 1-year expiry

Watch out for: Group sync is unavailable for Statuspage via SCIM. Statuspage team member access and page permissions must still be managed manually or via the Statuspage Manage API.

Why building this yourself is a trap

The API has three compounding gotchas that are not obvious from the documentation surface. First, page_access_users endpoints are scoped exclusively to audience-specific pages; they silently do nothing on public or private pages, which means integration tests against a non-audience-specific page will pass without provisioning anyone.

Second, omitting page and per_page query parameters on list calls drops the rate limit from 60 req/min to 1 req/min - a 60x degradation that will not surface until production load hits.

Third, both HTTP 420 and HTTP 429 are returned for rate-limit errors depending on API service version; handling only 429 will cause silent retry failures on older endpoints.

On the SCIM path: group sync is unavailable for Statuspage, meaning IdP group membership changes do not propagate to Statuspage page permissions. Teams that assume full lifecycle parity with Jira or Confluence SCIM behavior will find Statuspage requires a separate management layer.

The one-year SCIM API key expiry (mandatory since January 2025) with no automated warning is an additional operational dependency that must be tracked externally.

API keys remain active after the creating user's Statuspage access is revoked. Any key rotation or audit process must account for orphaned keys tied to departed team members, as these keys retain full org-scoped read/write access indefinitely until explicitly deleted.

Automate Atlassian Statuspage workflows without one-off scripts

Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedFeb 27, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

15Five logo

15Five

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

15Five uses a fixed role-based permission model with six predefined roles: Account Admin, HR Admin, Billing Admin, Group Admin, Manager, and Employee. No custom roles can be constructed. User management lives at Settings gear → People → Manage people p

1Password logo

1Password

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

1Password's admin console at my.1password.com covers the full user lifecycle — invitations, group assignments, vault access, suspension, and deletion — without any third-party tooling. Like every app that mixes role-based and resource-level permissions

8x8 logo

8x8

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

8x8 Admin Console supports full lifecycle user management — create, deactivate, and delete — across its X Series unified communications platform. Every app a user can access (8x8 Work desktop, mobile, web, Agent Workspace) is gated by license assignmen