contact.updated
Fires when a contact's fields change in SparrowDesk
Fires when a contact's fields change. The event fires on any persisted change, so a trivial edit produces an event too.
The payload carries the full current contact object plus a previousAttributes object listing only the fields that changed, each holding its prior value. This makes the event self-contained: you can upsert it into your own system idempotently (keyed on the event id) and tolerate out-of-order delivery (reconcile via updated_at) without re-fetching from the API.
For the envelope fields, see The webhook request.
Example payload
{
"id": "evt_019f41a1cb517b9cbbecd606550a5d84",
"eventType": "contact.updated",
"timestamp": "2026-07-08T12:09:10.256Z",
"accountId": "1001",
"payload": {
"contact": {
"id": 4296206,
"first_name": "Jordan",
"last_name": "Rivera",
"full_name": "Jordan Rivera",
"email": "[email protected]",
"phone": "+1 555 0100",
"language": null,
"time_zone": null,
"country": null,
"region": null,
"city": null,
"active": true,
"unsubscribed": false,
"blocked": false,
"avatar": null,
"company_id": null,
"company_name": null,
"custom_fields": {},
"properties": {
"initial_avatar_color": {
"backgroundColor": "linear-gradient(0deg, rgba(255, 255, 255, 0.75) 0%, rgba(255, 255, 255, 0.75) 100%)",
"textColor": "linear-gradient(180deg, #C083D8 0%, #9830C2 100%)"
}
},
"created_at": 1783512490,
"updated_at": 1783512548
},
"previousAttributes": {
"last_name": "",
"full_name": "Jordan",
"email": "[email protected]"
}
},
"webhookMetadata": {
"webhookTargetId": "38",
"deliveryAttemptId": "019f41a1cb6f739992c6129bd5693cca",
"deliveryAttemptNumber": 1
}
}Payload fields
| Field | Type | Description |
|---|---|---|
contact | object | The full current contact object. See the field reference on contact.created. |
previousAttributes | object | Only the fields that changed, each holding its prior value. Unchanged fields are absent. In the example above, the contact's last name and email changed; phone is absent because it didn't change. |
For nested objects such as custom_fields, previousAttributes carries the changed sub-object as a whole (the entire prior value), not a per-field diff.
Related events
contact.created— a new contact is createdcontact.deleted— a contact is deletedconversation.updated— the samepreviousAttributesconvention for conversations