Update a contact by ID
Changed onUpdate an existing contact identified by its unique id. Include one or more fields to change. Field updates and consent changes can be combined in a single request.
Mutable fields: first_name, last_name, email, phone_number, tags, custom_fields.
email and phone_number can only be set when the existing value is null. Once populated, they cannot be changed or cleared.
Consent fields: email_consent, sms_consent. Use these to subscribe, unsubscribe, or otherwise manage a contact's marketing consent.
When sms_consent is set to subscribed and the contact transitions to a confirmed opt-in state, Privy automatically sends a TCPA-required welcome SMS. Pass send_welcome_sms: false to suppress this message if you have already collected consent outside of Privy.
Required scope: contacts_write
Request
- Base URLhttps://api.privy.com/v1
- AuthHTTP bearer
Path parameters
The contact's unique identifier (returned as id in contact responses). Ids are opaque cus_-prefixed strings — a numeric id from a Privy dashboard URL is not a valid API id and will 404; list contacts, or look the contact up by ?email= or ?phone_number=, instead.
Headers
Target a subaccount instead of the main connected account. Pass a subaccount id from get_account's subaccounts list. Only direct subaccounts of the connected account are reachable — omit this for the main account itself.
Request body
Example request
{
"first_name": "Janet",
"last_name": "Smith",
"email": "janet@example.com",
"phone_number": "+15551234567",
"tags": [
"vip",
"wholesale"
],
"custom_fields": {
"loyalty_tier": "platinum"
},
"email_consent": "unsubscribed",
"sms_consent": "unsubscribed"
}Response
Contact updated successfully.
Example response
{
"data": {
"id": "cus_a1b2c3d4e5f6g7h8",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"email_consent": "subscribed",
"email_consent_at": "2025-03-20T14:22:00Z",
"phone_number": "+15551234567",
"sms_consent": "subscribed",
"sms_consent_at": "2025-03-20T14:22:00Z",
"source": "csv",
"source_type": "import",
"imported": true,
"import_ids": [
"im_k2R5m8Q"
],
"tags": [
"vip",
"repeat-buyer"
],
"custom_fields": {
"loyalty_tier": "gold",
"referral_code": "JANE2024"
},
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-03-20T14:22:00Z"
}
}Changes
- warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
forbiddenenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status - warning
added the new
segment_builder_requiredenum value to the/response property for the response status
- warning
- breaking
the response property
/became nullable for the status - breaking
the response property
/became nullable for the status - breaking
the response property
/became nullable for the status - breaking
the response property
/became nullable for the status - warning
added the new
api_access_requiredenum value to the/response property for the response status - warning
added the new
api_access_requiredenum value to the/response property for the response status - warning
added the new
api_access_requiredenum value to the/response property for the response status - warning
added the new
api_access_requiredenum value to the/response property for the response status - warning
added the new
api_access_requiredenum value to the/response property for the response status - warning
added the new
contacts_not_readyenum value to the/response property for the response status - warning
added the new
contacts_not_readyenum value to the/response property for the response status - warning
added the new
contacts_not_readyenum value to the/response property for the response status - warning
added the new
contacts_not_readyenum value to the/response property for the response status - warning
added the new
contacts_not_readyenum value to the/response property for the response status - warning
added the new
no_connected_storeenum value to the/response property for the response status - warning
added the new
no_connected_storeenum value to the/response property for the response status - warning
added the new
no_connected_storeenum value to the/response property for the response status - warning
added the new
no_connected_storeenum value to the/response property for the response status - warning
added the new
no_connected_storeenum value to the/response property for the response status - warning
added the new
paid_plan_requiredenum value to the/response property for the response status - warning
added the new
paid_plan_requiredenum value to the/response property for the response status - warning
added the new
paid_plan_requiredenum value to the/response property for the response status - warning
added the new
paid_plan_requiredenum value to the/response property for the response status - warning
added the new
paid_plan_requiredenum value to the/response property for the response status - warning
added the new
store_unavailableenum value to the/response property for the response status - warning
added the new
store_unavailableenum value to the/response property for the response status - warning
added the new
store_unavailableenum value to the/response property for the response status - warning
added the new
store_unavailableenum value to the/response property for the response status - warning
added the new
store_unavailableenum value to the/response property for the response status - info
added the new optional
headerrequest parameterPrivy-Account-Id - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status
- breaking