AO Job Heartbeat

Know when a scheduled job did not run.

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

  1. Create a check. Give it a name, how often the job runs (period_s), and how late is too late (grace_s).
  2. Ping it from the job. Put the check's ping_url at the end of your script. GET or POST, no key needed, body ignored.
  3. Get told when it is late. No ping within period + grace sends a check.late event. The next ping sends check.recovered. If the job knows it broke, it can call /ping/<id>/fail right away.

Plans

PlanPriceChecksAlertsEvent log
Free$010email30 days
Paid$7 a month, flat100email + webhooks30 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

More