---
title: "Mark or unmark contacts as bounced"
method: POST
path: "/v3/contacts/set-bounced"
tags: ["Contacts"]
---

# Mark or unmark contacts as bounced

`POST /v3/contacts/set-bounced`

<small>_Requires the `contacts:operate` scope (or a broader one that includes it)._</small>

Marks the given contacts as bounced (`isBounced: true`) or clears the bounced flag (`isBounced: false`) across **every sequence** they are currently enrolled in.

When clearing the flag (`isBounced: false`), `resendEmails` is required: pass `true` to retry the previously bounced step or `false` to leave the schedule untouched. When marking as bounced (`isBounced: true`), `resendEmails` must be omitted.

To restrict the change to a single sequence, use `POST /v3/sequences/{id}/contacts/set-bounced` instead.

## Request body

- object
  - `contactIds` integer[], required — Contact IDs to update. At least one, at most 100. Each ID must be positive.
  - `isBounced` boolean, required — `true` marks the contacts as bounced; `false` clears the bounced flag.
  - `resendEmails` boolean, nullable — Required (non-null) when `isBounced=false`; **must be omitted** when `isBounced=true`. When `true`, the previously bounced step is rescheduled for retry.

## Response `200`

Non-atomic result. The response body is a dictionary keyed by contact id listing per-item failures. Empty object `{}` means all contacts were updated successfully.

Per-item failures use the `ContactError` enum. Common per-item slugs:

| Slug | Meaning |
| --- | --- |
| `notFound` | Contact does not exist |
| `forbidden` | Caller lacks permission for this contact |
| `sequenceNotFound` | Derived sequence not accessible |
| `invalidInput` | Value rejected for this contact |

- object — Dictionary of per-item failures keyed by contact id. Empty object `{}` means all succeeded.

## Other responses

- `400` — Validation failure on the request body (missing/empty `contactIds`, non-positive ids, more than 100 ids, missing `isBounced`, or `resendEmails` violating the `isBounced` pairing rule), or a business rule rejection.
- `401` — Unauthorized. The response body is empty; check the `WWW-Authenticate` header for the expected scheme.
- `403` — User lacks the required feature scope to change contact status.
- `429` — Too Many Requests

---

[API](https://skmtc.net/reply/apis/reply-api.md) · [All operations](https://skmtc.net/reply/apis/reply-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/reply/reply-api/revisions/1c3d32eaf95e/schema)
