A cron job. A nightly backup. An agent that runs every hour. Each one hits its own ping URL when it finishes.
If the ping does not arrive in time, you get an email. On the paid plan you also get a signed webhook.
No dashboard to babysit. No SMS. No phone calls. Just the alert, when it matters.
Use OpenClaw? Install the AO Job Heartbeat skill on ClawHub. Create your free account below first. Then put your API key in OpenClaw's environment yourself. The skill never asks for it in chat.
Start free in your browser
No Terminal required. Create your free account and first monitor here.
Account created — creating your monitor…
Save your API key now.
Save your API key in your password manager before leaving this page. It controls your account. Your workflow needs only the heartbeat URL. Keep both private.
How it works
- Create a check. Give it a name, how often the job runs (
period_s), and how late is too late (grace_s). - Ping it from the job. Put the check's
ping_urlat the end of your script.GETorPOST, no key needed, body ignored. - Get told when it is late. No ping within
period + gracesends acheck.lateevent. The next ping sendscheck.recovered. If the job knows it broke, it can call/ping/<id>/failright away.
Plans
| Plan | Price | Checks | Alerts | Event log |
|---|---|---|---|---|
| Free | $0 | 10 | 30 days | |
| Paid | $7 a month, flat | 100 | email + webhooks | 30 days |
No per-seat fee. Create your free monitor above, then upgrade from the browser whenever you need 100 checks or webhooks. Developers can also use POST /v1/billing/checkout.
Cancel any time from the billing portal.
Developer quick start
Three calls. Replace the email with yours.
# 1. sign up (free). The API key is shown once. Save it.
# Alert email stays OFF until you open the link we email you and
# press "Confirm my email". Then GET /v1/account shows "email_verified": true.
# That turns alert email on. It does not mean an alert will reach you or
# land in your Inbox, and neither does getting the confirmation email.
# A check with "status": "up" only means your job checked in.
curl -s -X POST https://beat.austinoaksapi.com/v1/signup \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com"}'
# 2. create a check: runs every 5 minutes, 60 seconds of grace
curl -s -X POST https://beat.austinoaksapi.com/v1/checks \
-H "Authorization: Bearer $KEY" \
-H 'Content-Type: application/json' \
-d '{"name":"five-minute-demo","period_s":300,"grace_s":60}'
# the reply includes "ping_url" and "fail_url"
# 3. from the job itself, at the end of each run
curl -s https://beat.austinoaksapi.com/ping/<check id>
# the job knows it broke? say so now instead of waiting for the clock
curl -s -X POST https://beat.austinoaksapi.com/ping/<check id>/fail
Paid plan: add a webhook target and every event is POSTed to it.
curl -s -X POST https://beat.austinoaksapi.com/v1/targets \
-H "Authorization: Bearer $KEY" \
-H 'Content-Type: application/json' \
-d '{"kind":"webhook","url":"https://hooks.example.com/alerts","secret":"shared"}'
See what happened: GET /v1/checks/<id>/events returns the last 100 events with their delivery results. The full route list is in openapi.json.
Signed events
Every alert is a JSON event signed with an Ed25519 key. You can check that it really came from this service and was not changed.
The envelope is {"event", "sig", "kid", "ts"}. The signed bytes are the canonical JSON of {"event", "kid", "ts"}: keys sorted, no whitespace. The public key is at GET /v1/keys. Any Ed25519 library can verify it.
A signature proves this service issued the event, unchanged, at the stated time. It does not prove your job is healthy.
Webhook deliveries also carry X-AOKit-Event (the event type) and, when your target has a secret, X-AOKit-Signature: sha256=<HMAC of the body>. Deliveries are tried up to 3 times, waiting 1 second and then 2 seconds between tries. A 4xx reply (other than 429) is not retried.
Limits worth knowing
period_sis 60 seconds to 30 days.grace_sis 0 to 30 days.- Pings are limited to 10 a minute per check. Extra pings still answer
200with"dropped": true, so a chatty job never sees an error. - Alert email goes only to the address you signed up with.
- Webhook targets must be public
httporhttpsaddresses. Private networks and local addresses are refused. - One account per email address. Signups are rate limited per IP.
More
- OpenAPI 3.0 description of every route.
- Looking for a Healthchecks.io alternative?
- AO Job Heartbeat skill for OpenClaw on ClawHub.
- Service health (JSON).