Escalations
Create, read, update and archive escalation policies.
An escalation policy is a simple set of rules to alert the right person at the right time using the right channel such as phone, slack or email. If that person misses out then the incident gets escalated to the next person.
Your organisation's API key. Create one in the Spike dashboard under Settings > API. Sent on every request as the x-api-key header.
The target team's _id — a 24-character hex ObjectId such as 5f2b1c4d9e8a7b6c5d4e3f21. This is NOT the short uid slug (e.g. eng) shown in dashboard URLs; passing the uid will not resolve a team. Read the _id from GET /teams/get-all-teams or GET /teams/get-my-teams.
REQUIRED for: GET /on-calls (API-key callers get 400 without it), POST /on-calls, and every team-scoped read that declares it — the /incidents/* and /services/* listings, /escalations, /automation/rules and the integration endpoints.
OPTIONAL for: the incident action endpoints (acknowledge, resolve, escalate, unacknowledge), which derive the organisation from the API key itself; PUT /on-calls/{oncallId} and the on-call layer endpoints, which fall back to the organisation's default team; and org-wide reads such as GET /orgs/info and GET /users, which ignore it.
When supplied it must name a team inside the API key's organisation. A team from another organisation is rejected with 403.
Your API key. Find it in your Spike dashboard under Settings > API.
The team's _id — a 24-character hex ObjectId, NOT the short uid slug. Read it from GET /teams/get-all-teams.
5f2b1c4d9e8a7b6c5d4e3f21Successful response
Unauthorized
GET /escalations HTTP/1.1
Host: api.spike.sh
x-api-key: text
x-team-id: text
Accept: */*
{
"totalEscalations": 1,
"escalations": [
{
"_id": "63c9a1b2d4e5f60718293a4b",
"name": "Engineering primary",
"teams": [
"5f2b1c4d9e8a7b6c5d4e3f21"
],
"org": "5f72e289b17d1656e0115098"
}
],
"pagination": {
"perPage": 20,
"currentPage": 1,
"skip": 0,
"total": 1,
"totalPages": 1,
"pages": [
1
],
"showingFrom": 0,
"showingTill": 1
}
}Get details of an escalation policy. Includes escalation policy name, description, and escalation rules.
Your organisation's API key. Create one in the Spike dashboard under Settings > API. Sent on every request as the x-api-key header.
The target team's _id — a 24-character hex ObjectId such as 5f2b1c4d9e8a7b6c5d4e3f21. This is NOT the short uid slug (e.g. eng) shown in dashboard URLs; passing the uid will not resolve a team. Read the _id from GET /teams/get-all-teams or GET /teams/get-my-teams.
REQUIRED for: GET /on-calls (API-key callers get 400 without it), POST /on-calls, and every team-scoped read that declares it — the /incidents/* and /services/* listings, /escalations, /automation/rules and the integration endpoints.
OPTIONAL for: the incident action endpoints (acknowledge, resolve, escalate, unacknowledge), which derive the organisation from the API key itself; PUT /on-calls/{oncallId} and the on-call layer endpoints, which fall back to the organisation's default team; and org-wide reads such as GET /orgs/info and GET /users, which ignore it.
When supplied it must name a team inside the API key's organisation. A team from another organisation is rejected with 403.
escalationId parameter
Your API key. Find it in your Spike dashboard under Settings > API.
The team's _id — a 24-character hex ObjectId, NOT the short uid slug. Read it from GET /teams/get-all-teams.
5f2b1c4d9e8a7b6c5d4e3f21Successful response
Unauthorized
Not found
GET /escalations/{escalationId} HTTP/1.1
Host: api.spike.sh
x-api-key: text
x-team-id: text
Accept: */*
{
"escalation": {
"_id": "63c9a1b2d4e5f60718293a4b",
"name": "Engineering primary",
"teams": [
"5f2b1c4d9e8a7b6c5d4e3f21"
],
"org": "5f72e289b17d1656e0115098"
},
"integrations": [
{
"_id": "62a1b2c3d4e5f60718293a4b",
"name": "AWS CloudWatch",
"slug": "aws",
"token": "a1b2c3d4e5f6a7b8c9d0",
"webhookUrl": "https://hooks.spike.sh/a1b2c3d4e5f6a7b8c9d0/push-events",
"service": "61d2c3b4a5968778695a4b3c",
"escalation": "63c9a1b2d4e5f60718293a4b",
"teams": [
"5f2b1c4d9e8a7b6c5d4e3f21"
],
"createdAt": "2026-03-13T09:41:00.000Z"
}
],
"isPinned": false,
"alertRules": []
}Get a list of escalation policies that reference a specific on-call schedule. Useful for understanding which escalations will be affected if you modify or delete an on-call schedule.
Your organisation's API key. Create one in the Spike dashboard under Settings > API. Sent on every request as the x-api-key header.
The target team's _id — a 24-character hex ObjectId such as 5f2b1c4d9e8a7b6c5d4e3f21. This is NOT the short uid slug (e.g. eng) shown in dashboard URLs; passing the uid will not resolve a team. Read the _id from GET /teams/get-all-teams or GET /teams/get-my-teams.
REQUIRED for: GET /on-calls (API-key callers get 400 without it), POST /on-calls, and every team-scoped read that declares it — the /incidents/* and /services/* listings, /escalations, /automation/rules and the integration endpoints.
OPTIONAL for: the incident action endpoints (acknowledge, resolve, escalate, unacknowledge), which derive the organisation from the API key itself; PUT /on-calls/{oncallId} and the on-call layer endpoints, which fall back to the organisation's default team; and org-wide reads such as GET /orgs/info and GET /users, which ignore it.
When supplied it must name a team inside the API key's organisation. A team from another organisation is rejected with 403.
oncallId parameter
Your API key. Find it in your Spike dashboard under Settings > API.
The team's _id — a 24-character hex ObjectId, NOT the short uid slug. Read it from GET /teams/get-all-teams.
5f2b1c4d9e8a7b6c5d4e3f21A bare JSON array of the escalation policies that reference this on-call.
Unauthorized
The on-call does not exist.
GET /on-calls/{oncallId}/escalations HTTP/1.1
Host: api.spike.sh
x-api-key: text
x-team-id: text
Accept: */*
[
{
"_id": "63c9a1b2d4e5f60718293a4b",
"name": "Engineering primary",
"teams": [
"5f2b1c4d9e8a7b6c5d4e3f21"
],
"org": "5f72e289b17d1656e0115098"
}
]Create a new escalation policy for a team. An escalation policy defines who gets notified, how (via which channel), and the delay between steps.
Request Body:
name(required): A descriptive name for the escalation policy.escalation(required): An array of steps. Each step is an array of notification rules that fire in parallel. Steps are executed sequentially — Step 2 fires only if Step 1 is not acknowledged within its interval.delay(optional): Delay in minutes before the first step begins (default:0).
Notification rule fields:
interval: Time in minutes to wait before escalating to the next step. Only required in the first step.via: The notification channel — one ofemail,sms,phone,whatsapp,push-notification,slack,telegram, orms-teams.oncall: Reference to an on-call schedule{ "id": "<on-call-id>" }. The currently on-call user will be notified.user: Reference to a specific user{ "id": "<user-id>" }. Use this to always notify a fixed person.channel: (Slack/MS Teams only) The channel to post to{ "id": "<channel-id>", "value": "<channel-name>", "isPrivate": "false" }.mention: (Slack only) Mention config{ "id": "false", "value": "No mention" }.
Tip: Use
oncallto route alerts to whoever is currently on-call, oruserto always alert a specific person.
Your organisation's API key. Create one in the Spike dashboard under Settings > API. Sent on every request as the x-api-key header.
The target team's _id — a 24-character hex ObjectId such as 5f2b1c4d9e8a7b6c5d4e3f21. This is NOT the short uid slug (e.g. eng) shown in dashboard URLs; passing the uid will not resolve a team. Read the _id from GET /teams/get-all-teams or GET /teams/get-my-teams.
REQUIRED for: GET /on-calls (API-key callers get 400 without it), POST /on-calls, and every team-scoped read that declares it — the /incidents/* and /services/* listings, /escalations, /automation/rules and the integration endpoints.
OPTIONAL for: the incident action endpoints (acknowledge, resolve, escalate, unacknowledge), which derive the organisation from the API key itself; PUT /on-calls/{oncallId} and the on-call layer endpoints, which fall back to the organisation's default team; and org-wide reads such as GET /orgs/info and GET /users, which ignore it.
When supplied it must name a team inside the API key's organisation. A team from another organisation is rejected with 403.
Your API key. Find it in your Spike dashboard under Settings > API.
The team's _id — a 24-character hex ObjectId, NOT the short uid slug. Read it from GET /teams/get-all-teams.
5f2b1c4d9e8a7b6c5d4e3f21Successful response
Bad request
Unauthorized
POST /escalations/create HTTP/1.1
Host: api.spike.sh
x-api-key: text
x-team-id: text
Content-Type: application/json
Accept: */*
Content-Length: 608
{
"name": "Production Critical Alerts",
"escalation": [
[
{
"interval": "10",
"via": "email",
"oncall": {
"id": "64b7e2a1c3d4e5f60718293a"
}
},
{
"interval": "10",
"via": "sms",
"oncall": {
"id": "64b7e2a1c3d4e5f60718293a"
}
},
{
"interval": "10",
"via": "phone",
"oncall": {
"id": "64b7e2a1c3d4e5f60718293a"
}
},
{
"interval": "10",
"via": "push-notification",
"user": {
"id": "6a3c2d5e0f9b8c7d6e5f4a32"
}
}
],
[
{
"interval": "",
"via": "slack",
"channel": {
"id": "C07ABCDEF12",
"value": "incidents",
"isPrivate": "false"
},
"mention": {
"id": "false",
"value": "No mention"
}
},
{
"interval": "",
"via": "push-notification",
"oncall": {
"id": "64b7e2a1c3d4e5f607182941"
}
}
]
],
"delay": "0"
}{
"_id": "63c9a1b2d4e5f60718293a4b",
"name": "Engineering primary",
"teams": [
"5f2b1c4d9e8a7b6c5d4e3f21"
],
"org": "5f72e289b17d1656e0115098"
}Update an existing escalation policy by its ID. Pass the escalation policy _id in the URL and provide the full updated policy in the request body.
You must send the complete escalation structure — partial updates are not supported. The existing policy will be fully replaced with the provided data.
Request Body:
name(required): Updated name for the escalation policy.escalation(required): The full array of escalation steps (same format as Create).delay(optional): Delay in minutes before the first step (default:0).
See the Create an escalation policy endpoint for detailed field descriptions and notification channel options.
Your organisation's API key. Create one in the Spike dashboard under Settings > API. Sent on every request as the x-api-key header.
The target team's _id — a 24-character hex ObjectId such as 5f2b1c4d9e8a7b6c5d4e3f21. This is NOT the short uid slug (e.g. eng) shown in dashboard URLs; passing the uid will not resolve a team. Read the _id from GET /teams/get-all-teams or GET /teams/get-my-teams.
REQUIRED for: GET /on-calls (API-key callers get 400 without it), POST /on-calls, and every team-scoped read that declares it — the /incidents/* and /services/* listings, /escalations, /automation/rules and the integration endpoints.
OPTIONAL for: the incident action endpoints (acknowledge, resolve, escalate, unacknowledge), which derive the organisation from the API key itself; PUT /on-calls/{oncallId} and the on-call layer endpoints, which fall back to the organisation's default team; and org-wide reads such as GET /orgs/info and GET /users, which ignore it.
When supplied it must name a team inside the API key's organisation. A team from another organisation is rejected with 403.
escalationId parameter
Your API key. Find it in your Spike dashboard under Settings > API.
The team's _id — a 24-character hex ObjectId, NOT the short uid slug. Read it from GET /teams/get-all-teams.
5f2b1c4d9e8a7b6c5d4e3f21Successful response
Bad request
Unauthorized
Not found
PUT /escalations/{escalationId}/update HTTP/1.1
Host: api.spike.sh
x-api-key: text
x-team-id: text
Content-Type: application/json
Accept: */*
Content-Length: 607
{
"name": "Updated Production Alerts",
"escalation": [
[
{
"interval": "10",
"via": "email",
"oncall": {
"id": "64b7e2a1c3d4e5f60718293a"
}
},
{
"interval": "10",
"via": "sms",
"oncall": {
"id": "64b7e2a1c3d4e5f60718293a"
}
},
{
"interval": "10",
"via": "phone",
"oncall": {
"id": "64b7e2a1c3d4e5f60718293a"
}
},
{
"interval": "10",
"via": "push-notification",
"user": {
"id": "6a3c2d5e0f9b8c7d6e5f4a32"
}
}
],
[
{
"interval": "",
"via": "slack",
"channel": {
"id": "C07ABCDEF12",
"value": "incidents",
"isPrivate": "false"
},
"mention": {
"id": "false",
"value": "No mention"
}
},
{
"interval": "",
"via": "push-notification",
"oncall": {
"id": "64b7e2a1c3d4e5f607182941"
}
}
]
],
"delay": "0"
}{
"_id": "63c9a1b2d4e5f60718293a4b",
"name": "Engineering primary (updated)",
"teams": [
"5f2b1c4d9e8a7b6c5d4e3f21"
],
"org": "5f72e289b17d1656e0115098"
}Archive (soft-delete) an escalation policy by its ID. Archived escalation policies will no longer be active and won't appear in the default escalation list.
Important: Before archiving, make sure no active integrations are using this escalation policy. Archiving an in-use policy may result in incidents not being escalated properly.
Pass the escalation policy _id as a path parameter. No request body is required.
Your organisation's API key. Create one in the Spike dashboard under Settings > API. Sent on every request as the x-api-key header.
The target team's _id — a 24-character hex ObjectId such as 5f2b1c4d9e8a7b6c5d4e3f21. This is NOT the short uid slug (e.g. eng) shown in dashboard URLs; passing the uid will not resolve a team. Read the _id from GET /teams/get-all-teams or GET /teams/get-my-teams.
REQUIRED for: GET /on-calls (API-key callers get 400 without it), POST /on-calls, and every team-scoped read that declares it — the /incidents/* and /services/* listings, /escalations, /automation/rules and the integration endpoints.
OPTIONAL for: the incident action endpoints (acknowledge, resolve, escalate, unacknowledge), which derive the organisation from the API key itself; PUT /on-calls/{oncallId} and the on-call layer endpoints, which fall back to the organisation's default team; and org-wide reads such as GET /orgs/info and GET /users, which ignore it.
When supplied it must name a team inside the API key's organisation. A team from another organisation is rejected with 403.
escalationId parameter
Your API key. Find it in your Spike dashboard under Settings > API.
The team's _id — a 24-character hex ObjectId, NOT the short uid slug. Read it from GET /teams/get-all-teams.
5f2b1c4d9e8a7b6c5d4e3f21Successful response
Unauthorized
Not found
DELETE /escalations/{escalationId}/archive HTTP/1.1
Host: api.spike.sh
x-api-key: text
x-team-id: text
Accept: */*
{
"archive": true
}Last updated
Was this helpful?