Notification Webhooks
Get notified the moment a webhook arrives. The receiver POSTs a JSON summary with a ready-made message to Slack, Discord, or any service that accepts JSON, with no polling.
Updated Oct 2026
Get alerted the instant a webhook arrives, without watching the dashboard.
Add a notification URL to any endpoint and the receiver POSTs a JSON summary after each captured request. The summary carries a ready-made message, so Slack incoming webhooks and Discord webhooks show it as they are. Any other service that accepts an HTTP POST with a JSON body can read the fields.
Setup
- Open the endpoint's Settings tab in the dashboard
- In the Notifications section, paste your notification URL
- Click Save changes
That's it. The next webhook that hits your endpoint triggers a notification.
Payload format
The receiver sends a POST request with a JSON body:
{
"slug": "my-endpoint",
"method": "POST",
"path": "/webhooks/stripe",
"ip": "203.0.113.42",
"receivedAt": "2026-04-03T12:34:56.789Z",
"preview": "{\"type\":\"checkout.session.completed\",\"data\":{\"object\":{\"id\":\"cs_test...",
"text": "New webhook on *my-endpoint* (`POST /webhooks/stripe`)\nReceived 2026-04-03T12:34:56.789Z (UTC)\n```\n{\"type\":\"checkout.session.completed\",...}\n```",
"content": "New webhook on *my-endpoint* (`POST /webhooks/stripe`)\nReceived 2026-04-03T12:34:56.789Z (UTC)\n```\n{\"type\":\"checkout.session.completed\",...}\n```"
}| Field | Type | Description |
|---|---|---|
slug | string | Endpoint slug that received the webhook |
method | string | HTTP method of the incoming request |
path | string | Request path after the slug |
ip | string | Client IP address of the webhook sender |
receivedAt | string | When the receiver took the request, ISO 8601 in UTC with milliseconds |
preview | string | First 200 characters of the request body (truncated with ...) |
text | string | The message for Slack: <, > and & from the request are escaped |
content | string | The same message for Discord, unescaped and under Discord's 2,000 characters |
The message names the endpoint, the method and path, and when the request arrived (Received ..., the same UTC time as receivedAt), followed by the body: up to 3,000 characters in text, and as much as fits in content, cut inside the code block so it still closes. Use receivedAt to measure how long a webhook took to reach webhooks.cc: it is taken when the receiver handles the request, after our CDN edge.
In the message, paths longer than 100 characters are shortened; the path field keeps the whole path. When the URL is a Discord webhook, the body also sets allowed_mentions to { "parse": [] }, so an @everyone in a webhook pings nobody.
For captured emails, method is EMAIL, path is the recipient address, preview is the subject followed by the start of the text, and the message reads "New email to ...".
Notifications or forwarding?
A notification is a heads-up: at most one message a second per endpoint, sent at once, never retried and not logged. When every request has to reach your channel or your server, use forwarding instead: it posts the same message to Slack or Discord for every request (or relays the request to your server), retries until it is accepted, and logs each delivery with its timing. Both can be on at once; if they point at the same channel, every request that also triggers a notification arrives there twice.
Rate limiting
Notifications are rate-limited to one per second per endpoint. If your endpoint receives a burst of webhooks, only the first notification fires; later ones within the cooldown window are skipped. This keeps a burst from flooding your channel.
Delivery behavior
- Fire-and-forget: notifications don't block the webhook response. The sender gets their response immediately regardless of notification delivery.
- No retries: if the notification URL is unreachable or answers with an error status, the notification is dropped. The captured request is unaffected.
- 5-second timeout: the receiver gives up after 5 seconds.
Slack setup
- In Slack, go to Your Apps and create an app (or use an existing one)
- Enable Incoming Webhooks and click Add New Webhook to Workspace
- Choose a channel and copy the webhook URL
- Paste into your endpoint's notification URL field
Slack posts the text field: the endpoint, the method and path, and the start of the body in a code block. For richer formatting, route the JSON through a small serverless function that turns it into Slack Block Kit blocks.
Discord setup
- In Discord, go to Server Settings > Integrations > Webhooks
- Click New Webhook, choose a channel, and copy the webhook URL
- Paste it into your endpoint's notification URL field as it is
Discord posts the content field and, for these URLs, pings nobody. Use the plain URL rather than Discord's Slack-compatible form (ending in /slack): that form posts text instead, and its handling of mentions is not documented.
Microsoft Teams
Microsoft retired the Office 365 connectors in Teams in 2026. Their replacement, Teams Workflows webhooks, expects an Adaptive Card, not this JSON, so a Workflows URL does not post these notifications as they are. Create a Power Automate flow with the trigger When a Teams webhook request is received that reads text from the body and posts it to a channel, and use the flow's URL as the notification URL.
SDK and MCP
Set notificationUrl when creating or updating endpoints programmatically:
const client = new WebhooksCC({ apiKey: "whcc_..." });
// Set on creation
const endpoint = await client.endpoints.create({
name: "my-endpoint",
notificationUrl: "https://hooks.slack.com/services/T.../B.../xxx",
});
// Update later
await client.endpoints.update("my-endpoint", {
notificationUrl: "https://discord.com/api/webhooks/...",
});
// Clear it
await client.endpoints.update("my-endpoint", {
notificationUrl: null,
});The MCP server exposes notificationUrl on both create_endpoint and update_endpoint tools.
Clearing the notification URL
Set the field to empty in endpoint settings and save, or pass null via the SDK/API. The endpoint will stop sending notifications immediately.