Get started
API Reference

CronAlive API v1.0

Public REST API v1. Authenticate with a project API key (`Authorization: Bearer ca_rw_…` or `ca_ro_…`). Read-only keys may only call GET endpoints. Rate limit: 600 requests/minute per key (429 + Retry-After on excess).

Download openapi.yaml

Endpoints

get /ping-domains no auth Current ping domains (fallback list for SDKs)
Example request
curl https://app.cronalive.com/api/v1/ping-domains
Example response · 200
{
  "data": [
    "https://ping.cronalive.com",
    "https://ping.cronalive.ru"
  ]
}
Responses
200 OK
get /checks List checks of the key's project
Example request
curl https://app.cronalive.com/api/v1/checks \
  -H "Authorization: Bearer ca_ro_XXXXXXXXXXXXXXXX"
Example response · 200
{
  "data": [
    {
      "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
      "kind": "heartbeat",
      "name": "nightly backup",
      "slug": "nightly-backup",
      "description": null,
      "tags": [
        "backups",
        "prod"
      ],
      "schedule": {
        "kind": "cron",
        "cron": "0 3 * * *",
        "tz": "Europe/Moscow"
      },
      "grace_sec": 1800,
      "tz": "Europe/Moscow",
      "status": "up",
      "last_ping_at": "2026-07-22T03:00:12+00:00",
      "last_duration_ms": 5230,
      "next_deadline_at": "2026-07-23T00:00:00+00:00",
      "ping_urls": [
        "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
        "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
      ],
      "created_at": "2026-07-01T10:00:00+00:00"
    }
  ]
}
Responses
200 OK
post /checks Create a check (rw key)
Request body

Schema: CheckInput

Example request
curl https://app.cronalive.com/api/v1/checks \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "name": "nightly backup",
    "kind": "heartbeat",
    "slug": "nightly-backup",
    "tags": [
      "backups",
      "prod"
    ],
    "tz": "Europe/Moscow",
    "grace_sec": 1800,
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *"
    }
  }'
Example response · 201
{
  "data": {
    "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "kind": "heartbeat",
    "name": "nightly backup",
    "slug": "nightly-backup",
    "description": null,
    "tags": [
      "backups",
      "prod"
    ],
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *",
      "tz": "Europe/Moscow"
    },
    "grace_sec": 1800,
    "tz": "Europe/Moscow",
    "status": "new",
    "last_ping_at": null,
    "last_duration_ms": null,
    "next_deadline_at": null,
    "ping_urls": [
      "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
      "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
    ],
    "created_at": "2026-07-22T10:00:00+00:00"
  }
}
Responses
201 Created
422 Validation error
example
{
  "message": "The name field is required.",
  "errors": {
    "name": [
      "The name field is required."
    ]
  }
}
get /checks/{uuid} Get a check
Parameters
NameInType
uuid path string · uuid required
Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301 \
  -H "Authorization: Bearer ca_ro_XXXXXXXXXXXXXXXX"
Example response · 200
{
  "data": {
    "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "kind": "heartbeat",
    "name": "nightly backup",
    "slug": "nightly-backup",
    "description": null,
    "tags": [
      "backups",
      "prod"
    ],
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *",
      "tz": "Europe/Moscow"
    },
    "grace_sec": 1800,
    "tz": "Europe/Moscow",
    "status": "up",
    "last_ping_at": "2026-07-22T03:00:12+00:00",
    "last_duration_ms": 5230,
    "next_deadline_at": "2026-07-23T00:00:00+00:00",
    "ping_urls": [
      "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
      "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
    ],
    "created_at": "2026-07-01T10:00:00+00:00"
  }
}
Responses
200 OK
404 Not found
patch /checks/{uuid} Update a check (rw key)
Parameters
NameInType
uuid path string · uuid required
Request body

Schema: CheckInput

Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301 \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{
    "name": "nightly backup",
    "kind": "heartbeat",
    "slug": "nightly-backup",
    "tags": [
      "backups",
      "prod"
    ],
    "tz": "Europe/Moscow",
    "grace_sec": 1800,
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *"
    }
  }'
