Webhooks
Oh Dear can notify your application of events using webhooks. Each hook is cryptographically signed, so the request cannot be tampered with. If you receive a webhook, you can validate it to make sure it comes from us.
Getting started #
Let's start by enabling webhooks and pointing them to your own endpoint.
Enable webhooks in your account #
Navigate to the notification settings page, scroll down to the webhooks section and add your webhook URL.
Once your webhook is configured, we'll call it for every event we fire. You get the raw payload and can act on it as you see fit.
How the webhooks work #
Every event we fire internally, will also be translated to the webhook URL you provide in your team settings page in the account.
This means you can receive the raw payload of events like site up/down, certificate changes, ... you name it. You can then use that information to update internal systems, escalate alerts, log events, etc.
Our webhook works by firing a POST request to the endpoint you specified. All data related to the event that just took place will be inside the POST payload. For specific examples of each payload, have a look at the different webhook events.
Authentication #
All webhooks we send will be signed by a signing secret, unique to your team. You can find the signing secret in your account in the team settings.
It'll be displayed as Web hook signing secret: YoUrSeCreT.
You don't have to validate the incoming request, but it's highly suggested.
Webhook retries #
If we receive an HTTP/200 from your webhook URL, we consider the webhook successful. If your application returns anything else, including 301 or 302 redirects, we mark the webhook as failed and will resend the same payload again.
We will try to send the webhook up to 3 times. If we receive a non-HTTP/200 response code, or a timeout (of 3 seconds or more) for 3 times, we consider the webhook failed and will not resend that particular event.
We do not disable webhooks because they failed a couple of times, we'll only disable them if you remove the URL from your account page.
Webhook authentication & signing #
Our signing method is simple but efficient. For every webhook we call, we pass an additional header called OhDear-Signature that contains the hash of the payload.
In your webhook, you can validate if that OhDear-Signature header contains the hash you expected.
It's calculated like this:
$computedSignature = hash_hmac('sha256', $payload, $secret);
The $payload is the body of the POST request, which will be a JSON representation of the event.
The $secret is the one you can find on your team notifications settings page
The hash_hmac() function is a PHP function that generates a keyed hash value using the HMAC method.
The $computedSignature should match the Ohdear-Signature that's been set. If you use our laravel package, the signature checking is handled automatically.
Laravel package #
We offer a Laravel package that package can help you handle our webhooks. Out of the box it will verify the Oh Dear signature of all incoming requests. You can easily define jobs or events that should be dispatched when specific events hit your app.
Webhook events #
There's a lot of data on this page, you can jump directly to your desired payload with the table of contents shown below.
- Generic payloads: data shared among every webhook call
- Monitor (added): MonitorAdded
- Uptime Uptime
- Uptime (failed): UptimeCheckFailed
- Uptime (warning): UptimeCheckRecovered (warning)
- Uptime (recovered): UptimeCheckRecovered
- Performance (slow): PerformanceThresholdExceeded
- Performance (recovered): PerformanceThresholdRecovered
- Performance (changed): PerformanceDeltaExceeded
- Broken links (found): BrokenLinksFound
- Broken links (fixed): BrokenLinksFixed
- Mixed content (found): MixedContentFound
- Mixed content (fixed): MixedContentFixed
- Certificate (expiring): CertificateExpiresSoon
- Certificate (unhealthy): CertificateUnhealthy
- Certificate (changed): CertificateChanged
- Certificate (fixed): CertificateFixed
- DNS (failed): DnsIssuesFound
- DNS (changed): DnsRecordsChanged
- DNS (fixed): DnsIssuesFixed
- Scheduled task (failed): CronFailed
- Scheduled task (missing): CronNotExecutedOnTime
- Application Health (failed): ApplicationHealthProblemDetected
- Application Health (fixed): ApplicationHealthProblemFixed
- Application Health (client error): ApplicationHealthClientError
- Application Health (results too old): ApplicationHealthResultsTooOld
- Sitemap (found): SitemapIssuesFound
- Sitemap (fixed): SitemapIssuesFixed
- DNS Blocklist (found): DnsBlocklistIssuesFound
- DNS Blocklist (fixed): DnsBlocklistIssuesFixed
- Domain (found): DomainIssuesFound
- Domain (fixed): DomainIssuesFixed
- Lighthouse (detected): LighthouseIssuesDetected
- Lighthouse (fixed): LighthouseIssuesFixed
- AI check (failed): AiCheckFailed
- AI check (succeeded): AiCheckSucceeded
Generic payloads #
All webhook data will contain a set of recurring data points.
First, every webhook will have a uuid property. If your server was down, then Oh Dear will automatically retry sending the webhook. On the webhook log screen you can also resend a sent webhook. For both the automatic and manually retry, the uuid property will contain the same value as the original webhook.
Next, there's confirmation about which event you're receiving and which date this was generated.
{ "uuid": "" , "type":"httpUptimeCheckFailedNotification", "date_time":"20180312092737", ... }
There are details on the monitor that this event took place on. This will look like this:
{ ... "monitor":{ "id":1, "url":"https:\/\/yoursite.tld", "uses_https":true, "sort_url":"yoursite.tld", "label": "my-site", "team_id":1, "latest_run_date":"2018-03-12 20:27:34", "summarized_check_result":"failed", "created_at":"2018-03-12 20:24:54", "updated_at":"2018-03-12 20:24:54", "checks":[ { "id":1, "type":"uptime", "enabled":true, "monitor_id":1, "latest_run_result":"failed", "latest_run_ended_at":"2018-03-12 20:27:34", "latest_run_id":2 }, ... ] }, }
Additionally, there is meta-data present about the time the event took place.
"run":{ ... "started_at":"2018-03-12 20:27:33", "ended_at":"2018-03-12 20:27:34", "created_at":"2018-03-12 20:27:31", "updated_at":"2018-03-12 20:27:34", }
The actual payload of each individual event can be found in the run block, which contains all relevant data related to the event that just happened. Each of those blocks will be updated in more detail below.
For historical reasons, the monitor data is duplicated in three places in every webhook payload: as top-level monitor, as top-level site (kept for backwards compatibility), and nested inside run.check.monitor. They all serialize the same monitor. Examples below show the top-level monitor and omit the duplicates for brevity.
Monitor added #
Whenever you add a monitor to your Oh Dear account, we'll send a webhook for the monitorAddedNotification type with this data.
Included in the payload are details like the monitor ID and the checks that were included and their IDs. The checks will still be pending, but you can use the check IDs to retrieve their latest details using our API.
{ "type":"monitorAddedNotification", "date_time":"20191001113659", "monitor":{ "id":1, "url":"https:\/\/yoursite.tld", "uses_https":true, "sort_url":"yoursite.tld", "label":"yoursite.tld", "team_id":1, "latest_run_date":null, "summarized_check_result":"pending", "created_at":"2019-10-01 09:36:59", "updated_at":"2019-10-01 09:36:59", "checks":[ { "id":39675, "type":"uptime", "enabled":true, "monitor_id":1, "latest_run_result":null, "latest_run_ended_at":null, "latest_run_id":null }, { "id":39676, "type":"broken_links", "enabled":true, "monitor_id":1, "latest_run_result":null, "latest_run_ended_at":null, "latest_run_id":null }, { "id":39677, "type":"mixed_content", "enabled":true, "monitor_id":1, "latest_run_result":null, "latest_run_ended_at":null, "latest_run_id":null }, { "id":39678, "type":"certificate_health", "enabled":true, "monitor_id":1, "latest_run_result":null, "latest_run_ended_at":null, "latest_run_id":null } ] } }
Uptime monitor notifications
The type field of our uptime webhooks now includes a prefix that reflects the kind of monitor:
`[monitor-type]`UptimeCheckFailedNotification `[monitor-type]`UptimeCheckRecoveredNotification
Where [monitor-type] is:
- http – for HTTP monitors
- tcp – for TCP monitors
- ping – for Ping monitors
Example: "type": "httpUptimeCheckFailedNotification"
Request fields on HTTP uptime results #
Every HTTP uptime checkerResult records the exact request we made, alongside the response:
checkUrl: the final URL we hit, with any magic variables already expanded.requestHeaders: the headers we actually sent, as aheader => valueobject, with magic variables expanded.nullwhen the monitor has no custom headers configured.requestPayload: the body items we sent, as an array of{ "name": ..., "value": ... }entries, with magic variables expanded.nullwhen the monitor sends no body.
For a POST monitor with custom headers and a JSON body, the three fields look like this on the result:
"checkUrl":"https:\/\/yoursite.tld\/webhooks\/ping", "requestHeaders":{ "Content-Type":"application\/json", "X-Request-Id":"7b9a5e84-2c9c-4a2b-9c2d-1b0d8f5a3e21" }, "requestPayload":[ {"name":"event","value":"heartbeat"}, {"name":"sent_at","value":"20191001092130000"} ]
checkUrl reflects the URL as it left our checker server, so it will not change if you later edit the monitor's URL. requestHeaders and requestPayload only contain values you configured yourself in monitor settings: be mindful of putting secrets in headers or payload bodies, since they will be echoed back in webhook payloads to your destination.
Uptime monitor: downtime detected #
When we detect your website is down, we'll send a webhook for the [monitor-type]UptimeCheckFailedNotification type with this data.
{ "type":"[monitor-type]UptimeCheckFailedNotification", "date_time":"20180312092737", "monitor":{ "id":1, ... /* See above */ }, "run":{ "id":19830466, "check_id":10988, "parameters":null, "result":"failed", "result_payload":{ "checkerResult1":{ "checkerServer":{ "name":"uptime-checker-paris", "city":"Paris", "country":"France", "ip":"45.32.146.84" }, "checkUrl":"https:\/\/yoursite.tld\/", "response":[ ], "lookForString":"", "lookForStringFound":true, "error":{ "type":"connectionError", "errorNumber":6, "description":"Could not resolve host: yoursite.tld" }, "statistics":{ "url":"https:\/\/yoursite.tld\/", "content_type":null, "http_code":0, "header_size":0, "request_size":0, "filetime":-1, "ssl_verify_result":0, "redirect_count":0, "total_time":7.6000000000000004184153024056058711721561849117279052734375e-5, "namelookup_time":0, "connect_time":0, "pretransfer_time":0, "size_upload":0, "size_download":0, "speed_download":0, "speed_upload":0, "download_content_length":-1, "upload_content_length":-1, "starttransfer_time":0, "redirect_time":0, "redirect_url":"", "primary_ip":"", "certinfo":[ ], "primary_port":0, "local_ip":"", "local_port":0 } }, "checkerResult2":{ "checkerServer":{ "name":"uptime-checker-bangalore", "city":"Bangalore", "country":"India", "ip":"139.59.75.39" }, "checkUrl":"https:\/\/yoursite.tld\/", "response":[ ], "lookForString":"", "lookForStringFound":true, "error":{ "type":"connectionError", "errorNumber":6, "description":"Could not resolve host: yoursite.tld" }, "statistics":{ "url":"https:\/\/yoursite.tld\/", "content_type":null, "http_code":0, "header_size":0, "request_size":0, "filetime":-1, "ssl_verify_result":0, "redirect_count":0, "total_time":6.600000000000000506018837942434629439958371222019195556640625e-5, "namelookup_time":0, "connect_time":0, "pretransfer_time":0, "size_upload":0, "size_download":0, "speed_download":0, "speed_upload":0, "download_content_length":-1, "upload_content_length":-1, "starttransfer_time":0, "redirect_time":0, "redirect_url":"", "primary_ip":"", "certinfo":[ ], "primary_port":0, "local_ip":"", "local_port":0 } } }, } }
Uptime monitor: partial connectivity detected #
When the primary checker location cannot reach your monitor but the secondary location confirms it is still online, the run is marked with "result": "warning". This uses the [monitor-type]UptimeCheckRecoveredNotification webhook type (the same as a normal recovery), but you can distinguish it from a full recovery by checking the result field: "warning" instead of "succeeded".
A warning means partial connectivity, not full downtime. The monitor is still considered online for uptime percentage calculations. This webhook is only sent when the monitor was previously confirmed down and a failure notification was already sent. A standalone warning (without prior confirmed downtime) does not trigger a webhook.
{ "type":"[monitor-type]UptimeCheckRecoveredNotification", "date_time":"20180312092737", "monitor":{ "id":1, ... /* See above */ }, "run":{ "id":19830466, "check_id":10988, "parameters":null, "result":"warning", "result_payload":{ "checkerResult1":{ "checkerServer":{ "name":"uptime-checker-paris", "city":"Paris", "country":"France", "ip":"45.32.146.84" }, "checkUrl":"https:\/\/yoursite.tld\/", "response":[ ], "lookForString":"", "lookForStringFound":true, "error":{ "type":"connectionError", "errorNumber":6, "description":"Could not resolve host: yoursite.tld" }, "statistics":{ "url":"https:\/\/yoursite.tld\/", "http_code":0 } }, "checkerResult2":{ "checkerServer":{ "name":"uptime-checker-bangalore", "city":"Bangalore", "country":"India", "ip":"139.59.75.39" }, "checkUrl":"https:\/\/yoursite.tld\/", "response":{ "code":200, "code_phrase":"OK", "protocol":"1.1", "headers":{ "Server":["nginx"], "Content-Type":["text\/html; charset=UTF-8"] } }, "lookForString":"", "lookForStringFound":true, "error":[ ], "statistics":{ "url":"https:\/\/yoursite.tld\/", "http_code":200, "total_time":0.110265 } } } } }
The checkerResult1 (primary) shows the failure, while checkerResult2 (secondary) shows a successful HTTP/200 response. When processing webhooks, check run.result for "warning" to distinguish this from a full recovery ("succeeded").
The warning value can also appear in latest_run_result on check objects and summarized_check_result on monitor objects returned by the API.
Uptime monitor: recovery detected #
When site comes back up, we'll send a webhook for the [monitor-type]UptimeCheckRecoveredNotification type with this data.
{ "type":"[monitor-type]UptimeCheckRecoveredNotification", "date_time":"20191001112131", "run":{ "id":423131444, "check_id":33859, "parameters":null, "result":"succeeded", "result_payload":{ "checkerResult1":{ "checkerServer":{ "name":"uptime-checker-paris", "city":"Paris", "country":"France", "ip":"45.32.146.84" }, "checkUrl":"https:\/\/immutable.be\/?cb=20191001092130000", "requestHeaders":{ "X-Request-Id":"7b9a5e84-2c9c-4a2b-9c2d-1b0d8f5a3e21" }, "response":{ "code":200, "code_phrase":"OK", "protocol":"1.1", "headers":{ "Server":[ "nginx" ], "Date":[ "Tue, 01 Oct 2019 09:21:30 GMT" ], "Content-Type":[ "text\/html; charset=UTF-8" ], "Transfer-Encoding":[ "chunked" ], "Connection":[ "keep-alive" ], "Vary":[ "Accept-Encoding", "Accept-Encoding" ], "Cache-Control":[ "private, must-revalidate" ], "pragma":[ "no-cache" ], "expires":[ "-1" ], "Set-Cookie":[ "XSRF-TOKEN=eyJpdiI6InlNSkJOQVpwb2sra0c2Y0tsRkp5TEE9PSIsInZhbHVlIjoiUXVweXRIWXlxT1Q0U0hrUmUyTTh2K3lXd1EyM1VkcGwzUG1RN2g4a2tVcXpITU5ZVitGU05QRTlhWFFvTTQzdWpmZlFSbk9kYWZoR2V5ZTc1dVR0QlE9PSIsIm1hYyI6IjNkZDIyMGU2ZDMzOGJkMmYzMGU1N2QwNmNiOWE0MmJmODc3YWRjZGQ4NWEwY2IyYjE0ZGQ1ZTA1YjI2NWQwYzgifQ%3D%3D; expires=Tue, 01-Oct-2019 11:21:30 GMT; Max-Age=7200; path=\/", "laravel_session=eyJpdiI6IkxLVUFIY1BWMHE2bGNuTTFGYkp1SkE9PSIsInZhbHVlIjoiZGhHZFlIOHBpbTFSWGM4RFgwcFlwUlwvMThlUkFKYUdqU0tGRVVldGNDY3ZwRXc5dEh4K1wvWVY1MFk0R2UxZU5kVk9CMFppYkpBdStUVEFKb1FCR3RRZz09IiwibWFjIjoiZGI2ZjdjYjgxY2ZiZTQ1MGNiYzAzMzE1ZWNlNjdlMjExNWE3MjFhZTRiMWZhYTcwYjExMDVjMTNkYzRkZjFlYiJ9; expires=Tue, 01-Oct-2019 11:21:30 GMT; Max-Age=7200; path=\/; httponly" ] } }, "lookForString":"", "lookForStringFound":true, "error":[ ], "statistics":{ "url":"https:\/\/immutable.be\/", "content_type":"text\/html; charset=UTF-8", "http_code":200, "header_size":1024, "request_size":152, "filetime":-1, "ssl_verify_result":0, "redirect_count":0, "total_time":0.110265000000000001900701818158267997205257415771484375, "namelookup_time":0.0042430000000000002435829316027593449689447879791259765625, "connect_time":0.01140900000000000073796524446834155241958796977996826171875, "pretransfer_time":0.058913000000000000089261931179862585850059986114501953125, "size_upload":0, "size_download":3227, "speed_download":29265, "speed_upload":0, "download_content_length":-1, "upload_content_length":-1, "starttransfer_time":0.10999699999999999755484481056555523537099361419677734375, "redirect_time":0, "redirect_url":"", "primary_ip":"31.193.180.217", "certinfo":[ ], "primary_port":443, "local_ip":"45.32.146.84", "local_port":36260 } } }, ... }, "monitor":{ "id":1, ... /* See above */ } }
Performance threshold exceeded #
If the monitor is continuously slower than the performance threshold in your monitor settings we will send a performanceThresholdExceededNotification. See performance docs for more details about this check.
{ "type": "performanceThresholdExceededNotification", "uuid": "" , "date_time": "20220414070203", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "reference_timestamp": "2022-04-14 07:02:03", "performance_threshold_in_ms": 3500, "performance_change_percentage_threshold": 50, "average_total_time_past_15_minutes_in_ms": 4139 }, "check": { "id": 123456, "type": "performance", "enabled": true, "monitor_id":, "created_at": "2022-01-01T18:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T08:15:00.000000Z", "order_column": 1, "latest_run_id": 987654321234, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 987654321234, "latest_completed_run_result": "failed", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* See above */ } }
Performance threshold recovered #
If the monitor starts performing quickly again a performanceThresholdRecoveredNotification will be triggered. See performance docs for more details about this check.
The example below shows only the always-present keys. Depending on which recovery path was taken, result_payload may also include any of the following, added cumulatively in this order: average_total_time_past_15_minutes_in_ms, then average_total_time_past_2_hours_in_ms, then actual_performance_change_percentage.
{ "type": "performanceThresholdRecoveredNotification", "uuid": "" , "date_time": "20220414074621", "run": { "id": 12345678901, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "reference_timestamp": "2022-04-14 07:46:21", "performance_threshold_in_ms": 3500, "performance_change_percentage_threshold": 50 }, "check": { "id": 123456, "type": "performance", "enabled": true, "monitor_id": 1, "created_at": "2022-01-10T14:30:00.000000Z", "parameters": null, "updated_at": "2022-04-10T14:30:00.000000Z", "order_column": 1, "latest_run_id": 12345678901, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 12345678901, "latest_completed_run_result": "succeeded", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* See above */ } }
Performance Delta Exceeded #
If the monitor starts performing slower or faster than the performance change percentage in your monitor settings a performanceDeltaExceededNotification will be triggered. See performance docs for more details about this check.
{ "type": "performanceDeltaExceededNotification", "uuid": "" , "date_time": "20220414110128", "run": { "id": 12345678901, "result": "warning", "check_id": 65853, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "reference_timestamp": "2022-04-14 11:01:28", "performance_threshold_in_ms": 3500, "performance_change_percentage_threshold": 50, "average_total_time_past_15_minutes_in_ms": 32, "average_total_time_past_2_hours_in_ms": 122, "actual_performance_change_percentage": -73 }, "check": { "id": 12345, "type": "performance", "enabled": true, "monitor_id": 1, "created_at": "2022-04-14T08:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T08:00:00.000000Z", "order_column": 1, "latest_run_id": 98765432101, "latest_run_result": "warning", "latest_run_ended_at": "2022-04-14T08:00:00.000000Z", "latest_completed_run_id": 98765432101, "latest_completed_run_result": "warning", "latest_completed_run_ended_at": "2022-04-14T08:00:00.000000Z" } }, "monitor":{ "id":1, ... /* See above */ } }
Broken Links found #
Whenever a crawl of your site is finished, and broken links were found, we'll send a webhook for the brokenLinksFoundNotification type with this data.
{ "type":"brokenLinksFoundNotification", "date_time":"20191001114254", "run":{ "id":423155781, "check_id":39681, "parameters":null, "result":"failed", "result_payload":{ "broken_links":[ { "crawled_url":"https:\/\/immutable.be\/broken-links-test-page\/0\/404", "status_code":404, "found_on_url":"https:\/\/immutable.be\/broken-links-test-page\/", "link_text":"Broken link 1", "type":"link", "error_message":null }, { "crawled_url":"https:\/\/immutable.be\/broken-links-test-page\/1\/404", "status_code":404, "found_on_url":"https:\/\/immutable.be\/broken-links-test-page\/", "link_text":"Broken link 2", "type":"image", "error_message":null }, ... ], "crawled_urls":[ { "crawled_url":"https:\/\/immutable.be\/broken-links-test-page\/", "status_code":200, "found_on_url":"", "link_text":null, "type":"link", "error_message":null }, { "crawled_url":"https:\/\/immutable.be\/broken-links-test-page\/0\/404", "status_code":404, "found_on_url":"https:\/\/immutable.be\/broken-links-test-page\/", "link_text":"Broken link 1", "type":"link", "error_message":null }, ... ], "whitelist":[] }, ... }, "newBrokenLinks": [ { "crawled_url": "http://ohdear.app/broken-link-1", "relative_crawled_url": "/broken-link-1", "status_code": 404, "found_on_url": "http://ohdear.app/", "relative_found_on_url": "/", "link_text": "Click here for broken link 1", "internal": true, }, ... ], "monitor":{ "id":1, ... /* see above */ } }
Broken links fixed #
When we detect that all broken links have been fixed, we'll send a webhook for the brokenLinksFixedNotification type with this data.
{ "type":"brokenLinksFixedNotification", "date_time":"20191001114436", "run":{ "id":423159529, "check_id":39681, "parameters":null, "result":"succeeded", "result_payload":{ "broken_links":[ ], "crawled_urls":[ { "crawled_url":"https:\/\/immutable.be\/broken-links-test-page\/", "status_code":200, "found_on_url":"", "link_text":null, "type":"link", "error_message":null }, { "crawled_url":"https:\/\/immutable.be\/broken-links-test-page\/?0-404", "status_code":200, "found_on_url":"https:\/\/immutable.be\/broken-links-test-page\/", "link_text":"Link 0", "type":"link", "error_message":null }, ... ], "whitelist":[] }, ... }, "monitor":{ "id":1, ... /* see above */ } }
Mixed content found #
When we detected mixed content, we'll send a webhook for the mixedContentFoundNotification type with this data.
The foundMixedContent array contains one entry per mixed-content element, with elementName, mixedContentUrl, and foundOnUrl. The crawledPages array contains one entry per crawled URL, wrapped as a single-element array.
{ "type":"mixedContentFoundNotification", "date_time":"20191001114652", "run":{ "id":423161645, "check_id":39687, "parameters":null, "result":"failed", "result_payload":{ "foundMixedContent":[ { "elementName":"img", "mixedContentUrl":"http:\/\/doesnotexist.tld\/image0.png", "foundOnUrl":"https:\/\/site.tld\/" } ], "pagesWithoutMixedContent":0, "crawledPages":[ ["https:\/\/site.tld\/"] ] }, ... }, "monitor":{ "id":1, ... /* see above */ } }
Mixed content fixed #
When the mixed content was found to be fixed, we'll send a webhook for the mixedContentFixedNotification type with this data.
{ "type":"mixedContentFixedNotification", "date_time":"20191001115320", "run":{ "id":423169009, "check_id":39687, "parameters":null, "result":"succeeded", "result_payload":{ "foundMixedContent":[], "pagesWithoutMixedContent":1, "crawledPages":[ ["https:\/\/site.tld\/"] ] }, ... }, "monitor":{ "id":1, ... /* see above */ } }
Certificate expires soon #
By default we will send you a certificateExpiresSoonNotification if the certificate for the monitor expires within 7 days for Let's Encrypt certificates and 14 days for all others, unless you have set the threshold in days in your site certificate settings.
See certificate docs for more details about this check.
{ "type": "certificateExpiresSoonNotification", "uuid": "" , "date_time": "20220411063354", "run": { "id": 12345678901, "result": "warning", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "issues": { "expiresSoon": "Certificate forwill expire in 5 days." }, "certificateChain": { "hostName": "www.example.com", "certificates": [ { "fingerprint": "0a1376d4347e0639d6fa7ab9174eb61a0eb8dfe2", "remoteAddress": "23.62.99.210:443", "fingerprintSha256": "6c28cdd8deb191be72a9e3f24b5f1d36d95ed3bb8e3fd5a1e8947b4bba247986", "rawCertificateFields": { "hash": "2a73b43c", "name": "/CN=le0413.secure.dealer.com", "issuer": { "C": "US", "O": "Let's Encrypt", "CN": "R3" }, "subject": { "CN": "le0413.secure.dealer.com" }, "validTo": "220417181740Z", "version": 2, "purposes": { "1": [true, false, "sslclient"], "2": [true, false, "sslserver"], "3": [true, false, "nssslserver"], "4": [false, false, "smimesign"], "5": [false, false, "smimeencrypt"], "6": [false, false, "crlsign"], "7": [true, true, "any"], "8": [true, false, "ocsphelper"], "9": [false, false, "timestampsign"] }, "validFrom": "220117181741Z", "extensions": { "keyUsage": "Digital Signature, Key Encipherment", "subjectAltName": "DNS:example.com, DNS:example2.com", "ct_precert_scts": "...", "basicConstraints": "CA:FALSE", "extendedKeyUsage": "TLS Web Server Authentication, TLS Web Client Authentication", "authorityInfoAccess": "...\n...\n", "certificatePolicies": "Policy: ...\n...", "subjectKeyIdentifier": "21:5A:...", "authorityKeyIdentifier": "keyid:...\n" }, "serialNumber": "0x4f682044656172", "validTo_time_t": 1650219460, "serialNumberHex": "4f682044656172", "signatureTypeLN": "sha256WithRSAEncryption", "signatureTypeSN": "RSA-SHA256", "signatureTypeNID": 668, "validFrom_time_t": 1642443461 } }, { "fingerprint": "0a1376d4347e0639d6fa7ab9174eb61a0eb8dfe2", "remoteAddress": "23.62.99.210:443", "fingerprintSha256": "6c28cdd8deb191be72a9e3f24b5f1d36d95ed3bb8e3fd5a1e8947b4bba247986", "rawCertificateFields": { "hash": "9d33f237", "name": "/C=US/O=Let's Encrypt/CN=R3", "issuer": { "C": "US", "O": "Internet Security Research Group", "CN": "ISRG Root X1" }, "subject": { "C": "US", "O": "Let's Encrypt", "CN": "R3" }, "validTo": "250915160000Z", "version": 2, "purposes": { "1": [true, true, "sslclient"], "2": [true, true, "sslserver"], "3": [false, true, "nssslserver"], "4": [false, false, "smimesign"], "5": [false, false, "smimeencrypt"], "6": [true, true, "crlsign"], "7": [true, true, "any"], "8": [true, true, "ocsphelper"], "9": [false, true, "timestampsign"] }, "validFrom": "200904000000Z", "extensions": { "keyUsage": "Digital Signature, Certificate Sign, CRL Sign", "basicConstraints": "CA:TRUE, pathlen:0", "extendedKeyUsage": "TLS Web Client Authentication, TLS Web Server Authentication", "authorityInfoAccess": "CA Issuers - URI:http://x1.i.lencr.org/\n", "certificatePolicies": "Policy: ...\n", "subjectKeyIdentifier": "14:2E:...", "crlDistributionPoints": "\nFull Name:\n URI:http://x1.c.lencr.org/\n", "authorityKeyIdentifier": "keyid:79:B4:...\n" }, "serialNumber": "0x4f682044656172", "validTo_time_t": 1757952000, "serialNumberHex": "4f682044656172", "signatureTypeLN": "sha256WithRSAEncryption", "signatureTypeSN": "RSA-SHA256", "signatureTypeNID": 668, "validFrom_time_t": 1599177600 } }, { "fingerprint": "0a1376d4347e0639d6fa7ab9174eb61a0eb8dfe2", "remoteAddress": "23.62.99.210:443", "fingerprintSha256": "6c28cdd8deb191be72a9e3f24b5f1d36d95ed3bb8e3fd5a1e8947b4bba247986", "rawCertificateFields": { "hash": "3032bcee", "name": "/C=US/O=Internet Security Research Group/CN=ISRG Root X1", "issuer": { "O": "Digital Signature Trust Co.", "CN": "DST Root CA X3" }, "subject": { "C": "US", "O": "Internet Security Research Group", "CN": "ISRG Root X1" }, "validTo": "240930181403Z", "version": 2, "purposes": { "1": [false, true, "sslclient"], "2": [false, true, "sslserver"], "3": [false, true, "nssslserver"], "4": [false, true, "smimesign"], "5": [false, true, "smimeencrypt"], "6": [true, true, "crlsign"], "7": [true, true, "any"], "8": [true, true, "ocsphelper"], "9": [false, true, "timestampsign"] }, "validFrom": "210120191403Z", "extensions": { "keyUsage": "Certificate Sign, CRL Sign", "basicConstraints": "CA:TRUE", "authorityInfoAccess": "CA Issuers - URI:http://apps.identrust.com/roots/dstrootcax3.p7c\n", "certificatePolicies": "Policy: ...\n", "subjectKeyIdentifier": "79:B4:...", "crlDistributionPoints": "\nFull Name:\n URI:http://crl.identrust.com/DSTROOTCAX3CRL.crl\n", "authorityKeyIdentifier": "keyid:C4:A7:...\n" }, "serialNumber": "950482111265633317569109389149956118711", "validTo_time_t": 1727720043, "serialNumberHex": "4f682044656172", "signatureTypeLN": "sha256WithRSAEncryption", "signatureTypeSN": "RSA-SHA256", "signatureTypeNID": 668, "validFrom_time_t": 1611170043 } } ], "couldConnectToHost": true, "exception": null } }, "check": { "id": 123456, "type": "certificate_health", "enabled": true, "monitor_id": 1, "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T09:00:00.000000Z", "order_column": 5, "latest_run_id": 10245160027, "latest_run_result": "warning", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 10245160027, "latest_completed_run_result": "warning", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* see above */ } }
Certificate found to be unhealthy #
When we detect issues with your certificate, we'll send a webhook for the certificateUnhealthyNotification type with this data.
The issues object is a key => message map. Each key identifies a specific issue (e.g. coversWrongDomain, expiresSoon) and the value is a human-readable description. The certificateChain object has the same shape as in Certificate expires soon above.
{ "type":"certificateUnhealthyNotification", "uuid":"" , "date_time":"20191001115620", "run":{ "id":423172975, "check_id":39698, "parameters":null, "result":"failed", "result_payload":{ "issues":{ "coversWrongDomain":"Certificate does not cover `https:\/\/neverssl.com\/` but `*.cloudfront.net`." }, "certificateChain":{ "hostName":"neverssl.com", "certificates":[ { ... /* see Certificate expires soon for shape */ } ], "couldConnectToHost":true, "exception":null } }, ... }, "monitor":{ "id":1, ... /* see above */ } }
Certificate changed #
If we detect a changed certificate on the monitor we are monitoring, you will be reported with any issues, certificate chain and the certificate changes. This way, you can verify that all domains that were previously covered by the certificate are still present.
See certificate docs for more details about this check.
{ "type": "certificateHasChangedNotification", "uuid": "" , "date_time": "20220414044921", "run": { "id": 12345678901, "result": "warning", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "issues": { "hasChanged": "The certificate has changed" }, "certificateChain": { ... /** see above **/ }, "certificateChanges": [ { "hash": { "new": "baf82b8f0e93086c28b6688c09c6f7bd615bc7f3", "old": "8bdf3f5704493304de7f595ec72ffa80bf095dff" }, "expirationDate": { "new": "2022-07-12 23:10:16", "old": "2022-05-13 23:10:30" } } ] }, "check": { "id": 123456, "type": "certificate_health", "enabled": true, "monitor_id": 20140, "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T09:00:00.000000Z", "order_column": 5, "latest_run_id": 10298733707, "latest_run_result": "warning", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 10298733707, "latest_completed_run_result": "warning", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* see above */ } }
Certificate fixed #
When we detect that issues with a certificate have been fixed, we'll send a webhook of type certificateFixedNotification.
The certificateChain object has the same shape as in Certificate expires soon above.
{ "type":"certificateFixedNotification", "uuid":"" , "date_time":"20191001115620", "run":{ "id":423172975, "check_id":39698, "parameters":null, "result":"succeeded", "result_payload":{ "issues":[], "certificateChain":{ "hostName":"neverssl.com", "certificates":[ { ... /* see Certificate expires soon for shape */ } ], "couldConnectToHost":true, "exception":null } }, ... }, "monitor":{ "id":1, ... /* see above */ } }
DNS issues found #
If a DNS lookup threw an exception during the check, result_payload will include an exception object with class, message, and code. Otherwise it's an empty array.
{ "type": "dnsIssuesFoundNotification", "uuid": "" , "date_time": "20220414100503", "run": { "id": 12345678907, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "dns", "enabled": true, "monitor_id": 1, "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T09:00:00.000000Z", "order_column": 7, "latest_run_id": 10241978697, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 10241978697, "latest_completed_run_result": "failed", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* see above */ } }
DNS records changed #
{ "type": "dnsRecordsChangedNotification", "uuid": "" , "date_time": "20220414114047", "run": { "id": 12345678901, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "dns", "enabled": true, "monitor_id": 1, "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T09:00:00.000000Z", "order_column": 6, "latest_run_id": 12345678901, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 12345678901, "latest_completed_run_result": "succeeded", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* see above */ } }
DNS issues fixed #
{ "type": "dnsIssuesFixedNotification", "uuid": "" , "date_time": "20220414103508", "run": { "id": 12345678901, "result": "succeeded", "check_id": 123456, "ended_at": "2021-04-14T09:00:00.000000Z", "created_at": "2021-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2021-04-14T09:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "dns", "enabled": true, "monitor_id": 1, "created_at": "2021-04-14T09:00:00.000000Z", "parameters": null, "updated_at": "2021-04-14T09:00:00.000000Z", "order_column": 6, "latest_run_id": 12345678901, "latest_run_result": "succeeded", "latest_run_ended_at": "2021-04-14T09:00:00.000000Z", "latest_completed_run_id": 12345678901, "latest_completed_run_result": "succeeded", "latest_completed_run_ended_at": "2021-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* see above */ } }
Scheduled task reported an error #
When your code actively reports a failure state to us for a scheduled task, we fire a cronFailed event.
Some notes:
cron_check_log_item: contains the log entry for the specific failure, including themetafield with details likeexit_code,runtime,memory, andfailure_message. The payload also embeds the relatedcron_check_definitionunder this key because the relation is loaded before serialization.cron_check_definition: contains the scheduled task definition, including its name, frequency, and cron expression. The relatedcheck(with its loadedmonitorandteam) is embedded under this key for the same reason.monitor: contains the monitor this scheduled task belongs to.
Nested objects are omitted from the example below for readability.
{ "type": "cronFailedNotification", "date_time": "20191001115620", "cron_check_log_item": { "id": 12345, "cron_check_definition_id": 4991, "type": "pingFailed", "received_at": "2021-05-07T11:16:00.000000Z", "method": "POST", "ip": "203.0.113.42", "meta": { "exit_code": 1, "runtime": 12.34, "memory": 65536, "failure_message": "Connection to database timed out" }, "fingerprint": null, "created_at": "2021-05-07T11:16:00.000000Z", "updated_at": "2021-05-07T11:16:00.000000Z" }, "cron_check_definition": { "id": 4991, "check_id": 71023, "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "database-backup", "description": "Nightly database backup job", "frequency_in_minutes": 1440, "grace_time_in_minutes": 5, "cron_expression": null, "server_timezone": "Europe/Brussels", "created_at": "2021-01-15T10:00:00.000000Z", "updated_at": "2021-05-07T11:16:00.000000Z" }, "monitor": { "id": 1, "url": "https://yoursite.tld", "...": "..." }, "uuid": "860e04a8-2025-4793-a45c-c9ad71710cf2" }
Scheduled task didn't report on time #
When we did not receive a callback on time for a scheduled task, we consider it failed and will fire a cronNotExecutedOnTimeNotification event.
{ "type": "cronNotExecutedOnTimeNotification", "date_time": "20191001115620", "run": { "id": 5009631000, "check_id": 71023, "parameters": null, "result": "failed", "result_payload": [], "started_at": "2021-05-07T11:16:00.000000Z", "ended_at": "2021-05-07T11:16:01.000000Z", "created_at": "2021-05-07T11:16:00.000000Z", "updated_at": "2021-05-07T11:16:01.000000Z", "check": { "id": 71023, "type": "cron", "...": "..." } }, "monitor": { "id": 1, "url": "https://yoursite.tld", "...": "..." }, "uuid": "6fd75f8c-bc48-4e21-9523" }
Application health problem detected #
The result_payload.application_health_raw_response.body field contains the decoded JSON your application's health endpoint returned, with the same finishedAt and checkResults shape your check pushes to us. The raw response is truncated to 50,000 characters before decoding, so very large bodies may be incomplete or decode to null.
{ "type": "applicationHealthProblemDetectedNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "check": { "id": 123456, "type": "application_health", "enabled": true, "monitor_id": 33160, "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "updated_at": "2022-04-14T09:00:00.000000Z", "order_column": 6, "latest_run_id": 12345678901, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 12345678901, "latest_completed_run_result": "failed", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" }, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "application_health_raw_response": { "body": { "finishedAt": 1649930400, "checkResults": [ { "name": "database", "label": "Database", "notificationMessage": "Could not connect to database", "status": "failed", "meta": [] } ] } } } }, "monitor":{ "id":1, ... /* see above */ } }
Application health problem fixed #
This notification fires per recovered health check. The overall run.result and check.latest_run_result may still be failed or warning if other health checks are still in a bad state; only the recovered individual check triggered this event.
{ "type": "applicationHealthProblemFixedNotification", "uuid": "" , "date_time": "20220414100333", "run": { "id": 12345678901, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "application_health_raw_response": { "body": { "finishedAt": 1649930610, "checkResults": [ { "name": "database", "label": "Database", "notificationMessage": "", "status": "ok", "meta": [] } ] } } }, "check": { "id": 123456, "type": "application_health", "enabled": true, "monitor_id": 1, "created_at": "2022-03-10T10:14:58.000000Z", "parameters": null, "updated_at": "2022-04-14T09:00:00.000000Z", "order_column": 6, "latest_run_id": 12345678901, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z", "latest_completed_run_id": 12345678901, "latest_completed_run_result": "succeeded", "latest_completed_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor":{ "id":1, ... /* see above */ } }
Application health client error #
We fire an applicationHealthClientErrorNotification when we can't reach your application health endpoint at all. This is different from a health problem your app reports; it means we couldn't connect to it in the first place.
The application_health_client_errors array includes details on why the request failed. If the response also returned a body, it's available under application_health_raw_response.body.
{ "type": "applicationHealthClientErrorNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "application_health_client_errors": [ { "url": "", "statusCode": 0, "contentType": "text/plain", "contentLength": 56, "headers": [], "error": "We got a response with unexpected status code `500`" } ] }, "check": { "id": 123456, "type": "application_health", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Application health results too old #
We send an applicationHealthResultsTooOldNotification when your application health endpoint is reachable, but the data it returns is stale. This typically means your app is running fine, but the job that pushes health results to the endpoint has stopped.
{ "type": "applicationHealthResultsTooOldNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "application_health_client_errors": [ { "url": "", "statusCode": 0, "contentType": "text/plain", "contentLength": 134, "headers": [], "error": "The latest health check results reported by your server are more than 10 minutes old. Please verify that health checks are still running on your server." } ], "application_health_raw_response": { "body": { "checkResults": [] } } }, "check": { "id": 123456, "type": "application_health", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Sitemap issues found #
When we crawl your sitemap and find problems, such as URLs returning errors, malformed sitemap files, or sitemap indexes pointing to unavailable sitemaps, we'll send a sitemapIssuesFoundNotification.
{ "type": "sitemapIssuesFoundNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "sitemapCheckResult": { "checkUrl": "https://yoursite.tld/sitemap.xml", "totalIssuesCount": 3, "totalUrlCount": 120, "hasIssues": true, "issues": [ { "name": "FailedUrlResponse", "url": "https://yoursite.tld/missing-page", "responseCode": 404 } ], "sitemapIndexes": [], "sitemaps": [ { "url": "https://yoursite.tld/sitemap.xml", "urlCount": 120, "checkedReachabilityOfAllUrls": true, "issuesCount": 3, "issues": [] } ] } }, "check": { "id": 123456, "type": "sitemap", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Sitemap issues fixed #
When previously detected sitemap issues are resolved, we'll send a sitemapIssuesFixedNotification.
{ "type": "sitemapIssuesFixedNotification", "uuid": "" , "date_time": "20220414120000", "run": { "id": 12345678902, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T12:00:00.000000Z", "created_at": "2022-04-14T12:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T12:00:00.000000Z", "result_payload": { "sitemapCheckResult": { "checkUrl": "https://yoursite.tld/sitemap.xml", "totalIssuesCount": 0, "totalUrlCount": 120, "hasIssues": false, "issues": [], "sitemapIndexes": [], "sitemaps": [ { "url": "https://yoursite.tld/sitemap.xml", "urlCount": 120, "checkedReachabilityOfAllUrls": true, "issuesCount": 0, "issues": [] } ] } }, "check": { "id": 123456, "type": "sitemap", "enabled": true, "monitor_id": 1, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T12:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
DNS blocklist issues found #
We check if your domain appears on any known DNS blocklists. If we spot your domain on one, we'll send a dnsBlocklistIssuesFoundNotification. The detailed blocklist results are available in your Oh Dear dashboard.
{ "type": "dnsBlocklistIssuesFoundNotification", "uuid": "" , "date_time": "20220414100503", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "dns_blocklist", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
DNS blocklist issues fixed #
When your domain is no longer listed on any blocklists, we'll send a dnsBlocklistIssuesFixedNotification.
{ "type": "dnsBlocklistIssuesFixedNotification", "uuid": "" , "date_time": "20220414120000", "run": { "id": 12345678902, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T12:00:00.000000Z", "created_at": "2022-04-14T12:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T12:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "dns_blocklist", "enabled": true, "monitor_id": 1, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T12:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Domain issues found #
When we detect a problem with your domain registration, like an upcoming expiry or a domain that's already expired, we'll send a domainIssuesFoundNotification.
The issues array in result_payload can contain:
"domainHasExpired", the domain has already expired (runresultisfailed)"domainIsExpiringSoon", expiry is imminent within your configured threshold (runresultiswarning)"domainNotFoundInRdap", the domain couldn't be found in RDAP records (runresultisfailed)
{ "type": "domainIssuesFoundNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": { "issues": ["domainHasExpired"] }, "check": { "id": 123456, "type": "domain", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Domain issues fixed #
When domain issues have been resolved (e.g. the domain has been renewed), we'll send a domainIssuesFixedNotification.
{ "type": "domainIssuesFixedNotification", "uuid": "" , "date_time": "20220414120000", "run": { "id": 12345678902, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T12:00:00.000000Z", "created_at": "2022-04-14T12:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T12:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "domain", "enabled": true, "monitor_id": 1, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T12:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Lighthouse issues detected #
We'll send a lighthouseIssuesDetectedNotification when a Lighthouse audit drops below your configured score thresholds for performance, accessibility, SEO, or best practices. The detailed scores and metrics are available in your Oh Dear dashboard.
See Lighthouse docs for more details about this check.
{ "type": "lighthouseIssuesDetectedNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "lighthouse", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Lighthouse issues fixed #
When your Lighthouse scores recover above your configured thresholds, we'll send a lighthouseIssuesFixedNotification.
{ "type": "lighthouseIssuesFixedNotification", "uuid": "" , "date_time": "20220414120000", "run": { "id": 12345678902, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T12:00:00.000000Z", "created_at": "2022-04-14T12:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T12:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "lighthouse", "enabled": true, "monitor_id": 1, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T12:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
AI check failed #
We send an aiCheckFailedNotification when the AI check determines your application isn't behaving as expected. The AI generates a human-readable title and message describing what went wrong; you can find those in the run details via our API.
See AI monitoring docs for more details about this check.
{ "type": "aiCheckFailedNotification", "uuid": "" , "date_time": "20220414100102", "run": { "id": 12345678901, "result": "failed", "check_id": 123456, "ended_at": "2022-04-14T09:00:00.000000Z", "created_at": "2022-04-14T09:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T09:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "ai", "enabled": true, "monitor_id": 1, "latest_run_result": "failed", "latest_run_ended_at": "2022-04-14T09:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
AI check succeeded #
When your AI check returns an ok result, we'll send an aiCheckSucceededNotification. Repeated successes can be suppressed via the check's settings.
{ "type": "aiCheckSucceededNotification", "uuid": "" , "date_time": "20220414120000", "run": { "id": 12345678902, "result": "succeeded", "check_id": 123456, "ended_at": "2022-04-14T12:00:00.000000Z", "created_at": "2022-04-14T12:00:00.000000Z", "parameters": null, "started_at": null, "updated_at": "2022-04-14T12:00:00.000000Z", "result_payload": [], "check": { "id": 123456, "type": "ai", "enabled": true, "monitor_id": 1, "latest_run_result": "succeeded", "latest_run_ended_at": "2022-04-14T12:00:00.000000Z" } }, "monitor": { "id": 1, ... /* See above */ } }
Feel free to reach out via [email protected] or on X via @OhDearApp if you have any other questions. We'd love to help!