---
title: "Replace the project's check-ins"
method: PUT
path: "/projects/{project_id}/check_ins/bulk_update"
tags: ["Check-ins"]
---

# Replace the project's check-ins

`PUT /projects/{project_id}/check_ins/bulk_update`

## Request

- Base URL: `https://app.honeybadger.io/v3`
- URL: `https://app.honeybadger.io/v3/projects/{project_id}/check_ins/bulk_update`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/honeybadger/apis/honeybadger-api/docs/projects/:project_id/check_ins/bulk_update/put.ts> (a function with typed inputs; its response is checked against the schema)

Replaces the project's check-ins with the ones supplied. Each is matched to an existing check-in by `slug`: a matching check-in is updated, a new slug creates one, and any existing check-in that isn't supplied is deleted. The response lists what happened to each slug.

If any create, update or delete fails, nothing changes, and `error.details` has an entry for each failed slug (field `check_ins.<slug>`). A cron entry needs cron on the plan.

## Path parameters

- `project_id` string, required

## Request body

- CheckInReplaceInput: The project's complete set of check-ins. Any check-in the project has that this list doesn't name is deleted. Must be non-empty, and every entry needs a slug.
  - `check_ins` CheckInReplaceEntry[], required
    - `name` string, nullable: Display name. Null clears it; an unnamed check-in shows its ID.
    - `slug` string, nullable, required: Identifies which check-in an entry refers to, so it is required here
    - `schedule_type` 'simple' | 'cron': `simple` expects a report every `report_period`. `cron` expects reports on a cron schedule and requires `cron_schedule`.
    - `report_period` string, nullable: 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, nullable: 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.
    - `cron_schedule` string, nullable: Cron expression, required when `schedule_type` is `cron`.
    - `cron_timezone` string, nullable: 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`.

## Response `200`

Success

- object
  - `data` object[], required
    - `operation` 'create' | 'update' | 'delete', required
    - `slug` string, required
    - `success` true, required: Always true; any failure makes the whole request a 422 and changes nothing.
  - `meta` ResponseMeta
    - `request_id` string: Unique identifier for the request, for correlating with support

## Other responses

- `400`: A query parameter is malformed or outside its allowed values. `error.details` names the parameter.
- `401`: The credential is missing, invalid, expired or revoked (`unauthorized`), or was sent in a way v3 doesn't accept (see the examples).
- `403`: 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.
- `404`: Resource not found
- `422`: Validation error

---

[API](https://skmtc.dev/honeybadger/apis/honeybadger-api.md) - [All operations](https://skmtc.dev/honeybadger/apis/honeybadger-api/llms.txt) - [OpenAPI document](https://skmtc.dev/honeybadger/apis/honeybadger-api/revisions/cbcff53f2c8a?raw)
