Migrating from Cronitor.io
Cronitorex is a drop-in replacement for Cronitor.io in 95% of cases. The run/complete/fail pattern is identical, the JSON payload is the same (with one minor naming difference, covered below). Production migration typically takes 10 minutes.
TL;DR
# beforecurl https://cronitor.link/p/$CRONITOR_PING_KEY/db-backup?state=run
# aftercurl https://api.cronitorex.com/ping \ -H "Authorization: Bearer $CRONITOREX_API_KEY" \ -d '{"event_type":"ping","monitor":"db-backup","status":"run"}'That’s it. The rest of this page is detail for various integrations.
Step 1: Create an account
Sign up. Generate an API key in Settings → API Key. Copy it.
Step 2: Swap environment variables
In your .env, deployment config, GitHub secrets, K8s secrets — replace:
| Cronitor.io | Cronitorex |
|---|---|
CRONITOR_API_KEY | CRONITOREX_API_KEY |
CRONITOR_PING_KEY | — (not needed, we use Bearer tokens) |
CRONITOR_URL (if you self-hosted) | CRONITOREX_API_URL=https://api.cronitorex.com |
Step 3: Adjust the curl calls
Cronitor.io uses URL params, we use JSON body. Mapping:
| Cronitor.io URL | Cronitorex JSON |
|---|---|
?state=run | "status":"run" |
?state=complete | "status":"complete" |
?state=fail | "status":"fail" |
&host=server-01 | "host":"server-01" |
&duration=42.3 | "duration":42.3 |
&exit_code=1 | "exit_code":1 |
&message=DB+timeout | "error_output":"DB timeout" |
Naming note: Cronitor uses the state field in URL params, we use status in the JSON body. It’s a naming difference — function is identical. In our DB after acceptance the column is named state (post-normalisation), but at the API layer you send status.
Example — full lifecycle
Cronitor.io:
JOB="db-backup"KEY="$CRONITOR_PING_KEY"
curl -fs "https://cronitor.link/p/$KEY/$JOB?state=run&host=$(hostname)"START=$(date +%s)
/usr/local/bin/backup.shEXIT=$?DURATION=$(($(date +%s) - START))
if [ $EXIT -eq 0 ]; then curl -fs "https://cronitor.link/p/$KEY/$JOB?state=complete&duration=$DURATION"else curl -fs "https://cronitor.link/p/$KEY/$JOB?state=fail&exit_code=$EXIT&duration=$DURATION"fiCronitorex:
JOB="db-backup"KEY="$CRONITOREX_API_KEY"URL="https://api.cronitorex.com/ping"
curl -fs "$URL" -H "Authorization: Bearer $KEY" \ -d "{\"event_type\":\"ping\",\"monitor\":\"$JOB\",\"status\":\"run\",\"host\":\"$(hostname)\"}"START=$(date +%s)
/usr/local/bin/backup.shEXIT=$?DURATION=$(($(date +%s) - START))
if [ $EXIT -eq 0 ]; then curl -fs "$URL" -H "Authorization: Bearer $KEY" \ -d "{\"event_type\":\"ping\",\"monitor\":\"$JOB\",\"status\":\"complete\",\"duration\":$DURATION}"else curl -fs "$URL" -H "Authorization: Bearer $KEY" \ -d "{\"event_type\":\"ping\",\"monitor\":\"$JOB\",\"status\":\"fail\",\"exit_code\":$EXIT,\"duration\":$DURATION}"fiStep 4: Use our shell client
For convenience we ship cronitorex.sh with a simple CLI:
curl -fsSL https://cronitorex.com/cronitorex.sh -o /usr/local/bin/cronitorexchmod +x /usr/local/bin/cronitorexexport CRONITOREX_API_KEY=...
# instead of three curls:cronitorex run db-backup -- /usr/local/bin/backup.shIt pings run on start, measures duration, captures the exit code, and pings complete/fail at the end.
Step 5: GET pings (compatibility)
If your infrastructure can’t do POST JSON (legacy systems, plain bash, healthcheck.sh):
# equivalent of the POST bodycurl "https://api.cronitorex.com/ping/db-backup?status=run&host=server-01&series=abc123"The endpoint accepts query params for event_type=ping. Same pattern as Cronitor.io. Auth via Authorization: Bearer header.
Monitor mapping
In Cronitor.io: a monitor = (ping_key, name) combo. In Cronitorex: monitor is just a string identifier unique per user. You don’t need to declare anything upfront — the first ping creates the monitor in our DB automatically.
If you have 50 monitors in Cronitor.io named db-backup, web-cron, email-sender — the same names work in Cronitorex. No pre-registration needed.
Migrating schedule configuration
Cronitor lets you set a schedule (cron expression) per monitor to detect missed runs. Same idea here — the expected_interval_seconds field in Configure → Edit Monitor (UI) or via future API.
Cronitor schedule: "0 2 * * *" → Cronitorex expected_interval_seconds: 86400 + a configured time of first run (from the first ping).
Full cron expression support on the roadmap (roadmap →).
What’s different (honestly)
- Cronitorex doesn’t have yet: native Slack/PagerDuty/SMS integration (Q3 2026), public status pages, multi-region checks, advanced cron expression scheduling.
- Cronitorex has: drop-in API, 50% cheaper at target pricing, Polish-language support, EU infrastructure.
Migration support
Migration stuck? Email migrate@cronitorex.com — we help for free.
Next steps
- Quick start → — full tutorial
- API Reference: POST /ping → — all payload fields
- Shell Script Client → — convenience wrapper