Skip to content
Get started

Webhooks

Unwrap
webhooks.unwrap()
Function
ModelsExpand Collapse
class MessageEventV2:

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
id: str

Message identifier

formatuuid
chat: Chat

Chat information

id: str

Chat identifier

formatuuid
health_status: ChatHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: Optional[bool]

Whether this is a group chat

owner_handle: Optional[ChatHandle]

Your phone number’s handle. Always has is_me=true.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
direction: Literal["inbound", "outbound"]

Message direction - “outbound” if sent by you, “inbound” if received

One of the following:
"inbound"
"outbound"
parts: List[Part]

Message parts (text and/or media)

One of the following:
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class PartSchemasLinkPartResponse:

A rich link preview part

type: Literal["link"]

Indicates this is a rich link preview part

value: str

The URL

class PartSchemasIMessageAppPartResponse:

An iMessage app card part.

app: PartSchemasIMessageAppPartResponseApp

Identifies the iMessage app (Messages app extension) that backs the card.

bundle_id: str

Bundle identifier of the Messages app extension.

name: str

Display name of the app.

team_id: str

The app’s 10-character team identifier.

app_store_id: Optional[int]

The owning app’s App Store id, when known.

formatint64
layout: PartSchemasIMessageAppPartResponseLayout

Visible layout of the card.

caption: Optional[str]

Primary label, top-left and bold.

subcaption: Optional[str]

Secondary label, below caption on the left.

trailing_caption: Optional[str]

Label shown top-right.

trailing_subcaption: Optional[str]

Label shown below trailing_caption.

type: Literal["imessage_app"]

Indicates this is an iMessage app card part.

url: str

The URL the recipient’s app opens when the user taps the card.

formaturi
fallback_text: Optional[str]

Fallback text for surfaces that cannot render the card.

sender_handle: ChatHandle

The handle that sent this message

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
delivered_at: Optional[datetime]

When the message was delivered. Null if not yet delivered.

formatdate-time
effect: Optional[SchemasMessageEffect]

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
idempotency_key: Optional[str]

Idempotency key for deduplication of outbound messages.

preferred_service: Optional[Literal["iMessage", "SMS", "RCS", "auto"]]

Preferred messaging service type. Includes “auto” for default fallback behavior.

One of the following:
"iMessage"
"SMS"
"RCS"
"auto"
read_at: Optional[datetime]

When the message was read. Null if not yet read.

formatdate-time
reply_to: Optional[ReplyTo]

Reference to the message this is replying to (for threaded replies)

message_id: Optional[str]

ID of the message being replied to

formatuuid
part_index: Optional[int]

Index of the part being replied to

formatint32
minimum0
sent_at: Optional[datetime]

When the message was sent. Null if not yet sent.

formatdate-time
class MessagePayload:

Message content nested within webhook events

id: Optional[str]

Message identifier

formatuuid
created_at: Optional[datetime]

When the message record was created

formatdate-time
delivered_at: Optional[datetime]

When the message was delivered

formatdate-time
effect: Optional[SchemasMessageEffect]

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
is_delivered: Optional[bool]

Whether the message has been delivered

is_read: Optional[bool]

Whether the message has been read

parts: Optional[List[Part]]

Message content parts (text and/or media)

One of the following:
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class PartSchemasLinkPartResponse:

A rich link preview part

type: Literal["link"]

Indicates this is a rich link preview part

value: str

The URL

class PartSchemasIMessageAppPartResponse:

An iMessage app card part.

app: PartSchemasIMessageAppPartResponseApp

Identifies the iMessage app (Messages app extension) that backs the card.

bundle_id: str

Bundle identifier of the Messages app extension.

name: str

Display name of the app.

team_id: str

The app’s 10-character team identifier.

app_store_id: Optional[int]

The owning app’s App Store id, when known.

formatint64
layout: PartSchemasIMessageAppPartResponseLayout

Visible layout of the card.

caption: Optional[str]

Primary label, top-left and bold.

subcaption: Optional[str]

Secondary label, below caption on the left.

trailing_caption: Optional[str]

Label shown top-right.

trailing_subcaption: Optional[str]

Label shown below trailing_caption.

type: Literal["imessage_app"]

Indicates this is an iMessage app card part.

url: str

The URL the recipient’s app opens when the user taps the card.

formaturi
fallback_text: Optional[str]

