Explore documentation
Webhook subscriptions
Receive automated HTTP POST requests whenever there's a status update on the services you're monitoring. Instead of constantly polling for changes, we'll push updates directly to your endpoint.
Subscribe with webhooks
- Visit the status page you want to follow.
- Click Get updates.
- Select Webhook as the subscription type.
- Enter your endpoint URL, which must start with
https://. - Provide your email for confirmation and failure notifications.
- Click Subscribe.
- Check your email and click the confirmation link.
Your webhook starts receiving updates immediately after confirmation.
Example payloads
Every request shares the same meta and page objects. The event_type field tells you which event was delivered, and the event-specific object that follows.
Payload structure
Shared objects
Every payload includes meta and page.
Meta:
unsubscribe- Link that stops this webhook subscriptiondocumentation- Link to this page
Page:
id- Numeric identifier of the status pagestatus_indicator- Overall status of the page, one ofoperational,degraded,downtime, ormaintenancestatus_description- Human-readable summary ofstatus_indicator
The status_indicator and status_description values always pair up as follows:
status_indicator |
status_description |
|---|---|
operational |
All services are online |
degraded |
Some services are degraded |
downtime |
Some services are down |
maintenance |
Ongoing maintenance |
Event types
The event_type field determines which event-specific object is present:
incident- New incident or an update to an existing incident.
Payload carries anincidentobject.maintenance- Scheduled maintenance window or an update to one.
Payload carries amaintenanceobject.component_update- Monitored component changed status.
Payload carriescomponent_updateandcomponentobjects.
Incident and maintenance objects
Both objects share the same fields. Maintenance adds starts_at and ends_at, and names its updates array maintenance_updates.
id- Numeric identifier of the incident or maintenancename- Title shown on the status pagecreated_at/updated_at- ISO 8601 timestampsstarts_at/ends_at- Scheduled window for maintenance onlyshortlink- Public link to the incident on the status pageorganization_id- Identifier of the status page the incident belongs to, matchespage.idincident_updatesormaintenance_updates- Array of updates, newest first, each entry contains:id- Numeric identifier of the updatestatus_report_id- Identifier of the parent incident or maintenancebody- Update message textcreated_at/updated_at- ISO 8601 timestamps
Component updates and component objects
The component_update describes the change:
id- Unique identifier for this change eventcreated_at- ISO 8601 timestamp of the changeold_status- Previous status, set toresolvedwhen the previous status wasn't trackednew_status- Status the component changed tocomponent_id- Numeric identifier of the component, matchescomponent.id
The component describes the component's current state:
id- Numeric identifier of the componentname- Public name of the componentstatus- Current status, matchingnew_statuscreated_at- ISO 8601 timestamp of when the component was created
Component statuses use the same values as page.status_indicator: operational, degraded, downtime, and maintenance.
HTTP request details
Headers
Every webhook request includes these headers:
Content-Type: application/jsonUser-Agent: BetterStack-StatusPage/1.0X-BetterUptime-Event: [event_type]
Event type is eitherincident,maintenance, orcomponent_update.
Request format
All webhooks use HTTP POST with JSON payloads. Requests are sent with:
- UTF-8 encoding
- JSON content type
- HTTPS only - plain HTTP is not supported
Timeouts
- Connection timeout: 10 seconds
- Request timeout: 30 seconds
Your endpoint must respond within 30 seconds or the request is considered failed.
Expected response
We consider any 2xx HTTP status code as successful. Your endpoint should:
- Return
200 OK,201 Created, or204 No Content - Respond within 30 seconds
- Not require authentication headers - use URL-based auth if needed
Redirects
Webhooks do not follow HTTP redirects. Make sure your endpoint URL returns a direct 2xx response.
Retry policy
If your webhook fails, we'll automatically retry with exponential backoff:
- 1st retry: after 30 seconds
- 2nd retry: after 1 minute
- 3rd retry: after 2 minutes
- 4th retry: after 4 minutes
- 5th retry: after 8 minutes
- Continuing up to 10 retries
After failed retries
After 10 failed attempts, we'll:
- Deactivate the webhook subscription
- Send an email notification to your contact email about the failure
- Stop sending updates until you reactivate the subscription
Reactivating after failure
To reactivate a deactivated webhook:
- Fix the endpoint issue causing failures.
- Visit the status page and subscribe again with the same endpoint URL.
- Confirm the subscription via email.
Resubscribing with the same URL resets the failure count and requires a fresh email confirmation.
Best practices
Respond fast, process later. Return a 2xx response as soon as you receive the payload, then queue it for background processing. Heavy work before responding risks hitting the 30 second timeout.
Handle retries idempotently. A failed delivery may arrive more than once. Deduplicate on
idfields so repeated deliveries don't create duplicate work.Monitor failure emails. A deactivation email means deliveries stopped. Common causes are an unreachable endpoint, an expired SSL certificate, or a firewall blocking Better Stack.
Log requests. Record headers and bodies so you can debug when updates don't appear as expected.
Troubleshooting
Webhook not receiving requests
- Verify the subscription was confirmed via email.
- Check the endpoint URL is correct and reachable over HTTPS.
- Ensure the endpoint returns a 2xx status within 30 seconds.
- Confirm your firewall allows HTTPS traffic from Better Stack.
- Verify the SSL certificate is valid.
Requests timing out
- Move processing to a background queue.
- Return a 2xx response immediately after receiving the payload.
- Check network latency to your endpoint.
Need help?
Please let us know at hello@betterstack.com. We're happy to help! 🙏