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 }, plusintegrationIdpointing at the connected Slack OAuth row.slack_war_room—{ namingPrefix?, inviteUserIds?, inviteUserGroupIds?, archiveOnResolve? }, plusintegrationIdpointing at the connected Slack OAuth row.namingPrefixis 1-16 lowercase characters (a-z,0-9,-,_) and defaults toinc-.inviteUserIdstakes up to 50 Slack user ids andinviteUserGroupIdsup to 20 Slack user group ids.archiveOnResolvedefaults totrue.webhook—{ url, secret? }.urlmust use public HTTPS. Secret enablesX-Squasher-SignatureHMAC 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? }.chatIdis a numeric Telegram chat ID or a public group/channel@username.messageThreadIdselects 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.comor*.logic.azure.comare accepted; other hosts, including retired Office 365 connector URLs, return422. 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 hassuccess: falseandmetadata.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 returns422. Do not sendintegrationId. The destination acts only onopened: 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.testDestinationis not supported for this type: the test is recorded as a failed delivery and nobody is paged.
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
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 JSONPOST with this shape:
- Webhook
eventvalues areopened,acknowledged,resolved,status_changed,public_update, orescalation_exhausted.escalation_exhaustedmeans an on-call page on the same route ended with no acknowledgement.status_changedcomes from explicit incident status changes, while public status-page notes emitpublic_update.comment_mentionedis a route condition for opt-in Slack channels, not a webhook event. severity.labelreflects the project’s notation —SEV-1by default,P1when the project’sseverity_naming_styleisp, or a custom rename. Useseverity.key(alwayssev-N) andseverity.rank(1–N) for stable routing on the consumer side.severityisnullwhen 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
Usesquasher 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.