Fallback text for surfaces that cannot render the card.

read_at: Optional[datetime]

When the message was read

formatdate-time
reply_to: Optional[ReplyTo]

Reference to the message this is replying to

message_id: Optional[str]

The ID of the message being replied to

formatuuid
part_index: Optional[int]

Index of the message part being replied to (0-based)

formatint32
minimum0
sent_at: Optional[datetime]

When the message was sent

formatdate-time
updated_at: Optional[datetime]

When the message record was last updated

formatdate-time
class ReactionEventBase:
is_from_me: bool

Whether this reaction was from the owner of the phone number (true) or from someone else (false)

reaction_type: ReactionType

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.

One of the following:
"love"
"like"
"dislike"
"laugh"
"emphasize"
"question"
"custom"
"sticker"
chat_id: Optional[str]

Chat identifier (UUID)

custom_emoji: Optional[str]

The actual emoji when reaction_type is “custom”. Null for standard tapbacks.

Deprecatedfrom_: Optional[str]

DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.

from_handle: Optional[ChatHandle]

The person who added/removed the reaction as a full handle object

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
message_id: Optional[str]

Message identifier (UUID) that the reaction was added to or removed from

part_index: Optional[int]

Index of the message part that was reacted to (0-based)

formatint32
minimum0
reacted_at: Optional[datetime]

When the reaction was added or removed

formatdate-time
service: Optional[ServiceType]

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
sticker: Optional[Sticker]

Sticker attachment details when reaction_type is “sticker”. Null for non-sticker reactions.

file_name: Optional[str]

Filename of the sticker

height: Optional[int]

Sticker image height in pixels

mime_type: Optional[str]

MIME type of the sticker image

url: Optional[str]

Presigned URL for downloading the sticker image (expires in 1 hour).

formaturi
width: Optional[int]

Sticker image width in pixels

class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class SchemasMessageEffect:

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class MessageSentWebhookEvent:

Complete webhook payload for message.sent events (2026-02-03 format)

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time

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
id: str

Message identifier

formatuuid
chat: Chat

Chat information

id: str

Chat identifier

formatuuid
health_status: ChatHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: Optional[bool]

Whether this is a group chat

owner_handle: Optional[ChatHandle]

Your phone number’s handle. Always has is_me=true.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
direction: Literal["inbound", "outbound"]

Message direction - “outbound” if sent by you, “inbound” if received

One of the following:
"inbound"
"outbound"
parts: List[Part]

Message parts (text and/or media)

One of the following:
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class PartSchemasLinkPartResponse:

A rich link preview part

type: Literal["link"]

Indicates this is a rich link preview part

value: str

The URL

class PartSchemasIMessageAppPartResponse:

An iMessage app card part.

app: PartSchemasIMessageAppPartResponseApp

Identifies the iMessage app (Messages app extension) that backs the card.

bundle_id: str

Bundle identifier of the Messages app extension.

name: str

Display name of the app.

team_id: str

The app’s 10-character team identifier.

app_store_id: Optional[int]

The owning app’s App Store id, when known.

formatint64
layout: PartSchemasIMessageAppPartResponseLayout

Visible layout of the card.

caption: Optional[str]

Primary label, top-left and bold.

subcaption: Optional[str]

Secondary label, below caption on the left.

trailing_caption: Optional[str]

Label shown top-right.

trailing_subcaption: Optional[str]

Label shown below trailing_caption.

type: Literal["imessage_app"]

Indicates this is an iMessage app card part.

url: str

The URL the recipient’s app opens when the user taps the card.

formaturi
fallback_text: Optional[str]

Fallback text for surfaces that cannot render the card.

sender_handle: ChatHandle

The handle that sent this message

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
delivered_at: Optional[datetime]

When the message was delivered. Null if not yet delivered.

formatdate-time
effect: Optional[SchemasMessageEffect]

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
idempotency_key: Optional[str]

Idempotency key for deduplication of outbound messages.

preferred_service: Optional[Literal["iMessage", "SMS", "RCS", "auto"]]

Preferred messaging service type. Includes “auto” for default fallback behavior.

One of the following:
"iMessage"
"SMS"
"RCS"
"auto"
read_at: Optional[datetime]

When the message was read. Null if not yet read.

formatdate-time
reply_to: Optional[ReplyTo]

