Escalation Policies
An ordered chain of integrations to notify when an incident stays open — step 1 fires immediately (or after its own delay), then each later step fires after its own delay if nobody's resolved things yet.
A policy is scoped to one project. Each step is just
{ integration_id, delay_minutes } — the channel (Slack, webhook, email, etc.) is whatever that integration was configured as. See Integrations to create the integrations you’ll reference here first.GET
List Escalation Policies/escalation-policiesEscalation policies are project-scoped alerting chains: an ordered list of integrations to notify, each after a delay.
Example Request
curl -X GET "https://api.exitprobe.com/api/v1/escalation-policies" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"Example Response
{
"success": true,
"data": {
"escalation_policies": [
{
"id": 10, "project_id": 3, "name": "Prod on-call", "is_active": true,
"project": { "id": 3, "name": "Default Project" },
"steps": [
{ "id": 55, "order": 1, "delay_minutes": 0, "integration": { "id": 1, "name": "My Webhook", "type": "webhook" } },
{ "id": 56, "order": 2, "delay_minutes": 15, "integration": { "id": 2, "name": "Pager Slack", "type": "slack" } }
]
}
]
}
}POST
Create Escalation Policy/escalation-policiesSteps are given as an ordered array — order is taken from array position, not an explicit field. Each step waits `delay_minutes` after the previous step (or after the incident opens, for step 1) before notifying its integration.
Request Body
| project_id* | integer | Must belong to your account. |
| name* | string | Max 255 chars. |
| is_active | boolean | Default true. |
| steps* | array | 1–10 entries, in order. |
| steps[].integration_id* | integer | Must be an integration you own. |
| steps[].delay_minutes* | integer | 0–1440. |
Notes
- •404 "Project not found." for an unowned project_id.
- •422 "One or more escalation steps reference an integration that does not belong to you."
Example Request
curl -X POST /api/v1/escalation-policies \
-H "Authorization: Bearer 1|K7f9XyZaQ2mN8pL4vR6tW1sJ0hD3cB5gA7eF9uI2oY4" \
-H "Content-Type: application/json" \
-d '{
"project_id": 3,
"name": "Prod on-call",
"steps": [
{"integration_id": 1, "delay_minutes": 0},
{"integration_id": 2, "delay_minutes": 15}
]
}'Example Response
{ "success": true, "message": "Escalation policy created.", "data": { "escalation_policy": { "id": 10, "name": "Prod on-call", "steps": [ { "order": 1, "delay_minutes": 0 } ] } } }PUT
Update Escalation Policy/escalation-policies/{id}Same body as Create — steps are replaced wholesale each time, not merged.
Example Request
curl -X PUT "https://api.exitprobe.com/api/v1/escalation-policies/{id}" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"DELETE
Delete Escalation Policy/escalation-policies/{id}Example Request
curl -X DELETE "https://api.exitprobe.com/api/v1/escalation-policies/{id}" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"Example Response
{ "success": true, "message": "Escalation policy removed." }