Skip to content

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

  1. Open the endpoint's Settings tab in the dashboard
  2. In the Notifications section, paste your notification URL
  3. 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```"
}
FieldTypeDescription
slugstringEndpoint slug that received the webhook
methodstringHTTP method of the incoming request
pathstringRequest path after the slug
ipstringClient IP address of the webhook sender
receivedAtstringWhen the receiver took the request, ISO 8601 in UTC with milliseconds
previewstringFirst 200 characters of the request body (truncated with ...)
textstringThe message for Slack: <, > and & from the request are escaped
contentstringThe 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

  1. In Slack, go to Your Apps and create an app (or use an existing one)
  2. Enable Incoming Webhooks and click Add New Webhook to Workspace
  3. Choose a channel and copy the webhook URL
  4. 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

  1. In Discord, go to Server Settings > Integrations > Webhooks
  2. Click New Webhook, choose a channel, and copy the webhook URL
  3. 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.