Reference to the message this is replying to (for threaded replies)

message_id: Optional[str]

ID of the message being replied to

formatuuid
part_index: Optional[int]

Index of the part being replied to

formatint32
minimum0
sent_at: Optional[datetime]

When the message was sent. Null if not yet sent.

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class MessageReceivedWebhookEvent:

Complete webhook payload for message.received events (2026-02-03 format)

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time

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
id: str

Message identifier

formatuuid
chat: Chat

Chat information

id: str

Chat identifier

formatuuid
health_status: ChatHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: Optional[bool]

Whether this is a group chat

owner_handle: Optional[ChatHandle]

Your phone number’s handle. Always has is_me=true.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
direction: Literal["inbound", "outbound"]

Message direction - “outbound” if sent by you, “inbound” if received

One of the following:
"inbound"
"outbound"
parts: List[Part]

Message parts (text and/or media)

One of the following:
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class PartSchemasLinkPartResponse:

A rich link preview part

type: Literal["link"]

Indicates this is a rich link preview part

value: str

The URL

class PartSchemasIMessageAppPartResponse:

An iMessage app card part.

app: PartSchemasIMessageAppPartResponseApp

Identifies the iMessage app (Messages app extension) that backs the card.

bundle_id: str

Bundle identifier of the Messages app extension.

name: str

Display name of the app.

team_id: str

The app’s 10-character team identifier.

app_store_id: Optional[int]

The owning app’s App Store id, when known.

formatint64
layout: PartSchemasIMessageAppPartResponseLayout

Visible layout of the card.

caption: Optional[str]

Primary label, top-left and bold.

subcaption: Optional[str]

Secondary label, below caption on the left.

trailing_caption: Optional[str]

Label shown top-right.

trailing_subcaption: Optional[str]

Label shown below trailing_caption.

type: Literal["imessage_app"]

Indicates this is an iMessage app card part.

url: str

The URL the recipient’s app opens when the user taps the card.

formaturi
fallback_text: Optional[str]

Fallback text for surfaces that cannot render the card.

sender_handle: ChatHandle

The handle that sent this message

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
delivered_at: Optional[datetime]

When the message was delivered. Null if not yet delivered.

formatdate-time
effect: Optional[SchemasMessageEffect]

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
idempotency_key: Optional[str]

Idempotency key for deduplication of outbound messages.

preferred_service: Optional[Literal["iMessage", "SMS", "RCS", "auto"]]

Preferred messaging service type. Includes “auto” for default fallback behavior.

One of the following:
"iMessage"
"SMS"
"RCS"
"auto"
read_at: Optional[datetime]

When the message was read. Null if not yet read.

formatdate-time
reply_to: Optional[ReplyTo]

Reference to the message this is replying to (for threaded replies)

message_id: Optional[str]

ID of the message being replied to

formatuuid
part_index: Optional[int]

Index of the part being replied to

formatint32
minimum0
sent_at: Optional[datetime]

When the message was sent. Null if not yet sent.

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class MessageReadWebhookEvent:

Complete webhook payload for message.read events (2026-02-03 format)

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time

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
id: str

Message identifier

formatuuid
chat: Chat

Chat information

id: str

Chat identifier

formatuuid
health_status: ChatHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: Optional[bool]

Whether this is a group chat

owner_handle: Optional[ChatHandle]

Your phone number’s handle. Always has is_me=true.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
direction: Literal["inbound", "outbound"]

Message direction - “outbound” if sent by you, “inbound” if received

One of the following:
"inbound"
"outbound"
parts: List[Part]

Message parts (text and/or media)

One of the following:
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class PartSchemasLinkPartResponse:

A rich link preview part

type: Literal["link"]

Indicates this is a rich link preview part

value: str

The URL

class PartSchemasIMessageAppPartResponse:

An iMessage app card part.

app: PartSchemasIMessageAppPartResponseApp

Identifies the iMessage app (Messages app extension) that backs the card.

bundle_id: str

Bundle identifier of the Messages app extension.

name: str

Display name of the app.

team_id: str

The app’s 10-character team identifier.

app_store_id: Optional[int]

The owning app’s App Store id, when known.

formatint64
layout: PartSchemasIMessageAppPartResponseLayout

Visible layout of the card.

caption: Optional[str]

Primary label, top-left and bold.

subcaption: Optional[str]