Example response · 200
{
  "data": {
    "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "kind": "heartbeat",
    "name": "nightly backup",
    "slug": "nightly-backup",
    "description": null,
    "tags": [
      "backups",
      "prod"
    ],
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *",
      "tz": "Europe/Moscow"
    },
    "grace_sec": 1800,
    "tz": "Europe/Moscow",
    "status": "up",
    "last_ping_at": "2026-07-22T03:00:12+00:00",
    "last_duration_ms": 5230,
    "next_deadline_at": "2026-07-23T00:00:00+00:00",
    "ping_urls": [
      "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
      "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
    ],
    "created_at": "2026-07-01T10:00:00+00:00"
  }
}
Responses
200 Updated
422 Validation error
example
{
  "message": "The name field is required.",
  "errors": {
    "name": [
      "The name field is required."
    ]
  }
}
delete /checks/{uuid} Delete a check (rw key)
Parameters
NameInType
uuid path string · uuid required
Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301 \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X DELETE
Responses
204 Deleted
post /checks/{uuid}/pause Pause monitoring (rw key)

The check flips to `paused`: pings are still recorded, but the status and deadlines are not touched until `resume`.

Parameters
NameInType
uuid path string · uuid required
Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301/pause \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X POST
Example response · 200
{
  "data": {
    "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "kind": "heartbeat",
    "name": "nightly backup",
    "slug": "nightly-backup",
    "description": null,
    "tags": [
      "backups",
      "prod"
    ],
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *",
      "tz": "Europe/Moscow"
    },
    "grace_sec": 1800,
    "tz": "Europe/Moscow",
    "status": "paused",
    "last_ping_at": "2026-07-22T03:00:12+00:00",
    "last_duration_ms": 5230,
    "next_deadline_at": null,
    "ping_urls": [
      "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
      "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
    ],
    "created_at": "2026-07-01T10:00:00+00:00"
  }
}
Responses
200 Paused
post /checks/{uuid}/resume Resume monitoring (rw key)

Returns to `up` with a fresh deadline counted from the resume moment (or to `new` if the check has never been pinged).

Parameters
NameInType
uuid path string · uuid required
Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301/resume \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X POST
Example response · 200
{
  "data": {
    "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "kind": "heartbeat",
    "name": "nightly backup",
    "slug": "nightly-backup",
    "description": null,
    "tags": [
      "backups",
      "prod"
    ],
    "schedule": {
      "kind": "cron",
      "cron": "0 3 * * *",
      "tz": "Europe/Moscow"
    },
    "grace_sec": 1800,
    "tz": "Europe/Moscow",
    "status": "up",
    "last_ping_at": "2026-07-22T03:00:12+00:00",
    "last_duration_ms": 5230,
    "next_deadline_at": "2026-07-23T00:00:00+00:00",
    "ping_urls": [
      "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
      "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
    ],
    "created_at": "2026-07-01T10:00:00+00:00"
  }
}
Responses
200 Resumed
get /checks/{uuid}/pings Recent pings (up to 100)
Parameters
NameInType
uuid path string · uuid required
limit query integer default: 25
Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301/pings \
  -H "Authorization: Bearer ca_ro_XXXXXXXXXXXXXXXX"
Example response · 200
{
  "data": [
    {
      "ts": "2026-07-22T03:00:12.482913+00:00",
      "type": "success",
      "exit_status": 0,
      "source_ip": "203.0.113.7",
      "method": "GET",
      "body_size": 0,
      "duration_ms": 5230,
      "body": null,
      "user_agent": "curl/8.5.0"
    }
  ]
}
Responses
200 OK
get /checks/{uuid}/flips Recent status changes
Parameters
NameInType
uuid path string · uuid required
limit query integer default: 25
Example request
curl https://app.cronalive.com/api/v1/checks/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301/flips \
  -H "Authorization: Bearer ca_ro_XXXXXXXXXXXXXXXX"
Example response · 200
{
  "data": [
    {
      "ts": "2026-07-21T00:30:00+00:00",
      "old_status": "late",
      "new_status": "down",
      "reason": "timeout"
    }
  ]
}
Responses
200 OK
get /integrations List integrations
Example request
curl https://app.cronalive.com/api/v1/integrations \
  -H "Authorization: Bearer ca_ro_XXXXXXXXXXXXXXXX"
Example response · 200
{
  "data": [
    {
      "id": 7,
      "kind": "telegram",
      "name": "ops chat",
      "enabled": true,
      "events": [
        "down",
        "up"
      ],
      "tags": [
        "prod"
      ],
      "quiet_hours": {
        "from": "23:00",
        "to": "08:00",
        "tz": "Europe/Moscow"
      },
      "reminders": [
        1,
        24
      ],
      "created_at": "2026-07-10T09:00:00+00:00"
    }
  ]
}
Responses
200 OK
post /integrations Create an integration (rw key)
Request body

