eventType and data fields vary. Lock onto this envelope and your handler will work for contact.* today and every event family we ship in the future.
Anatomy
Field reference
What’s in data?
The data object is the part that actually tells you what happened. Its shape depends on the event type. As of v1.1.1, the contact family carries an identity baseline (contactId, firstName, lastName, fullName, email, phone, isActive, contactGroupId, subGroupId, subGroupName) on every non-delete event — so partners can route, sync, and act on a single delivery without a follow-up state lookup. Additional fields gate behind PII subscription opt-ins.
Two patterns at play:
- Identity baseline + diff — non-delete events in the contact family carry the contact’s identity (name, email, phone) so you can act on a single event without a state lookup. “Something changed” events (
status_changed,sub_group_changed) add the before/after IDs and human-readable names. - Signal-only —
contact.deletedships only{ contactId, operation: "delete" }. The resource is gone; there’s nothing to baseline.
Request headers
Beyond the JSON body, every delivery includes:Conventions
camelCase property names
camelCase property names
All JSON properties use camelCase (
contactId, not ContactId or contact_id). The wire format is stable; the C# / SQL backend uses PascalCase internally but serialization converts.Null fields are omitted
Null fields are omitted
If a field’s value is
null, it’s left out of the JSON entirely rather than emitted as "field": null. Treat absence and explicit null as equivalent.Timestamps are always UTC, always ISO 8601
Timestamps are always UTC, always ISO 8601
Every
*At / *Date / *Timestamp field is ISO 8601 in UTC with millisecond precision. No timezone offsets, no DATE-only formats unless explicitly noted on the event page.IDs are integers, not strings
IDs are integers, not strings
contactId, locationId, organizationId, subscriptionId, etc. are JSON numbers. Treat them as 32-bit ints on receipt; we’d give plenty of warning before we ever needed to widen to 64-bit.