Secondary label, below caption on the left.

trailing_caption: Optional[str]

Label shown top-right.

trailing_subcaption: Optional[str]

Label shown below trailing_caption.

type: Literal["imessage_app"]

Indicates this is an iMessage app card part.

url: str

The URL the recipient’s app opens when the user taps the card.

formaturi
fallback_text: Optional[str]

Fallback text for surfaces that cannot render the card.

sender_handle: ChatHandle

The handle that sent this message

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
delivered_at: Optional[datetime]

When the message was delivered. Null if not yet delivered.

formatdate-time
effect: Optional[SchemasMessageEffect]

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
idempotency_key: Optional[str]

Idempotency key for deduplication of outbound messages.

preferred_service: Optional[Literal["iMessage", "SMS", "RCS", "auto"]]

Preferred messaging service type. Includes “auto” for default fallback behavior.

One of the following:
"iMessage"
"SMS"
"RCS"
"auto"
read_at: Optional[datetime]

When the message was read. Null if not yet read.

formatdate-time
reply_to: Optional[ReplyTo]

Reference to the message this is replying to (for threaded replies)

message_id: Optional[str]

ID of the message being replied to

formatuuid
part_index: Optional[int]

Index of the part being replied to

formatint32
minimum0
sent_at: Optional[datetime]

When the message was sent. Null if not yet sent.

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class MessageDeliveredWebhookEvent:

Complete webhook payload for message.delivered events (2026-02-03 format)

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time

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
id: str

Message identifier

formatuuid
chat: Chat

Chat information

id: str

Chat identifier

formatuuid
health_status: ChatHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: Optional[bool]

Whether this is a group chat

owner_handle: Optional[ChatHandle]

Your phone number’s handle. Always has is_me=true.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
direction: Literal["inbound", "outbound"]

Message direction - “outbound” if sent by you, “inbound” if received

One of the following:
"inbound"
"outbound"
parts: List[Part]

Message parts (text and/or media)

One of the following:
class SchemasTextPartResponse:

A text message part

type: Literal["text"]

Indicates this is a text message part

value: str

The text content

text_decorations: Optional[List[TextDecoration]]

Text decorations applied to character ranges in the value

range: List[int]

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.

animation: Optional[Literal["big", "small", "shake", 5 more]]

Animated text effect to apply. Mutually exclusive with style.

One of the following:
"big"
"small"
"shake"
"nod"
"explode"
"ripple"
"bloom"
"jitter"
style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]

Text style to apply. Mutually exclusive with animation.

One of the following:
"bold"
"italic"
"strikethrough"
"underline"
class SchemasMediaPartResponse:

A media attachment part

id: str

Unique attachment identifier

formatuuid
filename: str

Original filename

mime_type: str

MIME type of the file

size_bytes: int

File size in bytes

type: Literal["media"]

Indicates this is a media attachment part

url: str

Presigned URL for downloading the attachment (expires in 1 hour).

formaturi
class PartSchemasLinkPartResponse:

A rich link preview part

type: Literal["link"]

Indicates this is a rich link preview part

value: str

The URL

class PartSchemasIMessageAppPartResponse:

An iMessage app card part.

app: PartSchemasIMessageAppPartResponseApp

Identifies the iMessage app (Messages app extension) that backs the card.

bundle_id: str

Bundle identifier of the Messages app extension.

name: str

Display name of the app.

team_id: str

The app’s 10-character team identifier.

app_store_id: Optional[int]

The owning app’s App Store id, when known.

formatint64
layout: PartSchemasIMessageAppPartResponseLayout

Visible layout of the card.

caption: Optional[str]

Primary label, top-left and bold.

subcaption: Optional[str]

Secondary label, below caption on the left.

trailing_caption: Optional[str]

Label shown top-right.

trailing_subcaption: Optional[str]

Label shown below trailing_caption.

type: Literal["imessage_app"]

Indicates this is an iMessage app card part.

url: str

The URL the recipient’s app opens when the user taps the card.

formaturi
fallback_text: Optional[str]

Fallback text for surfaces that cannot render the card.

sender_handle: ChatHandle

The handle that sent this message

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
delivered_at: Optional[datetime]

When the message was delivered. Null if not yet delivered.

formatdate-time
effect: Optional[SchemasMessageEffect]

iMessage effect applied to a message (screen or bubble animation)

