SendApp Docs
Log in

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