# Migrate from Healthchecks.io to HookPulse

Export your Healthchecks.io checks, turn them into crontab lines and import them into HookPulse in one go.

HookPulse · Updated 2026-10-16

## Step 1. Export your checks

In the settings of your Healthchecks.io project, create a read-only API key. This call saves every check of the project in checks.json.

```sh
curl -s https://healthchecks.io/api/v3/checks/ -H "X-Api-Key: $HC_READ_ONLY_KEY" > checks.json
```

## Step 2. Turn them into crontab lines

Save this script as hc2crontab.py. Each check becomes one line with its schedule and its name. A period with no cron schedule becomes a comment, and so does a time zone other than UTC.

```python
import json
import sys

# A simple check's period, in seconds, as a cron schedule.
PERIODS = {
    60: "* * * * *",
    300: "*/5 * * * *",
    600: "*/10 * * * *",
    900: "*/15 * * * *",
    1800: "*/30 * * * *",
    3600: "0 * * * *",
    86400: "0 0 * * *",
    604800: "0 0 * * 0",
}

with open(sys.argv[1], encoding="utf-8") as f:
    checks = json.load(f)["checks"]
for check in checks:
    name = check["name"] or check["slug"] or "healthchecks-check"
    schedule = check.get("schedule") or PERIODS.get(check.get("timeout"))
    if not schedule:
        print(f"# by hand: {name}, every {check.get('timeout')} seconds")
        continue
    if check.get("tz", "UTC") != "UTC":
        print(f"# {name} runs in {check['tz']}: set this time zone on the monitor")
    print(f"{schedule} {name}")
```

## Step 3. Preview the import

HookPulse creates nothing yet. The answer lists the monitors it would create and the lines it ignored, with the reason. Keep the hp_ token: it owns the new monitors.

```sh
python3 hc2crontab.py checks.json > crontab.txt
HP=$(curl -s -XPOST https://hookpulse.net/api/guest -H 'content-type: application/json' -d '{}' \
  | python3 -c 'import json, sys; print(json.load(sys.stdin)["token"])')
echo "$HP"  # keep this token: it owns the new monitors
curl -s -XPOST "https://hookpulse.net/api/import/crontab" -H "X-Guest-Token: $HP" \
  -H 'content-type: text/plain' --data-binary @crontab.txt
```

## Step 4. Create the monitors

Send the same file with apply=1. It creates all the monitors or none, and lists the check-in URL of each one.

```sh
curl -s -XPOST "https://hookpulse.net/api/import/crontab?apply=1" -H "X-Guest-Token: $HP" \
  -H 'content-type: text/plain' --data-binary @crontab.txt > created.json
python3 -c 'import json; [print(m["name"], m["ingest_url"]) for m in json.load(open("created.json"))["created"]]'
```

## Step 5. Point your jobs at HookPulse

In each job, replace the hc-ping.com URL with the check-in URL of the monitor that has the same name.

```sh
# before
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://hc-ping.com/YOUR_UUID
# after
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://hookpulse.net/in/YOUR_ID
```

## Step 6. Turn on e-mail alerts

Set the address that receives the alerts of each monitor. Use the ID from its check-in URL.

```sh
curl -s -XPATCH https://hookpulse.net/api/endpoints/YOUR_ID -H "X-Guest-Token: $HP" \
  -H 'content-type: application/json' -d '{"alert_to":"you@example.com"}'
```

[Open HookPulse](https://hookpulse.net/#routines)

[Migrate from Healthchecks.io to HookPulse](https://hookpulse.net/guides/migrate-from-healthchecks-io)