name: Optional[str]

Effect name (confetti, fireworks, slam, gentle, etc.)

type: Optional[Literal["screen", "bubble"]]

Effect category

One of the following:
"screen"
"bubble"
idempotency_key: Optional[str]

Idempotency key for deduplication of outbound messages.

preferred_service: Optional[Literal["iMessage", "SMS", "RCS", "auto"]]

Preferred messaging service type. Includes “auto” for default fallback behavior.

One of the following:
"iMessage"
"SMS"
"RCS"
"auto"
read_at: Optional[datetime]

When the message was read. Null if not yet read.

formatdate-time
reply_to: Optional[ReplyTo]

Reference to the message this is replying to (for threaded replies)

message_id: Optional[str]

ID of the message being replied to

formatuuid
part_index: Optional[int]

Index of the part being replied to

formatint32
minimum0
sent_at: Optional[datetime]

When the message was sent. Null if not yet sent.

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class MessageFailedWebhookEvent:

Complete webhook payload for message.failed events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Error details for message.failed webhook events. See WebhookErrorCode for the full error code reference.

code: int

Error codes in webhook failure events (3007, 4001, 4005).

failed_at: datetime

When the failure was detected

formatdate-time
chat_id: Optional[str]

Chat identifier (UUID)

message_id: Optional[str]

Message identifier (UUID)

reason: Optional[str]

Human-readable description of the failure

event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class MessageEditedWebhookEvent:

Complete webhook payload for message.edited events (2026-02-03 format only)

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

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".

id: str

Message identifier

formatuuid
chat: DataChat

Chat context

id: str

Chat identifier

formatuuid
health_status: DataChatHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: bool

Whether this is a group chat

owner_handle: ChatHandle

The handle that owns this chat (your phone number)

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
direction: Literal["outbound", "inbound"]

“outbound” if you sent the original message, “inbound” if you received it

One of the following:
"outbound"
"inbound"
edited_at: datetime

When the edit occurred

formatdate-time
part: DataPart

The edited part

index: int

Zero-based index of the edited part within the message

text: str

New text content of the part

sender_handle: ChatHandle

The handle that sent (and edited) this message

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ReactionAddedWebhookEvent:

Complete webhook payload for reaction.added events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time

Payload for reaction.added webhook events

is_from_me: bool

Whether this reaction was from the owner of the phone number (true) or from someone else (false)

reaction_type: ReactionType

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.

One of the following:
"love"
"like"
"dislike"
"laugh"
"emphasize"
"question"
"custom"
"sticker"
chat_id: Optional[str]

Chat identifier (UUID)

custom_emoji: Optional[str]

The actual emoji when reaction_type is “custom”. Null for standard tapbacks.

Deprecatedfrom_: Optional[str]

DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.

from_handle: Optional[ChatHandle]

The person who added/removed the reaction as a full handle object

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
message_id: Optional[str]

Message identifier (UUID) that the reaction was added to or removed from

part_index: Optional[int]

Index of the message part that was reacted to (0-based)

formatint32
minimum0
reacted_at: Optional[datetime]

When the reaction was added or removed

formatdate-time
service: Optional[ServiceType]

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
sticker: Optional[Sticker]

Sticker attachment details when reaction_type is “sticker”. Null for non-sticker reactions.

file_name: Optional[str]

Filename of the sticker

height: Optional[int]

Sticker image height in pixels

mime_type: Optional[str]

MIME type of the sticker image

url: Optional[str]

Presigned URL for downloading the sticker image (expires in 1 hour).

formaturi
width: Optional[int]

Sticker image width in pixels

event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ReactionRemovedWebhookEvent:

Complete webhook payload for reaction.removed events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time

Payload for reaction.removed webhook events

is_from_me: bool

Whether this reaction was from the owner of the phone number (true) or from someone else (false)

reaction_type: ReactionType

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.

One of the following:
"love"
"like"
"dislike"
"laugh"
"emphasize"
"question"
"custom"
"sticker"
chat_id: Optional[str]

Chat identifier (UUID)

custom_emoji: Optional[str]

The actual emoji when reaction_type is “custom”. Null for standard tapbacks.

Deprecatedfrom_: Optional[str]

DEPRECATED: Use from_handle instead. Phone number or email address of the person who added/removed the reaction.

