Skip to content

Webhook events

Reference
For:
Developers

This webhook events list covers every HTTP request HostRepute sends to your own endpoints: the events of a webhook alert channel and the callbacks of checks you start through the API.

Alert channel events Scan callback events
Sent to The URL of a webhook alert channel The callback_url you pass when you start a blocklist or certificate check with the API
Sent when Something the channel follows changes, or you send a test The check ends, whether it completed or failed
Event header X-HostRepute-Event X-Webhook-Event
Timestamp header X-HostRepute-Timestamp X-Webhook-Timestamp
Signature header X-HostRepute-Signature X-Webhook-Signature-V3
Signed with The channel’s own signing secret, which you set in the channel form Your team’s webhook secret
  • Both signatures are sha256= followed by the hex HMAC-SHA256 of the timestamp, a dot and the raw request body. Receive webhooks shows how to check them, with code.
  • The portal doesn’t show the team webhook secret yet, so you can’t check the signature of a scan callback today.
  • HostRepute sends both kinds only to https URLs that resolve to a public address, and doesn’t follow redirects.
EventDescription
alert.testSent when you send a test alert to a webhook channel, from the portal or the API. data.test is always true.
Sample payload
{
"id": "6f1d2c9a-3b7e-4f05-9a8c-2e4b7d1f0c53",
"event": "alert.test",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "HostRepute Test Alert",
"severity": "info",
"summary": "HostRepute test alert webhook delivered successfully.",
"data": {
"message": "This is a test notification from HostRepute.",
"test": true
}
}
alert.blacklist_status_changedSent when blocklist checks find domains or IPs that were newly listed or removed from a blocklist (with the Only when listed frequency, only new listings). Changes are batched into one request; severity is critical when any host is listed, and host names are defanged (. becomes [.]).
Sample payload
{
"id": "b2e7c4a1-9d3f-4e58-a1c6-7f0d2b8e5a94",
"event": "alert.blacklist_status_changed",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "Alert: 1 blocklisted, 1 delisted host(s)",
"severity": "critical",
"summary": "Alert: 1 blocklisted, 1 delisted host(s)",
"data": {
"blocklisted_count": 1,
"delisted_count": 1,
"monitored_at": "2026-10-27T14:00:42+00:00",
"hosts": [
{
"host_id": 90211,
"host_monitoring_id": 5530918,
"host": "203[.]0[.]113[.]25",
"is_blocklisted": true,
"listed_data_source_count": 2,
"data_source_count": 58,
"monitored_at": "2026-10-27T14:00:42+00:00"
},
{
"host_id": 90214,
"host_monitoring_id": 5530921,
"host": "mail[.]example[.]com",
"is_blocklisted": false,
"listed_data_source_count": 0,
"data_source_count": 58,
"monitored_at": "2026-10-27T14:00:47+00:00"
}
]
}
}
alert.reputation_issueSent for Microsoft SNDS alerts (IP status, filter result changes, complaint rate, spam trap hits) and Gmail Postmaster Tools alerts (spam rate, delivery errors, compliance issues). data.lines holds the alert text and data.url links to the related page in the portal.
Sample payload
{
"id": "c81f5a2d-6e4b-4b97-8d03-1a9e7c5f2b60",
"event": "alert.reputation_issue",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "SNDS IP status alert: 203.0.113.25 is blocked",
"severity": "critical",
"summary": "SNDS IP status alert: 203.0.113.25 is blocked",
"data": {
"lines": [
"The IP address 203.0.113.25 has been flagged by Microsoft SNDS.",
"Status: blocked",
"Reason: Blocked due to user complaints or other evidence of spamming",
"Recommended actions: check current Outlook/Hotmail traffic, slow sending from this IP, and investigate complaint or malware signals before resuming normal volume."
],
"url": "https://app.hostrepute.com/01JQ7ZK3M8V4XN2R5T9WBHCDEF/snds-integrations/019a0b6e-2f41-7c93-a8d5-0e7b3c9f1a62"
}
}
alert.certificate_status_changedSent when a certificate check changes a monitor's status and finds an event that its certificate profile has turned on, such as expiring, expired or hostname mismatch. The same status and events are sent at most once per monitor per day.
Sample payload
{
"id": "e4a9d7b2-1c5f-4a38-b6e0-9d2f8c3a7e15",
"event": "alert.certificate_status_changed",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "Certificate Expiring Soon: www.example.com:443",
"severity": "warning",
"summary": "Certificate Expiring Soon: www.example.com:443",
"data": {
"lines": [
"Target: www.example.com:443 (HTTPS)",
"Status: Expiring Soon",
"Expires: 2026-11-10 08:14:33 UTC (14 days remaining)",
"Issuer: Let's Encrypt",
"Events: certificate_expiring"
],
"url": "https://app.hostrepute.com/01JQ7ZK3M8V4XN2R5T9WBHCDEF/certificates/019a12d8-7b3e-7f05-b1c4-9e6a2d8f0c3b"
}
}
alert.certificate_agent_offlineSent when an active certificate agent has not contacted HostRepute for 15 minutes and is marked offline. Sent at most once per agent per day.
Sample payload
{
"id": "7d3b1e9f-4a6c-4d82-9f15-c0e8a2b6d473",
"event": "alert.certificate_agent_offline",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "Certificate agent offline: dc1-agent",
"severity": "warning",
"summary": "Certificate agent offline: dc1-agent",
"data": {
"lines": [
"Agent: dc1-agent",
"Status: offline",
"Last seen: 16 minutes ago",
"Monitors routed through this agent will not run scheduled checks until it reconnects."
],
"url": "https://app.hostrepute.com/01JQ7ZK3M8V4XN2R5T9WBHCDEF/certificates"
}
}
alert.certificate_agent_recoveredSent when a certificate agent that was marked offline contacts HostRepute again. Sent at most once per agent per day.
Sample payload
{
"id": "a5c0e8d4-2b7f-4e19-8c6a-3f1d9b7e0a28",
"event": "alert.certificate_agent_recovered",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "Certificate agent recovered: dc1-agent",
"severity": "info",
"summary": "Certificate agent recovered: dc1-agent",
"data": {
"lines": [
"Agent: dc1-agent",
"Status: online",
"Scheduled certificate checks routed through this agent have resumed."
],
"url": "https://app.hostrepute.com/01JQ7ZK3M8V4XN2R5T9WBHCDEF/certificates"
}
}
alert.domain_expiry_status_changedSent when a domain expiry check changes a monitor's status and the domain is expiring soon, has expired or was renewed. The same status and events are sent at most once per monitor per day.
Sample payload
{
"id": "3e8f6b0c-7d2a-4c51-a9e4-6b1f0d8c2a97",
"event": "alert.domain_expiry_status_changed",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "Domain Expiring Soon: example.net",
"severity": "warning",
"summary": "Domain Expiring Soon: example.net",
"data": {
"lines": [
"Domain: example.net",
"Status: Expiring Soon",
"Registrar: Example Registrar, Inc.",
"Expires: 2026-11-20 (24 days remaining)",
"Events: domain_expiring"
],
"url": "https://app.hostrepute.com/01JQ7ZK3M8V4XN2R5T9WBHCDEF/domain-expiry/019a14f2-0c9d-7a61-8e3b-5d2f7a1c9e04"
}
}
alert.delisting_attempt_reminder_dueSent when a delisting request marked submitted or waiting reaches its follow-up date. Sent once for each follow-up date.
Sample payload
{
"id": "9b4d2f7e-5a1c-4e63-b8d0-2c7a9f1e6b35",
"event": "alert.delisting_attempt_reminder_due",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "Delisting follow-up due: 203.0.113.25",
"severity": "warning",
"summary": "Delisting follow-up due: 203.0.113.25",
"data": {
"lines": [
"Host: 203.0.113.25",
"Provider: b.barracudacentral.org",
"Status: submitted",
"Follow up by: Tue, Oct 27, 2026 9:00 AM",
"Reminder: reach out to the provider or update the attempt status."
],
"url": "https://app.hostrepute.com/01JQ7ZK3M8V4XN2R5T9WBHCDEF/delisting-attempts?status=submitted&attempt=019a2c47-8e1b-7d56-9a0f-3c6e1b8d4f29"
}
}
uptime.monitor_downSent once when an uptime monitor is confirmed down or degraded and an incident opens. data.status says which; resolved_at and duration_seconds are null.
Sample payload
{
"id": "f0c7a3e9-8b2d-4f16-9a5c-1e6d4b0f8c72",
"event": "uptime.monitor_down",
"occurred_at": "2026-10-27T14:05:09+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "🔴 Down: Checkout API",
"severity": "critical",
"summary": "Checkout API is Down.",
"data": {
"incident_uuid": "019a2f5b-6d0e-7c48-b3a9-1f7e4c2d8a50",
"monitor": "Checkout API",
"target": "https://shop.example.com/health",
"status": "down",
"last_error": "Expected HTTP 2xx-3xx, received 503.",
"started_at": "2026-10-27T13:58:02+00:00",
"resolved_at": null,
"duration_seconds": null
}
}
uptime.monitor_recoveredSent once when a monitor with an open incident is confirmed up again and the incident closes. data.status keeps the incident's status (down or degraded).
Sample payload
{
"id": "1a6e9c4f-3d8b-4a27-b0f5-8e2c7d1a9b64",
"event": "uptime.monitor_recovered",
"occurred_at": "2026-10-27T14:21:13+00:00",
"team_id": 4182,
"alert": {
"uuid": "019a1f3c-5e27-7b84-9c1d-6f0a2e8b4d37",
"type": "webhook",
"frequency": "once_on_listed_delisted"
},
"title": "🟢 Recovered: Checkout API is back up",
"severity": "info",
"summary": "Checkout API has recovered and is reachable again.",
"data": {
"incident_uuid": "019a2f5b-6d0e-7c48-b3a9-1f7e4c2d8a50",
"monitor": "Checkout API",
"target": "https://shop.example.com/health",
"status": "down",
"last_error": "Expected HTTP 2xx-3xx, received 503.",
"started_at": "2026-10-27T13:58:02+00:00",
"resolved_at": "2026-10-27T14:20:47+00:00",
"duration_seconds": 1365
}
}
EventDescription
blacklist.scan.completedSent to the callback_url of an API blocklist check (POST /api/v1/blacklist/check) when the scan finishes. When the scan fails, status is failed and result holds only an error message.
Sample payload
{
"event": "blacklist.scan.completed",
"data": {
"uuid": "019a2f61-3a8c-7e19-8b4d-0c5f9e2a7d16",
"host": "203.0.113.25",
"status": "completed",
"result": {
"host": "203.0.113.25",
"data_sources": [
{
"data_source_id": 12,
"data_source_name": "b.barracudacentral.org",
"data_source_host": "b.barracudacentral.org",
"source_status": "completed",
"is_listed": true,
"details": [
{
"host": "25.113.0.203.b.barracudacentral.org",
"class": "IN",
"ttl": 900,
"type": "A",
"ip": "127.0.0.2"
}
],
"error": null
},
{
"data_source_id": 31,
"data_source_name": "bl.spamcop.net",
"data_source_host": "bl.spamcop.net",
"source_status": "completed",
"is_listed": false,
"details": [],
"error": null
},
{
"data_source_id": 27,
"data_source_name": "bl.mailspike.net",
"data_source_host": "bl.mailspike.net",
"source_status": "failed",
"is_listed": false,
"details": [],
"error": "The DNS lookup for bl.mailspike.net failed or timed out, so the listing status could not be determined."
}
],
"listed_count": 1,
"total_count": 3,
"failed_count": 1,
"skipped_count": 0,
"is_listed": true,
"relisted_detected": false
},
"started_at": "2026-10-27T14:02:11.000000Z",
"completed_at": "2026-10-27T14:02:19.000000Z"
}
}
certificate.scan.completedSent to the callback_url of an API certificate check (POST /api/v1/certificates/check) when the scan completes, or fails after its retries. result is the full stored result, including the certificate PEM (shortened in this sample), the result for each resolved IP and the grade.
Sample payload
{
"event": "certificate.scan.completed",
"data": {
"uuid": "019a2f64-9c2e-7b07-a6f1-4d8b0e3c5a92",
"host": "www.example.com",
"port": 443,
"protocol": "https",
"status": "completed",
"result": {
"status": "healthy",
"host": "www.example.com",
"port": 443,
"protocol": "https",
"sni": "www.example.com",
"checked_ip": "203.0.113.10",
"issuer": "Let's Encrypt",
"subject": "www.example.com",
"common_name": "www.example.com",
"sans": [
"www.example.com",
"example.com"
],
"serial_number": "05B6E1F3A2C47D98E0F1A3B5C7D9E1F3A5B7",
"fingerprint_sha256": "3F9A6C21D84E7B05A1C3E9F27D6B48A0C5E1F3B79D2A4C68E0B1D3F5A7C9E2B4",
"signature_algorithm": "RSA-SHA256",
"valid_from": "2026-08-29 06:14:22",
"expires_at": "2026-11-27 06:14:21",
"days_remaining": 31,
"chain_valid": true,
"hostname_valid": true,
"caa_valid": true,
"algorithm_secure": true,
"revocation_status": "unchecked",
"events": [],
"diagnostics": {
"caa": {
"valid": true,
"status": "missing",
"records": [],
"authorized_issuers": []
},
"revocation": {
"status": "unchecked",
"ocsp_url": null,
"crl_urls": [],
"reason": "No reachable revocation endpoints were published by the certificate.",
"checked_via": null
},
"public_key": {
"type": 0,
"bits": 2048
},
"tls": {
"protocol": "TLSv1.3",
"cipher_name": "TLS_AES_256_GCM_SHA384",
"cipher_version": "TLSv1.3",
"cipher_bits": 256
},
"pem": "-----BEGIN CERTIFICATE-----\nMIIFBTCCA+2gAwIBAgISBbT2Xn0q9cKx7vJ1y3m4pZ8wDQYJKoZIhvcNAQELBQAw\nMzELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxDDAKBgNVBAMT\n-----END CERTIFICATE-----\n",
"ip_results": [
{
"status": "healthy",
"host": "www.example.com",
"port": 443,
"protocol": "https",
"sni": "www.example.com",
"checked_ip": "203.0.113.10",
"issuer": "Let's Encrypt",
"subject": "www.example.com",
"common_name": "www.example.com",
"sans": [
"www.example.com",
"example.com"
],
"serial_number": "05B6E1F3A2C47D98E0F1A3B5C7D9E1F3A5B7",
"fingerprint_sha256": "3F9A6C21D84E7B05A1C3E9F27D6B48A0C5E1F3B79D2A4C68E0B1D3F5A7C9E2B4",
"signature_algorithm": "RSA-SHA256",
"valid_from": "2026-08-29 06:14:22",
"expires_at": "2026-11-27 06:14:21",
"days_remaining": 31,
"chain_valid": true,
"hostname_valid": true,
"caa_valid": true,
"algorithm_secure": true,
"revocation_status": "unchecked",
"events": [],
"diagnostics": {
"caa": {
"valid": true,
"status": "missing",
"records": [],
"authorized_issuers": []
},
"revocation": {
"status": "unchecked",
"ocsp_url": null,
"crl_urls": [],
"reason": "No reachable revocation endpoints were published by the certificate.",
"checked_via": null
},
"public_key": {
"type": 0,
"bits": 2048
},
"tls": {
"protocol": "TLSv1.3",
"cipher_name": "TLS_AES_256_GCM_SHA384",
"cipher_version": "TLSv1.3",
"cipher_bits": 256
},
"pem": "-----BEGIN CERTIFICATE-----\nMIIFBTCCA+2gAwIBAgISBbT2Xn0q9cKx7vJ1y3m4pZ8wDQYJKoZIhvcNAQELBQAw\nMzELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxDDAKBgNVBAMT\n-----END CERTIFICATE-----\n"
},
"error_message": null,
"checked_at": "2026-10-27 14:07:31"
}
],
"checked_all_resolved_ips": true
},
"error_message": null,
"checked_at": "2026-10-27 14:07:31",
"resolved_ips": [
"203.0.113.10"
],
"certificate_grade": "A",
"certificate_score": 100,
"certificate_grade_version": "ssl-grade-v1",
"certificate_grade_breakdown": {
"summary": "Certificate grade is A (100/100): strong certificate posture.",
"checks": [
{
"key": "trust_chain",
"label": "Trust chain",
"status": "pass",
"message": "The certificate chain validates against the local CA bundle.",
"score_delta": 0
},
{
"key": "hostname",
"label": "Hostname match",
"status": "pass",
"message": "The certificate covers the requested host.",
"score_delta": 0
},
{
"key": "expiry",
"label": "Expiration",
"status": "pass",
"message": "The certificate is valid for 31 more days.",
"score_delta": 0
},
{
"key": "algorithm",
"label": "Algorithm and key",
"status": "pass",
"message": "Signature and public key strength meet modern thresholds.",
"score_delta": 0
},
{
"key": "caa",
"label": "CAA policy",
"status": "info",
"message": "No CAA records were published. This is allowed, but CAA can reduce issuance risk.",
"score_delta": 0
},
{
"key": "ip_consistency",
"label": "Resolved IP consistency",
"status": "pass",
"message": "Resolved IP checks did not show certificate fingerprint drift.",
"score_delta": 0
},
{
"key": "negotiated_tls",
"label": "Negotiated TLS",
"status": "pass",
"message": "The observed handshake used a modern TLS protocol.",
"score_delta": 0
},
{
"key": "cipher_strength",
"label": "Cipher strength",
"status": "pass",
"message": "The observed cipher reports 256 effective bits.",
"score_delta": 0
}
],
"recommendations": []
}
},
"started_at": "2026-10-27T14:07:29.000000Z",
"completed_at": "2026-10-27T14:07:32.000000Z"
}
}