Schema: IntegrationInput

Example request
curl https://app.cronalive.com/api/v1/integrations \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "telegram",
    "name": "ops chat",
    "events": [
      "down",
      "up"
    ],
    "tags": [
      "prod"
    ],
    "quiet_hours": {
      "from": "23:00",
      "to": "08:00",
      "tz": "Europe/Moscow"
    },
    "reminders": [
      1,
      24
    ]
  }'
Example response · 201
{
  "data": {
    "id": 7,
    "kind": "telegram",
    "name": "ops chat",
    "enabled": true,
    "events": [
      "down",
      "up"
    ],
    "tags": [
      "prod"
    ],
    "quiet_hours": {
      "from": "23:00",
      "to": "08:00",
      "tz": "Europe/Moscow"
    },
    "reminders": [
      1,
      24
    ],
    "created_at": "2026-07-10T09:00:00+00:00"
  },
  "telegram_deep_link": "https://t.me/CronAliveBot?start=Zx91…"
}
Responses
201 Created
422 Validation error
example
{
  "message": "The name field is required.",
  "errors": {
    "name": [
      "The name field is required."
    ]
  }
}
patch /integrations/{id} Update an integration (rw key)
Parameters
NameInType
id path integer required
Request body

Schema: IntegrationInput

Example request
curl https://app.cronalive.com/api/v1/integrations/7 \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "telegram",
    "name": "ops chat",
    "events": [
      "down",
      "up"
    ],
    "tags": [
      "prod"
    ],
    "quiet_hours": {
      "from": "23:00",
      "to": "08:00",
      "tz": "Europe/Moscow"
    },
    "reminders": [
      1,
      24
    ]
  }'
Example response · 200
{
  "data": {
    "id": 7,
    "kind": "telegram",
    "name": "ops chat",
    "enabled": true,
    "events": [
      "down",
      "up"
    ],
    "tags": [
      "prod"
    ],
    "quiet_hours": {
      "from": "23:00",
      "to": "08:00",
      "tz": "Europe/Moscow"
    },
    "reminders": [
      1,
      24
    ],
    "created_at": "2026-07-10T09:00:00+00:00"
  }
}
Responses
200 Updated
delete /integrations/{id} Delete an integration (rw key)
Parameters
NameInType
id path integer required
Example request
curl https://app.cronalive.com/api/v1/integrations/7 \
  -H "Authorization: Bearer ca_rw_XXXXXXXXXXXXXXXX" \
  -X DELETE
Responses
204 Deleted

Schemas

Schedule

period | cron | oncalendar (systemd)

