---
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 national format. Stored normalized to E.164. Invalid values fail with a 400 validation error. Does not affect SMS consent. Changing it resets SMS consent unless smsConsent is sent in the same request. null or "" clears the phone, except on a phone-only (SMS) contact, where clearing its only identity fails with a 400 validation error.
  - `phoneCountry` string, nullable — ISO 3166-1 alpha-2 country used to read a national-format phone, defaulting to US. A parsing hint only - the stored phoneCountry always comes from the parsed number. Sending it without phone fails with a 400 validation error.
  - `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, nullable — Null for phone-only (SMS) contacts, which are identified by their phone number instead.
    - `externalId` string, nullable — Customer-owned app/customer/user ID for this subscriber
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `timezone` string, nullable — IANA timezone identifier used for recipient-local campaign delivery. Null when unknown.
    - `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'
    - `unsubscribedAt` string, date-time, nullable — When the contact opted out, derived from the list memberships the opt-out deactivated. Use this rather than `updatedAt` to date an opt-out - any later tag or attribute write moves `updatedAt`. Null unless the contact is currently unsubscribed, so leaving a single list does not set it, and null for contacts imported as already unsubscribed, where no date exists.
    - `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-08-19** `ba3a29c6eb33` — 4 info
  - added the optional property `retryable` to the response with the `400` status
  - added the optional property `retryable` to the response with the `401` status
  - added the optional property `retryable` to the response with the `404` status
  - added the optional property `retryable` to the response with the `500` status
- **2026-08-18** `8fbabe82a04d` — 1 info
  - added the optional property `subscriber/timezone` to the response with the `200` status
- **2026-08-16** `6fd2903b91ce` — 4 info
  - added the optional property `code` to the response with the `400` status
  - added the optional property `code` to the response with the `401` status
  - added the optional property `code` to the response with the `404` status
  - added the optional property `code` to the response with the `500` status
- **2026-08-10** `16ad4f8e3d97` — 1 info
  - added the optional property `subscriber/unsubscribedAt` to the response with the `200` status
- **2026-08-04** `aa6181241c7f` — 1 info
  - added the new optional request property `phoneCountry`

[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/73f826277d9a/schema)
