---
title: "A subscriber left"
method: POST
path: "subscriber.unsubscribed"
tags: ["Webhooks"]
---

# A subscriber left

`POST subscriber.unsubscribed` (webhook)

Posted to the subscriptions to `subscriber.unsubscribed` when a subscriber leaves: the unsubscribe link of an email, the API or MCP, or the app. A bounce or a complaint does not produce it; the same person can be reported more than once — handle it as idempotent. Signed and retried like every event. The test event (`POST /api/v1/webhooks/{id}/test`) arrives under this `type` too, with `data: { test: true, message }` and none of the fields of the real event: check `data.test` first.

## Headers

- `Mailcheer-Signature` string, required
- `Mailcheer-Timestamp` string, required
- `Mailcheer-Event-Id` string, required
- `Mailcheer-Event-Type` string, required
- `Mailcheer-Delivery-Id` string, required
- `Mailcheer-Attempt` string, required

## Payload

- union
  - SubscriberEvent: The body of a `subscriber.*` call. A test event carries a different `data`: see `TestEvent`.
    - `id` string, required: `evt_…` — the same on every attempt and every replay of the event: the deduplication key.
    - `type` string, required: `subscriber.created` or `subscriber.unsubscribed`.
    - `created_at` string, date-time, required: When the event occurred (not when it was delivered).
    - `data` object, required
      - `subscriber_id` string, required: The subscriber's identifier.
      - `email` string, required: The address the event concerns.
      - `status` 'pending' | 'subscribed' | 'unsubscribed', required: `pending` (waiting for confirmation), `subscribed` or `unsubscribed`.
      - `first_name` string: `subscriber.created`, when known.
      - `last_name` string: `subscriber.created`, when known.
      - `source` 'form' | 'api' | 'manual': `subscriber.created` only. `form`: a signup form (`pending` until the person confirms). `api`: the API or MCP (`pending`, or `subscribed` with `double_opt_in: false`). `manual`: added in the app.
      - `reason` 'unsubscribe' | 'manual' | 'bounce' | 'complaint': `subscriber.unsubscribed` only: `unsubscribe` (an email's link, `DELETE /api/v1/subscribers/{email}`, the app), or the reason given when the address was added to the suppression list.
      - `campaign_id` string: `subscriber.unsubscribed` through a campaign email's link: the campaign.
      - `message_id` string: `subscriber.unsubscribed` through a campaign email's link: the recipient's row whose link was used.
      - `automation_id` string: `subscriber.unsubscribed` through an automation email's link: the automation.
  - TestEvent: The body of the test event (`POST /api/v1/webhooks/{id}/test`, or Settings → API). Its `type` is the subscription's first event, but its `data` holds only `test` and `message` — **none of the fields of the real event**. Check `data.test === true` before reading anything else, and answer 2xx without processing it.
    - `id` string, required: `evt_…` — the same on every attempt and every replay of the event: the deduplication key.
    - `type` 'email.sent' | 'email.failed' | 'email.delivered' | 'email.opened' | 'email.clicked' | 'email.bounced' | 'email.complained' | 'email.received' | 'subscriber.created' | 'subscriber.unsubscribed' | 'quota.threshold_reached', required
    - `created_at` string, date-time, required: When the event occurred (not when it was delivered).
    - `data` object, required
      - `test` true, required: Always `true`: this is a test.
      - `message` string, required: A sentence in the language of the request (`Accept-Language`) or of the screen.

## Acknowledgement `2XX`

Any 2xx within 15 seconds acknowledges receipt. Anything else — another status, a redirect (not followed), no answer, a network error — is retried: 5 attempts in all, the next ones 30 s, 2 min, 10 min and 1 h after the previous failure.

---

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