Subscribers
Create Subscriber
Create a new subscriber or update an existing one based on duplicate strategy
POST
Create Subscriber
Create a new subscriber or handle existing ones based on the
Three things to know:
duplicateStrategy parameter.
Permissions
The API key needssubscribers:write, which also covers the lists array
in this request. Explicit sequence enrollment and writes that can send a
double opt-in confirmation require automations:trigger. Imports into explicit lists and dedicated
list membership endpoints still require lists:write.
Request Body
string
Subscriber delivery email address. Required when creating a new subscriber
unless
phone is provided - a contact created with only a phone becomes a
phone-only (SMS) contact that email sends automatically skip.string
Your app/customer/user ID for this subscriber. It is unique within your
workspace and is trimmed without lowercasing.
string
First name
string
Last name
string
IANA timezone identifier such as
America/New_York, stored as a native
profile field. Enables recipient-local campaign delivery (“send when it’s 8pm
for the customer”). An invalid identifier returns 400 VALIDATION_ERROR;
null clears the stored value.string
Phone number in E.164 format (
+15551234567) or national format. Stored
normalized to E.164 on the native phone field, not as a custom attribute. An
invalid phone returns 400 VALIDATION_ERROR. Setting a phone does NOT
subscribe the contact to SMS - use smsConsent for that. With no email or
externalId, the phone creates or matches a phone-only (SMS) contact.string
ISO 3166-1 alpha-2 country used to read a national-format
phone, such as
IT or US. Defaults to US. This is a parsing hint only: the stored
phoneCountry always comes from the parsed number. Sending it without phone
returns 400 VALIDATION_ERROR.boolean
SMS marketing consent.
true sets the subscriber’s SMS status to subscribed
with consent source api - only send true when you have express written
consent. false sets it to unsubscribed. Omitted leaves SMS status
unchanged. Consent is never inferred from phone presence. See SMS &
MMS for the full consent model.string
default:"active"
Status:
active, unsubscribed, or bounced.string
default:"default"
Consent mode:
default obeys your workspace double opt-in setting for new
active subscribers, confirmed creates an active subscriber immediately when
you have verified consent, and double_opt_in sends a confirmation email and
keeps the contact unsubscribed until they confirm.Omitting
optInMode follows the workspace double opt-in setting. Use
confirmed only when your app already verified consent. When confirmation is
required, Sequenzy applies requested lists and tags only after the subscriber
clicks the confirmation link. default does not send confirmation email to an
existing unsubscribed contact.string[]
Array of tag names to assign
string[]
Array of list IDs to add the subscriber to. If omitted, a subscriber this call
creates follows your workspace default lists setting, and a subscriber that
already exists keeps the list memberships they have - an attribute-only upsert
never changes memberships. If set to an empty array
[], the subscriber will
not be added to any lists.object
Custom key-value attributes
boolean
default:"true"
Whether to enroll the subscriber in matching sequences. Defaults to
true, or
to false when you supply createdAt. Explicitly passing true requires the
automations:trigger scope; the request returns 403 when that scope is
missing.string
ISO 8601 date the contact originally signed up, for importing history from
another platform. New-subscriber account notifications remain eligible when
the signup date is at most one hour old; older dates do not notify on
creation. Double opt-in confirmation can notify even for imported contacts.
Your notification preferences, double opt-in and the daily cap still apply.
See Preserving the original signup
date.
string
default:"skip"
How to handle existing subscribers: -
skip - Don’t update existing
subscribers (default) - merge - Only fill in missing fields, never overwrite
existing values - overwrite - Replace all fields (but never reactivate
unsubscribed users)Responses
Preserving the Original Signup Date
By default a new contact’s signup date is the moment you created them. That is right for a real signup and wrong for a migration: if you import 50,000 contacts today, all 50,000 look like they joined today, and an audience like “signed up in the last 30 days” matches your entire list on day one and nobody on day 31. PasscreatedAt to keep their real date:
- It only ever moves earlier. If the contact already exists with an earlier
date, yours is ignored - an earlier date is more history than we had, a later
one would erase some. This holds for every
duplicateStrategy. - Sequences do not run. Supplying
createdAtdefaultsenrollInSequencestofalse, because you are describing the past, not a signup happening now. PassenrollInSequences: truewith theautomations:triggerscope to override; the request returns403when that scope is missing. - Only the signup date moves. The contact’s “last updated” time stays the real one, so recently-changed views still tell the truth.
createdAt on each record in
Create Subscriber Import.
Double Opt-In
Learn how confirmation emails, pending subscribers, and signup tags work.
SMS & MMS
Learn how SMS consent, quiet hours, and message credits work.