Browse the docs
Webhooks
Send competitor alerts to your own endpoint or to a Discord, Microsoft Teams or Slack channel, and build on the alert payload.
Use a webhook when alerts need to land somewhere other than email or the Slack app: your own system, an automation tool that accepts incoming webhooks, or a Discord or Microsoft Teams channel.
Webhooks are available on Pro, Growth and Teams.
Add a webhook
- Open your account menu (your avatar) and choose Integrations.
- On the Webhooks card, click Connect. If you already have a webhook, click Manage.
- Click Add Webhook.
- Enter a Name you will recognise, the URL to send to, and a Format.
- Click Add Webhook.
The URL must be a public http or https address. Use https. Addresses on private or internal networks are refused.
You can add more than one webhook. Every webhook receives the same alerts.
Webhooks belong to your own login. On a team, alerts for a competitor go to the webhooks of the teammate who added that competitor.
Formats
| Format | Use it for |
|---|---|
| Generic JSON | Your own code or an automation tool. The payload is described below. |
| Slack-compatible | A Slack incoming webhook URL |
| Discord-compatible | A Discord channel webhook URL |
| Teams-compatible | A Microsoft Teams incoming webhook URL |
The chat formats post a short message with the competitor, the kind of change, its importance, a summary and a link back to SpyGlow. For Slack, the Slack integration gives fuller messages and lets you pick the channel from a list.
Test it
Each webhook in the list has a send button (the paper plane icon). Click it to send a test payload. You see "Test payload sent!" when your endpoint accepts it, or "Failed to send test payload" when it does not. The test uses a sample competitor called "Test Competitor" on example.com, so you can tell it apart from real alerts.
Which alerts are sent
A webhook gets an alert when all three are true:
- Webhook is on for that competitor, either directly or through Use global alert defaults. Webhook starts off for every new competitor. Change it in the competitor's Settings tab, under Alert Preferences. See Alerts and notifications.
- The change passes that competitor's alert level.
- The change scores 5 or more out of 10.
The payload
SpyGlow sends an HTTP POST with a JSON body and these headers:
Content-Type: application/jsonUser-Agent: SpyGlow-Webhook/1.0
A Generic JSON alert looks like this:
{
"event": "competitor_change",
"timestamp": "2026-10-27T14:05:12.481Z",
"competitor": {
"id": "66f1c0a2b9e4d81c2a7f3b10",
"name": "Example Co",
"domain": "example.com"
},
"change": {
"id": "6721f0c2a9b4e81d3c5f7a10",
"type": "content_change",
"importance": 8,
"page": {
"title": "Pricing",
"path": "/pricing",
"url": "https://example.com/pricing"
},
"summary": "Example Co added an annual plan and raised the price of its Team tier.",
"detected_at": "2026-10-27T14:04:58.903Z",
"view_url": "https://www.spyglow.com/changes/consolidated/6721f0c2a9b4e81d3c5f7a10"
}
}
| Field | What it holds |
|---|---|
event | Always competitor_change |
timestamp | When SpyGlow sent the alert, in UTC |
competitor.id, name, domain | The competitor as it appears in SpyGlow |
change.id | An ID for this alert |
change.type | The kind of change, for example content_change. Treat it as a label, since new values can appear. |
change.importance | The score, from 1 to 10 |
change.page.title, path | The page that changed. When an alert covers several pages, this is the first one. |
change.page.url | The full page address. It can be missing. |
change.summary | A plain-text summary of the change |
change.detected_at | When SpyGlow found the change, in UTC |
change.view_url | A link to the change in SpyGlow |
Write your code so a missing field does not break it.
If a delivery fails
SpyGlow sends each alert once and does not retry. If your endpoint is down, does not reply within 10 seconds, or replies with a status outside the 2xx range, that alert does not reach the webhook. SpyGlow does not list failed deliveries.
Plan for this:
- Reply with a 2xx status right away, then do any slow work afterwards.
- Treat the Changes page as the full record. Every change SpyGlow finds is kept there, whether or not a webhook received it.
Keep your URL private
SpyGlow does not sign webhook requests, so anyone who knows the URL could post to it. Use a long, hard-to-guess URL, keep it out of shared documents, and check that incoming data matches the payload above.
Stop or remove a webhook
- To stop alerts from one competitor, turn off Webhook in that competitor's Alert Preferences.
- To remove a webhook, open Integrations, click Manage on the Webhooks card, and click the trash icon next to it. Deliveries stop at once.
There is no pause switch. To pause a webhook, remove it and add it again later.