Update contact
PUT
https://app.sendapp.ai/api/contacts/{id}
Update one or more fields of a contact. Only the keys you send are changed;
tags REPLACES the whole set (use the tag endpoints to add or remove single tags). Every change is written to the contact timeline. PATCH is accepted too. You find the names of the custom fields, with their type and allowed choices, with GET /api/contact-fields.
Values by type: yes/no
true or false (also 1/0, "yes"/"no"), saved as 1/0 as on the Contacts page; number a number (also "12,5"); date YYYY-MM-DD (from an ISO 8601 date and time the date is kept); single choice one of the choices; multiple choice an array of choices or a text with the choices separated by commas. For choices upper and lower case do not matter: the value is saved with the official spelling. An invalid value returns 422 with invalid_fields, the reason for each field, and nothing is changed.AI fields are filled in by SendApp's AI: they cannot be written (
422, in invalid_fields), but you can read them on the contact, in custom_fields.Parameters
18 · 2 required
apikey
required
Your API Key (the
X-API-Key header also works).
id
required
Contact ID (integer, in the path). Use
GET /api/contacts to find it.
name
optional
Contact name.
first_name
optional
First name: the full name is rebuilt (it takes precedence over
name). If the contact's name was not split yet, the other half is taken from the current name.
last_name
optional
Last name: the full name is rebuilt.
phone
optional
Phone number in international format. 409 if it already belongs to another contact.
email
optional
Email address. 409 if it already belongs to another contact.
birthday
optional
Date in
YYYY-MM-DD format (null to clear).
tags
optional
Array or comma-separated string — replaces all tags.
custom_fields
optional
Object keyed by custom field NAME, e.g.
{"City": "Rome"}. Each value is checked against the field's type (see the notes): unknown names or invalid values return 422. Send null or "" to clear a value.
opted_out
optional
true = exclude from campaigns, false = re-subscribe.
requested_by
optional
With
opted_out=true: who asked for the opt-out, contact (the person, a withdrawal of consent; the value when missing) or business (your decision, the consent stays). Any other value returns 422.
opt_out_reason
optional
With
opted_out=true: reason in your own words (up to 191 characters), saved in the contact's history.
consent_ads
optional
App «Conversioni pubblicitarie»: consenso del contatto alla misurazione degli annunci (comunicare a Meta il clic sull'annuncio e cosa ha fatto dopo).
true = consenso raccolto dal tuo sistema (serve consent_ads_method, altrimenti 422), false = ritiro, vale subito anche per le conversioni in coda. Non è il consenso marketing.
consent_ads_method
optional
Obbligatorio con
consent_ads=true: come è stato raccolto il consenso, uno tra form, verbal, signature, email, other (con other serve anche consent_ads_text_ref).
consent_ads_text_ref
optional
Versione o riferimento del testo che il contatto ha accettato (massimo 191 caratteri), per esempio
informativa v3, modulo sito 2026-10.
ads_excluded
optional
true = escludi il contatto dalle conversioni pubblicitarie (opposizione); separato da
opted_out: i messaggi continuano.
lifecycle_stage
optional
One of
lead, qualified, customer, inactive, lost (null to clear).
Need help with the integration? info@sendapp.live