Skip to content

Update a contact

PATCH
/api/v2/contacts/{id}
curl --request PATCH \
--url https://api.sipstack.com/api/v2/contacts/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '{ "firstName": "Jordan", "lastName": "Lee", "email": "jordan.lee@example.com", "business": "Lee Consulting", "tags": [ "vip", "newsletter" ], "customFields": { "plan": "enterprise" } }'

Updates the mutable fields of a contact (contacts:write). phoneNumber is not mutable here — it is the dedupe key. 404 when absent / cross-org / soft-deleted; 400 when no updatable field is provided. Consent (consentStatus and the express consentMethod, consentMethodNote, consentDate) is written only when it changes.

id
required
string format: uuid
Media type application/json

Mutable contact fields (all optional; at least one must be present). phoneNumber is not mutable here — it is the dedupe key; use create/delete to change it.

object
firstName
string
nullable
lastName
string
nullable
email
string
nullable
business
string
nullable
tags
Array<string>
customFields
object
key
additional properties
any
consentStatus

Consent to text. Consent is written only when it changes: re-sending the contact’s current status (for example, a sync that sends every field) leaves consent_date untouched, so the 24-month window for implied consent is not restarted. For a contact that is already express, sending consentMethod, consentMethodNote or consentDate records a new basis only if one of them differs; a field you leave out keeps its recorded value. Each change is added to the contact’s consent history with the API key that made it.

string
Allowed values: implied express none
consentMethod

How express consent was obtained. Used only with consentStatus: express (ignored otherwise). Optional: if you set express without it, the consent history records the method as api (declared by caller). Send it whenever you know it — a stated method is stronger evidence.

string
Allowed values: web_form paper_signature verbal_recorded other
consentMethodNote

Free-text detail on how consent was obtained (longer text is cut at 500 characters). Required when consentMethod is other.

string
<= 500 characters
consentDate

When express consent was obtained: YYYY-MM-DD or a full ISO 8601 timestamp. Cannot be in the future (a YYYY-MM-DD that is today in any timezone is accepted). Defaults to now. Used only with consentStatus: express.

string
Examples

Update contact details

{
"firstName": "Jordan",
"lastName": "Lee",
"email": "jordan.lee@example.com",
"business": "Lee Consulting",
"tags": [
"vip",
"newsletter"
],
"customFields": {
"plan": "enterprise"
}
}

The updated contact.

Media type application/json
object
success
boolean
data

A contact record. POST /api/v2/contacts returns the compact subset (id, uuid, phone_number, names, email, tags, consent_status, consent_date, created_at); the list/get/update endpoints return the full record below.

object
id
string format: uuid
uuid
string format: uuid
phone_number
string
first_name
string
nullable
last_name
string
nullable
email
string
nullable
business
string
nullable
tags
Array<string>
custom_fields
object
key
additional properties
any
consent_status
string
Allowed values: implied express none
consent_date
string format: date-time
nullable
is_opted_out
boolean
is_blocked
boolean
is_archived
boolean
is_starred
boolean
last_contacted_at
string format: date-time
nullable
total_messages_sent
integer
total_messages_received
integer
source

How the contact was created (e.g. api).

string
nullable
created_at
string format: date-time
updated_at
string format: date-time
Example
{
"data": {
"phone_number": "+14165550100",
"consent_status": "implied"
}
}

A field was the wrong type, no updatable fields were provided, or invalid consent fields: an unknown consentStatus or consentMethod, consentMethod: other without consentMethodNote, an unreadable or future consentDate, or a consent method/date without consentStatus.

Media type application/json

Inline error shape used by the messaging API and management endpoints.

object
success
boolean
error
string
Example
{
"success": false,
"error": "Recipient phone number (to) is required"
}

Missing or invalid API key.

Media type application/json

Inline error shape used by the messaging API and management endpoints.

object
success
boolean
error
string
Example
{
"success": false,
"error": "Recipient phone number (to) is required"
}

API access is not enabled on your plan.

Media type application/json

Inline error shape used by the messaging API and management endpoints.

object
success
boolean
error
string
Example
{
"success": false,
"error": "Recipient phone number (to) is required"
}

Contact not found in your organization.

Media type application/json

Inline error shape used by the messaging API and management endpoints.

object
success
boolean
error
string
Example
{
"success": false,
"error": "Recipient phone number (to) is required"
}