Webhooks
ModelsExpand Collapse
MessageEventV2 { id, chat, direction, 10 more } Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessagePayload { id, created_at, delivered_at, 8 more } Message content nested within webhook events
Message content nested within webhook events
parts?: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message content parts (text and/or media)
Message content parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
ReactionEventBase { is_from_me, reaction_type, chat_id, 8 more }
Whether this reaction was from the owner of the phone number (true) or from someone else (false)
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
The actual emoji when reaction_type is “custom”. Null for standard tapbacks.
DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
MessageSentWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.sent events (2026-02-03 format)
Complete webhook payload for message.sent events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageReceivedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.received events (2026-02-03 format)
Complete webhook payload for message.received events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageReadWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.read events (2026-02-03 format)
Complete webhook payload for message.read events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageDeliveredWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.delivered events (2026-02-03 format)
Complete webhook payload for message.delivered events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageFailedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.failed events
Complete webhook payload for message.failed events
data: Data { code, failed_at, chat_id, 2 more } Error details for message.failed webhook events.
See WebhookErrorCode for the full error code reference.
Error details for message.failed webhook events. See WebhookErrorCode for the full error code reference.
MessageEditedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.edited events (2026-02-03 format only)
Complete webhook payload for message.edited events (2026-02-03 format only)
data: Data { id, chat, direction, 3 more } Payload for message.edited events (2026-02-03 format).
Describes which part of a message was edited and when. Only text parts can be edited.
Only available for subscriptions using webhook_version: "2026-02-03".
Payload for message.edited events (2026-02-03 format).
Describes which part of a message was edited and when. Only text parts can be edited.
Only available for subscriptions using webhook_version: "2026-02-03".
chat: Chat { id, health_status, is_group, owner_handle } Chat context
Chat context
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "outbound" | "inbound"“outbound” if you sent the original message, “inbound” if you received it
“outbound” if you sent the original message, “inbound” if you received it
ReactionAddedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for reaction.added events
Complete webhook payload for reaction.added events
Payload for reaction.added webhook events
Payload for reaction.added webhook events
Whether this reaction was from the owner of the phone number (true) or from someone else (false)
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
The actual emoji when reaction_type is “custom”. Null for standard tapbacks.
DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.
ReactionRemovedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for reaction.removed events
Complete webhook payload for reaction.removed events
Payload for reaction.removed webhook events
Payload for reaction.removed webhook events
Whether this reaction was from the owner of the phone number (true) or from someone else (false)
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
The actual emoji when reaction_type is “custom”. Null for standard tapbacks.
DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.
ParticipantAddedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for participant.added events
Complete webhook payload for participant.added events
data: Data { handle, added_at, chat_id, participant } Payload for participant.added webhook events
Payload for participant.added webhook events
ParticipantRemovedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for participant.removed events
Complete webhook payload for participant.removed events
data: Data { handle, chat_id, participant, removed_at } Payload for participant.removed webhook events
Payload for participant.removed webhook events
ChatCreatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.created events
Complete webhook payload for chat.created events
data: Data { id, created_at, display_name, 5 more } Payload for chat.created webhook events. Matches GET /v3/chats/{chatId} response.
Payload for chat.created webhook events. Matches GET /v3/chats/{chatId} response.
Display name for the chat. Defaults to a comma-separated list of recipient handles. Can be updated for group chats.
List of chat participants with full handle details. Always contains at least two handles (your phone number and the other participant).
List of chat participants with full handle details. Always contains at least two handles (your phone number and the other participant).
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
ChatGroupNameUpdatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_name_updated events
Complete webhook payload for chat.group_name_updated events
data: Data { chat_id, updated_at, changed_by_handle, 2 more } Payload for chat.group_name_updated webhook events
Payload for chat.group_name_updated webhook events
ChatGroupIconUpdatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_icon_updated events
Complete webhook payload for chat.group_icon_updated events
data: Data { chat_id, updated_at, changed_by_handle, 2 more } Payload for chat.group_icon_updated webhook events
Payload for chat.group_icon_updated webhook events
ChatGroupNameUpdateFailedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_name_update_failed events
Complete webhook payload for chat.group_name_update_failed events
data: Data { chat_id, error_code, failed_at } Error details for chat.group_name_update_failed webhook events.
See WebhookErrorCode for the full error code reference.
Error details for chat.group_name_update_failed webhook events. See WebhookErrorCode for the full error code reference.
ChatGroupIconUpdateFailedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_icon_update_failed events
Complete webhook payload for chat.group_icon_update_failed events
data: Data { chat_id, error_code, failed_at } Error details for chat.group_icon_update_failed webhook events.
See WebhookErrorCode for the full error code reference.
Error details for chat.group_icon_update_failed webhook events. See WebhookErrorCode for the full error code reference.
ChatTypingIndicatorStartedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.typing_indicator.started events
Complete webhook payload for chat.typing_indicator.started events
ChatTypingIndicatorStoppedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.typing_indicator.stopped events
Complete webhook payload for chat.typing_indicator.stopped events
PhoneNumberStatusUpdatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for phone_number.status_updated events
Complete webhook payload for phone_number.status_updated events
data: Data { changed_at, new_health_status, new_status, 3 more } Payload for phone_number.status_updated webhook events
Payload for phone_number.status_updated webhook events
EventsWebhookEvent = MessageSentWebhookEvent { api_version, created_at, data, 5 more } | MessageReceivedWebhookEvent { api_version, created_at, data, 5 more } | MessageReadWebhookEvent { api_version, created_at, data, 5 more } | 15 moreComplete webhook payload for message.sent events (2026-02-03 format)
Complete webhook payload for message.sent events (2026-02-03 format)
MessageSentWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.sent events (2026-02-03 format)
Complete webhook payload for message.sent events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageReceivedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.received events (2026-02-03 format)
Complete webhook payload for message.received events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageReadWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.read events (2026-02-03 format)
Complete webhook payload for message.read events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageDeliveredWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.delivered events (2026-02-03 format)
Complete webhook payload for message.delivered events (2026-02-03 format)
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead of is_from_me boolean
sender_handle: Full handle object for the sender
chat: Nested object with id, is_group, and owner_handle
- Message fields (
id, parts, effect, etc.) are at the top level, not nested in message
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=null
message.received: sent_at set, delivered_at=null, read_at=null
message.delivered: sent_at set, delivered_at set, read_at=null
message.read: sent_at set, delivered_at set, read_at set
Unified payload for message webhooks when using webhook_version: "2026-02-03".
This schema is used for message.sent, message.received, message.delivered, and message.read
events when the subscription URL includes ?version=2026-02-03.
Key differences from V1 (2025-01-01):
direction: “inbound” or “outbound” instead ofis_from_mebooleansender_handle: Full handle object for the senderchat: Nested object withid,is_group, andowner_handle- Message fields (
id,parts,effect, etc.) are at the top level, not nested inmessage
Timestamps indicate the message state:
message.sent: sent_at set, delivered_at=null, read_at=nullmessage.received: sent_at set, delivered_at=null, read_at=nullmessage.delivered: sent_at set, delivered_at set, read_at=nullmessage.read: sent_at set, delivered_at set, read_at set
chat: Chat { id, health_status, is_group, owner_handle } Chat information
Chat information
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "inbound" | "outbound"Message direction - “outbound” if sent by you, “inbound” if received
Message direction - “outbound” if sent by you, “inbound” if received
parts: Array<SchemasTextPartResponse { type, value, text_decorations } | SchemasMediaPartResponse { id, filename, mime_type, 3 more } | SchemasLinkPartResponse { type, value } >Message parts (text and/or media)
Message parts (text and/or media)
SchemasTextPartResponse { type, value, text_decorations } A text message part
A text message part
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
When the message was delivered. Null if not yet delivered.
preferred_service?: "iMessage" | "SMS" | "RCS" | "auto" | nullPreferred messaging service type. Includes “auto” for default fallback behavior.
Preferred messaging service type. Includes “auto” for default fallback behavior.
MessageFailedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.failed events
Complete webhook payload for message.failed events
data: Data { code, failed_at, chat_id, 2 more } Error details for message.failed webhook events.
See WebhookErrorCode for the full error code reference.
Error details for message.failed webhook events. See WebhookErrorCode for the full error code reference.
MessageEditedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for message.edited events (2026-02-03 format only)
Complete webhook payload for message.edited events (2026-02-03 format only)
data: Data { id, chat, direction, 3 more } Payload for message.edited events (2026-02-03 format).
Describes which part of a message was edited and when. Only text parts can be edited.
Only available for subscriptions using webhook_version: "2026-02-03".
Payload for message.edited events (2026-02-03 format).
Describes which part of a message was edited and when. Only text parts can be edited.
Only available for subscriptions using webhook_version: "2026-02-03".
chat: Chat { id, health_status, is_group, owner_handle } Chat context
Chat context
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
direction: "outbound" | "inbound"“outbound” if you sent the original message, “inbound” if you received it
“outbound” if you sent the original message, “inbound” if you received it
ReactionAddedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for reaction.added events
Complete webhook payload for reaction.added events
Payload for reaction.added webhook events
Payload for reaction.added webhook events
Whether this reaction was from the owner of the phone number (true) or from someone else (false)
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
The actual emoji when reaction_type is “custom”. Null for standard tapbacks.
DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.
ReactionRemovedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for reaction.removed events
Complete webhook payload for reaction.removed events
Payload for reaction.removed webhook events
Payload for reaction.removed webhook events
Whether this reaction was from the owner of the phone number (true) or from someone else (false)
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
The actual emoji when reaction_type is “custom”. Null for standard tapbacks.
DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.
ParticipantAddedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for participant.added events
Complete webhook payload for participant.added events
data: Data { handle, added_at, chat_id, participant } Payload for participant.added webhook events
Payload for participant.added webhook events
ParticipantRemovedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for participant.removed events
Complete webhook payload for participant.removed events
data: Data { handle, chat_id, participant, removed_at } Payload for participant.removed webhook events
Payload for participant.removed webhook events
ChatCreatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.created events
Complete webhook payload for chat.created events
data: Data { id, created_at, display_name, 5 more } Payload for chat.created webhook events. Matches GET /v3/chats/{chatId} response.
Payload for chat.created webhook events. Matches GET /v3/chats/{chatId} response.
Display name for the chat. Defaults to a comma-separated list of recipient handles. Can be updated for group chats.
List of chat participants with full handle details. Always contains at least two handles (your phone number and the other participant).
List of chat participants with full handle details. Always contains at least two handles (your phone number and the other participant).
health_status: HealthStatus { doc_url, status, updated_at } [BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
[BETA] Current health for a chat. Always present — chats start at HEALTHY and may shift based on engagement and delivery signals on the conversation. Many AT_RISK or CRITICAL chats on a single line increase the risk of line flagging.
Switch on status to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a doc_url that deep-links to the relevant section of the Chat Health guide.
See the Chat Health guide for what each status means and how to react.
status: "HEALTHY" | "AT_RISK" | "CRITICAL" | "OPTED_OUT"Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
Current health bucket for the chat. See the Chat Health guide for what each value means and how to react. doc_url deep-links to the relevant section.
ChatGroupNameUpdatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_name_updated events
Complete webhook payload for chat.group_name_updated events
data: Data { chat_id, updated_at, changed_by_handle, 2 more } Payload for chat.group_name_updated webhook events
Payload for chat.group_name_updated webhook events
ChatGroupIconUpdatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_icon_updated events
Complete webhook payload for chat.group_icon_updated events
data: Data { chat_id, updated_at, changed_by_handle, 2 more } Payload for chat.group_icon_updated webhook events
Payload for chat.group_icon_updated webhook events
ChatGroupNameUpdateFailedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_name_update_failed events
Complete webhook payload for chat.group_name_update_failed events
data: Data { chat_id, error_code, failed_at } Error details for chat.group_name_update_failed webhook events.
See WebhookErrorCode for the full error code reference.
Error details for chat.group_name_update_failed webhook events. See WebhookErrorCode for the full error code reference.
ChatGroupIconUpdateFailedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.group_icon_update_failed events
Complete webhook payload for chat.group_icon_update_failed events
data: Data { chat_id, error_code, failed_at } Error details for chat.group_icon_update_failed webhook events.
See WebhookErrorCode for the full error code reference.
Error details for chat.group_icon_update_failed webhook events. See WebhookErrorCode for the full error code reference.
ChatTypingIndicatorStartedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.typing_indicator.started events
Complete webhook payload for chat.typing_indicator.started events
ChatTypingIndicatorStoppedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for chat.typing_indicator.stopped events
Complete webhook payload for chat.typing_indicator.stopped events
PhoneNumberStatusUpdatedWebhookEvent { api_version, created_at, data, 5 more } Complete webhook payload for phone_number.status_updated events
Complete webhook payload for phone_number.status_updated events
data: Data { changed_at, new_health_status, new_status, 3 more } Payload for phone_number.status_updated webhook events
Payload for phone_number.status_updated webhook events