from_handle: Optional[ChatHandle]

The person who added/removed the reaction as a full handle object

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
message_id: Optional[str]

Message identifier (UUID) that the reaction was added to or removed from

part_index: Optional[int]

Index of the message part that was reacted to (0-based)

formatint32
minimum0
reacted_at: Optional[datetime]

When the reaction was added or removed

formatdate-time
service: Optional[ServiceType]

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
sticker: Optional[Sticker]

Sticker attachment details when reaction_type is “sticker”. Null for non-sticker reactions.

file_name: Optional[str]

Filename of the sticker

height: Optional[int]

Sticker image height in pixels

mime_type: Optional[str]

MIME type of the sticker image

url: Optional[str]

Presigned URL for downloading the sticker image (expires in 1 hour).

formaturi
width: Optional[int]

Sticker image width in pixels

event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ParticipantAddedWebhookEvent:

Complete webhook payload for participant.added events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for participant.added webhook events

Deprecatedhandle: str

DEPRECATED: Use participant instead. Handle (phone number or email address) of the added participant.

added_at: Optional[datetime]

When the participant was added

formatdate-time
chat_id: Optional[str]

Chat identifier (UUID) of the group chat

participant: Optional[ChatHandle]

The added participant as a full handle object

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ParticipantRemovedWebhookEvent:

Complete webhook payload for participant.removed events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for participant.removed webhook events

Deprecatedhandle: str

DEPRECATED: Use participant instead. Handle (phone number or email address) of the removed participant.

chat_id: Optional[str]

Chat identifier (UUID) of the group chat

participant: Optional[ChatHandle]

The removed participant as a full handle object

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
removed_at: Optional[datetime]

When the participant was removed

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatCreatedWebhookEvent:

Complete webhook payload for chat.created events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for chat.created webhook events. Matches GET /v3/chats/{chatId} response.

id: str

Unique identifier for the chat

formatuuid
created_at: datetime

When the chat was created

formatdate-time
display_name: Optional[str]

Display name for the chat. Defaults to a comma-separated list of recipient handles. Can be updated for group chats.

handles: List[ChatHandle]

List of chat participants with full handle details. Always contains at least two handles (your phone number and the other participant).

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
health_status: DataHealthStatus