{
  "type": "object",
  "description": "period | cron | oncalendar (systemd)",
  "oneOf": [
    {
      "properties": {
        "kind": {
          "const": "period"
        },
        "period_sec": {
          "type": "integer",
          "minimum": 60,
          "maximum": 31536000,
          "example": 3600
        },
        "tz": {
          "type": "string",
          "example": "UTC"
        }
      }
    },
    {
      "properties": {
        "kind": {
          "const": "cron"
        },
        "cron": {
          "type": "string",
          "description": "5-field cron expression",
          "example": "0 3 * * *"
        },
        "tz": {
          "type": "string",
          "example": "Europe/Moscow"
        }
      }
    },
    {
      "properties": {
        "kind": {
          "const": "oncalendar"
        },
        "oncalendar": {
          "type": "string",
          "description": "systemd OnCalendar expression",
          "example": "Mon..Fri 09:00"
        },
        "tz": {
          "type": "string",
          "example": "UTC"
        }
      }
    }
  ],
  "example": {
    "kind": "cron",
    "cron": "0 3 * * *",
    "tz": "Europe/Moscow"
  }
}
Example
{
  "kind": "cron",
  "cron": "0 3 * * *",
  "tz": "Europe/Moscow"
}
CheckInput
FieldType
namestringrequired
kindstring (heartbeat | http)default: "heartbeat"
slugstring
descriptionstring
tagsarray<string>
tzstringdefault: "UTC"
grace_secintegerrequired
scheduleSchedulerequired
http_configobjectRequired when kind=http
Example
{
  "name": "nightly backup",
  "kind": "heartbeat",
  "slug": "nightly-backup",
  "tags": [
    "backups",
    "prod"
  ],
  "tz": "Europe/Moscow",
  "grace_sec": 1800,
  "schedule": {
    "kind": "cron",
    "cron": "0 3 * * *"
  }
}
Check
FieldType
idstring · uuid
kindstring (heartbeat | http)
namestring
slugstring | null
descriptionstring | null
tagsarray<string>
scheduleSchedule
grace_secinteger
tzstring
statusstring (new | up | late | down | paused)
last_ping_atstring | null · date-time
last_duration_msinteger | null
next_deadline_atstring | null · date-time
ping_urlsarray<string>
created_atstring · date-time
Example
{
  "id": "e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
  "kind": "heartbeat",
  "name": "nightly backup",
  "slug": "nightly-backup",
  "description": null,
  "tags": [
    "backups",
    "prod"
  ],
  "schedule": {
    "kind": "cron",
    "cron": "0 3 * * *",
    "tz": "Europe/Moscow"
  },
  "grace_sec": 1800,
  "tz": "Europe/Moscow",
  "status": "up",
  "last_ping_at": "2026-07-22T03:00:12+00:00",
  "last_duration_ms": 5230,
  "next_deadline_at": "2026-07-23T00:00:00+00:00",
  "ping_urls": [
    "https://ping.cronalive.com/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301",
    "https://ping.cronalive.ru/e4c9ffb6-9d7e-4c1f-9df6-04642b6ad301"
  ],
  "created_at": "2026-07-01T10:00:00+00:00"
}
Ping
FieldType
tsstring · date-time
typestring (success | start | fail | exit | log)
exit_statusinteger | null
source_ipstring | null
methodstring
body_sizeinteger
duration_msinteger | null
bodystring | nullDecrypted POST body (truncated to 2 KB)
user_agentstring | null
Example
{
  "ts": "2026-07-22T03:00:12.482913+00:00",
  "type": "success",
  "exit_status": 0,
  "source_ip": "203.0.113.7",
  "method": "GET",
  "body_size": 0,
  "duration_ms": 5230,
  "body": null,
  "user_agent": "curl/8.5.0"
}
Flip
FieldType
tsstring · date-time
old_statusstring (new | up | late | down | paused)
new_statusstring (new | up | late | down | paused)
reasonstring (timeout | fail | exit | ping | manual | resumed | quota)
Example
{
  "ts": "2026-07-21T00:30:00+00:00",
  "old_status": "late",
  "new_status": "down",
  "reason": "timeout"
}
IntegrationInput
FieldType
kindstring (telegram | email | webhook | slack | discord | mattermost | sms | pagerduty)required
namestringrequired
eventsarray<string>required
tagsarray<string>Only checks with these tags; null = all
enabledbooleandefault: true
quiet_hoursobject
remindersarray<integer>Repeat reminders while down, hours
configobjectChannel-specific (not required for telegram — it is linked via the deep link): email → {email}, webhook → {url, secret?, body_template?, content_type?} (body_template supports {{event}}, {{check_id}}, {{check_name}}, {{status}}, {{previous_status}}, {{reason}}, {{ts}}, {{tags}}, {{subject}}, {{message}}; values are JSON-escaped when content_type is application/json), slack/discord/mattermost → {webhook_url}, sms → {phone}, pagerduty → {routing_key}
Example
{
  "kind": "telegram",
  "name": "ops chat",
  "events": [
    "down",
    "up"
  ],
  "tags": [
    "prod"
  ],
  "quiet_hours": {
    "from": "23:00",
    "to": "08:00",
    "tz": "Europe/Moscow"
  },
  "reminders": [
    1,
    24
  ]
}
Integration

Channel secrets (config) are never returned by the API

FieldType
idinteger
kindstring (telegram | email | webhook | slack | discord | mattermost | sms | pagerduty)
namestring
enabledboolean
eventsarray<string>
tagsarray | null<string>
quiet_hoursobject | null
remindersarray | null<integer>
created_atstring · date-time
Example
{
  "id": 7,
  "kind": "telegram",
  "name": "ops chat",
  "enabled": true,
  "events": [
    "down",
    "up"
  ],
  "tags": [
    "prod"
  ],
  "quiet_hours": {
    "from": "23:00",
    "to": "08:00",
    "tz": "Europe/Moscow"
  },
  "reminders": [
    1,
    24
  ],
  "created_at": "2026-07-10T09:00:00+00:00"
}