diff --git a/site/assets/docs/images/heartbeat-checks/create-heartbeat-check.png b/site/assets/docs/images/heartbeat-checks/create-heartbeat-check.png
new file mode 100644
index 000000000..a8b3b405d
Binary files /dev/null and b/site/assets/docs/images/heartbeat-checks/create-heartbeat-check.png differ
diff --git a/site/assets/docs/images/heartbeat-checks/getting-started-list-view-ping-now.png b/site/assets/docs/images/heartbeat-checks/getting-started-list-view-ping-now.png
deleted file mode 100644
index 7993880ef..000000000
Binary files a/site/assets/docs/images/heartbeat-checks/getting-started-list-view-ping-now.png and /dev/null differ
diff --git a/site/assets/docs/images/heartbeat-checks/getting-started-name-and-tag.png b/site/assets/docs/images/heartbeat-checks/getting-started-name-and-tag.png
deleted file mode 100644
index 67d62c288..000000000
Binary files a/site/assets/docs/images/heartbeat-checks/getting-started-name-and-tag.png and /dev/null differ
diff --git a/site/assets/docs/images/heartbeat-checks/getting-started-overview.png b/site/assets/docs/images/heartbeat-checks/getting-started-overview.png
deleted file mode 100644
index 8bd64c2ad..000000000
Binary files a/site/assets/docs/images/heartbeat-checks/getting-started-overview.png and /dev/null differ
diff --git a/site/assets/docs/images/heartbeat-checks/getting-started-period-and-grace.png b/site/assets/docs/images/heartbeat-checks/getting-started-period-and-grace.png
deleted file mode 100644
index cddc5488f..000000000
Binary files a/site/assets/docs/images/heartbeat-checks/getting-started-period-and-grace.png and /dev/null differ
diff --git a/site/assets/docs/images/heartbeat-checks/getting-started-ping-now.png b/site/assets/docs/images/heartbeat-checks/getting-started-ping-now.png
deleted file mode 100644
index 5c1efb60f..000000000
Binary files a/site/assets/docs/images/heartbeat-checks/getting-started-ping-now.png and /dev/null differ
diff --git a/site/assets/docs/images/heartbeat-checks/getting-started-ping-url.png b/site/assets/docs/images/heartbeat-checks/getting-started-ping-url.png
deleted file mode 100644
index 5b8f5f9db..000000000
Binary files a/site/assets/docs/images/heartbeat-checks/getting-started-ping-url.png and /dev/null differ
diff --git a/site/assets/docs/images/heartbeat-checks/heartbeat-check-overview.png b/site/assets/docs/images/heartbeat-checks/heartbeat-check-overview.png
new file mode 100644
index 000000000..1cb583642
Binary files /dev/null and b/site/assets/docs/images/heartbeat-checks/heartbeat-check-overview.png differ
diff --git a/site/assets/docs/images/heartbeat-checks/heartbeat-ping-overview-page.png b/site/assets/docs/images/heartbeat-checks/heartbeat-ping-overview-page.png
new file mode 100644
index 000000000..dc070e9c3
Binary files /dev/null and b/site/assets/docs/images/heartbeat-checks/heartbeat-ping-overview-page.png differ
diff --git a/site/assets/docs/images/heartbeat-checks/heartbeat-ping-quick-menu.png b/site/assets/docs/images/heartbeat-checks/heartbeat-ping-quick-menu.png
new file mode 100644
index 000000000..3c1abdddf
Binary files /dev/null and b/site/assets/docs/images/heartbeat-checks/heartbeat-ping-quick-menu.png differ
diff --git a/site/assets/docs/images/monitoring/check-results-heartbeat.png b/site/assets/docs/images/monitoring/check-results-heartbeat.png
new file mode 100644
index 000000000..92b836d67
Binary files /dev/null and b/site/assets/docs/images/monitoring/check-results-heartbeat.png differ
diff --git a/site/content/docs/heartbeat-checks/_index.md b/site/content/docs/heartbeat-checks/_index.md
index fdb32ea61..b52244ab1 100644
--- a/site/content/docs/heartbeat-checks/_index.md
+++ b/site/content/docs/heartbeat-checks/_index.md
@@ -1,6 +1,6 @@
---
-title: Heartbeat Monitoring - Checkly Docs
-displayTitle: Heartbeat Monitoring
+title: Getting started with Heartbeat checks - Checkly Docs
+displayTitle: Getting started with Heartbeat checks
navTitle: Overview
weight: 14
slug: /
@@ -14,22 +14,21 @@ aliases:
---
-This guide gives you all the info needed to get started with Checkly heartbeat checks.
+Monitor your scheduled jobs with Heartbeat checks. Heartbeat checks listen for regular pings from your automated tasks, to ensure that they are running as expected.
-> Heartbeat checks are available on our [Team and Enterprise plans](https://www.checklyhq.com/pricing/#features).
+> Heartbeat checks are available on our [Team and Enterprise plans](https://www.checklyhq.com/pricing).
-Check out this video for a quick explainer:
+## What is a Heartbeat check?
-{{< youtube 7I_NfCjYCmo >}}
+A Heartbeat check is a passive check type that expects pings from an external source, such as a scheduled job on a server, at a defined interval. A ping is an HTTP request to a given endpoint URL using either the `GET` or `POST` method.
+When a ping is not received on time, the check will trigger any configured alerts.
-## What is a heartbeat check?
+
-A heartbeat check is a passive check type that expects pings from an external source, such as a scheduled job on a server, at a defined interval. A ping is an HTTP request to a given endpoint URL using either the `GET` or `POST` method.
-When a ping is not received on time, the check will trigger any configured alerts.
+Use Heartbeat checks to monitor backup jobs, data imports, and other recurring jobs or scripts.
-Use heartbeat checks to monitor backup jobs, data imports, and other recurring jobs or scripts.
+For example, this is how you ping a Heartbeat check from a Heroku job:
-Here is an example of how to have a Heroku job send a ping to a Checkly heartbeat check.
{{< tabs "Heroku example" >}}
{{< tab "BASH" >}}
```BASH
@@ -37,208 +36,109 @@ curl -m 5 --retry 3 https://api.checklyhq.com/heartbeats/ping/bcd964a7-6f15-49a5
```
{{< /tab >}}
{{< /tabs >}}
-Note the use of the retry option. We recommend always using retries when available to avoid false alarms due to temporary network issues or other disruptions. You should also specify a timeout so that the ping does not end up blocking an ongoing process or job.
-
-## Creating a heartbeat check
-
-To create a new heartbeat check, click the `+` icon on the sidebar & select **heartbeat check**.
-Creating a heartbeat check is quick and easy; the check requires a name and the period and grace settings defined. These can all be changed later on. Optionally, you can customize tags or [alert settings](/docs/alerting-and-retries/alert-settings/).
+Note the retry and timeout options. We recommend enabling retries when possible, to avoid false alarms due to temporary network issues or similar. You should also specify a timeout so that the ping doesn't block your ongoing job.
-Once you have created your check, the service or host you want to monitor needs to be configured to send a request to the ping URL. When creating or editing the check you can find code examples for how to send requests using JavaScript, Python or in Bash in the quickstart section.
+## Creating a Heartbeat check
-## Check breakdown
+
### Name and tag
-The check name is used for identifying the check in the list of heartbeat checks and in alert messages. Using a clear and meaningful name will help team members identify the check and can help reduce the reaction time when alerts are triggered.
-Tags are used to create meaningful distinctions between check groups, making it easy to filter out selections of checks.
-
+A meaningful name will not only help you and others identify your checks within Checkly, but it will help provide a better alerting experience if your checks fall into an alert state.
+
+Tags can relate your checks together. They also determine which checks are shown on your [dashboards](/docs/dashboards/).
### Ping URL
-The URL on which the check is listening for pings. The job or task monitored should make an HTTP request to the ping URL once per the period configured.
-The incoming request should be either a `GET` or `POST`. `PUT` and `DELETE` requests will not be recorded as pings, instead an error message will be returned.
-
+This is the URL your check listens to for pings. Your scheduled job should send a ping to this URL when successful, once per the configured period.
### Period and Grace
-**Period** defines how often you expect a ping to the ping URL.
+Period defines how often you expect a ping to the ping URL.
-**Grace** is the time Checkly will wait before triggering any alerts when a ping does not arrive within the set period. E.g., if you have a check that expects a ping every 60 minutes, with a grace of 10 minutes, no alarms would trigger until 70 minutes after the latest ping.
+Grace is the amount of time Checkly will wait before triggering any alerts when a ping does not arrive within the set period. E.g., if you have a check that expects a ping every 60 minutes, with a grace of 10 minutes, no alarms would trigger until 70 minutes after the latest ping.
Use grace to compensate for variance in your jobs.
-
-
-### Timer
-The check timer starts when it receives its first ping and will reset after each ping.
-If you have a check that expects a ping every 60 minutes starting at 09:30, and it receives a ping at 10:00, it will reset the timer to expect a ping before 11:00. If the check does not receive a ping before 11:00 plus any configured grace period it will trigger any configured alerts.
-
-
-
-**Every ping or triggered alert will reset the timer of the next expected heartbeat ping.**
-
-> When a check is deactivated and activated again, the timer will start when the check is saved. This is also the case when changing the period of a check.
-
-### Ping now
-Sends a ping to the ping URL. Use this to start the check timer when a check is first created or to silence alarms.
-
-Ping now is also available in the quick menu in the heartbeat overview page.
-
-
-> Note that some __user-agents__ are blocked to prevent false-positive pings from bots.
-> We're currently blocking __Twitterbot__, __Slackbot__, __Googlebot__, __Discordbot__, __Facebot__, __TelegramBot__, __WhatsApp__, __LinkedInBot__.
-> Please note that this list might change in the future.
### Alerting
-By default Checkly uses your account default alert settings and channels. You can configure any of the provided [alert channels](/docs/alerting-and-retries/alert-channels/#managing-alert-channels) for a heartbeat check. If we don’t provide your preferred alert method, use [webhooks](/docs/alerting-and-retries/webhooks/) to configure your alert flow. When configuring a check, you can choose if it should use the account default channels or a selection specific to the check.
-
-> Note that some alerting channels, like [SMS](/docs/alerting-and-retries/sms-delivery/) and [Phone call](/docs/alerting-and-retries/phone-calls/) are only available on our [Team and Enterprise plans](https://www.checklyhq.com/pricing/#features)
-
+You can configure any of the provided [alert channels](/docs/alerting-and-retries/alert-channels/) for a Heartbeat check. If we don’t provide your preferred alert method, use [webhooks](/docs/alerting-and-retries/webhooks/) to configure your alert flow.
-## Reporting
-The heartbeat overview page displays a table of all your heartbeat checks. Here you can see the results of recent pings, the configured period and grace, and the availability over the last 7 days.
+## Pinging your Heartbeat check
-Clicking any individual check will open the check overview page.
-
+Once you've created your check, configure your scheduled job to send an HTTP request to your check's ping URL. For examples of how to do this, see [ping examples](/docs/heartbeat-checks/ping-examples).
-### Check overview
-The check overview page shows the current status of the check, as well as a breakdown of recent runs and availability metrics.
+This should be a `GET` or `POST` request. Your check won't count `PUT` or `DELETE` requests as valid pings, and the endpoint will return an error.
-The summary section at the top of the page allows for time-based filtering, and displays the availability and number of alerts triggered for the given time period.
+You can set request headers to indicate the source of the ping. The source is parsed from the `origin` request header, falling back to `referer` if needed. If both are missing, the source will be blank.
-Single check runs can be accessed by selecting them in the timeline, or by clicking an individual result in the list below the timeline.
-
-Select ‘View all’ for a complete list of available monitoring results in a time period.
-
-### Check results
+> Note that some user-agents are blocked to prevent false-positive pings from bots.
+> We're currently blocking Twitterbot, Slackbot, Googlebot, Discordbot, Facebot, TelegramBot WhatsApp, and LinkedInBot.
+> Please note that this list might change in the future.
-Selecting a single check result page from the check overview page will give a detailed breakdown of the specific request.
+### Manual pings
-The `source` value is taken from the request parameter, if available, otherwise from the request `header.origin`, lastly from `headers.referer`. If none of these are available `source` defers to `null`.
+You can manually send pings via the Checkly UI. Use this to start the check timer when a check is first created or to silence alarms.
-## Ping examples
-Here you can find examples on how to ping a heartbeat check using various types of script or programming languages.
+
-Most examples uses `GET` as the request method, but Heartbeat checks also accepts `POST` requests. Using `PUT` or `DELETE` will return an error message and the ping will not be recorded.
+"Ping now" is also available in the quick menu in your list of Heartbeat checks.
-### Shell
-Adding a ping to a shell script only requires a single line. In this example we use [curl](https://github.com/curl/curl), and [wget](https://www.gnu.org/software/wget/).
+
-As mentioned earlier, we recommend using the `-m` and `--retry` options to specify timeout and retries to reduce the risk of false alerts or blocking the script. The corresponding options for wget are `-t` for retries and `-T` for timeout.
+## How does the timer work?
+The check timer starts when it receives its first ping and will reset after each ping or triggered alert.
-The last example shows how to do a `POST` request instead of `GET` using Curl.
-{{< tabs "Shell" >}}
-{{< tab "Curl" >}}
-```BASH
-# run_backup.sh
+If you have a check that expects a ping every 60 minutes starting at 09:30, and it receives a ping at 10:00, it will reset the timer to expect a ping before 11:00. If the check does not receive a ping before 11:00 plus the configured grace period, it will trigger any configured alerts.
-curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372
-```
-{{< /tab >}}
-{{< tab "Wget" >}}
-```BASH
-# run_backup.sh
+> Every ping or triggered alert will reset the timer of the next expected heartbeat ping.
-wget -T 5 -t 3 https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4
-```
-{{< /tab >}}
-{{< tab "POST in Curl" >}}
-```BASH
-# run_backup.sh
-
-curl -X "POST" -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372
-```
-{{< /tab >}}
-{{< /tabs >}}
-
-The above curl example can also be used in the [Heroku Scheduler](https://devcenter.heroku.com/articles/scheduler):
-
-`run_backup.sh && curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372 > dev/null`
-
-And similarly for [Render cron jobs](https://render.com/docs/cronjobs):
-
-`run_backup.sh && curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372`
-
-### Kubernetes CronJob
-Here is an example of how to add the curl command from earlier to a Kubernetes CronJob.
+
-```BASH
-apiVersion: batch/v1
-kind: CronJob
-metadata:
- name: nightly
- namespace: example
-spec:
- schedule: "0 2 * * *"
- jobTemplate:
- spec:
- template:
- spec:
- containers:
- - name: curl
- image: docker.io/curlimages/curl:latest
- imagePullPolicy: IfNotPresent
- command:
- - sh
- - -c
- args:
- - 'curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372;'
- restartPolicy: OnFailure
-```
+> When a check is deactivated and activated again, the timer will start when the check is saved. This is also the case when changing the period of a check.
-### Node.js
-In these examples we are using the built in [https.get](https://nodejs.org/api/https.html#httpsgeturl-options-callback) option, and then [axios](https://axios-http.com/).
-{{< tabs "Node.js" >}}
-{{< tab "Node.js" >}}
-```JS
-const https = require("https");
+## CLI example
-// Sample URL
-const url = "https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4";
+The [Checkly CLI](/docs/cli/) gives you a JavaScript/TypeScript-native workflow for coding, testing and deploying synthetic monitoring at scale, from your code base.
-const options = {
- timeout: 5000,
-};
+You can define a Heartbeat check via the CLI. For example:
-https.get(url, options, (res) => {
- console.log("statusCode:", res.statusCode);
+{{< tabs "CLI example" >}}
+{{< tab "TypeScript" >}}
+```ts {title="heartbeat.check.ts"}
+import { HeartbeatCheck } from 'checkly/constructs'
- res.on('data', (data) => {
- console.log("responseBody:", data);
- });
-});
+new HeartbeatCheck('heartbeat-check-1', {
+ name: 'Send weekly newsletter job',
+ period: 7,
+ periodUnit: 'days',
+ grace: 2,
+ graceUnit: 'hours',
+})
```
{{< /tab >}}
-{{< tab "Axios" >}}
-```JS
-const axios = require('axios');
-
-axios.get('https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4').then(resp => {
- console.log(resp.data);
+{{< tab "JavaScript" >}}
+```js {title="heartbeat.check.js"}
+const { HeartbeatCheck } = require('checkly/constructs')
+
+new HeartbeatCheck('heartbeat-check-1', {
+ name: 'Send weekly newsletter job',
+ period: 7,
+ periodUnit: 'days',
+ grace: 2,
+ graceUnit: 'hours',
})
+
```
{{< /tab >}}
{{< /tabs >}}
+The above example defines:
+- The `name` of the check.
+- A `period` of 7 days and a `grace` of 2 hours.
-### Python
-Using the python [requests](https://requests.readthedocs.io/en/latest/) library with a timeout set to 5 seconds.
-
-```PYTHON
-import requests
+For more options, see the [Check construct reference](/docs/cli/constructs-reference/#check).
-# Heartbeat URL
-url = "https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc"
+## Next steps
-# A GET request to the Heartbeat
-response = requests.get(url, timeout=5)
-```
-
-### PowerShell
-Adding a ping to a PowerShell script only requires a single line. Use PowerShell and Windows Task Scheduler to automate tasks on Windows systems.
-
-Similar to the Shell example we can specify `timeout` and `retry` options. See the [Invoke-RestMethod](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7.3) documentation for more information.
-
-```BASH
-Invoke-RestMethod -Uri https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc -TimeoutSec 5 -MaximumRetryCount 3 -RetryIntervalSec 5
-```
+- Learn about the benefits of [Monitoring as Code](/guides/monitoring-as-code/).
+- Interpret your [Heartbeat check results](/docs/monitoring/check-results/#heartbeat-check-results).
\ No newline at end of file
diff --git a/site/content/docs/heartbeat-checks/ping-examples.md b/site/content/docs/heartbeat-checks/ping-examples.md
new file mode 100644
index 000000000..cab655f0a
--- /dev/null
+++ b/site/content/docs/heartbeat-checks/ping-examples.md
@@ -0,0 +1,228 @@
+---
+title: Ping examples - Checkly Docs
+displayTitle: Ping examples
+navTitle: Ping examples
+weight: 15
+menu:
+ resources:
+ parent: "Heartbeat checks"
+
+---
+
+Here you can find examples on how to ping a Heartbeat check.
+
+Most examples use `GET` as the request method, but Heartbeat checks also accept `POST` requests. Your check won't record `PUT` or `DELETE` requests as pings, and the endpoint will return an error.
+
+## Shell
+Adding a ping to a shell script only requires a single line.
+
+This is an example using [curl](https://curl.se/). We recommend using the `-m` and `--retry` options to specify timeout and retries to reduce the risk of false alerts or blocking the script.
+
+{{< tabs "Shell" >}}
+{{< tab "Get" >}}
+```BASH {title="run_backup.sh"}
+curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372
+```
+{{< /tab >}}
+{{< tab "POST" >}}
+```BASH {title="run_backup.sh"}
+curl -X "POST" -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+This is a similar example with [wget](https://www.gnu.org/software/wget/). Use the options `-t` for retries and `-T` for timeout.
+
+```BASH {title="run_backup.sh"}
+wget -T 5 -t 3 https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4
+```
+
+You can use curl for [Render cron jobs](https://render.com/docs/cronjobs) and the [Heroku Scheduler](https://devcenter.heroku.com/articles/scheduler):
+
+```BASH
+run_backup.sh && curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372
+```
+
+## Kubernetes CronJob
+Here is an example of how to add the curl command to a Kubernetes CronJob.
+
+```YAML {title="my-scheduled-job.yaml"}
+apiVersion: batch/v1
+kind: CronJob
+metadata:
+ name: nightly
+spec:
+ schedule: "0 2 * * *"
+ jobTemplate:
+ spec:
+ template:
+ spec:
+ containers:
+ - name: curl
+ image: docker.io/curlimages/curl:latest
+ imagePullPolicy: IfNotPresent
+ command:
+ - sh
+ - -c
+ args:
+ - 'curl -m 5 --retry 3 https://ping.checklyhq.com/f0e0b1d3-665d-49d0-8bf0-3e6504c3d372;'
+ restartPolicy: OnFailure
+```
+
+## Node.js
+
+You can use any HTTP request library (`https`, `axios`, etc.) to ping your Heartbeat check.
+
+This is an example with the built-in [https.get](https://nodejs.org/api/https.html#httpsgeturl-options-callback) package:
+
+{{< tabs "https.get" >}}
+{{< tab "Typescript" >}}
+```ts {title="my-scheduled-job.ts"}
+import https from "https";
+
+// Sample URL
+const url = "https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4";
+
+const options = {
+ timeout: 5000,
+};
+
+https.get(url, options, (res) => {
+ console.log("statusCode:", res.statusCode);
+
+ res.on('data', (data) => {
+ console.log("responseBody:", data);
+ });
+});
+```
+{{< /tab >}}
+{{< tab "Javascript" >}}
+```js {title="my-scheduled-job.js"}
+const https = require("https");
+
+// Sample URL
+const url = "https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4";
+
+const options = {
+ timeout: 5000,
+};
+
+https.get(url, options, (res) => {
+ console.log("statusCode:", res.statusCode);
+
+ res.on('data', (data) => {
+ console.log("responseBody:", data);
+ });
+});
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+You can also use [Axios](https://axios-http.com/):
+
+{{< tabs "axios" >}}
+{{< tab "TypeScript" >}}
+```ts {title="my-scheduled-job.ts"}
+import axios from 'axios'
+
+axios.get('https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4')
+ .then(resp => {
+ console.log(resp.data);
+ })
+
+```
+{{< /tab >}}
+{{< tab "JavaScript" >}}
+```js {title="my-scheduled-job.js"}
+const axios = require('axios');
+
+axios.get('https://ping.checklyhq.com/87c05896-3b7d-49ae-83ff-5e81323a54c4')
+ .then(resp => {
+ console.log(resp.data);
+ })
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+## Vercel cron jobs
+
+You can monitor your [Vercel cron jobs](https://vercel.com/docs/cron-jobs) with Heartbeat checks. At the end of your cron job, make an HTTP `GET` or `POST` request to your ping URL. For example, using `fetch()`:
+
+{{< tabs "Vercel example" >}}
+{{< tab "Next.js (App Router)" >}}
+```js {title="app/api/my-cron-job/route.js"}
+export async function GET(req, res) {
+ // Your job tasks here ...
+
+ // Ping URL
+ const URL = 'https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc';
+
+ // GET request to the Heartbeat
+ try {
+ const response = await fetch(URL);
+ console.log(`Checkly heartbeat ping status ${response.status}`);
+ } catch (error) {
+ console.log(`Checkly heartbeat ping failed: ${error}`)
+ }
+}
+```
+{{< /tab >}}
+{{< tab "Next.js (Pages Router)" >}}
+```js {title="pages/api/my-cron-job.js"}
+export default function handler(req, res) {
+ // Your job tasks here ...
+
+ // Ping URL
+ const URL = 'https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc';
+
+ // GET request to the Heartbeat
+ try {
+ const response = await fetch(URL);
+ console.log(`Checkly heartbeat ping status ${response.status}`);
+ } catch (error) {
+ console.log(`Checkly heartbeat ping failed: ${error}`)
+ }
+}
+```
+{{< /tab >}}
+{{< tab "Other frameworks" >}}
+```js {title="api/my-cron-job.js"}
+export function GET() {
+ // Your job tasks here ...
+
+ // Ping URL
+ const URL = 'https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc';
+
+ // GET request to the Heartbeat
+ try {
+ const response = await fetch(URL);
+ console.log(`Checkly heartbeat ping status ${response.status}`);
+ } catch (error) {
+ console.log(`Checkly heartbeat ping failed: ${error}`)
+ }
+}
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+## Python
+This is an example using the Python [requests](https://requests.readthedocs.io/en/latest/) library with a timeout of 5 seconds:
+
+```PYTHON {title="my_scheduled_job.py"}
+import requests
+
+# Heartbeat URL
+url = "https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc"
+
+# A GET request to the Heartbeat
+response = requests.get(url, timeout=5)
+```
+
+## PowerShell
+Use PowerShell and Windows Task Scheduler to automate tasks on Windows systems. Adding a ping to a PowerShell script only requires a single line.
+
+We recommend using the `timeout` and `retry` options to reduce the risk of false alerts or blocking the script. See the [Invoke-RestMethod](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7.3) documentation for more information.
+
+```BASH
+Invoke-RestMethod -Uri https://ping.checklyhq.com/c3f5f5bb-6e46-431a-b7b1-35105450cddc -TimeoutSec 5 -MaximumRetryCount 3 -RetryIntervalSec 5
+```
\ No newline at end of file
diff --git a/site/content/docs/monitoring/check-results.md b/site/content/docs/monitoring/check-results.md
index b6f0f2f81..566a46a17 100644
--- a/site/content/docs/monitoring/check-results.md
+++ b/site/content/docs/monitoring/check-results.md
@@ -8,7 +8,7 @@ menu:
parent: "Monitoring"
---
-You can select any check on the main Checkly dashboard to get an overview of the results they have produced so far. To learn about heartbeat check results, visit the [Heartbeat checks](/docs/heartbeat-checks/) section
+You can select any check on the main Checkly dashboard to get an overview of the results they have produced so far.
## Check results overview
@@ -132,6 +132,24 @@ These include:
e. Download
+## Heartbeat check results
+
+Heartbeat check results show information about the ping request, like when it was recieved and its source.
+
+
+
+The state indicates when your scheduled job pinged the Heartbeat check, relative to the expected time:
+
+| State | Description |
+| -------- | ------- |
+| `EARLY` | Ping recieved before the expected time. |
+| `RECEIVED` | Ping recieved right at the expected time. |
+| `GRACE` | Ping recieved after the expected time, during the grace period. |
+| `LATE` | Ping recieved during the few seconds between the end of the grace period and before the check is marked as failing. This is very rare. |
+| `FAILING` | No ping recieved by the end of the grace period. Indicates a failing Heartbeat check. |
+
+The source shows where your ping originated, determined by the `origin` and `referer` request headers. [Learn more about configuring the ping source](/docs/heartbeat-checks/#pinging-your-heartbeat-check).
+
## Multistep check results
Multistep check results are navigated using the tree on the left side of the screen. If you are running checks in parallel, first select the location you are interested in.