Webhooks
Webhooks allow you to integrate Pulsewise with any service by sending structured JSON payloads to an HTTPS endpoint of your choice.
Setup
- In Pulsewise, go to your site's Settings > Notifications.
- Click Add Notification Channel and select Webhook.
- Enter your HTTPS webhook URL.
- Configure which notification types to send.
Webhook URLs must use HTTPS. HTTP URLs are not accepted.
Payload format
Every webhook sends an HTTP POST request with a JSON body. All payloads share this base structure:
{
"event": "site_offline",
"title": "Site Offline",
"description": "Oh no. Example Site is offline.",
"severity": "critical",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
| Field | Type | Description |
|---|---|---|
event |
string | Machine-readable event identifier (e.g. site_offline) |
title |
string | Human-readable event title |
description |
string | Detailed description including the site name |
severity |
string | One of info, warning, or critical |
timestamp |
string | ISO 8601 timestamp of when the event occurred |
site |
object | The affected site's ID, name, and URL |
check |
object | Only present for uptime events. Contains response_time, status_code, and location |
Severity levels
info— Positive events (site online, certificate renewed, issues resolved)warning— Events that need attention (certificate expiring, performance degraded, DNS changed)critical— Urgent events (site offline, certificate expired, broken links found)
Event payloads
Below are the payloads for each event type Pulsewise can send. Click to expand.
Status
site_online — Site has recovered
{
"event": "site_online",
"title": "Site Online",
"description": "Example Site has recovered.",
"severity": "info",
"timestamp": "2026-01-15T10:35:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
},
"check": {
"response_time": 245,
"status_code": 200,
"location": "sydney"
}
}
site_offline — Site is offline
{
"event": "site_offline",
"title": "Site Offline",
"description": "Oh no. Example Site is offline.",
"severity": "critical",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
},
"check": {
"response_time": 5000,
"status_code": 0,
"location": "sydney"
}
}
Performance
performance_improved — Response times improved
{
"event": "performance_improved",
"title": "Site Performance Improved",
"description": "Nice! We've noticed Example Site is about 25% faster over the last 15 minutes than the previous period.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
performance_degraded — Response times worsened
{
"event": "performance_degraded",
"title": "Site Performance Degraded",
"description": "Damn, We've noticed Example Site is about 30% slower over the last 15 minutes than the previous period.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
SSL Certificates
certificate_expiring — Certificate expiring soon
{
"event": "certificate_expiring",
"title": "SSL Certificate Expiring",
"description": "SSL certificate for Example Site is expiring soon.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
certificate_expired — Certificate has expired
{
"event": "certificate_expired",
"title": "SSL Certificate Expired",
"description": "SSL certificate for Example Site has expired.",
"severity": "critical",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
certificate_changed — Certificate details changed
{
"event": "certificate_changed",
"title": "SSL Certificate Changed",
"description": "SSL certificate for Example Site has changed.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
certificate_renewed — Certificate renewed
{
"event": "certificate_renewed",
"title": "SSL Certificate Expiring",
"description": "SSL certificate for Example Site is expiring soon.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
Broken Links
broken_links_found — Broken links detected
{
"event": "broken_links_found",
"title": "Broken Links Found",
"description": "We've found broken links on Example Site.",
"severity": "critical",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
broken_links_fixed — All broken links resolved
{
"event": "broken_links_fixed",
"title": "Broken Links Fixed",
"description": "We've found no broken links on Example Site.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
Mixed Content
mixed_content_found — Insecure resources detected
{
"event": "mixed_content_found",
"title": "Mixed Content Found",
"description": "We've found mixed content on Example Site.",
"severity": "critical",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
mixed_content_resolved — All mixed content fixed
{
"event": "mixed_content_resolved",
"title": "Mixed Content Resolved",
"description": "Mixed content resolved on Example Site.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
mixed_content_partially_resolved — Some issues fixed
{
"event": "mixed_content_partially_resolved",
"title": "Mixed Content Partially Resolved",
"description": "Some mixed content resolved on Example Site.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
DNS
dns_records_changed — DNS records modified
{
"event": "dns_records_changed",
"title": "DNS Records Changed",
"description": "DNS records have changed for Example Site.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
Sitemap
sitemap_issues_found — Sitemap problems detected
{
"event": "sitemap_issues_found",
"title": "Sitemap Issues Found",
"description": "We've found issues with the sitemap on Example Site.",
"severity": "critical",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
sitemap_issues_resolved — Sitemap is valid again
{
"event": "sitemap_issues_resolved",
"title": "Sitemap Issues Resolved",
"description": "The sitemap on Example Site is now valid with 142 URLs.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
Domain
domain_expiring — Domain expires soon
{
"event": "domain_expiring",
"title": "Domain Expiring Soon",
"description": "Domain example.com expires on Mar 15, 2026 (30 days from now)",
"severity": "warning",
"timestamp": "2026-02-13T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
domain_expired — Domain has expired
{
"event": "domain_expired",
"title": "Domain Expired",
"description": "Domain example.com expired on Feb 12, 2026",
"severity": "critical",
"timestamp": "2026-02-13T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
domain_changed — Domain registration changed
{
"event": "domain_changed",
"title": "Domain Changes Detected",
"description": "2 changes detected for example.com.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
Lighthouse
lighthouse_performance_improved — Performance score increased
{
"event": "lighthouse_performance_improved",
"title": "Page Speed Insights performance score improved",
"description": "The performance score for Example Site has improved.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_performance_degraded — Performance score decreased
{
"event": "lighthouse_performance_degraded",
"title": "Page Speed Insights performance score decreased",
"description": "The performance score for Example Site has decreased.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_seo_improved — SEO score increased
{
"event": "lighthouse_seo_improved",
"title": "Page Speed Insights SEO score improved",
"description": "The SEO score for Example Site has improved.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_seo_degraded — SEO score decreased
{
"event": "lighthouse_seo_degraded",
"title": "Page Speed Insights SEO score decreased",
"description": "The SEO score for Example Site has decreased.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_accessibility_improved — Accessibility score increased
{
"event": "lighthouse_accessibility_improved",
"title": "Page Speed Insights accessibility score improved",
"description": "The accessibility score for Example Site has improved.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_accessibility_degraded — Accessibility score decreased
{
"event": "lighthouse_accessibility_degraded",
"title": "Page Speed Insights accessibility score decreased",
"description": "The accessibility score for Example Site has decreased.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_best_practices_improved — Best practices score increased
{
"event": "lighthouse_best_practices_improved",
"title": "Page Speed Insights best practices score improved",
"description": "The best practices score for Example Site has improved.",
"severity": "info",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
lighthouse_best_practices_degraded — Best practices score decreased
{
"event": "lighthouse_best_practices_degraded",
"title": "Page Speed Insights best practices score decreased",
"description": "The best practices score for Example Site has decreased.",
"severity": "warning",
"timestamp": "2026-01-15T10:30:00Z",
"site": {
"id": "1",
"name": "Example Site",
"url": "https://example.com"
}
}
Headers
Pulsewise sends the following headers with each webhook request:
| Header | Value |
|---|---|
Content-Type |
application/json |
User-Agent |
Pulsewise/1.0 |
Security
Pulsewise validates that webhook URLs do not resolve to private or reserved IP addresses. Redirects are not followed to prevent SSRF attacks.
Retry policy
If the webhook endpoint returns a non-2xx status code or times out (10 second limit), the delivery is logged as failed. Currently, failed webhooks are not automatically retried.