Skip to main content
The notifications API controls where incidents go. Destinations say where to send a message, and routes say which incidents go to which destinations. This API replaces the retired alerts.* operations. Destinations replace alert rule channel configs, and routes replace alert rule trigger conditions. The test-send endpoint uses the same outbound path as real notifications.

Operations

Destination configs are type-specific:
  • slack — { channelId, channelName }, plus integrationId pointing at the connected Slack OAuth row.
  • slack_war_room — { namingPrefix?, inviteUserIds?, inviteUserGroupIds?, archiveOnResolve? }, plus integrationId pointing at the connected Slack OAuth row. namingPrefix is 1-16 lowercase characters (a-z, 0-9, -, _) and defaults to inc-. inviteUserIds takes up to 50 Slack user ids and inviteUserGroupIds up to 20 Slack user group ids. archiveOnResolve defaults to true.
  • webhook — { url, secret? }. url must use public HTTPS. Secret enables X-Squasher-Signature HMAC SHA-256 on the request body. At delivery time, Squasher rejects private or reserved DNS results, pins the TLS connection to a validated public address, refuses redirects, and applies a 10-second timeout.
  • email — { recipients: string[] }, max 20.
  • pagerduty — { integrationKey, severityMap? }.
  • telegram — { botToken, chatId, messageThreadId? }. chatId is a numeric Telegram chat ID or a public group/channel @username. messageThreadId selects a forum topic. Squasher checks that the bot can access the chat before creating the destination. Use Send test to confirm posting rights; creation alone does not send a message.
  • teams — { webhookUrl }. The URL of a Microsoft Teams Workflows webhook, for example from the “Send webhook alerts to a channel” workflow. Only HTTPS URLs on *.environment.api.powerplatform.com or *.logic.azure.com are accepted; other hosts, including retired Office 365 connector URLs, return 422. Squasher posts an Adaptive Card of at most 24 KB, does not follow redirects, and retries only throttling and server errors. When the outcome is unknown (the connection dropped after sending), the delivery has success: false and metadata.outcome: "unknown", and it is not retried. Use Send test to confirm delivery; creation alone does not send a message.
  • oncall_escalation — { "policyId": "<uuid>" }. Starts the escalation policy when a matching incident opens. The policy must be enabled and must be team-wide or scoped to this project; otherwise creation returns 422. Do not send integrationId. The destination acts only on opened: acknowledging or resolving the incident stops its pages. Manage policies with the On-call API. If the policy is later disabled or deleted, deliveries to this destination fail and appear in delivery history. notifications.testDestination is not supported for this type: the test is recorded as a failed delivery and nobody is paged.
Route behavior supports one setting: includeAiSummary?: boolean. When it is false, AI-derived incident sections are omitted from the initial delivery and every retry. Cooldown belongs to monitor incident creation, not notification routing; notification-route cooldown and update-grouping fields are rejected. Route scope supports sourceTypes?, sourceIds?, monitorIds?, and components? (string arrays). sourceIds matches the incident’s source, for example an alert source (connector) ID, so one alert source can go to its own route. A matching non-default route replaces the default route for that event. See Add a route with filters for every filter. Route conditions support attentionClasses?: ("interrupt" | "digest")[]. Omitting the field matches both classes. An active, expiring monitor-tuning override can route that monitor’s incident events as digest while leaving the incident severity unchanged; reverting or expiring the override restores interrupt. Configure a matching digest route before applying the proposal. Routes may explicitly include the comment_mentioned lifecycle event. This event posts only to attached Slack channel destinations; it does not deliver to webhook, PagerDuty, Telegram, Microsoft Teams, or configured email destinations. Independently, a valid mention can create the recipient’s inbox item and account email. Personal notification preferences, grouping, and limits apply before delivery. Existing routes do not acquire mention delivery automatically. See Comment mentions for the dashboard behavior. Responder rotations live in the On-call API. Use onCall.getCurrentEngineer or onCall.listShifts when an agent needs to explain who is currently covering a project before changing notification routes.

Create an on-call escalation destination

Attach the returned destination id to a route that includes the opened event. When a page is exhausted, the same route sends an escalation_exhausted notice to its other destinations; the route does not need to list that event. Secret fields (webhook secret, PagerDuty integration key, Slack bot token, Telegram bot token, Microsoft Teams webhook URL) are write-only. Telegram tokens and Teams webhook URLs are encrypted in storage; configPreview.botToken and configPreview.webhookUrl are Configured, and configPreview.host is the Teams webhook host. Other secret previews show a redacted ••••<last4> value. Webhook previews contain only the URL origin; path, query, and credential material are never returned.

Webhook payload

Webhook destinations receive a JSON POST with this shape:
  • Webhook event values are opened, acknowledged, resolved, status_changed, public_update, or escalation_exhausted. escalation_exhausted means an on-call page on the same route ended with no acknowledgement. status_changed comes from explicit incident status changes, while public status-page notes emit public_update. comment_mentioned is a route condition for opt-in Slack channels, not a webhook event.
  • severity.label reflects the project’s notation — SEV-1 by default, P1 when the project’s severity_naming_style is p, or a custom rename. Use severity.key (always sev-N) and severity.rank (1–N) for stable routing on the consumer side.
  • severity is null when the incident has no resolved severity (e.g. test sends without an incident row).
  • When a destination secret is set, the same JSON body is signed with HMAC SHA-256 and the hex digest is sent in X-Squasher-Signature.

Auth

Every operation is project-scoped and authenticated. Required scope: notifications:read for the three list endpoints, notifications:write for the rest. Both are covered by the * wildcard and write global shortcuts on an API key.

CLI and MCP

Use squasher notifications destinations|routes|deliveries in a terminal:
--input takes the other route fields (scope, conditions, behavior) as JSON. Deletes ask for confirmation; pass --yes in scripts. In MCP Code Mode, use search("notifications") before execute, and ask for confirmation before creating, updating, deleting, or sending a test notification.

Agent handoff

Related: Notifications, Incidents API.