PATCH
Required scope https://app.honeybadger.io/v3/projects/{project_id}/check_ins/{check_in_id}
checkins:write
Updates a check-in’s settings. Switching to a cron schedule needs cron on the plan.
Example request
curl -X PATCH "https://app.honeybadger.io/v3/projects/$PROJECT_ID/check_ins/$CHECK_IN_ID" \ -H "Authorization: Bearer $HONEYBADGER_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "grace_period": "10 minutes"}'Parameters
2Path parameters
| Field | Type | Description |
|---|---|---|
project_id required | string | Project ID. |
check_in_id required | string | Check-in ID. |
Request body
Read-only fields are ignored.
| Field | Type | Description |
|---|---|---|
name | string | null | Display name. Null clears it; an unnamed check-in shows its ID. |
slug | string | null | Short identifier used in the check-in's reporting URL. Null clears it. Renaming it breaks jobs reporting to …/check_in/<ingestion key>/<slug> and changes how PUT /check_ins matches this check-in. |
schedule_type | string | Switching to simple clears cron_schedule and resets cron_timezone to UTC; switching to cron clears report_period. |
report_period | string | null | How often a report is expected, for simple schedules. Required unless schedule_type is cron, and may not be zero. A duration such as 5 minutes, 1 hour 30 minutes or 01:30:00. Returned in long form: 1 week comes back as 7 days. |
grace_period | string | null | How long after the expected time before the check-in is considered missing. Same format as report_period; zero is 00:00:00. Null resets it to zero. Default: "00:00:00". |
cron_schedule | string | null | Cron expression, required when schedule_type is cron. |
cron_timezone | string | null | Timezone the cron schedule is evaluated in. A time zone name as the web app lists them, not an IANA identifier — Central Time (US & Canada), not America/Chicago, which is rejected. Required when schedule_type is cron. Null resets it to UTC. Default: "UTC". |
Responses
1200 Success
Example payload
{ "data": { "id": "Ci5xWq", "project_id": "Xk9mZp", "name": "Daily Backup", "slug": "daily-backup", "schedule_type": "simple", "state": "pending", "reported_at": "2026-01-01T00:00:00Z", "expected_at": "2026-01-01T00:00:00Z", "missed_count": 0, "grace_period": "10 minutes", "report_url": "https://api.honeybadger.io/v1/check_in/Ci5xWq", "created_at": "2026-01-01T00:00:00Z", "cron_schedule": "0 2 * * *", "cron_timezone": "Eastern Time (US & Canada)", "report_period": "1 day", "links": { "web": "https://app.honeybadger.io/projects/Xk9mZp" } }, "meta": { "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b" }}Response schema20
| Field | Type | Description |
|---|---|---|
data required | object | A check-in monitor for a scheduled job. The job requests the check-in's report URL each time it runs, and Honeybadger alerts when a report doesn't arrive on schedule. |
data.id required | string | |
data.project_id required | string | ID of the project this check-in belongs to. |
data.name required | string | null | Display name. |
data.slug required | string | null | URL-safe identifier. |
data.schedule_type required | string | simple expects a report every report_period. cron expects reports on a cron schedule and requires cron_schedule. Allowed values: simple, cron. Default: "simple". |
data.state required | string | Current check-in state. Allowed values: pending, reporting, missing, paused. |
data.reported_at required | date-time | null | When the last report was received. |
data.expected_at required | date-time | null | When the next report is expected. |
data.missed_count required | integer | Number of consecutive missed reports. |
data.grace_period required | string | How long after the expected time before the check-in is missing. A duration such as 5 minutes, 1 hour 30 minutes or 01:30:00. Returned in long form: 1 week comes back as 7 days, and zero as 00:00:00. |
data.report_url required | string | URL to ping when the task completes. |
data.created_at required | date-time | When the check-in was created. |
data.cron_schedule | string | null | Cron expression (for cron schedule type). |
data.cron_timezone required | string | Timezone for cron schedule, as the web app names time zones. UTC on a simple check-in. |
data.report_period | string | null | How often a report is expected, for simple schedules. Same format as grace_period. Null for cron schedules, which use cron_schedule. |
data.links required | object | Links into the Honeybadger web UI. |
data.links.web required | uri | The resource's page in the Honeybadger web UI, as an absolute URL. Resources without a page, such as outages and deploys, don't have links. For a project provisioned through Heroku, error, notice and comment links go through Heroku's single sign-on. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
Errors
5
400
Bad Request
A query parameter is malformed or outside its allowed values. error.details names the parameter.
Example payload
{ "error": { "code": "invalid_parameter", "message": "unmapped must be true or false", "details": [ { "field": "unmapped", "message": "must be true or false" } ] }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
401
Unauthorized
The credential is missing, invalid, expired or revoked (unauthorized), or was sent in a way v3 doesn’t accept (see the examples).
Example payload: unauthorized (Missing, malformed, expired or revoked credential)
{ "error": { "code": "unauthorized", "message": "Access denied" }, "meta": { "request_id": "abc123" }}Example payload: unsupported_auth_scheme (Sent as HTTP basic, which v3 does not accept)
{ "error": { "code": "unsupported_auth_scheme", "message": "Send the credential as `Authorization: Bearer <token>`; v3 does not accept HTTP basic" }, "meta": { "request_id": "abc123" }}Example payload: credential_in_query (Sent as the `auth_token` query parameter)
{ "error": { "code": "credential_in_query", "message": "Credentials must be sent in the Authorization header" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
403
Forbidden
The credential isn’t allowed to do this. error.code says why. An account or project the credential doesn’t cover is 404 not_found, not 403.
Example payload: access_denied (The credential isn't allowed to do this to this record)
{ "error": { "code": "access_denied", "message": "Access denied" }, "meta": { "request_id": "abc123" }}Example payload: insufficient_scope (The credential lacks the permission this endpoint requires)
{ "error": { "code": "insufficient_scope", "message": "Insufficient scope", "details": { "required_scope": "faults:write", "token_scopes": [ "faults:read", "insights:read" ] } }, "meta": { "request_id": "abc123" }}Example payload: requires_user_token (The endpoint records who acted, and an account token has nobody)
{ "error": { "code": "requires_user_token", "message": "This endpoint records the person who acted, so it requires a user credential rather than an account token" }, "meta": { "request_id": "abc123" }}Example payload: project_restricted (A project-restricted credential cannot create a project)
{ "error": { "code": "project_restricted", "message": "Project-restricted tokens cannot create projects" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
404
Not Found
Resource not found
Example payload
{ "error": { "code": "not_found", "message": "Resource not found" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
422
Unprocessable Content
Validation error
Example payload
{ "error": { "code": "validation_error", "message": "Name can't be blank", "details": [ { "field": "name", "message": "can't be blank" } ] }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |