---
title: "Update subscriber"
method: PATCH
path: "/subscribers/{email}"
tags: ["Subscribers"]
---

# Update subscriber

`PATCH /subscribers/{email}`

Updates a subscriber's first name, last name, status, tags, or custom attributes. Setting `status` to `unsubscribed` performs the full unsubscribe workflow, including list unsubscription and sequence cancellation.

## Path parameters

- `email` string, required

## Request body

- object
  - `email` string, email — New delivery email. Fails with 409 if another subscriber owns it.
  - `externalId` string — New customer-owned external ID. Fails with 409 if another subscriber owns it.
  - `firstName` string
  - `lastName` string
  - `phone` string, nullable — Phone number in E.164 format or US national format. Stored normalized to E.164. Invalid values fail with a 400 validation error. Does not affect SMS consent.
  - `smsConsent` boolean — SMS marketing consent. true sets smsStatus to subscribed with consent source api, false sets unsubscribed, omitted leaves SMS status unchanged. Never inferred from phone presence.
  - `status` 'active' | 'unsubscribed' | 'bounced' — Setting `unsubscribed` performs a full global unsubscribe.
  - `tags` string[]
  - `customAttributes` object — Custom attributes to update. Defaults to replacing the existing public custom-attribute map.
  - `customAttributesStrategy` 'replace' | 'merge' — How to apply customAttributes. replace replaces the existing public custom-attribute map. merge overwrites only provided keys and retains unspecified existing keys.

## Response `200`

Subscriber updated

- object
  - `success` boolean
  - `subscriber` Subscriber
    - `id` string
    - `email` string, email
    - `externalId` string, nullable — Customer-owned app/customer/user ID for this subscriber
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `phone` string, nullable — Phone number in E.164 format
    - `smsStatus` 'not_subscribed' | 'pending' | 'subscribed' | 'unsubscribed' — SMS marketing consent status, independent of the email status
    - `status` 'active' | 'unsubscribed' | 'bounced'
    - `emailProvider` string, nullable
    - `tags` string[]
    - `customAttributes` object
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `400` — Validation error, for example an invalid phone number
- `401` — Unauthorized
- `404` — Subscriber not found
- `500` — Internal server error

## Changes

- **2026-07-10** `1b0d5fa83cd8` — 5 info
  - added the new optional request property `phone`
  - added the new optional request property `smsConsent`
  - added the non-success response with the status `400`
  - added the optional property `subscriber/phone` to the response with the `200` status
  - …1 more
- **2026-06-23** `4b74fb05357f` — 1 info
  - added the new optional request property `customAttributesStrategy`
- **2026-05-20** `1139fdf1ac6b` — 2 info
  - added the new optional request property `email`
  - added the new optional request property `externalId`
- **2026-05-19** `1a51a400be50` — 1 info
  - added the new `bounced` enum value to the request property `status`
- **2026-05-05** `5449b620579f` — 1 info
  - added the optional property `subscriber/externalId` to the response with the `200` status

[Full history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/subscribers/:email/patch.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/revisions/b58891ac1cde/schema)