[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.

doc_url: str

Deep-link to the relevant section of the Chat Health guide for this status.

formaturi
status: Literal["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.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
"OPTED_OUT"
updated_at: datetime

When this status last changed.

formatdate-time
is_group: bool

Whether this is a group chat

updated_at: datetime

When the chat was last updated

formatdate-time
service: Optional[ServiceType]

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatGroupNameUpdatedWebhookEvent:

Complete webhook payload for chat.group_name_updated events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for chat.group_name_updated webhook events

chat_id: str

Chat identifier (UUID) of the group chat

updated_at: datetime

When the update occurred

formatdate-time
changed_by_handle: Optional[ChatHandle]

The handle who made the change.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
new_value: Optional[str]

New group name (null if the name was removed)

old_value: Optional[str]

Previous group name (null if no previous name)

event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatGroupIconUpdatedWebhookEvent:

Complete webhook payload for chat.group_icon_updated events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for chat.group_icon_updated webhook events

chat_id: str

Chat identifier (UUID) of the group chat

updated_at: datetime

When the update occurred

formatdate-time
changed_by_handle: Optional[ChatHandle]

The handle who made the change.

id: str

Unique identifier for this handle

formatuuid
handle: str

Phone number (E.164) or email address of the participant

joined_at: datetime

When this participant joined the chat

formatdate-time
service: ServiceType

Messaging service type

One of the following:
"iMessage"
"SMS"
"RCS"
is_me: Optional[bool]

Whether this handle belongs to the sender (your phone number)

left_at: Optional[datetime]

When they left (if applicable)

formatdate-time
status: Optional[Literal["active", "left", "removed"]]

Participant status

One of the following:
"active"
"left"
"removed"
new_value: Optional[str]

New icon URL (null if the icon was removed)

old_value: Optional[str]

Previous icon URL (null if no previous icon)

event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatGroupNameUpdateFailedWebhookEvent:

Complete webhook payload for chat.group_name_update_failed events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Error details for chat.group_name_update_failed webhook events. See WebhookErrorCode for the full error code reference.

chat_id: str

Chat identifier (UUID) of the group chat

error_code: int

Error codes in webhook failure events (3007, 4001, 4005).

failed_at: datetime

When the failure was detected

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatGroupIconUpdateFailedWebhookEvent:

Complete webhook payload for chat.group_icon_update_failed events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Error details for chat.group_icon_update_failed webhook events. See WebhookErrorCode for the full error code reference.

chat_id: str

Chat identifier (UUID) of the group chat

error_code: int

Error codes in webhook failure events (3007, 4001, 4005).

failed_at: datetime

When the failure was detected

formatdate-time
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatTypingIndicatorStartedWebhookEvent:

Complete webhook payload for chat.typing_indicator.started events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for chat.typing_indicator.started webhook events

chat_id: str

Chat identifier

formatuuid
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class ChatTypingIndicatorStoppedWebhookEvent:

Complete webhook payload for chat.typing_indicator.stopped events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for chat.typing_indicator.stopped webhook events

chat_id: str

Chat identifier

formatuuid
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: WebhookEventType

Valid webhook event types that can be subscribed to.

Note: message.edited is only delivered to subscriptions using webhook_version: "2026-02-03". Subscribing to this event on a v2025 subscription will not produce any deliveries.

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.

class PhoneNumberStatusUpdatedWebhookEvent:

Complete webhook payload for phone_number.status_updated events

api_version: str

API version for the webhook payload format

created_at: datetime

When the event was created

formatdate-time
data: Data

Payload for phone_number.status_updated webhook events

changed_at: datetime

When the status change occurred

formatdate-time
Deprecatednew_health_status: Literal["HEALTHY", "AT_RISK", "CRITICAL"]

Current reputation of this phone line.

  • HEALTHY — The line is in good standing. Send normally.
  • AT_RISK — The line’s overall engagement is trending down. Slow the line’s send pace and review your messaging patterns.
  • CRITICAL — Strong signals that messages from this line aren’t landing well. Pause outbound on the line until it recovers.

Defaults to HEALTHY for lines that have not yet been scored.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
new_reputation: Literal["HEALTHY", "AT_RISK", "CRITICAL"]

The new line reputation

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
new_status: Literal["ACTIVE", "FLAGGED"]

The new service status

One of the following:
"ACTIVE"
"FLAGGED"
phone_number: str

Phone number in E.164 format

Deprecatedprevious_health_status: Literal["HEALTHY", "AT_RISK", "CRITICAL"]

Current reputation of this phone line.

  • HEALTHY — The line is in good standing. Send normally.
  • AT_RISK — The line’s overall engagement is trending down. Slow the line’s send pace and review your messaging patterns.
  • CRITICAL — Strong signals that messages from this line aren’t landing well. Pause outbound on the line until it recovers.

Defaults to HEALTHY for lines that have not yet been scored.

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
previous_reputation: Literal["HEALTHY", "AT_RISK", "CRITICAL"]

The previous line reputation

One of the following:
"HEALTHY"
"AT_RISK"
"CRITICAL"
previous_status: Literal["ACTIVE", "FLAGGED"]

The previous service status

One of the following:
"ACTIVE"
"FLAGGED"
event_id: str

Unique identifier for this event (for deduplication)

formatuuid
event_type: Literal["message.sent", "message.received", "message.read", 28 more]

The type of event

One of the following:
"message.sent"
"message.received"
"message.read"
"message.delivered"
"message.failed"
"message.edited"
"reaction.added"
"reaction.removed"
"participant.added"
"participant.removed"
"chat.created"
"chat.group_name_updated"
"chat.group_icon_updated"
"chat.group_name_update_failed"
"chat.group_icon_update_failed"
"chat.typing_indicator.started"
"chat.typing_indicator.stopped"
"phone_number.status_updated"
"call.initiated"
"call.ringing"
"call.answered"
"call.ended"
"call.failed"
"call.declined"
"call.no_answer"
"location.sharing.started"
"location.sharing.stopped"
"payment.succeeded"
"payment.failed"
"payment.canceled"
"payment.expired"
partner_id: str

Partner identifier. Present on all webhooks for cross-referencing.

trace_id: str

Trace ID for debugging and correlation across systems.

webhook_version: str

Date-based webhook payload version. Determined by the ?version= query parameter in your webhook subscription URL. If no version parameter is specified, defaults based on subscription creation date.