data.object is the thing the event is about.
Events
data.object has the same shape as the REST API’s answer for that object, so code that reads GET /conversations/{id} also reads the webhook. Webhooks always include names and emails: an endpoint exists to get the lead into your CRM.
Example payloads
lead.captured
lead.captured
handoff.requested and conversation.completed
handoff.requested and conversation.completed
conversation.completed has the same shape. Its evaluation is filled in: intent, buying_stage, qualification_score and meeting_intent (0 to 10), understood, failure_category, abandonment_reason and recommended_improvement. conversation.started carries the conversation without messages.outcome.submitted
outcome.submitted
messages. Each answer’s key comes from its question and stays the same while the question does; GET /outcomes lists every form’s keys. fit is false when an answer matched the form’s fit rules, and fit_reasons names those questions. billing is counted, not_billable, voided or none.personal_link.opened
personal_link.opened
GET /personal_links/{id} and GET /contacts/{id} return. person is what the link’s address carried, so a forwarded email can carry someone else’s details. contact is null when the link had no email. The visit arrives within seconds of the click, before any chat; GET /link_visits/{id} later lists the conversations that browser started.meeting.booked, meeting.rescheduled and meeting.canceled
meeting.booked, meeting.rescheduled and meeting.canceled
verified is true when the calendar provider confirmed the booking. On meeting.rescheduled, start_at, end_at and reschedules change; on meeting.canceled, status is canceled.experiment.started and experiment.winner_found
experiment.started and experiment.winner_found
GET /experiments/{id}.knowledge.source_failed
knowledge.source_failed
webhook.test
webhook.test
GET /events.data.object is null. If the person was erased, data is { "erased": true }.