---
title: "Update subscriber by external ID"
method: PATCH
path: "/subscribers/external"
tags: ["Subscribers"]
---

# Update subscriber by external ID

`PATCH /subscribers/external`

Updates a subscriber's email, external ID, first name, last name, status, tags, or custom attributes.

## Query parameters

- `externalId` string, required

## Request body

- object
  - `email` string, email — New delivery email. Fails with 409 if another subscriber owns it.
  - `externalId` string — New 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 the unsubscribe workflow.
  - `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
    - `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` — Missing external ID or validation error
- `409` — Identity conflict

---

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