Get started
Documentation

/start, /fail and duration

One ping says "I am alive". Three signals tell you when the job started, how it ended and how long it took.

Ping URL suffixes

Address Meaning Status after
/<uuid>successup
/<uuid>/startthe job startedunchanged
/<uuid>/failexplicit failuredown immediately
/<uuid>/<code>exit status 0–2550 is up, anything else is down
/<uuid>/logjournal entryunchanged

A POST body (up to 100 KB) is stored in the ping log — a handy place for the tail of a log, so an incident can be triaged without logging into the server.

A start → success pair is what gives you duration

The execution duration chart on the check page is built only from pairs: /start, then a success or an exit code. The gap between them is the runtime.

The consequence worth knowing. If you only send the success ping and never /start, the check works perfectly well — statuses, alerts and uptime are all there — but the duration chart stays empty: there is nothing to subtract. Milliseconds only exist for runs that had a start.

# no duration: the service knows it ran, not how long it took
/usr/local/bin/backup.sh && curl -fsS -m 10 "$PING"

# with duration
curl -fsS -m 10 "$PING/start"
/usr/local/bin/backup.sh
curl -fsS -m 10 "$PING/$?"

Pairs are matched in arrival order. If the job can run in several instances at once, durations blend together — such cases deserve separate checks.

Failing without the wait

The usual route to down is silence: deadline, then grace, then the alert. An explicit failure signal skips all of it — the check drops the moment the ping lands.

The second form is friendlier in a shell: the exit code of the last command already sits in $?, no branching required. In systemd the same role is played by $EXIT_STATUS inside ExecStopPost — see the snippets.

signal() { curl -fsS -m 10 --retry 3 -o /dev/null "$PING$1" || true; }

signal /start
/usr/local/bin/backup.sh
signal "/$?"

A journal entry without a status change

/log writes a line into the journal without touching the status or the deadline. Useful for milestones inside a long run: "exported 10,000 rows", "switched to the fallback source".

A first ping can create the check

Creating checks by hand is optional. Ping by slug — a readable name instead of a UUID — with ?create=1, and the check appears on first contact. Handy when jobs are rolled out by a deploy and you do not know up front how many there will be.

https://ping.cronalive.com/<ping-key>/<slug>?create=1

ping-key is the project key (Projects → Ping key in the dashboard), shared by all of its checks; slug is the job name in lower case, for example etl-run. The schedule of the new check comes from the query parameters:

Parameter Value
periodperiod in seconds, 60–31536000
gracegrace in seconds, 0–2592000
crona cron expression instead of a period
tztime zone for cron, UTC by default
# a plain period
curl "https://ping.cronalive.com/<ping-key>/etl-run?create=1&period=3600&grace=300"

# a cron expression with a time zone (plus signs instead of spaces)
curl "https://ping.cronalive.com/<ping-key>/backup?create=1&cron=30+3+*+*+*&tz=Europe/Moscow"

Rules worth knowing in advance:

See also