In the early beta of the Crons product, Check-In endpoints existed under the sentry.io/api/0/ API namespace. This namespace is not designed for ingestion-level traffic, so we have since moved Check-In APIs to use Relay for ingestion of Check-In events.

If you're using legacy endpoints for Crons, migrate to the new endpoints to avoid issues.

The SDKs do not utilize our legacy endpoints.

When using the HTTP endpoints, you can differentiate them like so:

Copied
# ❌ Legacy endpoints
https://sentry.io/api/0/organizations/example-org/monitors/<monitor_slug/

# ❌ Legacy endpoint without organization context
https://sentry.io/api/0/monitors/<monitor_slug/

# ❌ Legacy check-in details endpoint
https://sentry.io/api/0/monitors/<monitor_slug/checkins/<check_in_id>/

# ✅ Relay Check-In ingestion endpoint
https://o0.ingest.sentry.io/api/0/cron/<monitor_slug>/examplePublicKey/

There are a few backward incompatible changes to be aware of.

  • There is now only a single Check-In endpoint. The "Check-In details" endpoint has been removed.

  • The API endpoint supports both POST with a JSON body, as well as now supporting GET. You can use query parameters to specify status, environment, etc.

    The API endpoint will always respond with a 202 with no body (unless there is an error).

  • Because there is no "details" endpoint, the PUT method for a Check-In has also been removed. You will always use POST or GET for Check-Ins.

  • For overlapping jobs, it is still possible to specify a check_in_id via the query parameters or JSON body. However, the API no longer responds with an auto-generated Check-In ID. If you need a stable Check-In ID, you must generate it client-side yourself.

  • The monitor_config structure has changed slightly. schedule is now an object of varying shape, depending on the schedule type.

    Copied
    {"type": "crontab", "value": "0 * * * *"}
    {"type": "interval", "value": "2", "unit": "hour"}
    

See the code samples below to help you migrate from the legacy endpoints to the current ones.

Copied
# ❌ Legacy simple `in_progress` -> `ok` check-in
curl -X POST \
    'https://sentry.io/api/0/organizations/example-org/monitors/<monitor_slug>/checkins/' \
    --header 'Authorization: DSN https://examplePublicKey@o0.ingest.sentry.io/0' \
    --header 'Content-Type: application/json' \
    --data-raw '{"status": "in_progress"}'

curl -X POST \
    'https://sentry.io/api/0/organizations/example-org/monitors/<monitor_slug>/checkins/' \
    --header 'Authorization: DSN https://examplePublicKey@o0.ingest.sentry.io/0' \
    --header 'Content-Type: application/json' \
    --data-raw '{"status": "ok"}'


# ✅ New style `in_progress` -> `ok` check-in
SENTRY_INGEST="https://o0.ingest.sentry.io"
SENTRY_CRONS="${SENTRY_INGEST}/api/0/cron/<monitor_slug>/examplePublicKey/"

curl "${SENTRY_CRONS}?status=in_progress"

curl "${SENTRY_CRONS}?status=ok"

Copied
# ❌ Legacy upsert monitor with a check-in
curl -X POST \
    'https://sentry.io/api/0/organizations/example-org/monitors/<monitor_slug>/checkins/' \
    --header 'Authorization: DSN https://examplePublicKey@o0.ingest.sentry.io/0' \
    --header 'Content-Type: application/json' \
    --data-raw '{"monitor_config": {"schedule": "0 * * * *", "schedule_type": "crontab"}, "status": "in_progress"}'

# ✅ New style upsert monitor with a check-in
SENTRY_INGEST="https://o0.ingest.sentry.io"
SENTRY_CRONS="${SENTRY_INGEST}/api/0/cron/<monitor_slug>/examplePublicKey/"

curl -X POST "${SENTRY_CRONS}?status=in_progress" \
    --header 'Content-Type: application/json' \
    --data-raw '{"monitor_config": {"schedule": {"type": "crontab", "value": "0 * * * *"}}, "status": "in_progress"}'
    # 👉 Note that schedule is now an object ---^

Copied
# ❌ Legacy Check-In with ID
curl -X POST \
    'https://sentry.io/api/0/organizations/example-org/monitors/<monitor_slug>/checkins/' \
    --header 'Authorization: DSN https://examplePublicKey@o0.ingest.sentry.io/0' \
    --header 'Content-Type: application/json' \
    --data-raw '{"status": "in_progress"}'
# Response { "id": "2bc1a871-a1b7-4577-82fc-fa6d2468aabc" }

# ✅ New style upsert monitor with a check-in
CHECK_IN_ID="$(uuidgen)"
# 👉 Note that you now need to generate the Check-In UUID

SENTRY_INGEST="https://o0.ingest.sentry.io"
SENTRY_CRONS="${SENTRY_INGEST}/api/0/cron/<monitor_slug>/examplePublicKey/"

curl "${SENTRY_CRONS}?check_in_id=${CHECK_IN_ID}&status=in_progress"
# 👉 Note that no Check-In ID is returned
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").