Part of the Phoenix Alerts Management API reference.
An escalation policy is the ordered list of who gets paged, and how long to wait between each page, when an alert isn't acknowledged. Every service needs a team with at least one escalation policy that has at least one step.
Create a policy
POST /v1/escalation-policies
Field | Type | Required | Notes |
| string | yes | 1–255 characters. |
| string | yes | UUID of the owning team. |
| boolean | no | Whether this is the team's default policy for severities no other policy covers. |
| array of integer or null | no | Severities 1–5 this policy applies to. |
| integer | no | Extra passes through the steps after the first (0–9). Defaults to no repeat. |
| integer or null | no | Auto-resolve an alert after this many hours (1–720). |
| array | yes | At least one initial step, created atomically with the policy. See below. |
Each entry in steps takes the same fields as adding a step — step_order, wait_seconds, target_type, and target_user_id or target_team_id.
Example request body:
{
"policy_name": "Default Policy",
"team_uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"is_default": true,
"steps": [
{"step_order": 1, "wait_seconds": 300, "target_type": "TEAM_NEXT_ON_CALL", "target_team_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901"}
]
}
Response (201) — step details aren't embedded; fetch the policy to see them:
{
"object": "escalation_policy",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Default Policy",
"team": {
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"name": "Platform Team",
"key": "platform"
},
"is_default": true,
"applicable_severities": null,
"repeat_count": 0,
"auto_resolve_after_hours": null,
"created_at": "2026-06-12T00:00:00.000Z",
"updated_at": "2026-06-12T00:00:00.000Z"
}
Get a policy and its steps
GET /v1/escalation-policies/{policy_uuid}
Returns the policy with its ordered steps[], each with the resolved user or team target.
To list all policies without step detail (useful for an overview), use GET /v1/escalation-policies, optionally filtered with ?team_uuid= and/or ?is_default=.
Add a step
POST /v1/escalation-policies/{policy_uuid}/stepsField | Type | Required | Notes |
| integer | yes | Position of this step in the sequence. Must be a unique positive number within the policy. |
| integer | yes | How long to wait before escalating to this step. Must be |
| string | yes |
|
| string or null | required (non-null) when | UUID of the target user. Omit or send |
| string or null | required (non-null) for the | UUID of the target team. Omit or send |
Example request body:
{"step_order": 2, "wait_seconds": 300, "target_type": "USER", "target_user_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901"}
Response (201):
{
"object": "escalation_step",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"step_order": 2,
"wait_seconds": 300,
"target_type": "USER",
"user": {
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"display_name": "Alice Example",
"jira_account_id": "5c8a9b6d4f2e1a0b3c7d8e9f"
},
"team": null,
"created_at": "2026-06-12T00:00:00.000Z",
"updated_at": "2026-06-12T00:00:00.000Z"
}
Update or delete a step
PATCH /v1/escalation-policies/{policy_uuid}/steps/{step_uuid}
DELETE /v1/escalation-policies/{policy_uuid}/steps/{step_uuid}
PATCH accepts wait_seconds, target_type, target_user_id, target_team_id — all optional, send only what changed. step_order can't be changed after a step is created.
Update or delete a policy
PATCH /v1/escalation-policies/{policy_uuid}
DELETE /v1/escalation-policies/{policy_uuid}
PATCH accepts policy_name, is_default, applicable_severities, repeat_count, auto_resolve_after_hours.
DELETE returns 409 if this is the team's last default policy — every team needs one policy that catches severities nothing else covers.
