Documentation Index
Fetch the complete documentation index at: https://docs.heyy.io/llms.txt
Use this file to discover all available pages before exploring further.
The webhook payload object is sent whenever an event triggers that you have subscribed to. Message webhooks re-use the same object. We have not added other events yet, but platform events will likely use a slightly different object structure due to their different nature.
The Heyy API currently supports the following webhook event types:
message.received
message.sent
message.updated
message.received webhook payload
The message.received event is fired when a new inbound message is received on one of your channels.
{
"id": "f8a2b1c3-4d5e-4f6a-9b0c-1d2e3f4a5b6c",
"tenantId": "a98d0e1f2-a1b4-4c4d-6e7f-8a9b0c1d2e3f",
"event": "message.received",
"data": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"type": "message",
"sender": "inbound",
"sources": [
{
"type": "vendor"
}
],
"status": "delivered",
"scheduledAt": null,
"content": {
"body": "Hello world",
"attachments": []
},
"forwarded": false,
"reactions": [],
"errors": [],
"history": [],
"vendorId": "wamid.HBgNOTcyNTQ0Nzc4NzcwFQIAEhgUMzJCNzMyRzU0OTQ2MDdDNUE1RTIA",
"timestamp": "2026-03-13T23:29:34.000Z",
"vendorDetails": null,
"isSensitive": false,
"aiGenerationId": null,
"metadata": {},
"chat": {
"id": "5f3700cd-a5cf-4b2b-be5a-23b013025c11"
},
"handle": {
"id": "1a9559d7-3c53-4cd5-a076-962193b206e9",
"type": "phone_number",
"value": "+12135550123"
},
"contact": {
"id": "259c9fec-c831-41ad-8a43-3fdad389d015",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+12135550123",
"email": "john@example.com"
},
"channel": {
"id": "h9dd4c3e-b049-4903-b047-e2717f1e88e3",
"type": "whatsapp",
"name": "Examply"
}
}
}
Use this event to react to new customer messages, for example by:
- Creating or updating conversations in your own system.
- Triggering internal workflows.
- Logging messages for analytics or compliance.
message.sent webhook payload
The message.sent event is fired when an outbound message is created and sent from Heyy (for example, by an agent, an automation, or an API call).
{
"id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a",
"tenantId": "a98d0e1f2-a1b4-4c4d-6e7f-8a9b0c1d2e3f",
"event": "message.sent",
"data": {
"id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b",
"type": "message",
"sender": "outbound",
"sources": [
{
"type": "inbox",
"userId": "b8c9d0e1-f2a3-4b4c-5d6e-7f8a9b0c1d2e"
}
],
"status": "pending",
"scheduledAt": null,
"content": {
"body": "Hello world"
},
"forwarded": false,
"reactions": [],
"errors": [],
"history": [],
"vendorId": "2847123456789012345",
"timestamp": "2026-03-13T23:15:25.166Z",
"vendorDetails": null,
"isSensitive": false,
"aiGenerationId": null,
"metadata": {},
"chat": {
"id": "5f3700cd-a5cf-4b2b-be5a-23b013025c11"
},
"handle": {
"id": "1a9559d7-3c53-4cd5-a076-962193b206e9",
"type": "phone_number",
"value": "+12135550123"
},
"contact": {
"id": "259c9fec-c831-41ad-8a43-3fdad389d015",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+12135550123",
"email": "john@example.com"
},
"channel": {
"id": "h9dd4c3e-b049-4903-b047-e2717f1e88e3",
"type": "whatsapp",
"name": "Examply"
}
}
}
You can use this event to:
- Mirror outbound messages into your own data store.
- Keep external CRMs or analytics systems in sync.
- Track which system or agent generated which outbound messages.
message.updated webhook payload
The message.updated event is fired when the delivery status of a message changes (for example, from sent to delivered or read or failed, depending on the channel).
{
"id": "c9d0e1f2-a3b4-4c5d-6e7f-8a9b0c1d2e3f",
"tenantId": "a98d0e1f2-a1b4-4c4d-6e7f-8a9b0c1d2e3f",
"event": "message.updated",
"data": {
"id": "d0e1f2a3-b4c5-4d6e-7f8a-9b0c1d2e3f4a",
"type": "message",
"sender": "outbound",
"sources": [
{
"type": "inbox",
"userId": "a3b4c5d6-e7f8-4a9b-0c1d-2e3f4a5b6c7d"
}
],
"status": "delivered",
"scheduledAt": null,
"content": {
"body": "Hello world"
},
"forwarded": false,
"reactions": [],
"errors": [],
"history": [
{
"event": "status_update",
"newStatus": "pending",
"timestamp": "2026-03-13T23:26:57.275Z"
},
{
"event": "status_update",
"newStatus": "sent",
"timestamp": "2026-03-13T23:26:58.000Z"
},
{
"event": "status_update",
"newStatus": "delivered",
"timestamp": "2026-03-13T23:26:58.000Z"
}
],
"vendorId": "a1f2e3d4-c5b6-4a97-8e8f-0d1c2b3a4e5f",
"timestamp": "2026-03-13T23:26:57.275Z",
"vendorDetails": null,
"isSensitive": false,
"aiGenerationId": null,
"metadata": {},
"chat": {
"id": "5f3700cd-a5cf-4b2b-be5a-23b013025c11"
},
"handle": {
"id": "1a9559d7-3c53-4cd5-a076-962193b206e9",
"type": "phone_number",
"value": "+12135550123"
},
"contact": {
"id": "259c9fec-c831-41ad-8a43-3fdad389d015",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+12135550123",
"email": "john@example.com"
},
"channel": {
"id": "h9dd4c3e-b049-4903-b047-e2717f1e88e3",
"type": "whatsapp",
"name": "Examply"
}
}
}
Typical uses for this event include:
- Updating message delivery/read status in your own UI.
- Powering reporting or analytics dashboards.
- Triggering follow-up automations when a message reaches a specific status.
Forward compatibility
As Heyy evolves, we may:
- Add new webhook event types.
- Add new fields to existing payloads.
To keep your integration robust:
- Always ignore unknown fields.
- Rely on the
id and event fields for routing logic.
- Treat the
message object as an extensible resource that can gain additional properties over time.