Skip to main content
POST
Creates or updates a contact on the specified sending list. If the contact already exists on the list, their custom fields are merged (not replaced) and existing data is preserved. New contacts have their timezone resolved from the phone number’s area code. Carrier and line-type data are only populated when use_validation is set to true (a paid carrier lookup — see below).

Body Parameters

string
required
Contact phone number in E.164 format (e.g., +14155559876). Set use_validation to true to run a carrier lookup on the number (billed per lookup); by default the contact is stored without a carrier lookup.
string
required
Sending list phone number in E.164 format (e.g., +18005551234). Must be a list owned by your account.
boolean
default:"false"
When true, the contact will be enrolled in any matching Welcome Journeys configured for the target list.
boolean
default:"true"
When true, skips journey enrollment if the ListContact record already exists (i.e., the contact was previously added to this list). Only relevant when use_journeys is true.
string
Signup date in ISO 8601 UTC format (e.g., 2025-03-15T14:30:00Z). Defaults to the current timestamp if omitted.
string
IP address of the contact at the time of signup. Used for consent tracking and compliance records.
string
URL of the page where the contact signed up. Used for consent tracking and compliance records.
How consent to message this contact was obtained. One of web_form, sms_keyword, mobile_app, verbal, written, api_with_proof, double_opt_in. Optional — stored on the contact for TCPA compliance when a valid method is provided, otherwise null. Invalid or verbal values are ignored (stored as null), not rejected. To require a consent method when reactivating an opted-out contact, use the Resubscribe endpoint.
URL or short description of where consent was captured. Defaults to the url value when omitted.
The exact disclosure text shown to the contact at the time of consent.
string
Browser/device user-agent string captured at consent, stored on the compliance record.
object
Key-value pairs of custom data to attach to the contact on this list. Values can be strings, numbers, or booleans. Custom fields are merged with any existing fields — existing keys not included in the request are preserved.
boolean
default:"false"
When true, replaces the contact’s custom fields entirely instead of merging. When false (default), provided custom fields are merged into existing fields.
string
Ad network source for attribution tracking (e.g., adwords, facebook).
string
Ad network campaign or account ID for attribution tracking.
boolean
default:"false"
When true, the contact’s phone number is run through phone validation (LRN + DNC) and the result is attached to the response and persisted to the contact’s profile. The contact is created either way — invalid or unreachable numbers are accepted and stored, then can be segmented out of campaigns using the validation_status audience filter. The validation field in the response shows the per-disposition outcome.Billing. Requires an active payment method on file — requests without one return HTTP 402. Each non-cached lookup is billed at $0.003 (same as the /v1/phone/validate endpoint) and rolled up into your monthly invoice. Once a number has been validated for your account, repeat opt-ins of the same number are free indefinitely (validation.cached: true, validation.cost: 0). Pass force=true to bypass the cache and re-validate at $0.003 (rare; LRN data only changes on carrier porting).
boolean
default:"false"
When true, the contact is held pending confirmation (not sendable, not enrolled in journeys) and sent the confirmation message from optin_configuration_id. They activate only after replying Y/YES/CONFIRM. A pending contact is returned with pending: true. Requires optin_configuration_id to reference an active double-opt-in configuration on the same list — otherwise the request is rejected. For double-opt-in contacts, journey enrollment happens at confirmation and follows the opt-in configuration’s journey settings, not this request’s use_journeys.
string
ID of the double-opt-in opt-in configuration used to drive confirmation. Required when double_optin is true, and it must be an active double-opt-in config belonging to the same list. Passing it without double_optin=true is rejected with optin_configuration_requires_double_optin.

Response Fields

boolean
Whether the operation completed successfully.
string
Unique identifier of the Contact record.
string
Unique identifier of the ListContact record (contact-on-list membership).
boolean
true if a new Contact record was created. false if the phone number already existed in the system.
boolean
true if a new ListContact record was created. false if the contact was already on this list.
integer
Number of Welcome Journeys the contact was enrolled in. Always 0 if use_journeys is false, and always 0 for a double_optin contact (enrollment is deferred to confirmation).
boolean
Present and true only when double_optin=true and the contact is held pending confirmation. The contact is not sendable until they reply Y/YES/CONFIRM.
boolean
Present and true when the contact was previously unsubscribed and the list has allow_resubscriptions enabled — the opt-in reactivated the existing membership through the resubscribe flow instead of creating a new one. When present, carrier_status is also returned.
string
Returned alongside resubscribed: true. cleared when the membership was reactivated cleanly, or pending_start_keyword when the prior opt-out was a STOP keyword and the contact must text START to clear the carrier-level block before messages can be delivered.
boolean
Present and true when the contact was previously unsubscribed and the list does not allow resubscriptions. No reactivation occurs; skip_reason explains why.
string
Returned alongside skipped: true. Currently always previously_unsubscribed.
array
Array of warning strings about missed configuration or invalid signup data. For example, if there are active Welcome Journeys matching this list but use_journeys was not set to true. When ip_address or url are provided but invalid, they are silently dropped (not stored) and a warning is included: signup_ip_rejected_non_string, signup_ip_rejected_invalid_format, signup_url_rejected_non_string, signup_url_rejected_empty, signup_url_rejected_overlong, or signup_url_rejected_bad_scheme.
object
Present only when use_validation was true. Contains the full phone validation payload — same schema as the /v1/phone/validate response: phone, valid, line_type, carrier, carrier_raw, ported, country, state, city, on_dnc, disposition, cost, cached. The contact is created regardless of disposition — use the validation_status audience filter to segment out invalid or unreachable numbers from campaigns.

Examples

Error Codes

VOIP numbers may be rejected if your account has the reject_voip_numbers setting enabled. Contact support to adjust this setting.

Next Steps

Importing Contacts

Import contacts from CSV or API

Create Audience

Segment your contacts into audiences