Escalation Policies API
Create and manage multi-step escalation policies for workspace-scoped incident routing.
Escalation policies define who gets notified, when, and through what channel when an incident occurs. Policies are workspace-scoped and evaluated in priority order.
These are dashboard API endpoints — they require an OAuth session token ($ACCESS_TOKEN) and do not accept ionh_ API keys. For API-key access to escalation policies, use the MCP integration. See which credential goes where.
Escalation policies replace the legacy escalation rules. See Escalation Policies for the full conceptual documentation.
Create Escalation Policy
POST /escalation-policiesRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
workspaceId | number | Yes | Workspace this policy belongs to |
name | string | Yes | Human-readable name |
priority | number | Yes | Evaluation order (0 = highest). Must be unique per workspace. |
projectIds | number[] | No | Projects this policy applies to. null = catch-all. |
ackTimeoutMinutes | number | No | Re-escalate if acknowledged but not resolved within this time. null = no timeout. |
repeatCount | number | No | How many times to repeat the escalation cycle (default: 0) |
enabled | boolean | No | Whether the policy is active (default: true) |
steps | array | Yes | Escalation steps (see below) |
Step Object
| Field | Type | Required | Description |
|---|---|---|---|
position | number | Yes | Order within the policy (0-indexed) |
delayMinutes | number | Yes | Minutes after incident creation to fire this step |
targets | array | Yes | Notification targets (see below) |
Step Target Object
| Field | Type | Required | Description |
|---|---|---|---|
targetType | string | Yes | ALERT_CHANNEL, USER, ON_CALL_SCHEDULE, or TEAM |
alertChannelId | number | Conditional | Required when targetType is ALERT_CHANNEL |
targetUserId | number | Conditional | Required when targetType is USER |
targetScheduleId | number | Conditional | Required when targetType is ON_CALL_SCHEDULE |
targetTeamId | number | Conditional | Required when targetType is TEAM |
Example
curl -X POST https://api.ionhour.com/api/escalation-policies \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"workspaceId": 1,
"name": "Production Escalation",
"priority": 0,
"projectIds": [1, 2],
"ackTimeoutMinutes": 30,
"repeatCount": 1,
"steps": [
{
"position": 0,
"delayMinutes": 0,
"targets": [
{ "targetType": "ON_CALL_SCHEDULE", "targetScheduleId": 1 },
{ "targetType": "ALERT_CHANNEL", "alertChannelId": 3 }
]
},
{
"position": 1,
"delayMinutes": 5,
"targets": [
{ "targetType": "TEAM", "targetTeamId": 1 }
]
},
{
"position": 2,
"delayMinutes": 15,
"targets": [
{ "targetType": "ALERT_CHANNEL", "alertChannelId": 5 }
]
}
]
}'List Escalation Policies
GET /escalation-policiesQuery Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
workspaceId | number | Yes | Filter by workspace |
curl -H "Authorization: Bearer $ACCESS_TOKEN" \
"https://api.ionhour.com/api/escalation-policies?workspaceId=1"Get Escalation Policy
GET /escalation-policies/:idReturns a single policy with its steps and targets.
curl -H "Authorization: Bearer $ACCESS_TOKEN" \
https://api.ionhour.com/api/escalation-policies/1Update Escalation Policy
PUT /escalation-policies/:idUpdates a policy. Include only fields you want to change. To update steps, send the full steps array — it replaces the existing steps.
curl -X PUT https://api.ionhour.com/api/escalation-policies/1 \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Updated Policy", "ackTimeoutMinutes": 60}'Delete Escalation Policy
DELETE /escalation-policies/:idcurl -X DELETE https://api.ionhour.com/api/escalation-policies/1 \
-H "Authorization: Bearer $ACCESS_TOKEN"