Grafana Cloud

Escalation chains HTTP API

Create an escalation chain

Required permission: grafana-irm-app.escalation-chains:write

shell
curl "{{API_URL}}/api/v1/escalation_chains/" \
  --request POST \
  --header "Authorization: meowmeowmeow" \
  --header "Content-Type: application/json" \
  --header "X-Grafana-URL: https://your-stack.grafana.net" \
  --data '{
      "name": "example-chain"
  }'

The above command returns JSON structured in the following way:

JSON
{
  "id": "FWDL7M6N6I9HE",
  "name": "example-chain",
  "team_id": null
}
ParameterRequiredDescription
nameyesName of the escalation chain
team_idnoID of the team

HTTP request

POST {{API_URL}}/api/v1/escalation_chains/

Get an escalation chain

Required permission: grafana-irm-app.escalation-chains:read

shell
curl "{{API_URL}}/api/v1/escalation_chains/F5JU6KJET33FE/" \
  --request GET \
  --header "Authorization: meowmeowmeow" \
  --header "Content-Type: application/json" \
  --header "X-Grafana-URL: https://your-stack.grafana.net"

The above command returns JSON structured in the following way:

JSON
{
  "id": "F5JU6KJET33FE",
  "name": "default",
  "team_id": null
}

HTTP request

GET {{API_URL}}/api/v1/escalation_chains/<ESCALATION_CHAIN_ID>/

List escalation chains

Required permission: grafana-irm-app.escalation-chains:read

shell
curl "{{API_URL}}/api/v1/escalation_chains/" \
  --request GET \
  --header "Authorization: meowmeowmeow" \
  --header "Content-Type: application/json" \
  --header "X-Grafana-URL: https://your-stack.grafana.net"

The above command returns JSON structured in the following way:

JSON
{
  "count": 2,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": "F5JU6KJET33FE",
      "name": "default",
      "team_id": null
    }
  ],
  "current_page_number": 1,
  "page_size": 50,
  "total_pages": 1
}

Note: The response is paginated. You may need to make multiple requests to get all records.

HTTP request

GET {{API_URL}}/api/v1/escalation_chains/

Get current on-call users for an escalation chain

Required permission: grafana-irm-app.escalation-chains:read

Returns the users who would be notified by a given escalation chain based on its current policies. This walks all user-resolving escalation policy steps (schedule notifications, explicit user lists, team member notifications, Slack user group notifications, and round-robin queues) and returns the resolved users with their phone number, phone number status, and shift timing (when schedule-based).

shell
curl "{{API_URL}}/api/v1/escalation_chains/F5JU6KJET33FE/current_oncall/" \
  --request GET \
  --header "Authorization: meowmeowmeow" \
  --header "X-Grafana-URL: https://your-stack.grafana.net"

The above command returns JSON structured in the following way:

JSON
{
  "count": 2,
  "users": [
    {
      "id": "U4DNY931HHJS5",
      "grafana_id": 456,
      "email": "alice@example.com",
      "slack": [
        {
          "user_id": "UALICESLACKID",
          "team_id": "TSLACKTEAMID"
        }
      ],
      "username": "alice",
      "role": "admin",
      "is_phone_number_verified": true,
      "phone_number": "+12345678901",
      "phone_number_status": "available",
      "timezone": "America/New_York",
      "teams": ["TAAM1K1NNEHAG"]
    },
    {
      "id": "U7S8H84ARFTGN",
      "grafana_id": 789,
      "email": "bob@example.com",
      "slack": null,
      "username": "bob",
      "role": "editor",
      "is_phone_number_verified": false,
      "phone_number": null,
      "phone_number_status": "not_configured",
      "timezone": "UTC",
      "teams": []
    }
  ],
  "shifts": [
    {
      "schedule_id": "SBM7DV7BKFUYU",
      "schedule_name": "Primary Rotation",
      "team_id": "TAAM1K1NNEHAG",
      "shift_start": "2026-03-24T09:00:00+00:00",
      "shift_end": "2026-03-25T09:00:00+00:00",
      "users": ["U4DNY931HHJS5", "U7S8H84ARFTGN"]
    }
  ]
}
ParameterDescription
slackList of Slack user identities (user_id, team_id), or null if not connected.
timezoneThe user’s timezone (e.g. America/New_York), or null.
teamsList of team IDs the user belongs to.
phone_numberThe user’s verified phone number, or null if not configured or private.
phone_number_statusOne of: available (number returned), private (user has hidden their number), not_configured (user has no verified number).
shiftsList of shift entries with schedule reference (schedule_id, schedule_name, team_id) and timing (shift_start, shift_end). Empty when the resolving steps are not schedule-based.

Note

This endpoint resolves users from all escalation policy steps before the first “Wait” step, mirroring how the escalation engine fires all consecutive non-wait steps together. For round-robin steps, this is a read-only operation, which returns who would be notified next without advancing the pointer. Use the advance round-robin endpoint to explicitly advance the round-robin position.

HTTP request

GET {{API_URL}}/api/v1/escalation_chains/<ESCALATION_CHAIN_ID>/current_oncall/

Get previous on-call users for an escalation chain

Required permission: grafana-irm-app.escalation-chains:read

Returns the users who were on-call during the most recently completed shift for the first schedule-referencing policy step in the escalation chain. Only schedule-based steps have temporal meaning; chains with only non-schedule steps return an empty result.

shell
curl "{{API_URL}}/api/v1/escalation_chains/F5JU6KJET33FE/previous_oncall/" \
  --request GET \
  --header "Authorization: meowmeowmeow" \
  --header "X-Grafana-URL: https://your-stack.grafana.net"

The response format is identical to current_oncall.

Query ParameterRequiredDefaultDescription
daysNo7Number of days to look back for past shifts. Maximum value: 30.

HTTP request

GET {{API_URL}}/api/v1/escalation_chains/<ESCALATION_CHAIN_ID>/previous_oncall/

Get next on-call users for an escalation chain

Required permission: grafana-irm-app.escalation-chains:read

Returns the users who will be on-call during the next upcoming shift for the first schedule-referencing policy step in the escalation chain. Shifts that overlap with the current time are skipped. Chains with only non-schedule steps return an empty result.

shell
curl "{{API_URL}}/api/v1/escalation_chains/F5JU6KJET33FE/next_oncall/" \
  --request GET \
  --header "Authorization: meowmeowmeow" \
  --header "X-Grafana-URL: https://your-stack.grafana.net"

The response format is identical to current_oncall.

Query ParameterRequiredDefaultDescription
daysNo7Number of days to look ahead for future shifts. Maximum value: 30.

HTTP request

GET {{API_URL}}/api/v1/escalation_chains/<ESCALATION_CHAIN_ID>/next_oncall/

Delete an escalation chain

Required permission: grafana-irm-app.escalation-chains:write

shell
curl "{{API_URL}}/api/v1/escalation_chains/F5JU6KJET33FE/" \
  --request DELETE \
  --header "Authorization: meowmeowmeow" \
  --header "Content-Type: application/json" \
  --header "X-Grafana-URL: https://your-stack.grafana.net"

HTTP request

DELETE {{API_URL}}/api/v1/escalation_chains/<ESCALATION_CHAIN_ID>/