# Webhooks

## Domain Types

### Message Event V2

- `type MessageEventV2 struct{…}`

  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 string`

    Message identifier

  - `Chat MessageEventV2Chat`

    Chat information

    - `ID string`

      Chat identifier

    - `HealthStatus MessageEventV2ChatHealthStatus`

      **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

      See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

      - `DocURL string`

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

      - `Status string`

        Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

        `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
        The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
        does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
        casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
        soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
        in immediately — a reply in any conversation with you counts, the same way the block does.

        `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
        a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
        Group threads are never marked and are never blocked.

        Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
        `2024`) before the message is queued, across every chat and every line on your account. Nothing is
        delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
        request.

        - `const MessageEventV2ChatHealthStatusStatusHealthy MessageEventV2ChatHealthStatusStatus = "HEALTHY"`

        - `const MessageEventV2ChatHealthStatusStatusAtRisk MessageEventV2ChatHealthStatusStatus = "AT_RISK"`

        - `const MessageEventV2ChatHealthStatusStatusCritical MessageEventV2ChatHealthStatusStatus = "CRITICAL"`

        - `const MessageEventV2ChatHealthStatusStatusOptedOut MessageEventV2ChatHealthStatusStatus = "OPTED_OUT"`

      - `UpdatedAt Time`

        When this status last changed.

    - `IsGroup bool`

      Whether this is a group chat

    - `OwnerHandle ChatHandle`

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

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

  - `Direction MessageEventV2Direction`

    Message direction - "outbound" if sent by you, "inbound" if received

    - `const MessageEventV2DirectionInbound MessageEventV2Direction = "inbound"`

    - `const MessageEventV2DirectionOutbound MessageEventV2Direction = "outbound"`

  - `Parts []MessageEventV2PartUnion`

    Message parts (text and/or media)

    - `type SchemasTextPartResponse struct{…}`

      A text message part

      - `Type SchemasTextPartResponseType`

        Indicates this is a text message part

        - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

      - `Value string`

        The text content

      - `Mention string`

        DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
        of the **first** mention on this part. A part may carry several mentions; this
        field shows only the first in `value` order, so it cannot be used to determine
        whether a given participant was mentioned. `null` when the part carries no mention.

      - `MentionRange []int64`

        DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
        `value` highlighted as the **first** mention only. `null` when the range was
        omitted (the whole `value` is highlighted) or the part carries no mention.
        *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

      - `Mentions []SchemasTextPartResponseMention`

        Every mention on this part, in the order they appear in `value`. `null` when the
        part carries no mention. A part can carry several mentions of different people —
        check `is_me` to tell whether this line was one of them.

        Only iMessage carries mentions. On a received message this is populated when the
        sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
        from an SMS or RCS participant arrives as plain text with `mentions` null, even in
        a group where other participants are on iMessage.

        - `Handle string`

          Address of the mentioned participant, exactly as the device recorded it — an E.164
          phone number or an email address.

        - `IsMe bool`

          Whether the mentioned participant is this line.

        - `Range []int64`

          Character range `[start, end)` in `value` highlighted as this mention.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

      - `TextDecorations []TextDecoration`

        Text decorations applied to character ranges in the value

        - `Range []int64`

          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 TextDecorationAnimation`

          Animated text effect to apply. Mutually exclusive with `style`.

          - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

          - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

          - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

          - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

          - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

          - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

          - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

          - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

        - `Style TextDecorationStyle`

          Text style to apply. Mutually exclusive with `animation`.

          - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

          - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

          - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

          - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

    - `type SchemasMediaPartResponse struct{…}`

      A media attachment part

      - `ID string`

        Unique attachment identifier

      - `Filename string`

        Original filename

      - `MimeType string`

        MIME type of the file

      - `SizeBytes int64`

        File size in bytes

      - `Type SchemasMediaPartResponseType`

        Indicates this is a media attachment part

        - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

      - `URL string`

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

    - `type MessageEventV2PartLink struct{…}`

      A rich link preview part

      - `Type Link`

        Indicates this is a rich link preview part

        - `const LinkLink Link = "link"`

      - `Value string`

        The URL

    - `type MessageEventV2PartIMessageApp struct{…}`

      An iMessage app card part.

      - `App MessageEventV2PartIMessageAppApp`

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

        - `BundleID string`

          Bundle identifier of the Messages app extension.

        - `Name string`

          Display name of the app.

        - `TeamID string`

          The app's 10-character team identifier.

        - `AppStoreID int64`

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

      - `Layout MessageEventV2PartIMessageAppLayout`

        Visible layout of the card.

        - `Caption string`

          Primary label, top-left and bold.

        - `Subcaption string`

          Secondary label, below caption on the left.

        - `TrailingCaption string`

          Label shown top-right.

        - `TrailingSubcaption string`

          Label shown below trailing_caption.

      - `Type IMessageApp`

        Indicates this is an iMessage app card part.

        - `const IMessageAppIMessageApp IMessageApp = "imessage_app"`

      - `URL string`

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

      - `FallbackText string`

        Fallback text for surfaces that cannot render the card.

    - `type MessageEventV2PartAppClip struct{…}`

      An Apple Pay App Clip payment card part

      - `Type AppClip`

        Indicates this is an App Clip payment card part

        - `const AppClipAppClip AppClip = "app_clip"`

      - `Value string`

        The checkout link the card opens

      - `Description string`

        The card's summary line, composed by Linq from the checkout session

      - `ImageURL string`

        The card's preview image

      - `Title string`

        The card's headline, composed by Linq from the checkout session

  - `SenderHandle ChatHandle`

    The handle that sent this message

  - `Service ServiceType`

    Messaging service type

  - `DeliveredAt Time`

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

  - `Effect SchemasMessageEffect`

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

    - `Name string`

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

    - `Type SchemasMessageEffectType`

      Effect category

      - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

      - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

  - `IdempotencyKey string`

    Idempotency key for deduplication of outbound messages.

  - `PreferredService MessageEventV2PreferredService`

    Preferred messaging service type. Includes "auto" for default fallback behavior.

    - `const MessageEventV2PreferredServiceIMessage MessageEventV2PreferredService = "iMessage"`

    - `const MessageEventV2PreferredServiceSMS MessageEventV2PreferredService = "SMS"`

    - `const MessageEventV2PreferredServiceRCS MessageEventV2PreferredService = "RCS"`

    - `const MessageEventV2PreferredServiceAuto MessageEventV2PreferredService = "auto"`

  - `ReadAt Time`

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

  - `ReconciledAt Time`

    Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

  - `ReplyTo MessageEventV2ReplyTo`

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

    - `MessageID string`

      ID of the message being replied to

    - `PartIndex int64`

      Index of the part being replied to

  - `SentAt Time`

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

  - `ZeroRetention bool`

    True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

### Message Payload

- `type MessagePayload struct{…}`

  Message content nested within webhook events

  - `ID string`

    Message identifier

  - `CreatedAt Time`

    When the message record was created

  - `DeliveredAt Time`

    When the message was delivered

  - `Effect SchemasMessageEffect`

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

    - `Name string`

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

    - `Type SchemasMessageEffectType`

      Effect category

      - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

      - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

  - `IsDelivered bool`

    Whether the message has been delivered

  - `IsRead bool`

    Whether the message has been read

  - `Parts []MessagePayloadPartUnion`

    Message content parts (text and/or media)

    - `type SchemasTextPartResponse struct{…}`

      A text message part

      - `Type SchemasTextPartResponseType`

        Indicates this is a text message part

        - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

      - `Value string`

        The text content

      - `Mention string`

        DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
        of the **first** mention on this part. A part may carry several mentions; this
        field shows only the first in `value` order, so it cannot be used to determine
        whether a given participant was mentioned. `null` when the part carries no mention.

      - `MentionRange []int64`

        DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
        `value` highlighted as the **first** mention only. `null` when the range was
        omitted (the whole `value` is highlighted) or the part carries no mention.
        *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

      - `Mentions []SchemasTextPartResponseMention`

        Every mention on this part, in the order they appear in `value`. `null` when the
        part carries no mention. A part can carry several mentions of different people —
        check `is_me` to tell whether this line was one of them.

        Only iMessage carries mentions. On a received message this is populated when the
        sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
        from an SMS or RCS participant arrives as plain text with `mentions` null, even in
        a group where other participants are on iMessage.

        - `Handle string`

          Address of the mentioned participant, exactly as the device recorded it — an E.164
          phone number or an email address.

        - `IsMe bool`

          Whether the mentioned participant is this line.

        - `Range []int64`

          Character range `[start, end)` in `value` highlighted as this mention.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

      - `TextDecorations []TextDecoration`

        Text decorations applied to character ranges in the value

        - `Range []int64`

          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 TextDecorationAnimation`

          Animated text effect to apply. Mutually exclusive with `style`.

          - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

          - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

          - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

          - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

          - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

          - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

          - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

          - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

        - `Style TextDecorationStyle`

          Text style to apply. Mutually exclusive with `animation`.

          - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

          - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

          - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

          - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

    - `type SchemasMediaPartResponse struct{…}`

      A media attachment part

      - `ID string`

        Unique attachment identifier

      - `Filename string`

        Original filename

      - `MimeType string`

        MIME type of the file

      - `SizeBytes int64`

        File size in bytes

      - `Type SchemasMediaPartResponseType`

        Indicates this is a media attachment part

        - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

      - `URL string`

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

    - `MessagePayloadPartSchemasLinkPartResponse`

      - `Type string`

        Indicates this is a rich link preview part

        - `const MessagePayloadPartSchemasLinkPartResponseTypeLink MessagePayloadPartSchemasLinkPartResponseType = "link"`

      - `Value string`

        The URL

    - `MessagePayloadPartSchemasIMessageAppPartResponse`

      - `App MessagePayloadPartSchemasIMessageAppPartResponseApp`

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

        - `BundleID string`

          Bundle identifier of the Messages app extension.

        - `Name string`

          Display name of the app.

        - `TeamID string`

          The app's 10-character team identifier.

        - `AppStoreID int64`

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

      - `Layout MessagePayloadPartSchemasIMessageAppPartResponseLayout`

        Visible layout of the card.

        - `Caption string`

          Primary label, top-left and bold.

        - `Subcaption string`

          Secondary label, below caption on the left.

        - `TrailingCaption string`

          Label shown top-right.

        - `TrailingSubcaption string`

          Label shown below trailing_caption.

      - `Type string`

        Indicates this is an iMessage app card part.

        - `const MessagePayloadPartSchemasIMessageAppPartResponseTypeIMessageApp MessagePayloadPartSchemasIMessageAppPartResponseType = "imessage_app"`

      - `URL string`

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

      - `FallbackText string`

        Fallback text for surfaces that cannot render the card.

    - `MessagePayloadPartSchemasAppClipPartResponse`

      - `Type string`

        Indicates this is an App Clip payment card part

        - `const MessagePayloadPartSchemasAppClipPartResponseTypeAppClip MessagePayloadPartSchemasAppClipPartResponseType = "app_clip"`

      - `Value string`

        The checkout link the card opens

      - `Description string`

        The card's summary line, composed by Linq from the checkout session

      - `ImageURL string`

        The card's preview image

      - `Title string`

        The card's headline, composed by Linq from the checkout session

  - `ReadAt Time`

    When the message was read

  - `ReconciledAt Time`

    Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

  - `ReplyTo MessagePayloadReplyTo`

    Reference to the message this is replying to

    - `MessageID string`

      The ID of the message being replied to

    - `PartIndex int64`

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

  - `SentAt Time`

    When the message was sent

  - `UpdatedAt Time`

    When the message record was last updated

  - `ZeroRetention bool`

    True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

### Reaction Event Base

- `type ReactionEventBase struct{…}`

  - `IsFromMe bool`

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

  - `ReactionType 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.

    - `const ReactionTypeLove ReactionType = "love"`

    - `const ReactionTypeLike ReactionType = "like"`

    - `const ReactionTypeDislike ReactionType = "dislike"`

    - `const ReactionTypeLaugh ReactionType = "laugh"`

    - `const ReactionTypeEmphasize ReactionType = "emphasize"`

    - `const ReactionTypeQuestion ReactionType = "question"`

    - `const ReactionTypeCustom ReactionType = "custom"`

    - `const ReactionTypeSticker ReactionType = "sticker"`

  - `ChatID string`

    Chat identifier (UUID)

  - `CustomEmoji string`

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

  - `From string`

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

  - `FromHandle ChatHandle`

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

    - `ID string`

      Unique identifier for this handle

    - `Handle string`

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

    - `JoinedAt Time`

      When this participant joined the chat

    - `Service ServiceType`

      Messaging service type

      - `const ServiceTypeIMessage ServiceType = "iMessage"`

      - `const ServiceTypeSMS ServiceType = "SMS"`

      - `const ServiceTypeRCS ServiceType = "RCS"`

    - `IsMe bool`

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

    - `LeftAt Time`

      When they left (if applicable)

    - `Status ChatHandleStatus`

      Participant status

      - `const ChatHandleStatusActive ChatHandleStatus = "active"`

      - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

      - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

  - `MessageID string`

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

  - `PartIndex int64`

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

  - `ReactedAt Time`

    When the reaction was added or removed

  - `ReactionID string`

    Identifier for this reaction. Pass it to
    `PATCH /v3/messages/{messageId}/reactions/{reactionId}` to move a sticker.
    Stickers stack, so this is what distinguishes one sticker from another on the
    same message.

  - `Service ServiceType`

    Messaging service type

  - `Sticker ReactionEventBaseSticker`

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

    - `FileName string`

      Filename of the sticker

    - `Height int64`

      Sticker image height in pixels

    - `MimeType string`

      MIME type of the sticker image

    - `URL string`

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

    - `Width int64`

      Sticker image width in pixels

### Schemas Media Part Response

- `type SchemasMediaPartResponse struct{…}`

  A media attachment part

  - `ID string`

    Unique attachment identifier

  - `Filename string`

    Original filename

  - `MimeType string`

    MIME type of the file

  - `SizeBytes int64`

    File size in bytes

  - `Type SchemasMediaPartResponseType`

    Indicates this is a media attachment part

    - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

  - `URL string`

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

### Schemas Message Effect

- `type SchemasMessageEffect struct{…}`

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

  - `Name string`

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

  - `Type SchemasMessageEffectType`

    Effect category

    - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

    - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

### Schemas Text Part Response

- `type SchemasTextPartResponse struct{…}`

  A text message part

  - `Type SchemasTextPartResponseType`

    Indicates this is a text message part

    - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

  - `Value string`

    The text content

  - `Mention string`

    DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
    of the **first** mention on this part. A part may carry several mentions; this
    field shows only the first in `value` order, so it cannot be used to determine
    whether a given participant was mentioned. `null` when the part carries no mention.

  - `MentionRange []int64`

    DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
    `value` highlighted as the **first** mention only. `null` when the range was
    omitted (the whole `value` is highlighted) or the part carries no mention.
    *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

  - `Mentions []SchemasTextPartResponseMention`

    Every mention on this part, in the order they appear in `value`. `null` when the
    part carries no mention. A part can carry several mentions of different people —
    check `is_me` to tell whether this line was one of them.

    Only iMessage carries mentions. On a received message this is populated when the
    sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
    from an SMS or RCS participant arrives as plain text with `mentions` null, even in
    a group where other participants are on iMessage.

    - `Handle string`

      Address of the mentioned participant, exactly as the device recorded it — an E.164
      phone number or an email address.

    - `IsMe bool`

      Whether the mentioned participant is this line.

    - `Range []int64`

      Character range `[start, end)` in `value` highlighted as this mention.
      *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

  - `TextDecorations []TextDecoration`

    Text decorations applied to character ranges in the value

    - `Range []int64`

      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 TextDecorationAnimation`

      Animated text effect to apply. Mutually exclusive with `style`.

      - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

      - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

      - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

      - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

      - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

      - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

      - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

      - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

    - `Style TextDecorationStyle`

      Text style to apply. Mutually exclusive with `animation`.

      - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

      - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

      - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

      - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

### message.sent

- `type MessageSentWebhookEvent struct{…}`

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

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data 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 string`

      Message identifier

    - `Chat MessageEventV2Chat`

      Chat information

      - `ID string`

        Chat identifier

      - `HealthStatus MessageEventV2ChatHealthStatus`

        **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

        See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

        - `DocURL string`

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

        - `Status string`

          Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

          `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
          The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
          does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
          casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
          soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
          in immediately — a reply in any conversation with you counts, the same way the block does.

          `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
          a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
          Group threads are never marked and are never blocked.

          Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
          `2024`) before the message is queued, across every chat and every line on your account. Nothing is
          delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
          request.

          - `const MessageEventV2ChatHealthStatusStatusHealthy MessageEventV2ChatHealthStatusStatus = "HEALTHY"`

          - `const MessageEventV2ChatHealthStatusStatusAtRisk MessageEventV2ChatHealthStatusStatus = "AT_RISK"`

          - `const MessageEventV2ChatHealthStatusStatusCritical MessageEventV2ChatHealthStatusStatus = "CRITICAL"`

          - `const MessageEventV2ChatHealthStatusStatusOptedOut MessageEventV2ChatHealthStatusStatus = "OPTED_OUT"`

        - `UpdatedAt Time`

          When this status last changed.

      - `IsGroup bool`

        Whether this is a group chat

      - `OwnerHandle ChatHandle`

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

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction MessageEventV2Direction`

      Message direction - "outbound" if sent by you, "inbound" if received

      - `const MessageEventV2DirectionInbound MessageEventV2Direction = "inbound"`

      - `const MessageEventV2DirectionOutbound MessageEventV2Direction = "outbound"`

    - `Parts []MessageEventV2PartUnion`

      Message parts (text and/or media)

      - `type SchemasTextPartResponse struct{…}`

        A text message part

        - `Type SchemasTextPartResponseType`

          Indicates this is a text message part

          - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

        - `Value string`

          The text content

        - `Mention string`

          DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
          of the **first** mention on this part. A part may carry several mentions; this
          field shows only the first in `value` order, so it cannot be used to determine
          whether a given participant was mentioned. `null` when the part carries no mention.

        - `MentionRange []int64`

          DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
          `value` highlighted as the **first** mention only. `null` when the range was
          omitted (the whole `value` is highlighted) or the part carries no mention.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `Mentions []SchemasTextPartResponseMention`

          Every mention on this part, in the order they appear in `value`. `null` when the
          part carries no mention. A part can carry several mentions of different people —
          check `is_me` to tell whether this line was one of them.

          Only iMessage carries mentions. On a received message this is populated when the
          sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
          from an SMS or RCS participant arrives as plain text with `mentions` null, even in
          a group where other participants are on iMessage.

          - `Handle string`

            Address of the mentioned participant, exactly as the device recorded it — an E.164
            phone number or an email address.

          - `IsMe bool`

            Whether the mentioned participant is this line.

          - `Range []int64`

            Character range `[start, end)` in `value` highlighted as this mention.
            *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `TextDecorations []TextDecoration`

          Text decorations applied to character ranges in the value

          - `Range []int64`

            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 TextDecorationAnimation`

            Animated text effect to apply. Mutually exclusive with `style`.

            - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

            - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

            - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

            - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

            - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

            - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

            - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

            - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

          - `Style TextDecorationStyle`

            Text style to apply. Mutually exclusive with `animation`.

            - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

            - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

            - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

            - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

      - `type SchemasMediaPartResponse struct{…}`

        A media attachment part

        - `ID string`

          Unique attachment identifier

        - `Filename string`

          Original filename

        - `MimeType string`

          MIME type of the file

        - `SizeBytes int64`

          File size in bytes

        - `Type SchemasMediaPartResponseType`

          Indicates this is a media attachment part

          - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

        - `URL string`

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

      - `type MessageEventV2PartLink struct{…}`

        A rich link preview part

        - `Type Link`

          Indicates this is a rich link preview part

          - `const LinkLink Link = "link"`

        - `Value string`

          The URL

      - `type MessageEventV2PartIMessageApp struct{…}`

        An iMessage app card part.

        - `App MessageEventV2PartIMessageAppApp`

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

          - `BundleID string`

            Bundle identifier of the Messages app extension.

          - `Name string`

            Display name of the app.

          - `TeamID string`

            The app's 10-character team identifier.

          - `AppStoreID int64`

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

        - `Layout MessageEventV2PartIMessageAppLayout`

          Visible layout of the card.

          - `Caption string`

            Primary label, top-left and bold.

          - `Subcaption string`

            Secondary label, below caption on the left.

          - `TrailingCaption string`

            Label shown top-right.

          - `TrailingSubcaption string`

            Label shown below trailing_caption.

        - `Type IMessageApp`

          Indicates this is an iMessage app card part.

          - `const IMessageAppIMessageApp IMessageApp = "imessage_app"`

        - `URL string`

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

        - `FallbackText string`

          Fallback text for surfaces that cannot render the card.

      - `type MessageEventV2PartAppClip struct{…}`

        An Apple Pay App Clip payment card part

        - `Type AppClip`

          Indicates this is an App Clip payment card part

          - `const AppClipAppClip AppClip = "app_clip"`

        - `Value string`

          The checkout link the card opens

        - `Description string`

          The card's summary line, composed by Linq from the checkout session

        - `ImageURL string`

          The card's preview image

        - `Title string`

          The card's headline, composed by Linq from the checkout session

    - `SenderHandle ChatHandle`

      The handle that sent this message

    - `Service ServiceType`

      Messaging service type

    - `DeliveredAt Time`

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

    - `Effect SchemasMessageEffect`

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

      - `Name string`

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

      - `Type SchemasMessageEffectType`

        Effect category

        - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

        - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

    - `IdempotencyKey string`

      Idempotency key for deduplication of outbound messages.

    - `PreferredService MessageEventV2PreferredService`

      Preferred messaging service type. Includes "auto" for default fallback behavior.

      - `const MessageEventV2PreferredServiceIMessage MessageEventV2PreferredService = "iMessage"`

      - `const MessageEventV2PreferredServiceSMS MessageEventV2PreferredService = "SMS"`

      - `const MessageEventV2PreferredServiceRCS MessageEventV2PreferredService = "RCS"`

      - `const MessageEventV2PreferredServiceAuto MessageEventV2PreferredService = "auto"`

    - `ReadAt Time`

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

    - `ReconciledAt Time`

      Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

    - `ReplyTo MessageEventV2ReplyTo`

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

      - `MessageID string`

        ID of the message being replied to

      - `PartIndex int64`

        Index of the part being replied to

    - `SentAt Time`

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

    - `ZeroRetention bool`

      True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### message.received

- `type MessageReceivedWebhookEvent struct{…}`

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

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data 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 string`

      Message identifier

    - `Chat MessageEventV2Chat`

      Chat information

      - `ID string`

        Chat identifier

      - `HealthStatus MessageEventV2ChatHealthStatus`

        **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

        See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

        - `DocURL string`

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

        - `Status string`

          Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

          `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
          The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
          does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
          casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
          soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
          in immediately — a reply in any conversation with you counts, the same way the block does.

          `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
          a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
          Group threads are never marked and are never blocked.

          Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
          `2024`) before the message is queued, across every chat and every line on your account. Nothing is
          delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
          request.

          - `const MessageEventV2ChatHealthStatusStatusHealthy MessageEventV2ChatHealthStatusStatus = "HEALTHY"`

          - `const MessageEventV2ChatHealthStatusStatusAtRisk MessageEventV2ChatHealthStatusStatus = "AT_RISK"`

          - `const MessageEventV2ChatHealthStatusStatusCritical MessageEventV2ChatHealthStatusStatus = "CRITICAL"`

          - `const MessageEventV2ChatHealthStatusStatusOptedOut MessageEventV2ChatHealthStatusStatus = "OPTED_OUT"`

        - `UpdatedAt Time`

          When this status last changed.

      - `IsGroup bool`

        Whether this is a group chat

      - `OwnerHandle ChatHandle`

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

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction MessageEventV2Direction`

      Message direction - "outbound" if sent by you, "inbound" if received

      - `const MessageEventV2DirectionInbound MessageEventV2Direction = "inbound"`

      - `const MessageEventV2DirectionOutbound MessageEventV2Direction = "outbound"`

    - `Parts []MessageEventV2PartUnion`

      Message parts (text and/or media)

      - `type SchemasTextPartResponse struct{…}`

        A text message part

        - `Type SchemasTextPartResponseType`

          Indicates this is a text message part

          - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

        - `Value string`

          The text content

        - `Mention string`

          DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
          of the **first** mention on this part. A part may carry several mentions; this
          field shows only the first in `value` order, so it cannot be used to determine
          whether a given participant was mentioned. `null` when the part carries no mention.

        - `MentionRange []int64`

          DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
          `value` highlighted as the **first** mention only. `null` when the range was
          omitted (the whole `value` is highlighted) or the part carries no mention.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `Mentions []SchemasTextPartResponseMention`

          Every mention on this part, in the order they appear in `value`. `null` when the
          part carries no mention. A part can carry several mentions of different people —
          check `is_me` to tell whether this line was one of them.

          Only iMessage carries mentions. On a received message this is populated when the
          sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
          from an SMS or RCS participant arrives as plain text with `mentions` null, even in
          a group where other participants are on iMessage.

          - `Handle string`

            Address of the mentioned participant, exactly as the device recorded it — an E.164
            phone number or an email address.

          - `IsMe bool`

            Whether the mentioned participant is this line.

          - `Range []int64`

            Character range `[start, end)` in `value` highlighted as this mention.
            *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `TextDecorations []TextDecoration`

          Text decorations applied to character ranges in the value

          - `Range []int64`

            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 TextDecorationAnimation`

            Animated text effect to apply. Mutually exclusive with `style`.

            - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

            - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

            - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

            - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

            - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

            - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

            - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

            - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

          - `Style TextDecorationStyle`

            Text style to apply. Mutually exclusive with `animation`.

            - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

            - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

            - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

            - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

      - `type SchemasMediaPartResponse struct{…}`

        A media attachment part

        - `ID string`

          Unique attachment identifier

        - `Filename string`

          Original filename

        - `MimeType string`

          MIME type of the file

        - `SizeBytes int64`

          File size in bytes

        - `Type SchemasMediaPartResponseType`

          Indicates this is a media attachment part

          - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

        - `URL string`

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

      - `type MessageEventV2PartLink struct{…}`

        A rich link preview part

        - `Type Link`

          Indicates this is a rich link preview part

          - `const LinkLink Link = "link"`

        - `Value string`

          The URL

      - `type MessageEventV2PartIMessageApp struct{…}`

        An iMessage app card part.

        - `App MessageEventV2PartIMessageAppApp`

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

          - `BundleID string`

            Bundle identifier of the Messages app extension.

          - `Name string`

            Display name of the app.

          - `TeamID string`

            The app's 10-character team identifier.

          - `AppStoreID int64`

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

        - `Layout MessageEventV2PartIMessageAppLayout`

          Visible layout of the card.

          - `Caption string`

            Primary label, top-left and bold.

          - `Subcaption string`

            Secondary label, below caption on the left.

          - `TrailingCaption string`

            Label shown top-right.

          - `TrailingSubcaption string`

            Label shown below trailing_caption.

        - `Type IMessageApp`

          Indicates this is an iMessage app card part.

          - `const IMessageAppIMessageApp IMessageApp = "imessage_app"`

        - `URL string`

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

        - `FallbackText string`

          Fallback text for surfaces that cannot render the card.

      - `type MessageEventV2PartAppClip struct{…}`

        An Apple Pay App Clip payment card part

        - `Type AppClip`

          Indicates this is an App Clip payment card part

          - `const AppClipAppClip AppClip = "app_clip"`

        - `Value string`

          The checkout link the card opens

        - `Description string`

          The card's summary line, composed by Linq from the checkout session

        - `ImageURL string`

          The card's preview image

        - `Title string`

          The card's headline, composed by Linq from the checkout session

    - `SenderHandle ChatHandle`

      The handle that sent this message

    - `Service ServiceType`

      Messaging service type

    - `DeliveredAt Time`

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

    - `Effect SchemasMessageEffect`

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

      - `Name string`

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

      - `Type SchemasMessageEffectType`

        Effect category

        - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

        - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

    - `IdempotencyKey string`

      Idempotency key for deduplication of outbound messages.

    - `PreferredService MessageEventV2PreferredService`

      Preferred messaging service type. Includes "auto" for default fallback behavior.

      - `const MessageEventV2PreferredServiceIMessage MessageEventV2PreferredService = "iMessage"`

      - `const MessageEventV2PreferredServiceSMS MessageEventV2PreferredService = "SMS"`

      - `const MessageEventV2PreferredServiceRCS MessageEventV2PreferredService = "RCS"`

      - `const MessageEventV2PreferredServiceAuto MessageEventV2PreferredService = "auto"`

    - `ReadAt Time`

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

    - `ReconciledAt Time`

      Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

    - `ReplyTo MessageEventV2ReplyTo`

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

      - `MessageID string`

        ID of the message being replied to

      - `PartIndex int64`

        Index of the part being replied to

    - `SentAt Time`

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

    - `ZeroRetention bool`

      True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### message.read

- `type MessageReadWebhookEvent struct{…}`

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

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data 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 string`

      Message identifier

    - `Chat MessageEventV2Chat`

      Chat information

      - `ID string`

        Chat identifier

      - `HealthStatus MessageEventV2ChatHealthStatus`

        **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

        See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

        - `DocURL string`

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

        - `Status string`

          Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

          `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
          The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
          does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
          casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
          soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
          in immediately — a reply in any conversation with you counts, the same way the block does.

          `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
          a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
          Group threads are never marked and are never blocked.

          Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
          `2024`) before the message is queued, across every chat and every line on your account. Nothing is
          delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
          request.

          - `const MessageEventV2ChatHealthStatusStatusHealthy MessageEventV2ChatHealthStatusStatus = "HEALTHY"`

          - `const MessageEventV2ChatHealthStatusStatusAtRisk MessageEventV2ChatHealthStatusStatus = "AT_RISK"`

          - `const MessageEventV2ChatHealthStatusStatusCritical MessageEventV2ChatHealthStatusStatus = "CRITICAL"`

          - `const MessageEventV2ChatHealthStatusStatusOptedOut MessageEventV2ChatHealthStatusStatus = "OPTED_OUT"`

        - `UpdatedAt Time`

          When this status last changed.

      - `IsGroup bool`

        Whether this is a group chat

      - `OwnerHandle ChatHandle`

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

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction MessageEventV2Direction`

      Message direction - "outbound" if sent by you, "inbound" if received

      - `const MessageEventV2DirectionInbound MessageEventV2Direction = "inbound"`

      - `const MessageEventV2DirectionOutbound MessageEventV2Direction = "outbound"`

    - `Parts []MessageEventV2PartUnion`

      Message parts (text and/or media)

      - `type SchemasTextPartResponse struct{…}`

        A text message part

        - `Type SchemasTextPartResponseType`

          Indicates this is a text message part

          - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

        - `Value string`

          The text content

        - `Mention string`

          DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
          of the **first** mention on this part. A part may carry several mentions; this
          field shows only the first in `value` order, so it cannot be used to determine
          whether a given participant was mentioned. `null` when the part carries no mention.

        - `MentionRange []int64`

          DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
          `value` highlighted as the **first** mention only. `null` when the range was
          omitted (the whole `value` is highlighted) or the part carries no mention.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `Mentions []SchemasTextPartResponseMention`

          Every mention on this part, in the order they appear in `value`. `null` when the
          part carries no mention. A part can carry several mentions of different people —
          check `is_me` to tell whether this line was one of them.

          Only iMessage carries mentions. On a received message this is populated when the
          sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
          from an SMS or RCS participant arrives as plain text with `mentions` null, even in
          a group where other participants are on iMessage.

          - `Handle string`

            Address of the mentioned participant, exactly as the device recorded it — an E.164
            phone number or an email address.

          - `IsMe bool`

            Whether the mentioned participant is this line.

          - `Range []int64`

            Character range `[start, end)` in `value` highlighted as this mention.
            *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `TextDecorations []TextDecoration`

          Text decorations applied to character ranges in the value

          - `Range []int64`

            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 TextDecorationAnimation`

            Animated text effect to apply. Mutually exclusive with `style`.

            - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

            - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

            - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

            - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

            - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

            - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

            - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

            - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

          - `Style TextDecorationStyle`

            Text style to apply. Mutually exclusive with `animation`.

            - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

            - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

            - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

            - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

      - `type SchemasMediaPartResponse struct{…}`

        A media attachment part

        - `ID string`

          Unique attachment identifier

        - `Filename string`

          Original filename

        - `MimeType string`

          MIME type of the file

        - `SizeBytes int64`

          File size in bytes

        - `Type SchemasMediaPartResponseType`

          Indicates this is a media attachment part

          - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

        - `URL string`

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

      - `type MessageEventV2PartLink struct{…}`

        A rich link preview part

        - `Type Link`

          Indicates this is a rich link preview part

          - `const LinkLink Link = "link"`

        - `Value string`

          The URL

      - `type MessageEventV2PartIMessageApp struct{…}`

        An iMessage app card part.

        - `App MessageEventV2PartIMessageAppApp`

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

          - `BundleID string`

            Bundle identifier of the Messages app extension.

          - `Name string`

            Display name of the app.

          - `TeamID string`

            The app's 10-character team identifier.

          - `AppStoreID int64`

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

        - `Layout MessageEventV2PartIMessageAppLayout`

          Visible layout of the card.

          - `Caption string`

            Primary label, top-left and bold.

          - `Subcaption string`

            Secondary label, below caption on the left.

          - `TrailingCaption string`

            Label shown top-right.

          - `TrailingSubcaption string`

            Label shown below trailing_caption.

        - `Type IMessageApp`

          Indicates this is an iMessage app card part.

          - `const IMessageAppIMessageApp IMessageApp = "imessage_app"`

        - `URL string`

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

        - `FallbackText string`

          Fallback text for surfaces that cannot render the card.

      - `type MessageEventV2PartAppClip struct{…}`

        An Apple Pay App Clip payment card part

        - `Type AppClip`

          Indicates this is an App Clip payment card part

          - `const AppClipAppClip AppClip = "app_clip"`

        - `Value string`

          The checkout link the card opens

        - `Description string`

          The card's summary line, composed by Linq from the checkout session

        - `ImageURL string`

          The card's preview image

        - `Title string`

          The card's headline, composed by Linq from the checkout session

    - `SenderHandle ChatHandle`

      The handle that sent this message

    - `Service ServiceType`

      Messaging service type

    - `DeliveredAt Time`

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

    - `Effect SchemasMessageEffect`

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

      - `Name string`

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

      - `Type SchemasMessageEffectType`

        Effect category

        - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

        - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

    - `IdempotencyKey string`

      Idempotency key for deduplication of outbound messages.

    - `PreferredService MessageEventV2PreferredService`

      Preferred messaging service type. Includes "auto" for default fallback behavior.

      - `const MessageEventV2PreferredServiceIMessage MessageEventV2PreferredService = "iMessage"`

      - `const MessageEventV2PreferredServiceSMS MessageEventV2PreferredService = "SMS"`

      - `const MessageEventV2PreferredServiceRCS MessageEventV2PreferredService = "RCS"`

      - `const MessageEventV2PreferredServiceAuto MessageEventV2PreferredService = "auto"`

    - `ReadAt Time`

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

    - `ReconciledAt Time`

      Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

    - `ReplyTo MessageEventV2ReplyTo`

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

      - `MessageID string`

        ID of the message being replied to

      - `PartIndex int64`

        Index of the part being replied to

    - `SentAt Time`

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

    - `ZeroRetention bool`

      True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### message.delivered

- `type MessageDeliveredWebhookEvent struct{…}`

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

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data 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 string`

      Message identifier

    - `Chat MessageEventV2Chat`

      Chat information

      - `ID string`

        Chat identifier

      - `HealthStatus MessageEventV2ChatHealthStatus`

        **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

        See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

        - `DocURL string`

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

        - `Status string`

          Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

          `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
          The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
          does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
          casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
          soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
          in immediately — a reply in any conversation with you counts, the same way the block does.

          `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
          a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
          Group threads are never marked and are never blocked.

          Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
          `2024`) before the message is queued, across every chat and every line on your account. Nothing is
          delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
          request.

          - `const MessageEventV2ChatHealthStatusStatusHealthy MessageEventV2ChatHealthStatusStatus = "HEALTHY"`

          - `const MessageEventV2ChatHealthStatusStatusAtRisk MessageEventV2ChatHealthStatusStatus = "AT_RISK"`

          - `const MessageEventV2ChatHealthStatusStatusCritical MessageEventV2ChatHealthStatusStatus = "CRITICAL"`

          - `const MessageEventV2ChatHealthStatusStatusOptedOut MessageEventV2ChatHealthStatusStatus = "OPTED_OUT"`

        - `UpdatedAt Time`

          When this status last changed.

      - `IsGroup bool`

        Whether this is a group chat

      - `OwnerHandle ChatHandle`

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

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction MessageEventV2Direction`

      Message direction - "outbound" if sent by you, "inbound" if received

      - `const MessageEventV2DirectionInbound MessageEventV2Direction = "inbound"`

      - `const MessageEventV2DirectionOutbound MessageEventV2Direction = "outbound"`

    - `Parts []MessageEventV2PartUnion`

      Message parts (text and/or media)

      - `type SchemasTextPartResponse struct{…}`

        A text message part

        - `Type SchemasTextPartResponseType`

          Indicates this is a text message part

          - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

        - `Value string`

          The text content

        - `Mention string`

          DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
          of the **first** mention on this part. A part may carry several mentions; this
          field shows only the first in `value` order, so it cannot be used to determine
          whether a given participant was mentioned. `null` when the part carries no mention.

        - `MentionRange []int64`

          DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
          `value` highlighted as the **first** mention only. `null` when the range was
          omitted (the whole `value` is highlighted) or the part carries no mention.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `Mentions []SchemasTextPartResponseMention`

          Every mention on this part, in the order they appear in `value`. `null` when the
          part carries no mention. A part can carry several mentions of different people —
          check `is_me` to tell whether this line was one of them.

          Only iMessage carries mentions. On a received message this is populated when the
          sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
          from an SMS or RCS participant arrives as plain text with `mentions` null, even in
          a group where other participants are on iMessage.

          - `Handle string`

            Address of the mentioned participant, exactly as the device recorded it — an E.164
            phone number or an email address.

          - `IsMe bool`

            Whether the mentioned participant is this line.

          - `Range []int64`

            Character range `[start, end)` in `value` highlighted as this mention.
            *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

        - `TextDecorations []TextDecoration`

          Text decorations applied to character ranges in the value

          - `Range []int64`

            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 TextDecorationAnimation`

            Animated text effect to apply. Mutually exclusive with `style`.

            - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

            - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

            - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

            - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

            - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

            - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

            - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

            - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

          - `Style TextDecorationStyle`

            Text style to apply. Mutually exclusive with `animation`.

            - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

            - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

            - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

            - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

      - `type SchemasMediaPartResponse struct{…}`

        A media attachment part

        - `ID string`

          Unique attachment identifier

        - `Filename string`

          Original filename

        - `MimeType string`

          MIME type of the file

        - `SizeBytes int64`

          File size in bytes

        - `Type SchemasMediaPartResponseType`

          Indicates this is a media attachment part

          - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

        - `URL string`

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

      - `type MessageEventV2PartLink struct{…}`

        A rich link preview part

        - `Type Link`

          Indicates this is a rich link preview part

          - `const LinkLink Link = "link"`

        - `Value string`

          The URL

      - `type MessageEventV2PartIMessageApp struct{…}`

        An iMessage app card part.

        - `App MessageEventV2PartIMessageAppApp`

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

          - `BundleID string`

            Bundle identifier of the Messages app extension.

          - `Name string`

            Display name of the app.

          - `TeamID string`

            The app's 10-character team identifier.

          - `AppStoreID int64`

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

        - `Layout MessageEventV2PartIMessageAppLayout`

          Visible layout of the card.

          - `Caption string`

            Primary label, top-left and bold.

          - `Subcaption string`

            Secondary label, below caption on the left.

          - `TrailingCaption string`

            Label shown top-right.

          - `TrailingSubcaption string`

            Label shown below trailing_caption.

        - `Type IMessageApp`

          Indicates this is an iMessage app card part.

          - `const IMessageAppIMessageApp IMessageApp = "imessage_app"`

        - `URL string`

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

        - `FallbackText string`

          Fallback text for surfaces that cannot render the card.

      - `type MessageEventV2PartAppClip struct{…}`

        An Apple Pay App Clip payment card part

        - `Type AppClip`

          Indicates this is an App Clip payment card part

          - `const AppClipAppClip AppClip = "app_clip"`

        - `Value string`

          The checkout link the card opens

        - `Description string`

          The card's summary line, composed by Linq from the checkout session

        - `ImageURL string`

          The card's preview image

        - `Title string`

          The card's headline, composed by Linq from the checkout session

    - `SenderHandle ChatHandle`

      The handle that sent this message

    - `Service ServiceType`

      Messaging service type

    - `DeliveredAt Time`

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

    - `Effect SchemasMessageEffect`

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

      - `Name string`

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

      - `Type SchemasMessageEffectType`

        Effect category

        - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

        - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

    - `IdempotencyKey string`

      Idempotency key for deduplication of outbound messages.

    - `PreferredService MessageEventV2PreferredService`

      Preferred messaging service type. Includes "auto" for default fallback behavior.

      - `const MessageEventV2PreferredServiceIMessage MessageEventV2PreferredService = "iMessage"`

      - `const MessageEventV2PreferredServiceSMS MessageEventV2PreferredService = "SMS"`

      - `const MessageEventV2PreferredServiceRCS MessageEventV2PreferredService = "RCS"`

      - `const MessageEventV2PreferredServiceAuto MessageEventV2PreferredService = "auto"`

    - `ReadAt Time`

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

    - `ReconciledAt Time`

      Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

    - `ReplyTo MessageEventV2ReplyTo`

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

      - `MessageID string`

        ID of the message being replied to

      - `PartIndex int64`

        Index of the part being replied to

    - `SentAt Time`

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

    - `ZeroRetention bool`

      True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### message.failed

- `type MessageFailedWebhookEvent struct{…}`

  Complete webhook payload for message.failed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data MessageFailedWebhookEventData`

    Error details for message.failed webhook events.
    See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

    In rare cases the message can still be delivered after this event fires — a `message.delivered` webhook for the same message ID may follow.

    - `Code int64`

      Error codes in webhook failure events. The possible set varies by event:
      message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
      4008; the group update failure events (chat.group_name_update_failed,
      chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
      carries 1005, 2011, 4001, or 5002.

    - `FailedAt Time`

      When the failure was detected

    - `ChatID string`

      Chat identifier (UUID)

    - `DetailCode int64`

      Opaque diagnostic code identifying the specific failure class within `code`.
      Values are not enumerated and may change without notice — log it and include
      it in support requests, but do not branch on it.

    - `MessageID string`

      Message identifier (UUID)

    - `PreferredService string`

      Preferred messaging service type. Includes "auto" for default fallback behavior.

      - `const MessageFailedWebhookEventDataPreferredServiceIMessage MessageFailedWebhookEventDataPreferredService = "iMessage"`

      - `const MessageFailedWebhookEventDataPreferredServiceSMS MessageFailedWebhookEventDataPreferredService = "SMS"`

      - `const MessageFailedWebhookEventDataPreferredServiceRCS MessageFailedWebhookEventDataPreferredService = "RCS"`

      - `const MessageFailedWebhookEventDataPreferredServiceAuto MessageFailedWebhookEventDataPreferredService = "auto"`

    - `Reason string`

      Human-readable description of the failure

    - `Service ServiceType`

      Messaging service type

      - `const ServiceTypeIMessage ServiceType = "iMessage"`

      - `const ServiceTypeSMS ServiceType = "SMS"`

      - `const ServiceTypeRCS ServiceType = "RCS"`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### message.edited

- `type MessageEditedWebhookEvent struct{…}`

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

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data MessageEditedWebhookEventData`

    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 string`

      Message identifier

    - `Chat MessageEditedWebhookEventDataChat`

      Chat context

      - `ID string`

        Chat identifier

      - `HealthStatus MessageEditedWebhookEventDataChatHealthStatus`

        **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

        See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

        - `DocURL string`

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

        - `Status string`

          Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

          `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
          The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
          does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
          casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
          soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
          in immediately — a reply in any conversation with you counts, the same way the block does.

          `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
          a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
          Group threads are never marked and are never blocked.

          Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
          `2024`) before the message is queued, across every chat and every line on your account. Nothing is
          delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
          request.

          - `const MessageEditedWebhookEventDataChatHealthStatusStatusHealthy MessageEditedWebhookEventDataChatHealthStatusStatus = "HEALTHY"`

          - `const MessageEditedWebhookEventDataChatHealthStatusStatusAtRisk MessageEditedWebhookEventDataChatHealthStatusStatus = "AT_RISK"`

          - `const MessageEditedWebhookEventDataChatHealthStatusStatusCritical MessageEditedWebhookEventDataChatHealthStatusStatus = "CRITICAL"`

          - `const MessageEditedWebhookEventDataChatHealthStatusStatusOptedOut MessageEditedWebhookEventDataChatHealthStatusStatus = "OPTED_OUT"`

        - `UpdatedAt Time`

          When this status last changed.

      - `IsGroup bool`

        Whether this is a group chat

      - `OwnerHandle ChatHandle`

        The handle that owns this chat (your phone number)

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction string`

      "outbound" if you sent the original message, "inbound" if you received it

      - `const MessageEditedWebhookEventDataDirectionOutbound MessageEditedWebhookEventDataDirection = "outbound"`

      - `const MessageEditedWebhookEventDataDirectionInbound MessageEditedWebhookEventDataDirection = "inbound"`

    - `EditedAt Time`

      When the edit occurred

    - `Part MessageEditedWebhookEventDataPart`

      The edited part

      - `Index int64`

        Zero-based index of the edited part within the message

      - `Text string`

        New text content of the part

    - `SenderHandle ChatHandle`

      The handle that sent (and edited) this message

    - `ZeroRetention bool`

      True when the edited message is on a zero-day-retention line. Behavior differs by `direction`: on an outbound edit, `part.text` is empty — you already saw the real edited text once, synchronously, in the edit API response, and Linq never persists it. On an inbound edit, `part.text` is still the real text as received; zero-day-retention only means Linq never persists it.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### reaction.added

- `type ReactionAddedWebhookEvent struct{…}`

  Complete webhook payload for reaction.added events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ReactionEventBase`

    Payload for reaction.added webhook events

    - `IsFromMe bool`

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

    - `ReactionType 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.

      - `const ReactionTypeLove ReactionType = "love"`

      - `const ReactionTypeLike ReactionType = "like"`

      - `const ReactionTypeDislike ReactionType = "dislike"`

      - `const ReactionTypeLaugh ReactionType = "laugh"`

      - `const ReactionTypeEmphasize ReactionType = "emphasize"`

      - `const ReactionTypeQuestion ReactionType = "question"`

      - `const ReactionTypeCustom ReactionType = "custom"`

      - `const ReactionTypeSticker ReactionType = "sticker"`

    - `ChatID string`

      Chat identifier (UUID)

    - `CustomEmoji string`

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

    - `From string`

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

    - `FromHandle ChatHandle`

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

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `MessageID string`

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

    - `PartIndex int64`

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

    - `ReactedAt Time`

      When the reaction was added or removed

    - `ReactionID string`

      Identifier for this reaction. Pass it to
      `PATCH /v3/messages/{messageId}/reactions/{reactionId}` to move a sticker.
      Stickers stack, so this is what distinguishes one sticker from another on the
      same message.

    - `Service ServiceType`

      Messaging service type

    - `Sticker ReactionEventBaseSticker`

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

      - `FileName string`

        Filename of the sticker

      - `Height int64`

        Sticker image height in pixels

      - `MimeType string`

        MIME type of the sticker image

      - `URL string`

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

      - `Width int64`

        Sticker image width in pixels

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### reaction.removed

- `type ReactionRemovedWebhookEvent struct{…}`

  Complete webhook payload for reaction.removed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ReactionEventBase`

    Payload for reaction.removed webhook events

    - `IsFromMe bool`

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

    - `ReactionType 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.

      - `const ReactionTypeLove ReactionType = "love"`

      - `const ReactionTypeLike ReactionType = "like"`

      - `const ReactionTypeDislike ReactionType = "dislike"`

      - `const ReactionTypeLaugh ReactionType = "laugh"`

      - `const ReactionTypeEmphasize ReactionType = "emphasize"`

      - `const ReactionTypeQuestion ReactionType = "question"`

      - `const ReactionTypeCustom ReactionType = "custom"`

      - `const ReactionTypeSticker ReactionType = "sticker"`

    - `ChatID string`

      Chat identifier (UUID)

    - `CustomEmoji string`

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

    - `From string`

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

    - `FromHandle ChatHandle`

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

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `MessageID string`

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

    - `PartIndex int64`

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

    - `ReactedAt Time`

      When the reaction was added or removed

    - `ReactionID string`

      Identifier for this reaction. Pass it to
      `PATCH /v3/messages/{messageId}/reactions/{reactionId}` to move a sticker.
      Stickers stack, so this is what distinguishes one sticker from another on the
      same message.

    - `Service ServiceType`

      Messaging service type

    - `Sticker ReactionEventBaseSticker`

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

      - `FileName string`

        Filename of the sticker

      - `Height int64`

        Sticker image height in pixels

      - `MimeType string`

        MIME type of the sticker image

      - `URL string`

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

      - `Width int64`

        Sticker image width in pixels

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.received

- `type PollReceivedWebhookEvent struct{…}`

  Complete webhook payload for poll.received events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollReceivedWebhookEventData`

    Payload for poll.received — a poll created by someone else and delivered to your line.
    Carries the full poll snapshot (options, no voters yet) at receipt time.

    - `Chat PollReceivedWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `CreatedAt Time`

    - `Direction string`

      - `const PollReceivedWebhookEventDataDirectionInbound PollReceivedWebhookEventDataDirection = "inbound"`

      - `const PollReceivedWebhookEventDataDirectionOutbound PollReceivedWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `Poll PollReceivedWebhookEventDataPoll`

      - `Options []PollReceivedWebhookEventDataPollOption`

        - `CanBeEdited bool`

        - `CreatorHandle ChatHandle`

          The participant who added this option (poll creator for the initial options; whoever
          added later ones). On a poll.updated this differs from the event's `sender_handle`
          whenever a remote participant added the option. Null when unknown.

        - `OptionID string`

        - `Text string`

        - `Voters []PollReceivedWebhookEventDataPollOptionVoter`

          - `Handle string`

          - `VotedAt Time`

      - `TotalVoters int64`

        Distinct participants across the whole poll.

    - `ReceivedAt Time`

    - `Service string`

    - `UpdatedAt Time`

    - `SenderHandle ChatHandle`

      The line that created the poll (is_me=false for an inbound poll).

    - `ZeroRetention bool`

      True when your line has zero-day-retention enabled. Unlike other poll webhooks, option `text` here is still the real, unstripped text as received — Linq never persists it in the database, but this webhook fires from the live inbound event, not a database read, so this is the one place it's shown.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.sent

- `type PollSentWebhookEvent struct{…}`

  Complete webhook payload for poll.sent events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollSentWebhookEventData`

    Payload for poll.sent, poll.delivered, and poll.read webhook events. Timestamps indicate
    state (null = not yet happened): sent → sent_at; delivered → +delivered_at; read → +read_at.

    - `Chat PollSentWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `CreatedAt Time`

    - `Direction string`

      - `const PollSentWebhookEventDataDirectionInbound PollSentWebhookEventDataDirection = "inbound"`

      - `const PollSentWebhookEventDataDirectionOutbound PollSentWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `Poll PollSentWebhookEventDataPoll`

      - `Options []PollSentWebhookEventDataPollOption`

        - `CanBeEdited bool`

        - `CreatorHandle ChatHandle`

          The participant who added this option (poll creator for the initial options; whoever
          added later ones). On a poll.updated this differs from the event's `sender_handle`
          whenever a remote participant added the option. Null when unknown.

        - `OptionID string`

        - `Text string`

        - `Voters []PollSentWebhookEventDataPollOptionVoter`

          - `Handle string`

          - `VotedAt Time`

      - `TotalVoters int64`

        Distinct participants across the whole poll.

    - `Service string`

    - `UpdatedAt Time`

    - `DeliveredAt Time`

    - `ReadAt Time`

    - `SenderHandle ChatHandle`

      The handle that sent the poll.

    - `SentAt Time`

    - `ZeroRetention bool`

      True when this poll was sent on a zero-day-retention line. Every option's `text` is empty in that case — Linq never persists poll option text, so there is nothing to include here. The real text was only ever shown once, synchronously, in the API response when the poll was created or added to.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.delivered

- `type PollDeliveredWebhookEvent struct{…}`

  Complete webhook payload for poll.delivered events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollDeliveredWebhookEventData`

    Payload for poll.sent, poll.delivered, and poll.read webhook events. Timestamps indicate
    state (null = not yet happened): sent → sent_at; delivered → +delivered_at; read → +read_at.

    - `Chat PollDeliveredWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `CreatedAt Time`

    - `Direction string`

      - `const PollDeliveredWebhookEventDataDirectionInbound PollDeliveredWebhookEventDataDirection = "inbound"`

      - `const PollDeliveredWebhookEventDataDirectionOutbound PollDeliveredWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `Poll PollDeliveredWebhookEventDataPoll`

      - `Options []PollDeliveredWebhookEventDataPollOption`

        - `CanBeEdited bool`

        - `CreatorHandle ChatHandle`

          The participant who added this option (poll creator for the initial options; whoever
          added later ones). On a poll.updated this differs from the event's `sender_handle`
          whenever a remote participant added the option. Null when unknown.

        - `OptionID string`

        - `Text string`

        - `Voters []PollDeliveredWebhookEventDataPollOptionVoter`

          - `Handle string`

          - `VotedAt Time`

      - `TotalVoters int64`

        Distinct participants across the whole poll.

    - `Service string`

    - `UpdatedAt Time`

    - `DeliveredAt Time`

    - `ReadAt Time`

    - `SenderHandle ChatHandle`

      The handle that sent the poll.

    - `SentAt Time`

    - `ZeroRetention bool`

      True when this poll was sent on a zero-day-retention line. Every option's `text` is empty in that case — Linq never persists poll option text, so there is nothing to include here. The real text was only ever shown once, synchronously, in the API response when the poll was created or added to.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.read

- `type PollReadWebhookEvent struct{…}`

  Complete webhook payload for poll.read events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollReadWebhookEventData`

    Payload for poll.sent, poll.delivered, and poll.read webhook events. Timestamps indicate
    state (null = not yet happened): sent → sent_at; delivered → +delivered_at; read → +read_at.

    - `Chat PollReadWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `CreatedAt Time`

    - `Direction string`

      - `const PollReadWebhookEventDataDirectionInbound PollReadWebhookEventDataDirection = "inbound"`

      - `const PollReadWebhookEventDataDirectionOutbound PollReadWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `Poll PollReadWebhookEventDataPoll`

      - `Options []PollReadWebhookEventDataPollOption`

        - `CanBeEdited bool`

        - `CreatorHandle ChatHandle`

          The participant who added this option (poll creator for the initial options; whoever
          added later ones). On a poll.updated this differs from the event's `sender_handle`
          whenever a remote participant added the option. Null when unknown.

        - `OptionID string`

        - `Text string`

        - `Voters []PollReadWebhookEventDataPollOptionVoter`

          - `Handle string`

          - `VotedAt Time`

      - `TotalVoters int64`

        Distinct participants across the whole poll.

    - `Service string`

    - `UpdatedAt Time`

    - `DeliveredAt Time`

    - `ReadAt Time`

    - `SenderHandle ChatHandle`

      The handle that sent the poll.

    - `SentAt Time`

    - `ZeroRetention bool`

      True when this poll was sent on a zero-day-retention line. Every option's `text` is empty in that case — Linq never persists poll option text, so there is nothing to include here. The real text was only ever shown once, synchronously, in the API response when the poll was created or added to.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.updated

- `type PollUpdatedWebhookEvent struct{…}`

  Complete webhook payload for poll.updated events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollUpdatedWebhookEventData`

    Payload for poll.updated (option(s) added — add-only).

    - `AddedOptions []PollUpdatedWebhookEventDataAddedOption`

      Only the options this update added — never the ones the poll already had. Fetch the poll to read its full option set.

      - `CanBeEdited bool`

      - `CreatorHandle ChatHandle`

        The participant who added this option (poll creator for the initial options; whoever
        added later ones). On a poll.updated this differs from the event's `sender_handle`
        whenever a remote participant added the option. Null when unknown.

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

      - `OptionID string`

      - `Text string`

      - `Voters []PollUpdatedWebhookEventDataAddedOptionVoter`

        - `Handle string`

        - `VotedAt Time`

    - `Chat PollUpdatedWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

    - `Direction string`

      - `const PollUpdatedWebhookEventDataDirectionInbound PollUpdatedWebhookEventDataDirection = "inbound"`

      - `const PollUpdatedWebhookEventDataDirectionOutbound PollUpdatedWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `SenderHandle ChatHandle`

      Your line — the one that received or sent this update. Always present. On an inbound
      update this is NOT who added the option: use `added_options[].creator_handle` for
      that, which will be the remote participant.

    - `Service string`

    - `ZeroRetention bool`

      True when zero-day-retention applies to this update. Behavior differs by `direction`: on an inbound update, `added_options[].text` is the real text a participant just added; on an outbound update, it is empty — you already saw the real text once, synchronously, in the API response when you made the add, and this webhook is built from a database read, which never stored it.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.failed

- `type PollFailedWebhookEvent struct{…}`

  Complete webhook payload for poll.failed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollFailedWebhookEventData`

    Payload for poll.failed — an outbound poll (or poll action) that failed to send. Carries the
    poll snapshot at failure time plus the error and when it failed.

    - `Chat PollFailedWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction string`

      - `const PollFailedWebhookEventDataDirectionInbound PollFailedWebhookEventDataDirection = "inbound"`

      - `const PollFailedWebhookEventDataDirectionOutbound PollFailedWebhookEventDataDirection = "outbound"`

    - `Error PollFailedWebhookEventDataError`

      - `Code int64`

        Error codes in webhook failure events. The possible set varies by event:
        message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
        4008; the group update failure events (chat.group_name_update_failed,
        chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
        carries 1005, 2011, 4001, or 5002.

      - `Message string`

    - `FailedAt Time`

    - `MessageID string`

    - `Poll PollFailedWebhookEventDataPoll`

      - `Options []PollFailedWebhookEventDataPollOption`

        - `CanBeEdited bool`

        - `CreatorHandle ChatHandle`

          The participant who added this option (poll creator for the initial options; whoever
          added later ones). On a poll.updated this differs from the event's `sender_handle`
          whenever a remote participant added the option. Null when unknown.

        - `OptionID string`

        - `Text string`

        - `Voters []PollFailedWebhookEventDataPollOptionVoter`

          - `Handle string`

          - `VotedAt Time`

      - `TotalVoters int64`

        Distinct participants across the whole poll.

    - `Service string`

    - `SenderHandle ChatHandle`

      Null on failure (the send never landed).

    - `ZeroRetention bool`

      True when this poll was sent on a zero-day-retention line. `poll` is built from the same database read as poll.sent/delivered/read, so every option's `text` is empty.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.vote.added

- `type PollVoteAddedWebhookEvent struct{…}`

  Complete webhook payload for poll.vote.added events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollVoteAddedWebhookEventData`

    Payload for poll.vote.added and poll.vote.removed (one option toggled).

    - `Chat PollVoteAddedWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction string`

      - `const PollVoteAddedWebhookEventDataDirectionInbound PollVoteAddedWebhookEventDataDirection = "inbound"`

      - `const PollVoteAddedWebhookEventDataDirectionOutbound PollVoteAddedWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `OptionID string`

    - `SenderHandle ChatHandle`

      The voter — always present.

    - `Service string`

    - `ZeroRetention bool`

      True when this poll is on a zero-day-retention line. Votes are unaffected by zero-day-retention — a vote choice is always persisted and delivered regardless — this flag is informational only, telling you why this poll's other webhooks (poll.sent, poll.updated, etc.) may carry empty option text.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.vote.removed

- `type PollVoteRemovedWebhookEvent struct{…}`

  Complete webhook payload for poll.vote.removed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PollVoteRemovedWebhookEventData`

    Payload for poll.vote.added and poll.vote.removed (one option toggled).

    - `Chat PollVoteRemovedWebhookEventDataChat`

      Chat info for poll webhook events.

      - `ID string`

      - `IsGroup bool`

      - `OwnerHandle ChatHandle`

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `Direction string`

      - `const PollVoteRemovedWebhookEventDataDirectionInbound PollVoteRemovedWebhookEventDataDirection = "inbound"`

      - `const PollVoteRemovedWebhookEventDataDirectionOutbound PollVoteRemovedWebhookEventDataDirection = "outbound"`

    - `MessageID string`

    - `OptionID string`

    - `SenderHandle ChatHandle`

      The voter — always present.

    - `Service string`

    - `ZeroRetention bool`

      True when this poll is on a zero-day-retention line. Votes are unaffected by zero-day-retention — a vote choice is always persisted and delivered regardless — this flag is informational only, telling you why this poll's other webhooks (poll.sent, poll.updated, etc.) may carry empty option text.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### poll.reaction.added

- `type PollReactionAddedWebhookEvent struct{…}`

  Complete webhook payload for poll.reaction.added events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ReactionEventBase`

    Payload for poll.reaction.added — a reaction on a poll message. Same shape as
    reaction.added; `message_id` is the poll-definition message's ID. Poll reactions are
    stickers, which iMessage cannot remove, so there is no removal counterpart.

    - `IsFromMe bool`

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

    - `ReactionType 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.

      - `const ReactionTypeLove ReactionType = "love"`

      - `const ReactionTypeLike ReactionType = "like"`

      - `const ReactionTypeDislike ReactionType = "dislike"`

      - `const ReactionTypeLaugh ReactionType = "laugh"`

      - `const ReactionTypeEmphasize ReactionType = "emphasize"`

      - `const ReactionTypeQuestion ReactionType = "question"`

      - `const ReactionTypeCustom ReactionType = "custom"`

      - `const ReactionTypeSticker ReactionType = "sticker"`

    - `ChatID string`

      Chat identifier (UUID)

    - `CustomEmoji string`

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

    - `From string`

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

    - `FromHandle ChatHandle`

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

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `MessageID string`

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

    - `PartIndex int64`

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

    - `ReactedAt Time`

      When the reaction was added or removed

    - `ReactionID string`

      Identifier for this reaction. Pass it to
      `PATCH /v3/messages/{messageId}/reactions/{reactionId}` to move a sticker.
      Stickers stack, so this is what distinguishes one sticker from another on the
      same message.

    - `Service ServiceType`

      Messaging service type

    - `Sticker ReactionEventBaseSticker`

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

      - `FileName string`

        Filename of the sticker

      - `Height int64`

        Sticker image height in pixels

      - `MimeType string`

        MIME type of the sticker image

      - `URL string`

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

      - `Width int64`

        Sticker image width in pixels

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### participant.added

- `type ParticipantAddedWebhookEvent struct{…}`

  Complete webhook payload for participant.added events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ParticipantAddedWebhookEventData`

    Payload for participant.added webhook events

    - `Handle string`

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

    - `AddedAt Time`

      When the participant was added

    - `ChatID string`

      Chat identifier (UUID) of the group chat

    - `Participant ChatHandle`

      The added participant as a full handle object

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### participant.removed

- `type ParticipantRemovedWebhookEvent struct{…}`

  Complete webhook payload for participant.removed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ParticipantRemovedWebhookEventData`

    Payload for participant.removed webhook events

    - `Handle string`

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

    - `ChatID string`

      Chat identifier (UUID) of the group chat

    - `Participant ChatHandle`

      The removed participant as a full handle object

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `RemovedAt Time`

      When the participant was removed

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.created

- `type ChatCreatedWebhookEvent struct{…}`

  Complete webhook payload for chat.created events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatCreatedWebhookEventData`

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

    - `ID string`

      Unique identifier for the chat

    - `CreatedAt Time`

      When the chat was created

    - `DisplayName string`

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

    - `Handles []ChatHandle`

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

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `HealthStatus ChatCreatedWebhookEventDataHealthStatus`

      **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

      See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

      - `DocURL string`

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

      - `Status string`

        Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

        `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
        The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
        does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
        casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
        soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
        in immediately — a reply in any conversation with you counts, the same way the block does.

        `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
        a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
        Group threads are never marked and are never blocked.

        Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
        `2024`) before the message is queued, across every chat and every line on your account. Nothing is
        delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
        request.

        - `const ChatCreatedWebhookEventDataHealthStatusStatusHealthy ChatCreatedWebhookEventDataHealthStatusStatus = "HEALTHY"`

        - `const ChatCreatedWebhookEventDataHealthStatusStatusAtRisk ChatCreatedWebhookEventDataHealthStatusStatus = "AT_RISK"`

        - `const ChatCreatedWebhookEventDataHealthStatusStatusCritical ChatCreatedWebhookEventDataHealthStatusStatus = "CRITICAL"`

        - `const ChatCreatedWebhookEventDataHealthStatusStatusOptedOut ChatCreatedWebhookEventDataHealthStatusStatus = "OPTED_OUT"`

      - `UpdatedAt Time`

        When this status last changed.

    - `IsGroup bool`

      Whether this is a group chat

    - `UpdatedAt Time`

      When the chat was last updated

    - `Service ServiceType`

      Messaging service type

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.group_name_updated

- `type ChatGroupNameUpdatedWebhookEvent struct{…}`

  Complete webhook payload for chat.group_name_updated events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatGroupNameUpdatedWebhookEventData`

    Payload for chat.group_name_updated webhook events

    - `ChatID string`

      Chat identifier (UUID) of the group chat

    - `UpdatedAt Time`

      When the update occurred

    - `ChangedByHandle ChatHandle`

      The handle who made the change.

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `NewValue string`

      New group name (null if the name was removed)

    - `OldValue string`

      Previous group name (null if no previous name)

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.group_icon_updated

- `type ChatGroupIconUpdatedWebhookEvent struct{…}`

  Complete webhook payload for chat.group_icon_updated events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatGroupIconUpdatedWebhookEventData`

    Payload for chat.group_icon_updated webhook events

    - `ChatID string`

      Chat identifier (UUID) of the group chat

    - `UpdatedAt Time`

      When the update occurred

    - `ChangedByHandle ChatHandle`

      The handle who made the change.

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

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

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeIMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

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

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `NewValue string`

      New icon URL (null if the icon was removed)

    - `OldValue string`

      Previous icon URL (null if no previous icon)

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.group_name_update_failed

- `type ChatGroupNameUpdateFailedWebhookEvent struct{…}`

  Complete webhook payload for chat.group_name_update_failed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatGroupNameUpdateFailedWebhookEventData`

    Error details for chat.group_name_update_failed webhook events.
    See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

    - `ChatID string`

      Chat identifier (UUID) of the group chat

    - `ErrorCode int64`

      Error codes in webhook failure events. The possible set varies by event:
      message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
      4008; the group update failure events (chat.group_name_update_failed,
      chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
      carries 1005, 2011, 4001, or 5002.

    - `FailedAt Time`

      When the failure was detected

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.group_icon_update_failed

- `type ChatGroupIconUpdateFailedWebhookEvent struct{…}`

  Complete webhook payload for chat.group_icon_update_failed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatGroupIconUpdateFailedWebhookEventData`

    Error details for chat.group_icon_update_failed webhook events.
    See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

    - `ChatID string`

      Chat identifier (UUID) of the group chat

    - `ErrorCode int64`

      Error codes in webhook failure events. The possible set varies by event:
      message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
      4008; the group update failure events (chat.group_name_update_failed,
      chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
      carries 1005, 2011, 4001, or 5002.

    - `FailedAt Time`

      When the failure was detected

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.typing_indicator.started

- `type ChatTypingIndicatorStartedWebhookEvent struct{…}`

  Complete webhook payload for chat.typing_indicator.started events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatTypingIndicatorStartedWebhookEventData`

    Payload for chat.typing_indicator.started webhook events

    - `ChatID string`

      Chat identifier

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.typing_indicator.stopped

- `type ChatTypingIndicatorStoppedWebhookEvent struct{…}`

  Complete webhook payload for chat.typing_indicator.stopped events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatTypingIndicatorStoppedWebhookEventData`

    Payload for chat.typing_indicator.stopped webhook events

    - `ChatID string`

      Chat identifier

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.background_updated

- `type ChatBackgroundUpdatedWebhookEvent struct{…}`

  Complete webhook payload for chat.background_updated events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatBackgroundUpdatedWebhookEventData`

    Payload for chat.background_updated webhook events.

    - `Chat ChatBackgroundUpdatedWebhookEventDataChat`

      Chat information

      - `ID string`

        Chat identifier

      - `IsGroup bool`

        Whether this is a group chat

      - `OwnerHandle ChatHandle`

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

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

          - `const ServiceTypeIMessage ServiceType = "iMessage"`

          - `const ServiceTypeSMS ServiceType = "SMS"`

          - `const ServiceTypeRCS ServiceType = "RCS"`

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

          - `const ChatHandleStatusActive ChatHandleStatus = "active"`

          - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

          - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `ActorHandle ChatHandle`

      Who changed it. `is_me` is true when your own number set it.

    - `Background ChatBackgroundUpdatedWebhookEventDataBackground`

      A chat transcript background. Fields are populated per `type`.

      - `Type string`

        The background family.

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundTypeColor ChatBackgroundUpdatedWebhookEventDataBackgroundType = "color"`

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundTypeDynamic ChatBackgroundUpdatedWebhookEventDataBackgroundType = "dynamic"`

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundTypePhoto ChatBackgroundUpdatedWebhookEventDataBackgroundType = "photo"`

      - `ImageURL string`

        Photo: a hosted URL for the background image, whether you set it or a
        participant did. Apple stores the image, not the URL it came from, so the
        image is re-hosted and this is our URL rather than the one you supplied.
        `null` only if the image could not be hosted.

      - `Shades []string`

        Color: the two gradient stops as hex, top then bottom.

      - `Style string`

        Dynamic: the animated style.

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleSky ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "sky"`

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleWater ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "water"`

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleAurora ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "aurora"`

        - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleGlitter ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "glitter"`

      - `Variant string`

        Color: `custom` (the stored two colors) or a named swatch. Dynamic: the
        variant within the `style` (e.g. `sunrise`).

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### chat.background_update_failed

- `type ChatBackgroundUpdateFailedWebhookEvent struct{…}`

  Complete webhook payload for chat.background_update_failed events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ChatBackgroundUpdateFailedWebhookEventData`

    Error details for chat.background_update_failed webhook events.
    See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

    - `ChatID string`

      Chat identifier (UUID) whose background update failed

    - `ErrorCode int64`

      Error codes in webhook failure events. The possible set varies by event:
      message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
      4008; the group update failure events (chat.group_name_update_failed,
      chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
      carries 1005, 2011, 4001, or 5002.

    - `FailedAt Time`

      When the failure was detected

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### contact_card.received

- `type ContactCardReceivedWebhookEvent struct{…}`

  Complete webhook payload for contact_card.received events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ContactCardReceivedWebhookEventData`

    Payload for contact_card.received webhook events.

    A contact belongs to a line, not to an individual chat. You receive one event per person who
    shares their contact, regardless of how many chats they have in common with your line.

    The event fires again whenever the shared contact's name or media changes.

    - `FirstName string`

      First name from the shared contact card

    - `LastName string`

      Last name from the shared contact card (may be empty)

    - `OwnerHandle string`

      Which of your lines they shared it with.

    - `SenderHandle string`

      The person who shared their card — a phone number or email address.

    - `MediaURL string`

      URL of the contact's media, served from `cdn.linqapp.com`. `null` when the
      contact shared no media, and also when media was shared but could not be
      retrieved — this field does not distinguish the two.

      Download the media and store it yourself. The URL may be signed and expire,
      in as little as 45 minutes, and altering its query string invalidates it
      immediately.

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType 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.

    - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

    - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

    - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

    - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

    - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

    - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

    - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

    - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

    - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

    - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

    - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

    - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

    - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

    - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

    - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

    - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

    - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

    - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

    - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

    - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

    - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

    - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

    - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

    - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

    - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

    - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

    - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

    - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

    - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

    - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

    - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

    - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

    - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

    - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

    - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

    - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

    - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

    - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

    - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

    - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

    - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

    - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

    - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

    - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

    - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

    - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### phone_number.status_updated

- `type PhoneNumberStatusUpdatedWebhookEvent struct{…}`

  Complete webhook payload for phone_number.status_updated events

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PhoneNumberStatusUpdatedWebhookEventData`

    Payload for phone_number.status_updated webhook events

    - `ChangedAt Time`

      When the status change occurred

    - `NewReputation string`

      The new line reputation

      - `const PhoneNumberStatusUpdatedWebhookEventDataNewReputationHealthy PhoneNumberStatusUpdatedWebhookEventDataNewReputation = "HEALTHY"`

      - `const PhoneNumberStatusUpdatedWebhookEventDataNewReputationAtRisk PhoneNumberStatusUpdatedWebhookEventDataNewReputation = "AT_RISK"`

      - `const PhoneNumberStatusUpdatedWebhookEventDataNewReputationCritical PhoneNumberStatusUpdatedWebhookEventDataNewReputation = "CRITICAL"`

    - `NewStatus string`

      The new service status

      - `const PhoneNumberStatusUpdatedWebhookEventDataNewStatusActive PhoneNumberStatusUpdatedWebhookEventDataNewStatus = "ACTIVE"`

      - `const PhoneNumberStatusUpdatedWebhookEventDataNewStatusFlagged PhoneNumberStatusUpdatedWebhookEventDataNewStatus = "FLAGGED"`

    - `PhoneNumber string`

      Phone number in E.164 format

    - `PreviousReputation string`

      The previous line reputation

      - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousReputationHealthy PhoneNumberStatusUpdatedWebhookEventDataPreviousReputation = "HEALTHY"`

      - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousReputationAtRisk PhoneNumberStatusUpdatedWebhookEventDataPreviousReputation = "AT_RISK"`

      - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousReputationCritical PhoneNumberStatusUpdatedWebhookEventDataPreviousReputation = "CRITICAL"`

    - `PreviousStatus string`

      The previous service status

      - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousStatusActive PhoneNumberStatusUpdatedWebhookEventDataPreviousStatus = "ACTIVE"`

      - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousStatusFlagged PhoneNumberStatusUpdatedWebhookEventDataPreviousStatus = "FLAGGED"`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType PhoneNumberStatusUpdatedWebhookEventEventType`

    The type of event

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageSent PhoneNumberStatusUpdatedWebhookEventEventType = "message.sent"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageReceived PhoneNumberStatusUpdatedWebhookEventEventType = "message.received"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageRead PhoneNumberStatusUpdatedWebhookEventEventType = "message.read"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageDelivered PhoneNumberStatusUpdatedWebhookEventEventType = "message.delivered"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageFailed PhoneNumberStatusUpdatedWebhookEventEventType = "message.failed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageEdited PhoneNumberStatusUpdatedWebhookEventEventType = "message.edited"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeReactionAdded PhoneNumberStatusUpdatedWebhookEventEventType = "reaction.added"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeReactionRemoved PhoneNumberStatusUpdatedWebhookEventEventType = "reaction.removed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollReceived PhoneNumberStatusUpdatedWebhookEventEventType = "poll.received"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollFailed PhoneNumberStatusUpdatedWebhookEventEventType = "poll.failed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollSent PhoneNumberStatusUpdatedWebhookEventEventType = "poll.sent"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollDelivered PhoneNumberStatusUpdatedWebhookEventEventType = "poll.delivered"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollRead PhoneNumberStatusUpdatedWebhookEventEventType = "poll.read"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "poll.updated"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollVoteAdded PhoneNumberStatusUpdatedWebhookEventEventType = "poll.vote.added"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollVoteRemoved PhoneNumberStatusUpdatedWebhookEventEventType = "poll.vote.removed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollReactionAdded PhoneNumberStatusUpdatedWebhookEventEventType = "poll.reaction.added"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeParticipantAdded PhoneNumberStatusUpdatedWebhookEventEventType = "participant.added"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeParticipantRemoved PhoneNumberStatusUpdatedWebhookEventEventType = "participant.removed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatCreated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.created"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupNameUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_name_updated"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupIconUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_icon_updated"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupNameUpdateFailed PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupIconUpdateFailed PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatBackgroundUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.background_updated"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatBackgroundUpdateFailed PhoneNumberStatusUpdatedWebhookEventEventType = "chat.background_update_failed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatTypingIndicatorStarted PhoneNumberStatusUpdatedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatTypingIndicatorStopped PhoneNumberStatusUpdatedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePhoneNumberStatusUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "phone_number.status_updated"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeContactCardReceived PhoneNumberStatusUpdatedWebhookEventEventType = "contact_card.received"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallInitiated PhoneNumberStatusUpdatedWebhookEventEventType = "call.initiated"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallRinging PhoneNumberStatusUpdatedWebhookEventEventType = "call.ringing"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallAnswered PhoneNumberStatusUpdatedWebhookEventEventType = "call.answered"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallEnded PhoneNumberStatusUpdatedWebhookEventEventType = "call.ended"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallFailed PhoneNumberStatusUpdatedWebhookEventEventType = "call.failed"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallDeclined PhoneNumberStatusUpdatedWebhookEventEventType = "call.declined"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallNoAnswer PhoneNumberStatusUpdatedWebhookEventEventType = "call.no_answer"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeLocationSharingStarted PhoneNumberStatusUpdatedWebhookEventEventType = "location.sharing.started"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeLocationSharingStopped PhoneNumberStatusUpdatedWebhookEventEventType = "location.sharing.stopped"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentSucceeded PhoneNumberStatusUpdatedWebhookEventEventType = "payment.succeeded"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentCanceled PhoneNumberStatusUpdatedWebhookEventEventType = "payment.canceled"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentExpired PhoneNumberStatusUpdatedWebhookEventEventType = "payment.expired"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentDeclined PhoneNumberStatusUpdatedWebhookEventEventType = "payment.declined"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentAuthorized PhoneNumberStatusUpdatedWebhookEventEventType = "payment.authorized"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeConnectionCreated PhoneNumberStatusUpdatedWebhookEventEventType = "connection.created"`

    - `const PhoneNumberStatusUpdatedWebhookEventEventTypeConnectionRevoked PhoneNumberStatusUpdatedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### connection.created

- `type ConnectionCreatedWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ConnectionCreatedWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const ConnectionCreatedWebhookEventDataStatusSucceeded ConnectionCreatedWebhookEventDataStatus = "succeeded"`

      - `const ConnectionCreatedWebhookEventDataStatusFailed ConnectionCreatedWebhookEventDataStatus = "failed"`

      - `const ConnectionCreatedWebhookEventDataStatusCanceled ConnectionCreatedWebhookEventDataStatus = "canceled"`

      - `const ConnectionCreatedWebhookEventDataStatusExpired ConnectionCreatedWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount ConnectionCreatedWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const ConnectionCreatedWebhookEventDataIntervalDay ConnectionCreatedWebhookEventDataInterval = "day"`

      - `const ConnectionCreatedWebhookEventDataIntervalWeek ConnectionCreatedWebhookEventDataInterval = "week"`

      - `const ConnectionCreatedWebhookEventDataIntervalMonth ConnectionCreatedWebhookEventDataInterval = "month"`

      - `const ConnectionCreatedWebhookEventDataIntervalYear ConnectionCreatedWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const ConnectionCreatedWebhookEventDataModePayment ConnectionCreatedWebhookEventDataMode = "payment"`

      - `const ConnectionCreatedWebhookEventDataModeSubscription ConnectionCreatedWebhookEventDataMode = "subscription"`

    - `Natural ConnectionCreatedWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const ConnectionCreatedWebhookEventDataRailStripe ConnectionCreatedWebhookEventDataRail = "stripe"`

      - `const ConnectionCreatedWebhookEventDataRailNatural ConnectionCreatedWebhookEventDataRail = "natural"`

    - `Stripe ConnectionCreatedWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType ConnectionCreatedWebhookEventEventType`

    - `const ConnectionCreatedWebhookEventEventTypePaymentSucceeded ConnectionCreatedWebhookEventEventType = "payment.succeeded"`

    - `const ConnectionCreatedWebhookEventEventTypePaymentCanceled ConnectionCreatedWebhookEventEventType = "payment.canceled"`

    - `const ConnectionCreatedWebhookEventEventTypePaymentExpired ConnectionCreatedWebhookEventEventType = "payment.expired"`

    - `const ConnectionCreatedWebhookEventEventTypeMessageSent ConnectionCreatedWebhookEventEventType = "message.sent"`

    - `const ConnectionCreatedWebhookEventEventTypeMessageReceived ConnectionCreatedWebhookEventEventType = "message.received"`

    - `const ConnectionCreatedWebhookEventEventTypeMessageRead ConnectionCreatedWebhookEventEventType = "message.read"`

    - `const ConnectionCreatedWebhookEventEventTypeMessageDelivered ConnectionCreatedWebhookEventEventType = "message.delivered"`

    - `const ConnectionCreatedWebhookEventEventTypeMessageFailed ConnectionCreatedWebhookEventEventType = "message.failed"`

    - `const ConnectionCreatedWebhookEventEventTypeMessageEdited ConnectionCreatedWebhookEventEventType = "message.edited"`

    - `const ConnectionCreatedWebhookEventEventTypeReactionAdded ConnectionCreatedWebhookEventEventType = "reaction.added"`

    - `const ConnectionCreatedWebhookEventEventTypeReactionRemoved ConnectionCreatedWebhookEventEventType = "reaction.removed"`

    - `const ConnectionCreatedWebhookEventEventTypePollReceived ConnectionCreatedWebhookEventEventType = "poll.received"`

    - `const ConnectionCreatedWebhookEventEventTypePollFailed ConnectionCreatedWebhookEventEventType = "poll.failed"`

    - `const ConnectionCreatedWebhookEventEventTypePollSent ConnectionCreatedWebhookEventEventType = "poll.sent"`

    - `const ConnectionCreatedWebhookEventEventTypePollDelivered ConnectionCreatedWebhookEventEventType = "poll.delivered"`

    - `const ConnectionCreatedWebhookEventEventTypePollRead ConnectionCreatedWebhookEventEventType = "poll.read"`

    - `const ConnectionCreatedWebhookEventEventTypePollUpdated ConnectionCreatedWebhookEventEventType = "poll.updated"`

    - `const ConnectionCreatedWebhookEventEventTypePollVoteAdded ConnectionCreatedWebhookEventEventType = "poll.vote.added"`

    - `const ConnectionCreatedWebhookEventEventTypePollVoteRemoved ConnectionCreatedWebhookEventEventType = "poll.vote.removed"`

    - `const ConnectionCreatedWebhookEventEventTypePollReactionAdded ConnectionCreatedWebhookEventEventType = "poll.reaction.added"`

    - `const ConnectionCreatedWebhookEventEventTypeParticipantAdded ConnectionCreatedWebhookEventEventType = "participant.added"`

    - `const ConnectionCreatedWebhookEventEventTypeParticipantRemoved ConnectionCreatedWebhookEventEventType = "participant.removed"`

    - `const ConnectionCreatedWebhookEventEventTypeChatCreated ConnectionCreatedWebhookEventEventType = "chat.created"`

    - `const ConnectionCreatedWebhookEventEventTypeChatGroupNameUpdated ConnectionCreatedWebhookEventEventType = "chat.group_name_updated"`

    - `const ConnectionCreatedWebhookEventEventTypeChatGroupIconUpdated ConnectionCreatedWebhookEventEventType = "chat.group_icon_updated"`

    - `const ConnectionCreatedWebhookEventEventTypeChatGroupNameUpdateFailed ConnectionCreatedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const ConnectionCreatedWebhookEventEventTypeChatGroupIconUpdateFailed ConnectionCreatedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const ConnectionCreatedWebhookEventEventTypeChatBackgroundUpdated ConnectionCreatedWebhookEventEventType = "chat.background_updated"`

    - `const ConnectionCreatedWebhookEventEventTypeChatBackgroundUpdateFailed ConnectionCreatedWebhookEventEventType = "chat.background_update_failed"`

    - `const ConnectionCreatedWebhookEventEventTypeChatTypingIndicatorStarted ConnectionCreatedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const ConnectionCreatedWebhookEventEventTypeChatTypingIndicatorStopped ConnectionCreatedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const ConnectionCreatedWebhookEventEventTypePhoneNumberStatusUpdated ConnectionCreatedWebhookEventEventType = "phone_number.status_updated"`

    - `const ConnectionCreatedWebhookEventEventTypeContactCardReceived ConnectionCreatedWebhookEventEventType = "contact_card.received"`

    - `const ConnectionCreatedWebhookEventEventTypeCallInitiated ConnectionCreatedWebhookEventEventType = "call.initiated"`

    - `const ConnectionCreatedWebhookEventEventTypeCallRinging ConnectionCreatedWebhookEventEventType = "call.ringing"`

    - `const ConnectionCreatedWebhookEventEventTypeCallAnswered ConnectionCreatedWebhookEventEventType = "call.answered"`

    - `const ConnectionCreatedWebhookEventEventTypeCallEnded ConnectionCreatedWebhookEventEventType = "call.ended"`

    - `const ConnectionCreatedWebhookEventEventTypeCallFailed ConnectionCreatedWebhookEventEventType = "call.failed"`

    - `const ConnectionCreatedWebhookEventEventTypeCallDeclined ConnectionCreatedWebhookEventEventType = "call.declined"`

    - `const ConnectionCreatedWebhookEventEventTypeCallNoAnswer ConnectionCreatedWebhookEventEventType = "call.no_answer"`

    - `const ConnectionCreatedWebhookEventEventTypeLocationSharingStarted ConnectionCreatedWebhookEventEventType = "location.sharing.started"`

    - `const ConnectionCreatedWebhookEventEventTypeLocationSharingStopped ConnectionCreatedWebhookEventEventType = "location.sharing.stopped"`

    - `const ConnectionCreatedWebhookEventEventTypePaymentDeclined ConnectionCreatedWebhookEventEventType = "payment.declined"`

    - `const ConnectionCreatedWebhookEventEventTypePaymentAuthorized ConnectionCreatedWebhookEventEventType = "payment.authorized"`

    - `const ConnectionCreatedWebhookEventEventTypeConnectionCreated ConnectionCreatedWebhookEventEventType = "connection.created"`

    - `const ConnectionCreatedWebhookEventEventTypeConnectionRevoked ConnectionCreatedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### connection.revoked

- `type ConnectionRevokedWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data ConnectionRevokedWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const ConnectionRevokedWebhookEventDataStatusSucceeded ConnectionRevokedWebhookEventDataStatus = "succeeded"`

      - `const ConnectionRevokedWebhookEventDataStatusFailed ConnectionRevokedWebhookEventDataStatus = "failed"`

      - `const ConnectionRevokedWebhookEventDataStatusCanceled ConnectionRevokedWebhookEventDataStatus = "canceled"`

      - `const ConnectionRevokedWebhookEventDataStatusExpired ConnectionRevokedWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount ConnectionRevokedWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const ConnectionRevokedWebhookEventDataIntervalDay ConnectionRevokedWebhookEventDataInterval = "day"`

      - `const ConnectionRevokedWebhookEventDataIntervalWeek ConnectionRevokedWebhookEventDataInterval = "week"`

      - `const ConnectionRevokedWebhookEventDataIntervalMonth ConnectionRevokedWebhookEventDataInterval = "month"`

      - `const ConnectionRevokedWebhookEventDataIntervalYear ConnectionRevokedWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const ConnectionRevokedWebhookEventDataModePayment ConnectionRevokedWebhookEventDataMode = "payment"`

      - `const ConnectionRevokedWebhookEventDataModeSubscription ConnectionRevokedWebhookEventDataMode = "subscription"`

    - `Natural ConnectionRevokedWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const ConnectionRevokedWebhookEventDataRailStripe ConnectionRevokedWebhookEventDataRail = "stripe"`

      - `const ConnectionRevokedWebhookEventDataRailNatural ConnectionRevokedWebhookEventDataRail = "natural"`

    - `Stripe ConnectionRevokedWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType ConnectionRevokedWebhookEventEventType`

    - `const ConnectionRevokedWebhookEventEventTypePaymentSucceeded ConnectionRevokedWebhookEventEventType = "payment.succeeded"`

    - `const ConnectionRevokedWebhookEventEventTypePaymentCanceled ConnectionRevokedWebhookEventEventType = "payment.canceled"`

    - `const ConnectionRevokedWebhookEventEventTypePaymentExpired ConnectionRevokedWebhookEventEventType = "payment.expired"`

    - `const ConnectionRevokedWebhookEventEventTypeMessageSent ConnectionRevokedWebhookEventEventType = "message.sent"`

    - `const ConnectionRevokedWebhookEventEventTypeMessageReceived ConnectionRevokedWebhookEventEventType = "message.received"`

    - `const ConnectionRevokedWebhookEventEventTypeMessageRead ConnectionRevokedWebhookEventEventType = "message.read"`

    - `const ConnectionRevokedWebhookEventEventTypeMessageDelivered ConnectionRevokedWebhookEventEventType = "message.delivered"`

    - `const ConnectionRevokedWebhookEventEventTypeMessageFailed ConnectionRevokedWebhookEventEventType = "message.failed"`

    - `const ConnectionRevokedWebhookEventEventTypeMessageEdited ConnectionRevokedWebhookEventEventType = "message.edited"`

    - `const ConnectionRevokedWebhookEventEventTypeReactionAdded ConnectionRevokedWebhookEventEventType = "reaction.added"`

    - `const ConnectionRevokedWebhookEventEventTypeReactionRemoved ConnectionRevokedWebhookEventEventType = "reaction.removed"`

    - `const ConnectionRevokedWebhookEventEventTypePollReceived ConnectionRevokedWebhookEventEventType = "poll.received"`

    - `const ConnectionRevokedWebhookEventEventTypePollFailed ConnectionRevokedWebhookEventEventType = "poll.failed"`

    - `const ConnectionRevokedWebhookEventEventTypePollSent ConnectionRevokedWebhookEventEventType = "poll.sent"`

    - `const ConnectionRevokedWebhookEventEventTypePollDelivered ConnectionRevokedWebhookEventEventType = "poll.delivered"`

    - `const ConnectionRevokedWebhookEventEventTypePollRead ConnectionRevokedWebhookEventEventType = "poll.read"`

    - `const ConnectionRevokedWebhookEventEventTypePollUpdated ConnectionRevokedWebhookEventEventType = "poll.updated"`

    - `const ConnectionRevokedWebhookEventEventTypePollVoteAdded ConnectionRevokedWebhookEventEventType = "poll.vote.added"`

    - `const ConnectionRevokedWebhookEventEventTypePollVoteRemoved ConnectionRevokedWebhookEventEventType = "poll.vote.removed"`

    - `const ConnectionRevokedWebhookEventEventTypePollReactionAdded ConnectionRevokedWebhookEventEventType = "poll.reaction.added"`

    - `const ConnectionRevokedWebhookEventEventTypeParticipantAdded ConnectionRevokedWebhookEventEventType = "participant.added"`

    - `const ConnectionRevokedWebhookEventEventTypeParticipantRemoved ConnectionRevokedWebhookEventEventType = "participant.removed"`

    - `const ConnectionRevokedWebhookEventEventTypeChatCreated ConnectionRevokedWebhookEventEventType = "chat.created"`

    - `const ConnectionRevokedWebhookEventEventTypeChatGroupNameUpdated ConnectionRevokedWebhookEventEventType = "chat.group_name_updated"`

    - `const ConnectionRevokedWebhookEventEventTypeChatGroupIconUpdated ConnectionRevokedWebhookEventEventType = "chat.group_icon_updated"`

    - `const ConnectionRevokedWebhookEventEventTypeChatGroupNameUpdateFailed ConnectionRevokedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const ConnectionRevokedWebhookEventEventTypeChatGroupIconUpdateFailed ConnectionRevokedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const ConnectionRevokedWebhookEventEventTypeChatBackgroundUpdated ConnectionRevokedWebhookEventEventType = "chat.background_updated"`

    - `const ConnectionRevokedWebhookEventEventTypeChatBackgroundUpdateFailed ConnectionRevokedWebhookEventEventType = "chat.background_update_failed"`

    - `const ConnectionRevokedWebhookEventEventTypeChatTypingIndicatorStarted ConnectionRevokedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const ConnectionRevokedWebhookEventEventTypeChatTypingIndicatorStopped ConnectionRevokedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const ConnectionRevokedWebhookEventEventTypePhoneNumberStatusUpdated ConnectionRevokedWebhookEventEventType = "phone_number.status_updated"`

    - `const ConnectionRevokedWebhookEventEventTypeContactCardReceived ConnectionRevokedWebhookEventEventType = "contact_card.received"`

    - `const ConnectionRevokedWebhookEventEventTypeCallInitiated ConnectionRevokedWebhookEventEventType = "call.initiated"`

    - `const ConnectionRevokedWebhookEventEventTypeCallRinging ConnectionRevokedWebhookEventEventType = "call.ringing"`

    - `const ConnectionRevokedWebhookEventEventTypeCallAnswered ConnectionRevokedWebhookEventEventType = "call.answered"`

    - `const ConnectionRevokedWebhookEventEventTypeCallEnded ConnectionRevokedWebhookEventEventType = "call.ended"`

    - `const ConnectionRevokedWebhookEventEventTypeCallFailed ConnectionRevokedWebhookEventEventType = "call.failed"`

    - `const ConnectionRevokedWebhookEventEventTypeCallDeclined ConnectionRevokedWebhookEventEventType = "call.declined"`

    - `const ConnectionRevokedWebhookEventEventTypeCallNoAnswer ConnectionRevokedWebhookEventEventType = "call.no_answer"`

    - `const ConnectionRevokedWebhookEventEventTypeLocationSharingStarted ConnectionRevokedWebhookEventEventType = "location.sharing.started"`

    - `const ConnectionRevokedWebhookEventEventTypeLocationSharingStopped ConnectionRevokedWebhookEventEventType = "location.sharing.stopped"`

    - `const ConnectionRevokedWebhookEventEventTypePaymentDeclined ConnectionRevokedWebhookEventEventType = "payment.declined"`

    - `const ConnectionRevokedWebhookEventEventTypePaymentAuthorized ConnectionRevokedWebhookEventEventType = "payment.authorized"`

    - `const ConnectionRevokedWebhookEventEventTypeConnectionCreated ConnectionRevokedWebhookEventEventType = "connection.created"`

    - `const ConnectionRevokedWebhookEventEventTypeConnectionRevoked ConnectionRevokedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### location.sharing.started

- `type LocationSharingStartedWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data LocationSharingStartedWebhookEventData`

    - `BeganAt Time`

      When location sharing started. Always present: falls back to when the share was first observed if the device reported no start time.

    - `ChatID string`

      The chat this share was first sent to. Location sharing is per-contact rather than per-chat, so the location may also be visible in other chats with the same handle; this identifies where the share originated and does not change if the contact later shares into another chat. Null when the originating chat could not be determined.

    - `EndsAt Time`

      When location sharing will expire. Null when sharing indefinitely.

    - `SharedBy string`

      Phone number of the person sharing their location

    - `SharedWith string`

      Your phone number receiving the location

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType LocationSharingStartedWebhookEventEventType`

    - `const LocationSharingStartedWebhookEventEventTypeLocationSharingStarted LocationSharingStartedWebhookEventEventType = "location.sharing.started"`

    - `const LocationSharingStartedWebhookEventEventTypeMessageSent LocationSharingStartedWebhookEventEventType = "message.sent"`

    - `const LocationSharingStartedWebhookEventEventTypeMessageReceived LocationSharingStartedWebhookEventEventType = "message.received"`

    - `const LocationSharingStartedWebhookEventEventTypeMessageRead LocationSharingStartedWebhookEventEventType = "message.read"`

    - `const LocationSharingStartedWebhookEventEventTypeMessageDelivered LocationSharingStartedWebhookEventEventType = "message.delivered"`

    - `const LocationSharingStartedWebhookEventEventTypeMessageFailed LocationSharingStartedWebhookEventEventType = "message.failed"`

    - `const LocationSharingStartedWebhookEventEventTypeMessageEdited LocationSharingStartedWebhookEventEventType = "message.edited"`

    - `const LocationSharingStartedWebhookEventEventTypeReactionAdded LocationSharingStartedWebhookEventEventType = "reaction.added"`

    - `const LocationSharingStartedWebhookEventEventTypeReactionRemoved LocationSharingStartedWebhookEventEventType = "reaction.removed"`

    - `const LocationSharingStartedWebhookEventEventTypePollReceived LocationSharingStartedWebhookEventEventType = "poll.received"`

    - `const LocationSharingStartedWebhookEventEventTypePollFailed LocationSharingStartedWebhookEventEventType = "poll.failed"`

    - `const LocationSharingStartedWebhookEventEventTypePollSent LocationSharingStartedWebhookEventEventType = "poll.sent"`

    - `const LocationSharingStartedWebhookEventEventTypePollDelivered LocationSharingStartedWebhookEventEventType = "poll.delivered"`

    - `const LocationSharingStartedWebhookEventEventTypePollRead LocationSharingStartedWebhookEventEventType = "poll.read"`

    - `const LocationSharingStartedWebhookEventEventTypePollUpdated LocationSharingStartedWebhookEventEventType = "poll.updated"`

    - `const LocationSharingStartedWebhookEventEventTypePollVoteAdded LocationSharingStartedWebhookEventEventType = "poll.vote.added"`

    - `const LocationSharingStartedWebhookEventEventTypePollVoteRemoved LocationSharingStartedWebhookEventEventType = "poll.vote.removed"`

    - `const LocationSharingStartedWebhookEventEventTypePollReactionAdded LocationSharingStartedWebhookEventEventType = "poll.reaction.added"`

    - `const LocationSharingStartedWebhookEventEventTypeParticipantAdded LocationSharingStartedWebhookEventEventType = "participant.added"`

    - `const LocationSharingStartedWebhookEventEventTypeParticipantRemoved LocationSharingStartedWebhookEventEventType = "participant.removed"`

    - `const LocationSharingStartedWebhookEventEventTypeChatCreated LocationSharingStartedWebhookEventEventType = "chat.created"`

    - `const LocationSharingStartedWebhookEventEventTypeChatGroupNameUpdated LocationSharingStartedWebhookEventEventType = "chat.group_name_updated"`

    - `const LocationSharingStartedWebhookEventEventTypeChatGroupIconUpdated LocationSharingStartedWebhookEventEventType = "chat.group_icon_updated"`

    - `const LocationSharingStartedWebhookEventEventTypeChatGroupNameUpdateFailed LocationSharingStartedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const LocationSharingStartedWebhookEventEventTypeChatGroupIconUpdateFailed LocationSharingStartedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const LocationSharingStartedWebhookEventEventTypeChatBackgroundUpdated LocationSharingStartedWebhookEventEventType = "chat.background_updated"`

    - `const LocationSharingStartedWebhookEventEventTypeChatBackgroundUpdateFailed LocationSharingStartedWebhookEventEventType = "chat.background_update_failed"`

    - `const LocationSharingStartedWebhookEventEventTypeChatTypingIndicatorStarted LocationSharingStartedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const LocationSharingStartedWebhookEventEventTypeChatTypingIndicatorStopped LocationSharingStartedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const LocationSharingStartedWebhookEventEventTypePhoneNumberStatusUpdated LocationSharingStartedWebhookEventEventType = "phone_number.status_updated"`

    - `const LocationSharingStartedWebhookEventEventTypeContactCardReceived LocationSharingStartedWebhookEventEventType = "contact_card.received"`

    - `const LocationSharingStartedWebhookEventEventTypeCallInitiated LocationSharingStartedWebhookEventEventType = "call.initiated"`

    - `const LocationSharingStartedWebhookEventEventTypeCallRinging LocationSharingStartedWebhookEventEventType = "call.ringing"`

    - `const LocationSharingStartedWebhookEventEventTypeCallAnswered LocationSharingStartedWebhookEventEventType = "call.answered"`

    - `const LocationSharingStartedWebhookEventEventTypeCallEnded LocationSharingStartedWebhookEventEventType = "call.ended"`

    - `const LocationSharingStartedWebhookEventEventTypeCallFailed LocationSharingStartedWebhookEventEventType = "call.failed"`

    - `const LocationSharingStartedWebhookEventEventTypeCallDeclined LocationSharingStartedWebhookEventEventType = "call.declined"`

    - `const LocationSharingStartedWebhookEventEventTypeCallNoAnswer LocationSharingStartedWebhookEventEventType = "call.no_answer"`

    - `const LocationSharingStartedWebhookEventEventTypeLocationSharingStopped LocationSharingStartedWebhookEventEventType = "location.sharing.stopped"`

    - `const LocationSharingStartedWebhookEventEventTypePaymentSucceeded LocationSharingStartedWebhookEventEventType = "payment.succeeded"`

    - `const LocationSharingStartedWebhookEventEventTypePaymentCanceled LocationSharingStartedWebhookEventEventType = "payment.canceled"`

    - `const LocationSharingStartedWebhookEventEventTypePaymentExpired LocationSharingStartedWebhookEventEventType = "payment.expired"`

    - `const LocationSharingStartedWebhookEventEventTypePaymentDeclined LocationSharingStartedWebhookEventEventType = "payment.declined"`

    - `const LocationSharingStartedWebhookEventEventTypePaymentAuthorized LocationSharingStartedWebhookEventEventType = "payment.authorized"`

    - `const LocationSharingStartedWebhookEventEventTypeConnectionCreated LocationSharingStartedWebhookEventEventType = "connection.created"`

    - `const LocationSharingStartedWebhookEventEventTypeConnectionRevoked LocationSharingStartedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### location.sharing.stopped

- `type LocationSharingStoppedWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data LocationSharingStoppedWebhookEventData`

    - `BeganAt Time`

      When the sharing session started, matching began_at on its started event. Always present.

    - `ChatID string`

      The chat the ended share was first sent to, matching the chat_id on its started event. Sharing always stops for the contact as a whole, never for a single chat, so this is the session's origin rather than the chat it stopped in. Null when the originating chat could not be determined.

    - `EndedAt Time`

      When the sharing session was observed to stop.

    - `SharedBy string`

      Phone number of the person who stopped sharing

    - `SharedWith string`

      Your phone number that was receiving the location

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType LocationSharingStoppedWebhookEventEventType`

    - `const LocationSharingStoppedWebhookEventEventTypeLocationSharingStopped LocationSharingStoppedWebhookEventEventType = "location.sharing.stopped"`

    - `const LocationSharingStoppedWebhookEventEventTypeMessageSent LocationSharingStoppedWebhookEventEventType = "message.sent"`

    - `const LocationSharingStoppedWebhookEventEventTypeMessageReceived LocationSharingStoppedWebhookEventEventType = "message.received"`

    - `const LocationSharingStoppedWebhookEventEventTypeMessageRead LocationSharingStoppedWebhookEventEventType = "message.read"`

    - `const LocationSharingStoppedWebhookEventEventTypeMessageDelivered LocationSharingStoppedWebhookEventEventType = "message.delivered"`

    - `const LocationSharingStoppedWebhookEventEventTypeMessageFailed LocationSharingStoppedWebhookEventEventType = "message.failed"`

    - `const LocationSharingStoppedWebhookEventEventTypeMessageEdited LocationSharingStoppedWebhookEventEventType = "message.edited"`

    - `const LocationSharingStoppedWebhookEventEventTypeReactionAdded LocationSharingStoppedWebhookEventEventType = "reaction.added"`

    - `const LocationSharingStoppedWebhookEventEventTypeReactionRemoved LocationSharingStoppedWebhookEventEventType = "reaction.removed"`

    - `const LocationSharingStoppedWebhookEventEventTypePollReceived LocationSharingStoppedWebhookEventEventType = "poll.received"`

    - `const LocationSharingStoppedWebhookEventEventTypePollFailed LocationSharingStoppedWebhookEventEventType = "poll.failed"`

    - `const LocationSharingStoppedWebhookEventEventTypePollSent LocationSharingStoppedWebhookEventEventType = "poll.sent"`

    - `const LocationSharingStoppedWebhookEventEventTypePollDelivered LocationSharingStoppedWebhookEventEventType = "poll.delivered"`

    - `const LocationSharingStoppedWebhookEventEventTypePollRead LocationSharingStoppedWebhookEventEventType = "poll.read"`

    - `const LocationSharingStoppedWebhookEventEventTypePollUpdated LocationSharingStoppedWebhookEventEventType = "poll.updated"`

    - `const LocationSharingStoppedWebhookEventEventTypePollVoteAdded LocationSharingStoppedWebhookEventEventType = "poll.vote.added"`

    - `const LocationSharingStoppedWebhookEventEventTypePollVoteRemoved LocationSharingStoppedWebhookEventEventType = "poll.vote.removed"`

    - `const LocationSharingStoppedWebhookEventEventTypePollReactionAdded LocationSharingStoppedWebhookEventEventType = "poll.reaction.added"`

    - `const LocationSharingStoppedWebhookEventEventTypeParticipantAdded LocationSharingStoppedWebhookEventEventType = "participant.added"`

    - `const LocationSharingStoppedWebhookEventEventTypeParticipantRemoved LocationSharingStoppedWebhookEventEventType = "participant.removed"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatCreated LocationSharingStoppedWebhookEventEventType = "chat.created"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatGroupNameUpdated LocationSharingStoppedWebhookEventEventType = "chat.group_name_updated"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatGroupIconUpdated LocationSharingStoppedWebhookEventEventType = "chat.group_icon_updated"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatGroupNameUpdateFailed LocationSharingStoppedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatGroupIconUpdateFailed LocationSharingStoppedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatBackgroundUpdated LocationSharingStoppedWebhookEventEventType = "chat.background_updated"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatBackgroundUpdateFailed LocationSharingStoppedWebhookEventEventType = "chat.background_update_failed"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatTypingIndicatorStarted LocationSharingStoppedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const LocationSharingStoppedWebhookEventEventTypeChatTypingIndicatorStopped LocationSharingStoppedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const LocationSharingStoppedWebhookEventEventTypePhoneNumberStatusUpdated LocationSharingStoppedWebhookEventEventType = "phone_number.status_updated"`

    - `const LocationSharingStoppedWebhookEventEventTypeContactCardReceived LocationSharingStoppedWebhookEventEventType = "contact_card.received"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallInitiated LocationSharingStoppedWebhookEventEventType = "call.initiated"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallRinging LocationSharingStoppedWebhookEventEventType = "call.ringing"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallAnswered LocationSharingStoppedWebhookEventEventType = "call.answered"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallEnded LocationSharingStoppedWebhookEventEventType = "call.ended"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallFailed LocationSharingStoppedWebhookEventEventType = "call.failed"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallDeclined LocationSharingStoppedWebhookEventEventType = "call.declined"`

    - `const LocationSharingStoppedWebhookEventEventTypeCallNoAnswer LocationSharingStoppedWebhookEventEventType = "call.no_answer"`

    - `const LocationSharingStoppedWebhookEventEventTypeLocationSharingStarted LocationSharingStoppedWebhookEventEventType = "location.sharing.started"`

    - `const LocationSharingStoppedWebhookEventEventTypePaymentSucceeded LocationSharingStoppedWebhookEventEventType = "payment.succeeded"`

    - `const LocationSharingStoppedWebhookEventEventTypePaymentCanceled LocationSharingStoppedWebhookEventEventType = "payment.canceled"`

    - `const LocationSharingStoppedWebhookEventEventTypePaymentExpired LocationSharingStoppedWebhookEventEventType = "payment.expired"`

    - `const LocationSharingStoppedWebhookEventEventTypePaymentDeclined LocationSharingStoppedWebhookEventEventType = "payment.declined"`

    - `const LocationSharingStoppedWebhookEventEventTypePaymentAuthorized LocationSharingStoppedWebhookEventEventType = "payment.authorized"`

    - `const LocationSharingStoppedWebhookEventEventTypeConnectionCreated LocationSharingStoppedWebhookEventEventType = "connection.created"`

    - `const LocationSharingStoppedWebhookEventEventTypeConnectionRevoked LocationSharingStoppedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### payment.authorized

- `type PaymentAuthorizedWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PaymentAuthorizedWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const PaymentAuthorizedWebhookEventDataStatusSucceeded PaymentAuthorizedWebhookEventDataStatus = "succeeded"`

      - `const PaymentAuthorizedWebhookEventDataStatusFailed PaymentAuthorizedWebhookEventDataStatus = "failed"`

      - `const PaymentAuthorizedWebhookEventDataStatusCanceled PaymentAuthorizedWebhookEventDataStatus = "canceled"`

      - `const PaymentAuthorizedWebhookEventDataStatusExpired PaymentAuthorizedWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount PaymentAuthorizedWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const PaymentAuthorizedWebhookEventDataIntervalDay PaymentAuthorizedWebhookEventDataInterval = "day"`

      - `const PaymentAuthorizedWebhookEventDataIntervalWeek PaymentAuthorizedWebhookEventDataInterval = "week"`

      - `const PaymentAuthorizedWebhookEventDataIntervalMonth PaymentAuthorizedWebhookEventDataInterval = "month"`

      - `const PaymentAuthorizedWebhookEventDataIntervalYear PaymentAuthorizedWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const PaymentAuthorizedWebhookEventDataModePayment PaymentAuthorizedWebhookEventDataMode = "payment"`

      - `const PaymentAuthorizedWebhookEventDataModeSubscription PaymentAuthorizedWebhookEventDataMode = "subscription"`

    - `Natural PaymentAuthorizedWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const PaymentAuthorizedWebhookEventDataRailStripe PaymentAuthorizedWebhookEventDataRail = "stripe"`

      - `const PaymentAuthorizedWebhookEventDataRailNatural PaymentAuthorizedWebhookEventDataRail = "natural"`

    - `Stripe PaymentAuthorizedWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType PaymentAuthorizedWebhookEventEventType`

    - `const PaymentAuthorizedWebhookEventEventTypePaymentSucceeded PaymentAuthorizedWebhookEventEventType = "payment.succeeded"`

    - `const PaymentAuthorizedWebhookEventEventTypePaymentCanceled PaymentAuthorizedWebhookEventEventType = "payment.canceled"`

    - `const PaymentAuthorizedWebhookEventEventTypePaymentExpired PaymentAuthorizedWebhookEventEventType = "payment.expired"`

    - `const PaymentAuthorizedWebhookEventEventTypeMessageSent PaymentAuthorizedWebhookEventEventType = "message.sent"`

    - `const PaymentAuthorizedWebhookEventEventTypeMessageReceived PaymentAuthorizedWebhookEventEventType = "message.received"`

    - `const PaymentAuthorizedWebhookEventEventTypeMessageRead PaymentAuthorizedWebhookEventEventType = "message.read"`

    - `const PaymentAuthorizedWebhookEventEventTypeMessageDelivered PaymentAuthorizedWebhookEventEventType = "message.delivered"`

    - `const PaymentAuthorizedWebhookEventEventTypeMessageFailed PaymentAuthorizedWebhookEventEventType = "message.failed"`

    - `const PaymentAuthorizedWebhookEventEventTypeMessageEdited PaymentAuthorizedWebhookEventEventType = "message.edited"`

    - `const PaymentAuthorizedWebhookEventEventTypeReactionAdded PaymentAuthorizedWebhookEventEventType = "reaction.added"`

    - `const PaymentAuthorizedWebhookEventEventTypeReactionRemoved PaymentAuthorizedWebhookEventEventType = "reaction.removed"`

    - `const PaymentAuthorizedWebhookEventEventTypePollReceived PaymentAuthorizedWebhookEventEventType = "poll.received"`

    - `const PaymentAuthorizedWebhookEventEventTypePollFailed PaymentAuthorizedWebhookEventEventType = "poll.failed"`

    - `const PaymentAuthorizedWebhookEventEventTypePollSent PaymentAuthorizedWebhookEventEventType = "poll.sent"`

    - `const PaymentAuthorizedWebhookEventEventTypePollDelivered PaymentAuthorizedWebhookEventEventType = "poll.delivered"`

    - `const PaymentAuthorizedWebhookEventEventTypePollRead PaymentAuthorizedWebhookEventEventType = "poll.read"`

    - `const PaymentAuthorizedWebhookEventEventTypePollUpdated PaymentAuthorizedWebhookEventEventType = "poll.updated"`

    - `const PaymentAuthorizedWebhookEventEventTypePollVoteAdded PaymentAuthorizedWebhookEventEventType = "poll.vote.added"`

    - `const PaymentAuthorizedWebhookEventEventTypePollVoteRemoved PaymentAuthorizedWebhookEventEventType = "poll.vote.removed"`

    - `const PaymentAuthorizedWebhookEventEventTypePollReactionAdded PaymentAuthorizedWebhookEventEventType = "poll.reaction.added"`

    - `const PaymentAuthorizedWebhookEventEventTypeParticipantAdded PaymentAuthorizedWebhookEventEventType = "participant.added"`

    - `const PaymentAuthorizedWebhookEventEventTypeParticipantRemoved PaymentAuthorizedWebhookEventEventType = "participant.removed"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatCreated PaymentAuthorizedWebhookEventEventType = "chat.created"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatGroupNameUpdated PaymentAuthorizedWebhookEventEventType = "chat.group_name_updated"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatGroupIconUpdated PaymentAuthorizedWebhookEventEventType = "chat.group_icon_updated"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatGroupNameUpdateFailed PaymentAuthorizedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatGroupIconUpdateFailed PaymentAuthorizedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatBackgroundUpdated PaymentAuthorizedWebhookEventEventType = "chat.background_updated"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatBackgroundUpdateFailed PaymentAuthorizedWebhookEventEventType = "chat.background_update_failed"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatTypingIndicatorStarted PaymentAuthorizedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const PaymentAuthorizedWebhookEventEventTypeChatTypingIndicatorStopped PaymentAuthorizedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const PaymentAuthorizedWebhookEventEventTypePhoneNumberStatusUpdated PaymentAuthorizedWebhookEventEventType = "phone_number.status_updated"`

    - `const PaymentAuthorizedWebhookEventEventTypeContactCardReceived PaymentAuthorizedWebhookEventEventType = "contact_card.received"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallInitiated PaymentAuthorizedWebhookEventEventType = "call.initiated"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallRinging PaymentAuthorizedWebhookEventEventType = "call.ringing"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallAnswered PaymentAuthorizedWebhookEventEventType = "call.answered"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallEnded PaymentAuthorizedWebhookEventEventType = "call.ended"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallFailed PaymentAuthorizedWebhookEventEventType = "call.failed"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallDeclined PaymentAuthorizedWebhookEventEventType = "call.declined"`

    - `const PaymentAuthorizedWebhookEventEventTypeCallNoAnswer PaymentAuthorizedWebhookEventEventType = "call.no_answer"`

    - `const PaymentAuthorizedWebhookEventEventTypeLocationSharingStarted PaymentAuthorizedWebhookEventEventType = "location.sharing.started"`

    - `const PaymentAuthorizedWebhookEventEventTypeLocationSharingStopped PaymentAuthorizedWebhookEventEventType = "location.sharing.stopped"`

    - `const PaymentAuthorizedWebhookEventEventTypePaymentDeclined PaymentAuthorizedWebhookEventEventType = "payment.declined"`

    - `const PaymentAuthorizedWebhookEventEventTypePaymentAuthorized PaymentAuthorizedWebhookEventEventType = "payment.authorized"`

    - `const PaymentAuthorizedWebhookEventEventTypeConnectionCreated PaymentAuthorizedWebhookEventEventType = "connection.created"`

    - `const PaymentAuthorizedWebhookEventEventTypeConnectionRevoked PaymentAuthorizedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### payment.canceled

- `type PaymentCanceledWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PaymentCanceledWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const PaymentCanceledWebhookEventDataStatusSucceeded PaymentCanceledWebhookEventDataStatus = "succeeded"`

      - `const PaymentCanceledWebhookEventDataStatusFailed PaymentCanceledWebhookEventDataStatus = "failed"`

      - `const PaymentCanceledWebhookEventDataStatusCanceled PaymentCanceledWebhookEventDataStatus = "canceled"`

      - `const PaymentCanceledWebhookEventDataStatusExpired PaymentCanceledWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount PaymentCanceledWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const PaymentCanceledWebhookEventDataIntervalDay PaymentCanceledWebhookEventDataInterval = "day"`

      - `const PaymentCanceledWebhookEventDataIntervalWeek PaymentCanceledWebhookEventDataInterval = "week"`

      - `const PaymentCanceledWebhookEventDataIntervalMonth PaymentCanceledWebhookEventDataInterval = "month"`

      - `const PaymentCanceledWebhookEventDataIntervalYear PaymentCanceledWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const PaymentCanceledWebhookEventDataModePayment PaymentCanceledWebhookEventDataMode = "payment"`

      - `const PaymentCanceledWebhookEventDataModeSubscription PaymentCanceledWebhookEventDataMode = "subscription"`

    - `Natural PaymentCanceledWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const PaymentCanceledWebhookEventDataRailStripe PaymentCanceledWebhookEventDataRail = "stripe"`

      - `const PaymentCanceledWebhookEventDataRailNatural PaymentCanceledWebhookEventDataRail = "natural"`

    - `Stripe PaymentCanceledWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType PaymentCanceledWebhookEventEventType`

    - `const PaymentCanceledWebhookEventEventTypePaymentSucceeded PaymentCanceledWebhookEventEventType = "payment.succeeded"`

    - `const PaymentCanceledWebhookEventEventTypePaymentCanceled PaymentCanceledWebhookEventEventType = "payment.canceled"`

    - `const PaymentCanceledWebhookEventEventTypePaymentExpired PaymentCanceledWebhookEventEventType = "payment.expired"`

    - `const PaymentCanceledWebhookEventEventTypeMessageSent PaymentCanceledWebhookEventEventType = "message.sent"`

    - `const PaymentCanceledWebhookEventEventTypeMessageReceived PaymentCanceledWebhookEventEventType = "message.received"`

    - `const PaymentCanceledWebhookEventEventTypeMessageRead PaymentCanceledWebhookEventEventType = "message.read"`

    - `const PaymentCanceledWebhookEventEventTypeMessageDelivered PaymentCanceledWebhookEventEventType = "message.delivered"`

    - `const PaymentCanceledWebhookEventEventTypeMessageFailed PaymentCanceledWebhookEventEventType = "message.failed"`

    - `const PaymentCanceledWebhookEventEventTypeMessageEdited PaymentCanceledWebhookEventEventType = "message.edited"`

    - `const PaymentCanceledWebhookEventEventTypeReactionAdded PaymentCanceledWebhookEventEventType = "reaction.added"`

    - `const PaymentCanceledWebhookEventEventTypeReactionRemoved PaymentCanceledWebhookEventEventType = "reaction.removed"`

    - `const PaymentCanceledWebhookEventEventTypePollReceived PaymentCanceledWebhookEventEventType = "poll.received"`

    - `const PaymentCanceledWebhookEventEventTypePollFailed PaymentCanceledWebhookEventEventType = "poll.failed"`

    - `const PaymentCanceledWebhookEventEventTypePollSent PaymentCanceledWebhookEventEventType = "poll.sent"`

    - `const PaymentCanceledWebhookEventEventTypePollDelivered PaymentCanceledWebhookEventEventType = "poll.delivered"`

    - `const PaymentCanceledWebhookEventEventTypePollRead PaymentCanceledWebhookEventEventType = "poll.read"`

    - `const PaymentCanceledWebhookEventEventTypePollUpdated PaymentCanceledWebhookEventEventType = "poll.updated"`

    - `const PaymentCanceledWebhookEventEventTypePollVoteAdded PaymentCanceledWebhookEventEventType = "poll.vote.added"`

    - `const PaymentCanceledWebhookEventEventTypePollVoteRemoved PaymentCanceledWebhookEventEventType = "poll.vote.removed"`

    - `const PaymentCanceledWebhookEventEventTypePollReactionAdded PaymentCanceledWebhookEventEventType = "poll.reaction.added"`

    - `const PaymentCanceledWebhookEventEventTypeParticipantAdded PaymentCanceledWebhookEventEventType = "participant.added"`

    - `const PaymentCanceledWebhookEventEventTypeParticipantRemoved PaymentCanceledWebhookEventEventType = "participant.removed"`

    - `const PaymentCanceledWebhookEventEventTypeChatCreated PaymentCanceledWebhookEventEventType = "chat.created"`

    - `const PaymentCanceledWebhookEventEventTypeChatGroupNameUpdated PaymentCanceledWebhookEventEventType = "chat.group_name_updated"`

    - `const PaymentCanceledWebhookEventEventTypeChatGroupIconUpdated PaymentCanceledWebhookEventEventType = "chat.group_icon_updated"`

    - `const PaymentCanceledWebhookEventEventTypeChatGroupNameUpdateFailed PaymentCanceledWebhookEventEventType = "chat.group_name_update_failed"`

    - `const PaymentCanceledWebhookEventEventTypeChatGroupIconUpdateFailed PaymentCanceledWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const PaymentCanceledWebhookEventEventTypeChatBackgroundUpdated PaymentCanceledWebhookEventEventType = "chat.background_updated"`

    - `const PaymentCanceledWebhookEventEventTypeChatBackgroundUpdateFailed PaymentCanceledWebhookEventEventType = "chat.background_update_failed"`

    - `const PaymentCanceledWebhookEventEventTypeChatTypingIndicatorStarted PaymentCanceledWebhookEventEventType = "chat.typing_indicator.started"`

    - `const PaymentCanceledWebhookEventEventTypeChatTypingIndicatorStopped PaymentCanceledWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const PaymentCanceledWebhookEventEventTypePhoneNumberStatusUpdated PaymentCanceledWebhookEventEventType = "phone_number.status_updated"`

    - `const PaymentCanceledWebhookEventEventTypeContactCardReceived PaymentCanceledWebhookEventEventType = "contact_card.received"`

    - `const PaymentCanceledWebhookEventEventTypeCallInitiated PaymentCanceledWebhookEventEventType = "call.initiated"`

    - `const PaymentCanceledWebhookEventEventTypeCallRinging PaymentCanceledWebhookEventEventType = "call.ringing"`

    - `const PaymentCanceledWebhookEventEventTypeCallAnswered PaymentCanceledWebhookEventEventType = "call.answered"`

    - `const PaymentCanceledWebhookEventEventTypeCallEnded PaymentCanceledWebhookEventEventType = "call.ended"`

    - `const PaymentCanceledWebhookEventEventTypeCallFailed PaymentCanceledWebhookEventEventType = "call.failed"`

    - `const PaymentCanceledWebhookEventEventTypeCallDeclined PaymentCanceledWebhookEventEventType = "call.declined"`

    - `const PaymentCanceledWebhookEventEventTypeCallNoAnswer PaymentCanceledWebhookEventEventType = "call.no_answer"`

    - `const PaymentCanceledWebhookEventEventTypeLocationSharingStarted PaymentCanceledWebhookEventEventType = "location.sharing.started"`

    - `const PaymentCanceledWebhookEventEventTypeLocationSharingStopped PaymentCanceledWebhookEventEventType = "location.sharing.stopped"`

    - `const PaymentCanceledWebhookEventEventTypePaymentDeclined PaymentCanceledWebhookEventEventType = "payment.declined"`

    - `const PaymentCanceledWebhookEventEventTypePaymentAuthorized PaymentCanceledWebhookEventEventType = "payment.authorized"`

    - `const PaymentCanceledWebhookEventEventTypeConnectionCreated PaymentCanceledWebhookEventEventType = "connection.created"`

    - `const PaymentCanceledWebhookEventEventTypeConnectionRevoked PaymentCanceledWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### payment.declined

- `type PaymentDeclinedWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PaymentDeclinedWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const PaymentDeclinedWebhookEventDataStatusSucceeded PaymentDeclinedWebhookEventDataStatus = "succeeded"`

      - `const PaymentDeclinedWebhookEventDataStatusFailed PaymentDeclinedWebhookEventDataStatus = "failed"`

      - `const PaymentDeclinedWebhookEventDataStatusCanceled PaymentDeclinedWebhookEventDataStatus = "canceled"`

      - `const PaymentDeclinedWebhookEventDataStatusExpired PaymentDeclinedWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount PaymentDeclinedWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const PaymentDeclinedWebhookEventDataIntervalDay PaymentDeclinedWebhookEventDataInterval = "day"`

      - `const PaymentDeclinedWebhookEventDataIntervalWeek PaymentDeclinedWebhookEventDataInterval = "week"`

      - `const PaymentDeclinedWebhookEventDataIntervalMonth PaymentDeclinedWebhookEventDataInterval = "month"`

      - `const PaymentDeclinedWebhookEventDataIntervalYear PaymentDeclinedWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const PaymentDeclinedWebhookEventDataModePayment PaymentDeclinedWebhookEventDataMode = "payment"`

      - `const PaymentDeclinedWebhookEventDataModeSubscription PaymentDeclinedWebhookEventDataMode = "subscription"`

    - `Natural PaymentDeclinedWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const PaymentDeclinedWebhookEventDataRailStripe PaymentDeclinedWebhookEventDataRail = "stripe"`

      - `const PaymentDeclinedWebhookEventDataRailNatural PaymentDeclinedWebhookEventDataRail = "natural"`

    - `Stripe PaymentDeclinedWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType PaymentDeclinedWebhookEventEventType`

    - `const PaymentDeclinedWebhookEventEventTypePaymentSucceeded PaymentDeclinedWebhookEventEventType = "payment.succeeded"`

    - `const PaymentDeclinedWebhookEventEventTypePaymentCanceled PaymentDeclinedWebhookEventEventType = "payment.canceled"`

    - `const PaymentDeclinedWebhookEventEventTypePaymentExpired PaymentDeclinedWebhookEventEventType = "payment.expired"`

    - `const PaymentDeclinedWebhookEventEventTypeMessageSent PaymentDeclinedWebhookEventEventType = "message.sent"`

    - `const PaymentDeclinedWebhookEventEventTypeMessageReceived PaymentDeclinedWebhookEventEventType = "message.received"`

    - `const PaymentDeclinedWebhookEventEventTypeMessageRead PaymentDeclinedWebhookEventEventType = "message.read"`

    - `const PaymentDeclinedWebhookEventEventTypeMessageDelivered PaymentDeclinedWebhookEventEventType = "message.delivered"`

    - `const PaymentDeclinedWebhookEventEventTypeMessageFailed PaymentDeclinedWebhookEventEventType = "message.failed"`

    - `const PaymentDeclinedWebhookEventEventTypeMessageEdited PaymentDeclinedWebhookEventEventType = "message.edited"`

    - `const PaymentDeclinedWebhookEventEventTypeReactionAdded PaymentDeclinedWebhookEventEventType = "reaction.added"`

    - `const PaymentDeclinedWebhookEventEventTypeReactionRemoved PaymentDeclinedWebhookEventEventType = "reaction.removed"`

    - `const PaymentDeclinedWebhookEventEventTypePollReceived PaymentDeclinedWebhookEventEventType = "poll.received"`

    - `const PaymentDeclinedWebhookEventEventTypePollFailed PaymentDeclinedWebhookEventEventType = "poll.failed"`

    - `const PaymentDeclinedWebhookEventEventTypePollSent PaymentDeclinedWebhookEventEventType = "poll.sent"`

    - `const PaymentDeclinedWebhookEventEventTypePollDelivered PaymentDeclinedWebhookEventEventType = "poll.delivered"`

    - `const PaymentDeclinedWebhookEventEventTypePollRead PaymentDeclinedWebhookEventEventType = "poll.read"`

    - `const PaymentDeclinedWebhookEventEventTypePollUpdated PaymentDeclinedWebhookEventEventType = "poll.updated"`

    - `const PaymentDeclinedWebhookEventEventTypePollVoteAdded PaymentDeclinedWebhookEventEventType = "poll.vote.added"`

    - `const PaymentDeclinedWebhookEventEventTypePollVoteRemoved PaymentDeclinedWebhookEventEventType = "poll.vote.removed"`

    - `const PaymentDeclinedWebhookEventEventTypePollReactionAdded PaymentDeclinedWebhookEventEventType = "poll.reaction.added"`

    - `const PaymentDeclinedWebhookEventEventTypeParticipantAdded PaymentDeclinedWebhookEventEventType = "participant.added"`

    - `const PaymentDeclinedWebhookEventEventTypeParticipantRemoved PaymentDeclinedWebhookEventEventType = "participant.removed"`

    - `const PaymentDeclinedWebhookEventEventTypeChatCreated PaymentDeclinedWebhookEventEventType = "chat.created"`

    - `const PaymentDeclinedWebhookEventEventTypeChatGroupNameUpdated PaymentDeclinedWebhookEventEventType = "chat.group_name_updated"`

    - `const PaymentDeclinedWebhookEventEventTypeChatGroupIconUpdated PaymentDeclinedWebhookEventEventType = "chat.group_icon_updated"`

    - `const PaymentDeclinedWebhookEventEventTypeChatGroupNameUpdateFailed PaymentDeclinedWebhookEventEventType = "chat.group_name_update_failed"`

    - `const PaymentDeclinedWebhookEventEventTypeChatGroupIconUpdateFailed PaymentDeclinedWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const PaymentDeclinedWebhookEventEventTypeChatBackgroundUpdated PaymentDeclinedWebhookEventEventType = "chat.background_updated"`

    - `const PaymentDeclinedWebhookEventEventTypeChatBackgroundUpdateFailed PaymentDeclinedWebhookEventEventType = "chat.background_update_failed"`

    - `const PaymentDeclinedWebhookEventEventTypeChatTypingIndicatorStarted PaymentDeclinedWebhookEventEventType = "chat.typing_indicator.started"`

    - `const PaymentDeclinedWebhookEventEventTypeChatTypingIndicatorStopped PaymentDeclinedWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const PaymentDeclinedWebhookEventEventTypePhoneNumberStatusUpdated PaymentDeclinedWebhookEventEventType = "phone_number.status_updated"`

    - `const PaymentDeclinedWebhookEventEventTypeContactCardReceived PaymentDeclinedWebhookEventEventType = "contact_card.received"`

    - `const PaymentDeclinedWebhookEventEventTypeCallInitiated PaymentDeclinedWebhookEventEventType = "call.initiated"`

    - `const PaymentDeclinedWebhookEventEventTypeCallRinging PaymentDeclinedWebhookEventEventType = "call.ringing"`

    - `const PaymentDeclinedWebhookEventEventTypeCallAnswered PaymentDeclinedWebhookEventEventType = "call.answered"`

    - `const PaymentDeclinedWebhookEventEventTypeCallEnded PaymentDeclinedWebhookEventEventType = "call.ended"`

    - `const PaymentDeclinedWebhookEventEventTypeCallFailed PaymentDeclinedWebhookEventEventType = "call.failed"`

    - `const PaymentDeclinedWebhookEventEventTypeCallDeclined PaymentDeclinedWebhookEventEventType = "call.declined"`

    - `const PaymentDeclinedWebhookEventEventTypeCallNoAnswer PaymentDeclinedWebhookEventEventType = "call.no_answer"`

    - `const PaymentDeclinedWebhookEventEventTypeLocationSharingStarted PaymentDeclinedWebhookEventEventType = "location.sharing.started"`

    - `const PaymentDeclinedWebhookEventEventTypeLocationSharingStopped PaymentDeclinedWebhookEventEventType = "location.sharing.stopped"`

    - `const PaymentDeclinedWebhookEventEventTypePaymentDeclined PaymentDeclinedWebhookEventEventType = "payment.declined"`

    - `const PaymentDeclinedWebhookEventEventTypePaymentAuthorized PaymentDeclinedWebhookEventEventType = "payment.authorized"`

    - `const PaymentDeclinedWebhookEventEventTypeConnectionCreated PaymentDeclinedWebhookEventEventType = "connection.created"`

    - `const PaymentDeclinedWebhookEventEventTypeConnectionRevoked PaymentDeclinedWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### payment.expired

- `type PaymentExpiredWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PaymentExpiredWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const PaymentExpiredWebhookEventDataStatusSucceeded PaymentExpiredWebhookEventDataStatus = "succeeded"`

      - `const PaymentExpiredWebhookEventDataStatusFailed PaymentExpiredWebhookEventDataStatus = "failed"`

      - `const PaymentExpiredWebhookEventDataStatusCanceled PaymentExpiredWebhookEventDataStatus = "canceled"`

      - `const PaymentExpiredWebhookEventDataStatusExpired PaymentExpiredWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount PaymentExpiredWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const PaymentExpiredWebhookEventDataIntervalDay PaymentExpiredWebhookEventDataInterval = "day"`

      - `const PaymentExpiredWebhookEventDataIntervalWeek PaymentExpiredWebhookEventDataInterval = "week"`

      - `const PaymentExpiredWebhookEventDataIntervalMonth PaymentExpiredWebhookEventDataInterval = "month"`

      - `const PaymentExpiredWebhookEventDataIntervalYear PaymentExpiredWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const PaymentExpiredWebhookEventDataModePayment PaymentExpiredWebhookEventDataMode = "payment"`

      - `const PaymentExpiredWebhookEventDataModeSubscription PaymentExpiredWebhookEventDataMode = "subscription"`

    - `Natural PaymentExpiredWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const PaymentExpiredWebhookEventDataRailStripe PaymentExpiredWebhookEventDataRail = "stripe"`

      - `const PaymentExpiredWebhookEventDataRailNatural PaymentExpiredWebhookEventDataRail = "natural"`

    - `Stripe PaymentExpiredWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType PaymentExpiredWebhookEventEventType`

    - `const PaymentExpiredWebhookEventEventTypePaymentSucceeded PaymentExpiredWebhookEventEventType = "payment.succeeded"`

    - `const PaymentExpiredWebhookEventEventTypePaymentCanceled PaymentExpiredWebhookEventEventType = "payment.canceled"`

    - `const PaymentExpiredWebhookEventEventTypePaymentExpired PaymentExpiredWebhookEventEventType = "payment.expired"`

    - `const PaymentExpiredWebhookEventEventTypeMessageSent PaymentExpiredWebhookEventEventType = "message.sent"`

    - `const PaymentExpiredWebhookEventEventTypeMessageReceived PaymentExpiredWebhookEventEventType = "message.received"`

    - `const PaymentExpiredWebhookEventEventTypeMessageRead PaymentExpiredWebhookEventEventType = "message.read"`

    - `const PaymentExpiredWebhookEventEventTypeMessageDelivered PaymentExpiredWebhookEventEventType = "message.delivered"`

    - `const PaymentExpiredWebhookEventEventTypeMessageFailed PaymentExpiredWebhookEventEventType = "message.failed"`

    - `const PaymentExpiredWebhookEventEventTypeMessageEdited PaymentExpiredWebhookEventEventType = "message.edited"`

    - `const PaymentExpiredWebhookEventEventTypeReactionAdded PaymentExpiredWebhookEventEventType = "reaction.added"`

    - `const PaymentExpiredWebhookEventEventTypeReactionRemoved PaymentExpiredWebhookEventEventType = "reaction.removed"`

    - `const PaymentExpiredWebhookEventEventTypePollReceived PaymentExpiredWebhookEventEventType = "poll.received"`

    - `const PaymentExpiredWebhookEventEventTypePollFailed PaymentExpiredWebhookEventEventType = "poll.failed"`

    - `const PaymentExpiredWebhookEventEventTypePollSent PaymentExpiredWebhookEventEventType = "poll.sent"`

    - `const PaymentExpiredWebhookEventEventTypePollDelivered PaymentExpiredWebhookEventEventType = "poll.delivered"`

    - `const PaymentExpiredWebhookEventEventTypePollRead PaymentExpiredWebhookEventEventType = "poll.read"`

    - `const PaymentExpiredWebhookEventEventTypePollUpdated PaymentExpiredWebhookEventEventType = "poll.updated"`

    - `const PaymentExpiredWebhookEventEventTypePollVoteAdded PaymentExpiredWebhookEventEventType = "poll.vote.added"`

    - `const PaymentExpiredWebhookEventEventTypePollVoteRemoved PaymentExpiredWebhookEventEventType = "poll.vote.removed"`

    - `const PaymentExpiredWebhookEventEventTypePollReactionAdded PaymentExpiredWebhookEventEventType = "poll.reaction.added"`

    - `const PaymentExpiredWebhookEventEventTypeParticipantAdded PaymentExpiredWebhookEventEventType = "participant.added"`

    - `const PaymentExpiredWebhookEventEventTypeParticipantRemoved PaymentExpiredWebhookEventEventType = "participant.removed"`

    - `const PaymentExpiredWebhookEventEventTypeChatCreated PaymentExpiredWebhookEventEventType = "chat.created"`

    - `const PaymentExpiredWebhookEventEventTypeChatGroupNameUpdated PaymentExpiredWebhookEventEventType = "chat.group_name_updated"`

    - `const PaymentExpiredWebhookEventEventTypeChatGroupIconUpdated PaymentExpiredWebhookEventEventType = "chat.group_icon_updated"`

    - `const PaymentExpiredWebhookEventEventTypeChatGroupNameUpdateFailed PaymentExpiredWebhookEventEventType = "chat.group_name_update_failed"`

    - `const PaymentExpiredWebhookEventEventTypeChatGroupIconUpdateFailed PaymentExpiredWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const PaymentExpiredWebhookEventEventTypeChatBackgroundUpdated PaymentExpiredWebhookEventEventType = "chat.background_updated"`

    - `const PaymentExpiredWebhookEventEventTypeChatBackgroundUpdateFailed PaymentExpiredWebhookEventEventType = "chat.background_update_failed"`

    - `const PaymentExpiredWebhookEventEventTypeChatTypingIndicatorStarted PaymentExpiredWebhookEventEventType = "chat.typing_indicator.started"`

    - `const PaymentExpiredWebhookEventEventTypeChatTypingIndicatorStopped PaymentExpiredWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const PaymentExpiredWebhookEventEventTypePhoneNumberStatusUpdated PaymentExpiredWebhookEventEventType = "phone_number.status_updated"`

    - `const PaymentExpiredWebhookEventEventTypeContactCardReceived PaymentExpiredWebhookEventEventType = "contact_card.received"`

    - `const PaymentExpiredWebhookEventEventTypeCallInitiated PaymentExpiredWebhookEventEventType = "call.initiated"`

    - `const PaymentExpiredWebhookEventEventTypeCallRinging PaymentExpiredWebhookEventEventType = "call.ringing"`

    - `const PaymentExpiredWebhookEventEventTypeCallAnswered PaymentExpiredWebhookEventEventType = "call.answered"`

    - `const PaymentExpiredWebhookEventEventTypeCallEnded PaymentExpiredWebhookEventEventType = "call.ended"`

    - `const PaymentExpiredWebhookEventEventTypeCallFailed PaymentExpiredWebhookEventEventType = "call.failed"`

    - `const PaymentExpiredWebhookEventEventTypeCallDeclined PaymentExpiredWebhookEventEventType = "call.declined"`

    - `const PaymentExpiredWebhookEventEventTypeCallNoAnswer PaymentExpiredWebhookEventEventType = "call.no_answer"`

    - `const PaymentExpiredWebhookEventEventTypeLocationSharingStarted PaymentExpiredWebhookEventEventType = "location.sharing.started"`

    - `const PaymentExpiredWebhookEventEventTypeLocationSharingStopped PaymentExpiredWebhookEventEventType = "location.sharing.stopped"`

    - `const PaymentExpiredWebhookEventEventTypePaymentDeclined PaymentExpiredWebhookEventEventType = "payment.declined"`

    - `const PaymentExpiredWebhookEventEventTypePaymentAuthorized PaymentExpiredWebhookEventEventType = "payment.authorized"`

    - `const PaymentExpiredWebhookEventEventTypeConnectionCreated PaymentExpiredWebhookEventEventType = "connection.created"`

    - `const PaymentExpiredWebhookEventEventTypeConnectionRevoked PaymentExpiredWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### payment.succeeded

- `type PaymentSucceededWebhookEvent struct{…}`

  - `APIVersion string`

    API version for the webhook payload format

  - `CreatedAt Time`

    When the event was created

  - `Data PaymentSucceededWebhookEventData`

    The payment request, as returned by
    `GET /v3/payment_requests/{paymentRequestId}`.

    - `ID string`

      The payment request id.

    - `Amount int64`

      What was charged at checkout, in the currency's minor
      units. In `subscription` mode this is the first invoice's
      total — all items after any discounts are applied.

    - `CheckoutURL string`

      URL the recipient opens to pay
      (`https://zero.linqapp.com/pay/{slug}?session=...`).

    - `CreatedAt Time`

    - `Currency string`

    - `Object string`

    - `Status string`

      - `const PaymentSucceededWebhookEventDataStatusSucceeded PaymentSucceededWebhookEventDataStatus = "succeeded"`

      - `const PaymentSucceededWebhookEventDataStatusFailed PaymentSucceededWebhookEventDataStatus = "failed"`

      - `const PaymentSucceededWebhookEventDataStatusCanceled PaymentSucceededWebhookEventDataStatus = "canceled"`

      - `const PaymentSucceededWebhookEventDataStatusExpired PaymentSucceededWebhookEventDataStatus = "expired"`

    - `Description string`

    - `Discount PaymentSucceededWebhookEventDataDiscount`

      Subscription mode — the discount Stripe applied, read back
      from the coupon. Absent when none was applied.

      - `Coupon string`

      - `Label string`

        Name of the coupon/promo code displayed to customers.

      - `PromotionCode string`

    - `Interval string`

      Subscription mode — how often the subscription renews.

      - `const PaymentSucceededWebhookEventDataIntervalDay PaymentSucceededWebhookEventDataInterval = "day"`

      - `const PaymentSucceededWebhookEventDataIntervalWeek PaymentSucceededWebhookEventDataInterval = "week"`

      - `const PaymentSucceededWebhookEventDataIntervalMonth PaymentSucceededWebhookEventDataInterval = "month"`

      - `const PaymentSucceededWebhookEventDataIntervalYear PaymentSucceededWebhookEventDataInterval = "year"`

    - `IntervalCount int64`

      Subscription mode — intervals per renewal.

    - `Metadata map[string, string]`

    - `Mode string`

      Whether the request collected a one-time charge or started a subscription.

      - `const PaymentSucceededWebhookEventDataModePayment PaymentSucceededWebhookEventDataMode = "payment"`

      - `const PaymentSucceededWebhookEventDataModeSubscription PaymentSucceededWebhookEventDataMode = "subscription"`

    - `Natural PaymentSucceededWebhookEventDataNatural`

      Natural-rail join keys, present when `rail: natural`.

      - `PaymentRequestID string`

        The Natural payment request (`prq_...`).

      - `TransactionID string`

        The settled transaction (`txn_...`).

    - `PriceID string`

      Subscription mode — the recurring price subscribed to.

    - `Quantity int64`

      Subscription mode — units of the price subscribed to.

    - `Rail string`

      The rail this request settled on.

      - `const PaymentSucceededWebhookEventDataRailStripe PaymentSucceededWebhookEventDataRail = "stripe"`

      - `const PaymentSucceededWebhookEventDataRailNatural PaymentSucceededWebhookEventDataRail = "natural"`

    - `Stripe PaymentSucceededWebhookEventDataStripe`

      Ids of the Stripe objects on your connected account — join
      keys into your own Stripe Dashboard/API. Manage a
      subscription's post-checkout lifecycle with `subscription_id`.

      - `CustomerID string`

        The Customer the request is attached to (`cus_...`).
        Always set in subscription mode; set in payment mode
        only when the request was created with a `customer_id`.

      - `PaymentIntentID string`

        The PaymentIntent collected at checkout (`pi_...`).

      - `SubscriptionID string`

        Subscription mode — the Subscription (`sub_...`).

    - `TrialEnd Time`

      Subscription mode — when the free trial ends and the first
      charge happens. On a trial request, `payment.succeeded`
      means the payment method was collected ($0 moved).

    - `UpdatedAt Time`

  - `EventID string`

    Unique identifier for this event (for deduplication)

  - `EventType PaymentSucceededWebhookEventEventType`

    - `const PaymentSucceededWebhookEventEventTypePaymentSucceeded PaymentSucceededWebhookEventEventType = "payment.succeeded"`

    - `const PaymentSucceededWebhookEventEventTypePaymentCanceled PaymentSucceededWebhookEventEventType = "payment.canceled"`

    - `const PaymentSucceededWebhookEventEventTypePaymentExpired PaymentSucceededWebhookEventEventType = "payment.expired"`

    - `const PaymentSucceededWebhookEventEventTypeMessageSent PaymentSucceededWebhookEventEventType = "message.sent"`

    - `const PaymentSucceededWebhookEventEventTypeMessageReceived PaymentSucceededWebhookEventEventType = "message.received"`

    - `const PaymentSucceededWebhookEventEventTypeMessageRead PaymentSucceededWebhookEventEventType = "message.read"`

    - `const PaymentSucceededWebhookEventEventTypeMessageDelivered PaymentSucceededWebhookEventEventType = "message.delivered"`

    - `const PaymentSucceededWebhookEventEventTypeMessageFailed PaymentSucceededWebhookEventEventType = "message.failed"`

    - `const PaymentSucceededWebhookEventEventTypeMessageEdited PaymentSucceededWebhookEventEventType = "message.edited"`

    - `const PaymentSucceededWebhookEventEventTypeReactionAdded PaymentSucceededWebhookEventEventType = "reaction.added"`

    - `const PaymentSucceededWebhookEventEventTypeReactionRemoved PaymentSucceededWebhookEventEventType = "reaction.removed"`

    - `const PaymentSucceededWebhookEventEventTypePollReceived PaymentSucceededWebhookEventEventType = "poll.received"`

    - `const PaymentSucceededWebhookEventEventTypePollFailed PaymentSucceededWebhookEventEventType = "poll.failed"`

    - `const PaymentSucceededWebhookEventEventTypePollSent PaymentSucceededWebhookEventEventType = "poll.sent"`

    - `const PaymentSucceededWebhookEventEventTypePollDelivered PaymentSucceededWebhookEventEventType = "poll.delivered"`

    - `const PaymentSucceededWebhookEventEventTypePollRead PaymentSucceededWebhookEventEventType = "poll.read"`

    - `const PaymentSucceededWebhookEventEventTypePollUpdated PaymentSucceededWebhookEventEventType = "poll.updated"`

    - `const PaymentSucceededWebhookEventEventTypePollVoteAdded PaymentSucceededWebhookEventEventType = "poll.vote.added"`

    - `const PaymentSucceededWebhookEventEventTypePollVoteRemoved PaymentSucceededWebhookEventEventType = "poll.vote.removed"`

    - `const PaymentSucceededWebhookEventEventTypePollReactionAdded PaymentSucceededWebhookEventEventType = "poll.reaction.added"`

    - `const PaymentSucceededWebhookEventEventTypeParticipantAdded PaymentSucceededWebhookEventEventType = "participant.added"`

    - `const PaymentSucceededWebhookEventEventTypeParticipantRemoved PaymentSucceededWebhookEventEventType = "participant.removed"`

    - `const PaymentSucceededWebhookEventEventTypeChatCreated PaymentSucceededWebhookEventEventType = "chat.created"`

    - `const PaymentSucceededWebhookEventEventTypeChatGroupNameUpdated PaymentSucceededWebhookEventEventType = "chat.group_name_updated"`

    - `const PaymentSucceededWebhookEventEventTypeChatGroupIconUpdated PaymentSucceededWebhookEventEventType = "chat.group_icon_updated"`

    - `const PaymentSucceededWebhookEventEventTypeChatGroupNameUpdateFailed PaymentSucceededWebhookEventEventType = "chat.group_name_update_failed"`

    - `const PaymentSucceededWebhookEventEventTypeChatGroupIconUpdateFailed PaymentSucceededWebhookEventEventType = "chat.group_icon_update_failed"`

    - `const PaymentSucceededWebhookEventEventTypeChatBackgroundUpdated PaymentSucceededWebhookEventEventType = "chat.background_updated"`

    - `const PaymentSucceededWebhookEventEventTypeChatBackgroundUpdateFailed PaymentSucceededWebhookEventEventType = "chat.background_update_failed"`

    - `const PaymentSucceededWebhookEventEventTypeChatTypingIndicatorStarted PaymentSucceededWebhookEventEventType = "chat.typing_indicator.started"`

    - `const PaymentSucceededWebhookEventEventTypeChatTypingIndicatorStopped PaymentSucceededWebhookEventEventType = "chat.typing_indicator.stopped"`

    - `const PaymentSucceededWebhookEventEventTypePhoneNumberStatusUpdated PaymentSucceededWebhookEventEventType = "phone_number.status_updated"`

    - `const PaymentSucceededWebhookEventEventTypeContactCardReceived PaymentSucceededWebhookEventEventType = "contact_card.received"`

    - `const PaymentSucceededWebhookEventEventTypeCallInitiated PaymentSucceededWebhookEventEventType = "call.initiated"`

    - `const PaymentSucceededWebhookEventEventTypeCallRinging PaymentSucceededWebhookEventEventType = "call.ringing"`

    - `const PaymentSucceededWebhookEventEventTypeCallAnswered PaymentSucceededWebhookEventEventType = "call.answered"`

    - `const PaymentSucceededWebhookEventEventTypeCallEnded PaymentSucceededWebhookEventEventType = "call.ended"`

    - `const PaymentSucceededWebhookEventEventTypeCallFailed PaymentSucceededWebhookEventEventType = "call.failed"`

    - `const PaymentSucceededWebhookEventEventTypeCallDeclined PaymentSucceededWebhookEventEventType = "call.declined"`

    - `const PaymentSucceededWebhookEventEventTypeCallNoAnswer PaymentSucceededWebhookEventEventType = "call.no_answer"`

    - `const PaymentSucceededWebhookEventEventTypeLocationSharingStarted PaymentSucceededWebhookEventEventType = "location.sharing.started"`

    - `const PaymentSucceededWebhookEventEventTypeLocationSharingStopped PaymentSucceededWebhookEventEventType = "location.sharing.stopped"`

    - `const PaymentSucceededWebhookEventEventTypePaymentDeclined PaymentSucceededWebhookEventEventType = "payment.declined"`

    - `const PaymentSucceededWebhookEventEventTypePaymentAuthorized PaymentSucceededWebhookEventEventType = "payment.authorized"`

    - `const PaymentSucceededWebhookEventEventTypeConnectionCreated PaymentSucceededWebhookEventEventType = "connection.created"`

    - `const PaymentSucceededWebhookEventEventTypeConnectionRevoked PaymentSucceededWebhookEventEventType = "connection.revoked"`

  - `PartnerID string`

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

  - `TraceID string`

    Trace ID for debugging and correlation across systems.

  - `WebhookVersion string`

    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.

### Unwrap Webhook Event

- `type UnwrapWebhookEventUnion interface{…}`

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

  - `type MessageSentWebhookEvent struct{…}`

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

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data 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 string`

        Message identifier

      - `Chat MessageEventV2Chat`

        Chat information

        - `ID string`

          Chat identifier

        - `HealthStatus MessageEventV2ChatHealthStatus`

          **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

          See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

          - `DocURL string`

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

          - `Status string`

            Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

            `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
            The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
            does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
            casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
            soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
            in immediately — a reply in any conversation with you counts, the same way the block does.

            `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
            a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
            Group threads are never marked and are never blocked.

            Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
            `2024`) before the message is queued, across every chat and every line on your account. Nothing is
            delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
            request.

            - `const MessageEventV2ChatHealthStatusStatusHealthy MessageEventV2ChatHealthStatusStatus = "HEALTHY"`

            - `const MessageEventV2ChatHealthStatusStatusAtRisk MessageEventV2ChatHealthStatusStatus = "AT_RISK"`

            - `const MessageEventV2ChatHealthStatusStatusCritical MessageEventV2ChatHealthStatusStatus = "CRITICAL"`

            - `const MessageEventV2ChatHealthStatusStatusOptedOut MessageEventV2ChatHealthStatusStatus = "OPTED_OUT"`

          - `UpdatedAt Time`

            When this status last changed.

        - `IsGroup bool`

          Whether this is a group chat

        - `OwnerHandle ChatHandle`

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

          - `ID string`

            Unique identifier for this handle

          - `Handle string`

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

          - `JoinedAt Time`

            When this participant joined the chat

          - `Service ServiceType`

            Messaging service type

            - `const ServiceTypeIMessage ServiceType = "iMessage"`

            - `const ServiceTypeSMS ServiceType = "SMS"`

            - `const ServiceTypeRCS ServiceType = "RCS"`

          - `IsMe bool`

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

          - `LeftAt Time`

            When they left (if applicable)

          - `Status ChatHandleStatus`

            Participant status

            - `const ChatHandleStatusActive ChatHandleStatus = "active"`

            - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

            - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

      - `Direction MessageEventV2Direction`

        Message direction - "outbound" if sent by you, "inbound" if received

        - `const MessageEventV2DirectionInbound MessageEventV2Direction = "inbound"`

        - `const MessageEventV2DirectionOutbound MessageEventV2Direction = "outbound"`

      - `Parts []MessageEventV2PartUnion`

        Message parts (text and/or media)

        - `type SchemasTextPartResponse struct{…}`

          A text message part

          - `Type SchemasTextPartResponseType`

            Indicates this is a text message part

            - `const SchemasTextPartResponseTypeText SchemasTextPartResponseType = "text"`

          - `Value string`

            The text content

          - `Mention string`

            DEPRECATED: Use `mentions` instead. Handle (E.164 phone number or Apple ID email)
            of the **first** mention on this part. A part may carry several mentions; this
            field shows only the first in `value` order, so it cannot be used to determine
            whether a given participant was mentioned. `null` when the part carries no mention.

          - `MentionRange []int64`

            DEPRECATED: Use `mentions[].range` instead. Character range `[start, end)` in
            `value` highlighted as the **first** mention only. `null` when the range was
            omitted (the whole `value` is highlighted) or the part carries no mention.
            *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

          - `Mentions []SchemasTextPartResponseMention`

            Every mention on this part, in the order they appear in `value`. `null` when the
            part carries no mention. A part can carry several mentions of different people —
            check `is_me` to tell whether this line was one of them.

            Only iMessage carries mentions. On a received message this is populated when the
            sender was on iMessage; SMS and RCS have no way to mark a mention, so a message
            from an SMS or RCS participant arrives as plain text with `mentions` null, even in
            a group where other participants are on iMessage.

            - `Handle string`

              Address of the mentioned participant, exactly as the device recorded it — an E.164
              phone number or an email address.

            - `IsMe bool`

              Whether the mentioned participant is this line.

            - `Range []int64`

              Character range `[start, end)` in `value` highlighted as this mention.
              *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

          - `TextDecorations []TextDecoration`

            Text decorations applied to character ranges in the value

            - `Range []int64`

              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 TextDecorationAnimation`

              Animated text effect to apply. Mutually exclusive with `style`.

              - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

              - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

              - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

              - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

              - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

              - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

              - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

              - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

            - `Style TextDecorationStyle`

              Text style to apply. Mutually exclusive with `animation`.

              - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

              - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

              - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

              - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

        - `type SchemasMediaPartResponse struct{…}`

          A media attachment part

          - `ID string`

            Unique attachment identifier

          - `Filename string`

            Original filename

          - `MimeType string`

            MIME type of the file

          - `SizeBytes int64`

            File size in bytes

          - `Type SchemasMediaPartResponseType`

            Indicates this is a media attachment part

            - `const SchemasMediaPartResponseTypeMedia SchemasMediaPartResponseType = "media"`

          - `URL string`

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

        - `type MessageEventV2PartLink struct{…}`

          A rich link preview part

          - `Type Link`

            Indicates this is a rich link preview part

            - `const LinkLink Link = "link"`

          - `Value string`

            The URL

        - `type MessageEventV2PartIMessageApp struct{…}`

          An iMessage app card part.

          - `App MessageEventV2PartIMessageAppApp`

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

            - `BundleID string`

              Bundle identifier of the Messages app extension.

            - `Name string`

              Display name of the app.

            - `TeamID string`

              The app's 10-character team identifier.

            - `AppStoreID int64`

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

          - `Layout MessageEventV2PartIMessageAppLayout`

            Visible layout of the card.

            - `Caption string`

              Primary label, top-left and bold.

            - `Subcaption string`

              Secondary label, below caption on the left.

            - `TrailingCaption string`

              Label shown top-right.

            - `TrailingSubcaption string`

              Label shown below trailing_caption.

          - `Type IMessageApp`

            Indicates this is an iMessage app card part.

            - `const IMessageAppIMessageApp IMessageApp = "imessage_app"`

          - `URL string`

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

          - `FallbackText string`

            Fallback text for surfaces that cannot render the card.

        - `type MessageEventV2PartAppClip struct{…}`

          An Apple Pay App Clip payment card part

          - `Type AppClip`

            Indicates this is an App Clip payment card part

            - `const AppClipAppClip AppClip = "app_clip"`

          - `Value string`

            The checkout link the card opens

          - `Description string`

            The card's summary line, composed by Linq from the checkout session

          - `ImageURL string`

            The card's preview image

          - `Title string`

            The card's headline, composed by Linq from the checkout session

      - `SenderHandle ChatHandle`

        The handle that sent this message

      - `Service ServiceType`

        Messaging service type

      - `DeliveredAt Time`

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

      - `Effect SchemasMessageEffect`

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

        - `Name string`

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

        - `Type SchemasMessageEffectType`

          Effect category

          - `const SchemasMessageEffectTypeScreen SchemasMessageEffectType = "screen"`

          - `const SchemasMessageEffectTypeBubble SchemasMessageEffectType = "bubble"`

      - `IdempotencyKey string`

        Idempotency key for deduplication of outbound messages.

      - `PreferredService MessageEventV2PreferredService`

        Preferred messaging service type. Includes "auto" for default fallback behavior.

        - `const MessageEventV2PreferredServiceIMessage MessageEventV2PreferredService = "iMessage"`

        - `const MessageEventV2PreferredServiceSMS MessageEventV2PreferredService = "SMS"`

        - `const MessageEventV2PreferredServiceRCS MessageEventV2PreferredService = "RCS"`

        - `const MessageEventV2PreferredServiceAuto MessageEventV2PreferredService = "auto"`

      - `ReadAt Time`

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

      - `ReconciledAt Time`

        Present only when this message was recovered by reconciliation rather than delivered live, and set to the time of that recovery. The field is omitted entirely for normally-delivered messages, which is the overwhelming majority. When present, expect `sent_at` to be substantially earlier than delivery of this event: the message is genuine but is arriving late and out of real-time order, so treat it as history rather than as a live inbound (for example, suppress auto-replies).

      - `ReplyTo MessageEventV2ReplyTo`

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

        - `MessageID string`

          ID of the message being replied to

        - `PartIndex int64`

          Index of the part being replied to

      - `SentAt Time`

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

      - `ZeroRetention bool`

        True when this message was sent on a zero-day-retention line. `parts` is always empty in that case — Linq never persists this message's content, so there is nothing to include here, not even a count or type of what was sent.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

      - `const WebhookEventTypeMessageSent WebhookEventType = "message.sent"`

      - `const WebhookEventTypeMessageReceived WebhookEventType = "message.received"`

      - `const WebhookEventTypeMessageRead WebhookEventType = "message.read"`

      - `const WebhookEventTypeMessageDelivered WebhookEventType = "message.delivered"`

      - `const WebhookEventTypeMessageFailed WebhookEventType = "message.failed"`

      - `const WebhookEventTypeMessageEdited WebhookEventType = "message.edited"`

      - `const WebhookEventTypeReactionAdded WebhookEventType = "reaction.added"`

      - `const WebhookEventTypeReactionRemoved WebhookEventType = "reaction.removed"`

      - `const WebhookEventTypePollReceived WebhookEventType = "poll.received"`

      - `const WebhookEventTypePollFailed WebhookEventType = "poll.failed"`

      - `const WebhookEventTypePollSent WebhookEventType = "poll.sent"`

      - `const WebhookEventTypePollDelivered WebhookEventType = "poll.delivered"`

      - `const WebhookEventTypePollRead WebhookEventType = "poll.read"`

      - `const WebhookEventTypePollUpdated WebhookEventType = "poll.updated"`

      - `const WebhookEventTypePollVoteAdded WebhookEventType = "poll.vote.added"`

      - `const WebhookEventTypePollVoteRemoved WebhookEventType = "poll.vote.removed"`

      - `const WebhookEventTypePollReactionAdded WebhookEventType = "poll.reaction.added"`

      - `const WebhookEventTypeParticipantAdded WebhookEventType = "participant.added"`

      - `const WebhookEventTypeParticipantRemoved WebhookEventType = "participant.removed"`

      - `const WebhookEventTypeChatCreated WebhookEventType = "chat.created"`

      - `const WebhookEventTypeChatGroupNameUpdated WebhookEventType = "chat.group_name_updated"`

      - `const WebhookEventTypeChatGroupIconUpdated WebhookEventType = "chat.group_icon_updated"`

      - `const WebhookEventTypeChatGroupNameUpdateFailed WebhookEventType = "chat.group_name_update_failed"`

      - `const WebhookEventTypeChatGroupIconUpdateFailed WebhookEventType = "chat.group_icon_update_failed"`

      - `const WebhookEventTypeChatBackgroundUpdated WebhookEventType = "chat.background_updated"`

      - `const WebhookEventTypeChatBackgroundUpdateFailed WebhookEventType = "chat.background_update_failed"`

      - `const WebhookEventTypeChatTypingIndicatorStarted WebhookEventType = "chat.typing_indicator.started"`

      - `const WebhookEventTypeChatTypingIndicatorStopped WebhookEventType = "chat.typing_indicator.stopped"`

      - `const WebhookEventTypePhoneNumberStatusUpdated WebhookEventType = "phone_number.status_updated"`

      - `const WebhookEventTypeContactCardReceived WebhookEventType = "contact_card.received"`

      - `const WebhookEventTypeCallInitiated WebhookEventType = "call.initiated"`

      - `const WebhookEventTypeCallRinging WebhookEventType = "call.ringing"`

      - `const WebhookEventTypeCallAnswered WebhookEventType = "call.answered"`

      - `const WebhookEventTypeCallEnded WebhookEventType = "call.ended"`

      - `const WebhookEventTypeCallFailed WebhookEventType = "call.failed"`

      - `const WebhookEventTypeCallDeclined WebhookEventType = "call.declined"`

      - `const WebhookEventTypeCallNoAnswer WebhookEventType = "call.no_answer"`

      - `const WebhookEventTypeLocationSharingStarted WebhookEventType = "location.sharing.started"`

      - `const WebhookEventTypeLocationSharingStopped WebhookEventType = "location.sharing.stopped"`

      - `const WebhookEventTypePaymentSucceeded WebhookEventType = "payment.succeeded"`

      - `const WebhookEventTypePaymentCanceled WebhookEventType = "payment.canceled"`

      - `const WebhookEventTypePaymentExpired WebhookEventType = "payment.expired"`

      - `const WebhookEventTypePaymentDeclined WebhookEventType = "payment.declined"`

      - `const WebhookEventTypePaymentAuthorized WebhookEventType = "payment.authorized"`

      - `const WebhookEventTypeConnectionCreated WebhookEventType = "connection.created"`

      - `const WebhookEventTypeConnectionRevoked WebhookEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type MessageReceivedWebhookEvent struct{…}`

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

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data 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

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type MessageReadWebhookEvent struct{…}`

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

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data 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

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type MessageDeliveredWebhookEvent struct{…}`

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

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data 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

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type MessageFailedWebhookEvent struct{…}`

    Complete webhook payload for message.failed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data MessageFailedWebhookEventData`

      Error details for message.failed webhook events.
      See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

      In rare cases the message can still be delivered after this event fires — a `message.delivered` webhook for the same message ID may follow.

      - `Code int64`

        Error codes in webhook failure events. The possible set varies by event:
        message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
        4008; the group update failure events (chat.group_name_update_failed,
        chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
        carries 1005, 2011, 4001, or 5002.

      - `FailedAt Time`

        When the failure was detected

      - `ChatID string`

        Chat identifier (UUID)

      - `DetailCode int64`

        Opaque diagnostic code identifying the specific failure class within `code`.
        Values are not enumerated and may change without notice — log it and include
        it in support requests, but do not branch on it.

      - `MessageID string`

        Message identifier (UUID)

      - `PreferredService string`

        Preferred messaging service type. Includes "auto" for default fallback behavior.

        - `const MessageFailedWebhookEventDataPreferredServiceIMessage MessageFailedWebhookEventDataPreferredService = "iMessage"`

        - `const MessageFailedWebhookEventDataPreferredServiceSMS MessageFailedWebhookEventDataPreferredService = "SMS"`

        - `const MessageFailedWebhookEventDataPreferredServiceRCS MessageFailedWebhookEventDataPreferredService = "RCS"`

        - `const MessageFailedWebhookEventDataPreferredServiceAuto MessageFailedWebhookEventDataPreferredService = "auto"`

      - `Reason string`

        Human-readable description of the failure

      - `Service ServiceType`

        Messaging service type

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type MessageEditedWebhookEvent struct{…}`

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

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data MessageEditedWebhookEventData`

      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 string`

        Message identifier

      - `Chat MessageEditedWebhookEventDataChat`

        Chat context

        - `ID string`

          Chat identifier

        - `HealthStatus MessageEditedWebhookEventDataChatHealthStatus`

          **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

          See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

          - `DocURL string`

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

          - `Status string`

            Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

            `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
            The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
            does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
            casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
            soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
            in immediately — a reply in any conversation with you counts, the same way the block does.

            `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
            a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
            Group threads are never marked and are never blocked.

            Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
            `2024`) before the message is queued, across every chat and every line on your account. Nothing is
            delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
            request.

            - `const MessageEditedWebhookEventDataChatHealthStatusStatusHealthy MessageEditedWebhookEventDataChatHealthStatusStatus = "HEALTHY"`

            - `const MessageEditedWebhookEventDataChatHealthStatusStatusAtRisk MessageEditedWebhookEventDataChatHealthStatusStatus = "AT_RISK"`

            - `const MessageEditedWebhookEventDataChatHealthStatusStatusCritical MessageEditedWebhookEventDataChatHealthStatusStatus = "CRITICAL"`

            - `const MessageEditedWebhookEventDataChatHealthStatusStatusOptedOut MessageEditedWebhookEventDataChatHealthStatusStatus = "OPTED_OUT"`

          - `UpdatedAt Time`

            When this status last changed.

        - `IsGroup bool`

          Whether this is a group chat

        - `OwnerHandle ChatHandle`

          The handle that owns this chat (your phone number)

      - `Direction string`

        "outbound" if you sent the original message, "inbound" if you received it

        - `const MessageEditedWebhookEventDataDirectionOutbound MessageEditedWebhookEventDataDirection = "outbound"`

        - `const MessageEditedWebhookEventDataDirectionInbound MessageEditedWebhookEventDataDirection = "inbound"`

      - `EditedAt Time`

        When the edit occurred

      - `Part MessageEditedWebhookEventDataPart`

        The edited part

        - `Index int64`

          Zero-based index of the edited part within the message

        - `Text string`

          New text content of the part

      - `SenderHandle ChatHandle`

        The handle that sent (and edited) this message

      - `ZeroRetention bool`

        True when the edited message is on a zero-day-retention line. Behavior differs by `direction`: on an outbound edit, `part.text` is empty — you already saw the real edited text once, synchronously, in the edit API response, and Linq never persists it. On an inbound edit, `part.text` is still the real text as received; zero-day-retention only means Linq never persists it.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ReactionAddedWebhookEvent struct{…}`

    Complete webhook payload for reaction.added events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ReactionEventBase`

      Payload for reaction.added webhook events

      - `IsFromMe bool`

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

      - `ReactionType 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.

        - `const ReactionTypeLove ReactionType = "love"`

        - `const ReactionTypeLike ReactionType = "like"`

        - `const ReactionTypeDislike ReactionType = "dislike"`

        - `const ReactionTypeLaugh ReactionType = "laugh"`

        - `const ReactionTypeEmphasize ReactionType = "emphasize"`

        - `const ReactionTypeQuestion ReactionType = "question"`

        - `const ReactionTypeCustom ReactionType = "custom"`

        - `const ReactionTypeSticker ReactionType = "sticker"`

      - `ChatID string`

        Chat identifier (UUID)

      - `CustomEmoji string`

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

      - `From string`

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

      - `FromHandle ChatHandle`

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

      - `MessageID string`

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

      - `PartIndex int64`

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

      - `ReactedAt Time`

        When the reaction was added or removed

      - `ReactionID string`

        Identifier for this reaction. Pass it to
        `PATCH /v3/messages/{messageId}/reactions/{reactionId}` to move a sticker.
        Stickers stack, so this is what distinguishes one sticker from another on the
        same message.

      - `Service ServiceType`

        Messaging service type

      - `Sticker ReactionEventBaseSticker`

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

        - `FileName string`

          Filename of the sticker

        - `Height int64`

          Sticker image height in pixels

        - `MimeType string`

          MIME type of the sticker image

        - `URL string`

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

        - `Width int64`

          Sticker image width in pixels

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ReactionRemovedWebhookEvent struct{…}`

    Complete webhook payload for reaction.removed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ReactionEventBase`

      Payload for reaction.removed webhook events

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollReceivedWebhookEvent struct{…}`

    Complete webhook payload for poll.received events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollReceivedWebhookEventData`

      Payload for poll.received — a poll created by someone else and delivered to your line.
      Carries the full poll snapshot (options, no voters yet) at receipt time.

      - `Chat PollReceivedWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `CreatedAt Time`

      - `Direction string`

        - `const PollReceivedWebhookEventDataDirectionInbound PollReceivedWebhookEventDataDirection = "inbound"`

        - `const PollReceivedWebhookEventDataDirectionOutbound PollReceivedWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `Poll PollReceivedWebhookEventDataPoll`

        - `Options []PollReceivedWebhookEventDataPollOption`

          - `CanBeEdited bool`

          - `CreatorHandle ChatHandle`

            The participant who added this option (poll creator for the initial options; whoever
            added later ones). On a poll.updated this differs from the event's `sender_handle`
            whenever a remote participant added the option. Null when unknown.

          - `OptionID string`

          - `Text string`

          - `Voters []PollReceivedWebhookEventDataPollOptionVoter`

            - `Handle string`

            - `VotedAt Time`

        - `TotalVoters int64`

          Distinct participants across the whole poll.

      - `ReceivedAt Time`

      - `Service string`

      - `UpdatedAt Time`

      - `SenderHandle ChatHandle`

        The line that created the poll (is_me=false for an inbound poll).

      - `ZeroRetention bool`

        True when your line has zero-day-retention enabled. Unlike other poll webhooks, option `text` here is still the real, unstripped text as received — Linq never persists it in the database, but this webhook fires from the live inbound event, not a database read, so this is the one place it's shown.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollSentWebhookEvent struct{…}`

    Complete webhook payload for poll.sent events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollSentWebhookEventData`

      Payload for poll.sent, poll.delivered, and poll.read webhook events. Timestamps indicate
      state (null = not yet happened): sent → sent_at; delivered → +delivered_at; read → +read_at.

      - `Chat PollSentWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `CreatedAt Time`

      - `Direction string`

        - `const PollSentWebhookEventDataDirectionInbound PollSentWebhookEventDataDirection = "inbound"`

        - `const PollSentWebhookEventDataDirectionOutbound PollSentWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `Poll PollSentWebhookEventDataPoll`

        - `Options []PollSentWebhookEventDataPollOption`

          - `CanBeEdited bool`

          - `CreatorHandle ChatHandle`

            The participant who added this option (poll creator for the initial options; whoever
            added later ones). On a poll.updated this differs from the event's `sender_handle`
            whenever a remote participant added the option. Null when unknown.

          - `OptionID string`

          - `Text string`

          - `Voters []PollSentWebhookEventDataPollOptionVoter`

            - `Handle string`

            - `VotedAt Time`

        - `TotalVoters int64`

          Distinct participants across the whole poll.

      - `Service string`

      - `UpdatedAt Time`

      - `DeliveredAt Time`

      - `ReadAt Time`

      - `SenderHandle ChatHandle`

        The handle that sent the poll.

      - `SentAt Time`

      - `ZeroRetention bool`

        True when this poll was sent on a zero-day-retention line. Every option's `text` is empty in that case — Linq never persists poll option text, so there is nothing to include here. The real text was only ever shown once, synchronously, in the API response when the poll was created or added to.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollDeliveredWebhookEvent struct{…}`

    Complete webhook payload for poll.delivered events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollDeliveredWebhookEventData`

      Payload for poll.sent, poll.delivered, and poll.read webhook events. Timestamps indicate
      state (null = not yet happened): sent → sent_at; delivered → +delivered_at; read → +read_at.

      - `Chat PollDeliveredWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `CreatedAt Time`

      - `Direction string`

        - `const PollDeliveredWebhookEventDataDirectionInbound PollDeliveredWebhookEventDataDirection = "inbound"`

        - `const PollDeliveredWebhookEventDataDirectionOutbound PollDeliveredWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `Poll PollDeliveredWebhookEventDataPoll`

        - `Options []PollDeliveredWebhookEventDataPollOption`

          - `CanBeEdited bool`

          - `CreatorHandle ChatHandle`

            The participant who added this option (poll creator for the initial options; whoever
            added later ones). On a poll.updated this differs from the event's `sender_handle`
            whenever a remote participant added the option. Null when unknown.

          - `OptionID string`

          - `Text string`

          - `Voters []PollDeliveredWebhookEventDataPollOptionVoter`

            - `Handle string`

            - `VotedAt Time`

        - `TotalVoters int64`

          Distinct participants across the whole poll.

      - `Service string`

      - `UpdatedAt Time`

      - `DeliveredAt Time`

      - `ReadAt Time`

      - `SenderHandle ChatHandle`

        The handle that sent the poll.

      - `SentAt Time`

      - `ZeroRetention bool`

        True when this poll was sent on a zero-day-retention line. Every option's `text` is empty in that case — Linq never persists poll option text, so there is nothing to include here. The real text was only ever shown once, synchronously, in the API response when the poll was created or added to.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollReadWebhookEvent struct{…}`

    Complete webhook payload for poll.read events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollReadWebhookEventData`

      Payload for poll.sent, poll.delivered, and poll.read webhook events. Timestamps indicate
      state (null = not yet happened): sent → sent_at; delivered → +delivered_at; read → +read_at.

      - `Chat PollReadWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `CreatedAt Time`

      - `Direction string`

        - `const PollReadWebhookEventDataDirectionInbound PollReadWebhookEventDataDirection = "inbound"`

        - `const PollReadWebhookEventDataDirectionOutbound PollReadWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `Poll PollReadWebhookEventDataPoll`

        - `Options []PollReadWebhookEventDataPollOption`

          - `CanBeEdited bool`

          - `CreatorHandle ChatHandle`

            The participant who added this option (poll creator for the initial options; whoever
            added later ones). On a poll.updated this differs from the event's `sender_handle`
            whenever a remote participant added the option. Null when unknown.

          - `OptionID string`

          - `Text string`

          - `Voters []PollReadWebhookEventDataPollOptionVoter`

            - `Handle string`

            - `VotedAt Time`

        - `TotalVoters int64`

          Distinct participants across the whole poll.

      - `Service string`

      - `UpdatedAt Time`

      - `DeliveredAt Time`

      - `ReadAt Time`

      - `SenderHandle ChatHandle`

        The handle that sent the poll.

      - `SentAt Time`

      - `ZeroRetention bool`

        True when this poll was sent on a zero-day-retention line. Every option's `text` is empty in that case — Linq never persists poll option text, so there is nothing to include here. The real text was only ever shown once, synchronously, in the API response when the poll was created or added to.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollUpdatedWebhookEvent struct{…}`

    Complete webhook payload for poll.updated events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollUpdatedWebhookEventData`

      Payload for poll.updated (option(s) added — add-only).

      - `AddedOptions []PollUpdatedWebhookEventDataAddedOption`

        Only the options this update added — never the ones the poll already had. Fetch the poll to read its full option set.

        - `CanBeEdited bool`

        - `CreatorHandle ChatHandle`

          The participant who added this option (poll creator for the initial options; whoever
          added later ones). On a poll.updated this differs from the event's `sender_handle`
          whenever a remote participant added the option. Null when unknown.

        - `OptionID string`

        - `Text string`

        - `Voters []PollUpdatedWebhookEventDataAddedOptionVoter`

          - `Handle string`

          - `VotedAt Time`

      - `Chat PollUpdatedWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `Direction string`

        - `const PollUpdatedWebhookEventDataDirectionInbound PollUpdatedWebhookEventDataDirection = "inbound"`

        - `const PollUpdatedWebhookEventDataDirectionOutbound PollUpdatedWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `SenderHandle ChatHandle`

        Your line — the one that received or sent this update. Always present. On an inbound
        update this is NOT who added the option: use `added_options[].creator_handle` for
        that, which will be the remote participant.

      - `Service string`

      - `ZeroRetention bool`

        True when zero-day-retention applies to this update. Behavior differs by `direction`: on an inbound update, `added_options[].text` is the real text a participant just added; on an outbound update, it is empty — you already saw the real text once, synchronously, in the API response when you made the add, and this webhook is built from a database read, which never stored it.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollFailedWebhookEvent struct{…}`

    Complete webhook payload for poll.failed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollFailedWebhookEventData`

      Payload for poll.failed — an outbound poll (or poll action) that failed to send. Carries the
      poll snapshot at failure time plus the error and when it failed.

      - `Chat PollFailedWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `Direction string`

        - `const PollFailedWebhookEventDataDirectionInbound PollFailedWebhookEventDataDirection = "inbound"`

        - `const PollFailedWebhookEventDataDirectionOutbound PollFailedWebhookEventDataDirection = "outbound"`

      - `Error PollFailedWebhookEventDataError`

        - `Code int64`

          Error codes in webhook failure events. The possible set varies by event:
          message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
          4008; the group update failure events (chat.group_name_update_failed,
          chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
          carries 1005, 2011, 4001, or 5002.

        - `Message string`

      - `FailedAt Time`

      - `MessageID string`

      - `Poll PollFailedWebhookEventDataPoll`

        - `Options []PollFailedWebhookEventDataPollOption`

          - `CanBeEdited bool`

          - `CreatorHandle ChatHandle`

            The participant who added this option (poll creator for the initial options; whoever
            added later ones). On a poll.updated this differs from the event's `sender_handle`
            whenever a remote participant added the option. Null when unknown.

          - `OptionID string`

          - `Text string`

          - `Voters []PollFailedWebhookEventDataPollOptionVoter`

            - `Handle string`

            - `VotedAt Time`

        - `TotalVoters int64`

          Distinct participants across the whole poll.

      - `Service string`

      - `SenderHandle ChatHandle`

        Null on failure (the send never landed).

      - `ZeroRetention bool`

        True when this poll was sent on a zero-day-retention line. `poll` is built from the same database read as poll.sent/delivered/read, so every option's `text` is empty.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollVoteAddedWebhookEvent struct{…}`

    Complete webhook payload for poll.vote.added events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollVoteAddedWebhookEventData`

      Payload for poll.vote.added and poll.vote.removed (one option toggled).

      - `Chat PollVoteAddedWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `Direction string`

        - `const PollVoteAddedWebhookEventDataDirectionInbound PollVoteAddedWebhookEventDataDirection = "inbound"`

        - `const PollVoteAddedWebhookEventDataDirectionOutbound PollVoteAddedWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `OptionID string`

      - `SenderHandle ChatHandle`

        The voter — always present.

      - `Service string`

      - `ZeroRetention bool`

        True when this poll is on a zero-day-retention line. Votes are unaffected by zero-day-retention — a vote choice is always persisted and delivered regardless — this flag is informational only, telling you why this poll's other webhooks (poll.sent, poll.updated, etc.) may carry empty option text.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollVoteRemovedWebhookEvent struct{…}`

    Complete webhook payload for poll.vote.removed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PollVoteRemovedWebhookEventData`

      Payload for poll.vote.added and poll.vote.removed (one option toggled).

      - `Chat PollVoteRemovedWebhookEventDataChat`

        Chat info for poll webhook events.

        - `ID string`

        - `IsGroup bool`

        - `OwnerHandle ChatHandle`

      - `Direction string`

        - `const PollVoteRemovedWebhookEventDataDirectionInbound PollVoteRemovedWebhookEventDataDirection = "inbound"`

        - `const PollVoteRemovedWebhookEventDataDirectionOutbound PollVoteRemovedWebhookEventDataDirection = "outbound"`

      - `MessageID string`

      - `OptionID string`

      - `SenderHandle ChatHandle`

        The voter — always present.

      - `Service string`

      - `ZeroRetention bool`

        True when this poll is on a zero-day-retention line. Votes are unaffected by zero-day-retention — a vote choice is always persisted and delivered regardless — this flag is informational only, telling you why this poll's other webhooks (poll.sent, poll.updated, etc.) may carry empty option text.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PollReactionAddedWebhookEvent struct{…}`

    Complete webhook payload for poll.reaction.added events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ReactionEventBase`

      Payload for poll.reaction.added — a reaction on a poll message. Same shape as
      reaction.added; `message_id` is the poll-definition message's ID. Poll reactions are
      stickers, which iMessage cannot remove, so there is no removal counterpart.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ParticipantAddedWebhookEvent struct{…}`

    Complete webhook payload for participant.added events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ParticipantAddedWebhookEventData`

      Payload for participant.added webhook events

      - `Handle string`

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

      - `AddedAt Time`

        When the participant was added

      - `ChatID string`

        Chat identifier (UUID) of the group chat

      - `Participant ChatHandle`

        The added participant as a full handle object

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ParticipantRemovedWebhookEvent struct{…}`

    Complete webhook payload for participant.removed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ParticipantRemovedWebhookEventData`

      Payload for participant.removed webhook events

      - `Handle string`

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

      - `ChatID string`

        Chat identifier (UUID) of the group chat

      - `Participant ChatHandle`

        The removed participant as a full handle object

      - `RemovedAt Time`

        When the participant was removed

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatCreatedWebhookEvent struct{…}`

    Complete webhook payload for chat.created events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatCreatedWebhookEventData`

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

      - `ID string`

        Unique identifier for the chat

      - `CreatedAt Time`

        When the chat was created

      - `DisplayName string`

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

      - `Handles []ChatHandle`

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

        - `ID string`

          Unique identifier for this handle

        - `Handle string`

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

        - `JoinedAt Time`

          When this participant joined the chat

        - `Service ServiceType`

          Messaging service type

        - `IsMe bool`

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

        - `LeftAt Time`

          When they left (if applicable)

        - `Status ChatHandleStatus`

          Participant status

      - `HealthStatus ChatCreatedWebhookEventDataHealthStatus`

        **[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 surface chat and 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. To gate a send, act on the response rather than the status: a `403` is the authoritative answer.

        See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each status means and how to react.

        - `DocURL string`

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

        - `Status string`

          Current health bucket for the chat. See the [Chat Health guide](/channel/imessage/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

          `OPTED_OUT` — the recipient sent `STOP`, `UNSUBSCRIBE`, `OPTOUT`, `CANCEL`, `END`, or `QUIT`.
          The keyword must be the whole trimmed message, never part of a longer one: `STOP` counts, `please stop`
          does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any
          casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears as
          soon as they reply again: any later message from them that is not itself an opt-out keyword opts them back
          in immediately — a reply in any conversation with you counts, the same way the block does.

          `OPTED_OUT` marks only the conversation the keyword arrived in. The block below is wider than the mark, so
          a conversation still reading `HEALTHY` can be blocked as well — gate on the `403`, not on the status.
          Group threads are never marked and are never blocked.

          Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code
          `2024`) before the message is queued, across every chat and every line on your account. Nothing is
          delivered, including a final courtesy message — to send one, set `override_optout: true` on that single
          request.

          - `const ChatCreatedWebhookEventDataHealthStatusStatusHealthy ChatCreatedWebhookEventDataHealthStatusStatus = "HEALTHY"`

          - `const ChatCreatedWebhookEventDataHealthStatusStatusAtRisk ChatCreatedWebhookEventDataHealthStatusStatus = "AT_RISK"`

          - `const ChatCreatedWebhookEventDataHealthStatusStatusCritical ChatCreatedWebhookEventDataHealthStatusStatus = "CRITICAL"`

          - `const ChatCreatedWebhookEventDataHealthStatusStatusOptedOut ChatCreatedWebhookEventDataHealthStatusStatus = "OPTED_OUT"`

        - `UpdatedAt Time`

          When this status last changed.

      - `IsGroup bool`

        Whether this is a group chat

      - `UpdatedAt Time`

        When the chat was last updated

      - `Service ServiceType`

        Messaging service type

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatGroupNameUpdatedWebhookEvent struct{…}`

    Complete webhook payload for chat.group_name_updated events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatGroupNameUpdatedWebhookEventData`

      Payload for chat.group_name_updated webhook events

      - `ChatID string`

        Chat identifier (UUID) of the group chat

      - `UpdatedAt Time`

        When the update occurred

      - `ChangedByHandle ChatHandle`

        The handle who made the change.

      - `NewValue string`

        New group name (null if the name was removed)

      - `OldValue string`

        Previous group name (null if no previous name)

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatGroupIconUpdatedWebhookEvent struct{…}`

    Complete webhook payload for chat.group_icon_updated events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatGroupIconUpdatedWebhookEventData`

      Payload for chat.group_icon_updated webhook events

      - `ChatID string`

        Chat identifier (UUID) of the group chat

      - `UpdatedAt Time`

        When the update occurred

      - `ChangedByHandle ChatHandle`

        The handle who made the change.

      - `NewValue string`

        New icon URL (null if the icon was removed)

      - `OldValue string`

        Previous icon URL (null if no previous icon)

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatGroupNameUpdateFailedWebhookEvent struct{…}`

    Complete webhook payload for chat.group_name_update_failed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatGroupNameUpdateFailedWebhookEventData`

      Error details for chat.group_name_update_failed webhook events.
      See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

      - `ChatID string`

        Chat identifier (UUID) of the group chat

      - `ErrorCode int64`

        Error codes in webhook failure events. The possible set varies by event:
        message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
        4008; the group update failure events (chat.group_name_update_failed,
        chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
        carries 1005, 2011, 4001, or 5002.

      - `FailedAt Time`

        When the failure was detected

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatGroupIconUpdateFailedWebhookEvent struct{…}`

    Complete webhook payload for chat.group_icon_update_failed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatGroupIconUpdateFailedWebhookEventData`

      Error details for chat.group_icon_update_failed webhook events.
      See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

      - `ChatID string`

        Chat identifier (UUID) of the group chat

      - `ErrorCode int64`

        Error codes in webhook failure events. The possible set varies by event:
        message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
        4008; the group update failure events (chat.group_name_update_failed,
        chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
        carries 1005, 2011, 4001, or 5002.

      - `FailedAt Time`

        When the failure was detected

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatTypingIndicatorStartedWebhookEvent struct{…}`

    Complete webhook payload for chat.typing_indicator.started events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatTypingIndicatorStartedWebhookEventData`

      Payload for chat.typing_indicator.started webhook events

      - `ChatID string`

        Chat identifier

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatTypingIndicatorStoppedWebhookEvent struct{…}`

    Complete webhook payload for chat.typing_indicator.stopped events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatTypingIndicatorStoppedWebhookEventData`

      Payload for chat.typing_indicator.stopped webhook events

      - `ChatID string`

        Chat identifier

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatBackgroundUpdatedWebhookEvent struct{…}`

    Complete webhook payload for chat.background_updated events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatBackgroundUpdatedWebhookEventData`

      Payload for chat.background_updated webhook events.

      - `Chat ChatBackgroundUpdatedWebhookEventDataChat`

        Chat information

        - `ID string`

          Chat identifier

        - `IsGroup bool`

          Whether this is a group chat

        - `OwnerHandle ChatHandle`

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

      - `ActorHandle ChatHandle`

        Who changed it. `is_me` is true when your own number set it.

      - `Background ChatBackgroundUpdatedWebhookEventDataBackground`

        A chat transcript background. Fields are populated per `type`.

        - `Type string`

          The background family.

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundTypeColor ChatBackgroundUpdatedWebhookEventDataBackgroundType = "color"`

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundTypeDynamic ChatBackgroundUpdatedWebhookEventDataBackgroundType = "dynamic"`

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundTypePhoto ChatBackgroundUpdatedWebhookEventDataBackgroundType = "photo"`

        - `ImageURL string`

          Photo: a hosted URL for the background image, whether you set it or a
          participant did. Apple stores the image, not the URL it came from, so the
          image is re-hosted and this is our URL rather than the one you supplied.
          `null` only if the image could not be hosted.

        - `Shades []string`

          Color: the two gradient stops as hex, top then bottom.

        - `Style string`

          Dynamic: the animated style.

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleSky ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "sky"`

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleWater ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "water"`

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleAurora ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "aurora"`

          - `const ChatBackgroundUpdatedWebhookEventDataBackgroundStyleGlitter ChatBackgroundUpdatedWebhookEventDataBackgroundStyle = "glitter"`

        - `Variant string`

          Color: `custom` (the stored two colors) or a named swatch. Dynamic: the
          variant within the `style` (e.g. `sunrise`).

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ChatBackgroundUpdateFailedWebhookEvent struct{…}`

    Complete webhook payload for chat.background_update_failed events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ChatBackgroundUpdateFailedWebhookEventData`

      Error details for chat.background_update_failed webhook events.
      See [WebhookErrorCode](#/components/schemas/WebhookErrorCode) for the full error code reference.

      - `ChatID string`

        Chat identifier (UUID) whose background update failed

      - `ErrorCode int64`

        Error codes in webhook failure events. The possible set varies by event:
        message.failed and poll.failed can carry 3007, 4001, 4002, 4005, 4006, 4007, or
        4008; the group update failure events (chat.group_name_update_failed,
        chat.group_icon_update_failed) carry 3007 or 4001; chat.background_update_failed
        carries 1005, 2011, 4001, or 5002.

      - `FailedAt Time`

        When the failure was detected

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ContactCardReceivedWebhookEvent struct{…}`

    Complete webhook payload for contact_card.received events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ContactCardReceivedWebhookEventData`

      Payload for contact_card.received webhook events.

      A contact belongs to a line, not to an individual chat. You receive one event per person who
      shares their contact, regardless of how many chats they have in common with your line.

      The event fires again whenever the shared contact's name or media changes.

      - `FirstName string`

        First name from the shared contact card

      - `LastName string`

        Last name from the shared contact card (may be empty)

      - `OwnerHandle string`

        Which of your lines they shared it with.

      - `SenderHandle string`

        The person who shared their card — a phone number or email address.

      - `MediaURL string`

        URL of the contact's media, served from `cdn.linqapp.com`. `null` when the
        contact shared no media, and also when media was shared but could not be
        retrieved — this field does not distinguish the two.

        Download the media and store it yourself. The URL may be signed and expire,
        in as little as 45 minutes, and altering its query string invalidates it
        immediately.

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType 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.

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PhoneNumberStatusUpdatedWebhookEvent struct{…}`

    Complete webhook payload for phone_number.status_updated events

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PhoneNumberStatusUpdatedWebhookEventData`

      Payload for phone_number.status_updated webhook events

      - `ChangedAt Time`

        When the status change occurred

      - `NewReputation string`

        The new line reputation

        - `const PhoneNumberStatusUpdatedWebhookEventDataNewReputationHealthy PhoneNumberStatusUpdatedWebhookEventDataNewReputation = "HEALTHY"`

        - `const PhoneNumberStatusUpdatedWebhookEventDataNewReputationAtRisk PhoneNumberStatusUpdatedWebhookEventDataNewReputation = "AT_RISK"`

        - `const PhoneNumberStatusUpdatedWebhookEventDataNewReputationCritical PhoneNumberStatusUpdatedWebhookEventDataNewReputation = "CRITICAL"`

      - `NewStatus string`

        The new service status

        - `const PhoneNumberStatusUpdatedWebhookEventDataNewStatusActive PhoneNumberStatusUpdatedWebhookEventDataNewStatus = "ACTIVE"`

        - `const PhoneNumberStatusUpdatedWebhookEventDataNewStatusFlagged PhoneNumberStatusUpdatedWebhookEventDataNewStatus = "FLAGGED"`

      - `PhoneNumber string`

        Phone number in E.164 format

      - `PreviousReputation string`

        The previous line reputation

        - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousReputationHealthy PhoneNumberStatusUpdatedWebhookEventDataPreviousReputation = "HEALTHY"`

        - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousReputationAtRisk PhoneNumberStatusUpdatedWebhookEventDataPreviousReputation = "AT_RISK"`

        - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousReputationCritical PhoneNumberStatusUpdatedWebhookEventDataPreviousReputation = "CRITICAL"`

      - `PreviousStatus string`

        The previous service status

        - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousStatusActive PhoneNumberStatusUpdatedWebhookEventDataPreviousStatus = "ACTIVE"`

        - `const PhoneNumberStatusUpdatedWebhookEventDataPreviousStatusFlagged PhoneNumberStatusUpdatedWebhookEventDataPreviousStatus = "FLAGGED"`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType PhoneNumberStatusUpdatedWebhookEventEventType`

      The type of event

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageSent PhoneNumberStatusUpdatedWebhookEventEventType = "message.sent"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageReceived PhoneNumberStatusUpdatedWebhookEventEventType = "message.received"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageRead PhoneNumberStatusUpdatedWebhookEventEventType = "message.read"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageDelivered PhoneNumberStatusUpdatedWebhookEventEventType = "message.delivered"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageFailed PhoneNumberStatusUpdatedWebhookEventEventType = "message.failed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeMessageEdited PhoneNumberStatusUpdatedWebhookEventEventType = "message.edited"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeReactionAdded PhoneNumberStatusUpdatedWebhookEventEventType = "reaction.added"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeReactionRemoved PhoneNumberStatusUpdatedWebhookEventEventType = "reaction.removed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollReceived PhoneNumberStatusUpdatedWebhookEventEventType = "poll.received"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollFailed PhoneNumberStatusUpdatedWebhookEventEventType = "poll.failed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollSent PhoneNumberStatusUpdatedWebhookEventEventType = "poll.sent"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollDelivered PhoneNumberStatusUpdatedWebhookEventEventType = "poll.delivered"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollRead PhoneNumberStatusUpdatedWebhookEventEventType = "poll.read"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "poll.updated"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollVoteAdded PhoneNumberStatusUpdatedWebhookEventEventType = "poll.vote.added"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollVoteRemoved PhoneNumberStatusUpdatedWebhookEventEventType = "poll.vote.removed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePollReactionAdded PhoneNumberStatusUpdatedWebhookEventEventType = "poll.reaction.added"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeParticipantAdded PhoneNumberStatusUpdatedWebhookEventEventType = "participant.added"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeParticipantRemoved PhoneNumberStatusUpdatedWebhookEventEventType = "participant.removed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatCreated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.created"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupNameUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_name_updated"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupIconUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_icon_updated"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupNameUpdateFailed PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatGroupIconUpdateFailed PhoneNumberStatusUpdatedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatBackgroundUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "chat.background_updated"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatBackgroundUpdateFailed PhoneNumberStatusUpdatedWebhookEventEventType = "chat.background_update_failed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatTypingIndicatorStarted PhoneNumberStatusUpdatedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeChatTypingIndicatorStopped PhoneNumberStatusUpdatedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePhoneNumberStatusUpdated PhoneNumberStatusUpdatedWebhookEventEventType = "phone_number.status_updated"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeContactCardReceived PhoneNumberStatusUpdatedWebhookEventEventType = "contact_card.received"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallInitiated PhoneNumberStatusUpdatedWebhookEventEventType = "call.initiated"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallRinging PhoneNumberStatusUpdatedWebhookEventEventType = "call.ringing"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallAnswered PhoneNumberStatusUpdatedWebhookEventEventType = "call.answered"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallEnded PhoneNumberStatusUpdatedWebhookEventEventType = "call.ended"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallFailed PhoneNumberStatusUpdatedWebhookEventEventType = "call.failed"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallDeclined PhoneNumberStatusUpdatedWebhookEventEventType = "call.declined"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeCallNoAnswer PhoneNumberStatusUpdatedWebhookEventEventType = "call.no_answer"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeLocationSharingStarted PhoneNumberStatusUpdatedWebhookEventEventType = "location.sharing.started"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeLocationSharingStopped PhoneNumberStatusUpdatedWebhookEventEventType = "location.sharing.stopped"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentSucceeded PhoneNumberStatusUpdatedWebhookEventEventType = "payment.succeeded"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentCanceled PhoneNumberStatusUpdatedWebhookEventEventType = "payment.canceled"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentExpired PhoneNumberStatusUpdatedWebhookEventEventType = "payment.expired"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentDeclined PhoneNumberStatusUpdatedWebhookEventEventType = "payment.declined"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypePaymentAuthorized PhoneNumberStatusUpdatedWebhookEventEventType = "payment.authorized"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeConnectionCreated PhoneNumberStatusUpdatedWebhookEventEventType = "connection.created"`

      - `const PhoneNumberStatusUpdatedWebhookEventEventTypeConnectionRevoked PhoneNumberStatusUpdatedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ConnectionCreatedWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ConnectionCreatedWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const ConnectionCreatedWebhookEventDataStatusSucceeded ConnectionCreatedWebhookEventDataStatus = "succeeded"`

        - `const ConnectionCreatedWebhookEventDataStatusFailed ConnectionCreatedWebhookEventDataStatus = "failed"`

        - `const ConnectionCreatedWebhookEventDataStatusCanceled ConnectionCreatedWebhookEventDataStatus = "canceled"`

        - `const ConnectionCreatedWebhookEventDataStatusExpired ConnectionCreatedWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount ConnectionCreatedWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const ConnectionCreatedWebhookEventDataIntervalDay ConnectionCreatedWebhookEventDataInterval = "day"`

        - `const ConnectionCreatedWebhookEventDataIntervalWeek ConnectionCreatedWebhookEventDataInterval = "week"`

        - `const ConnectionCreatedWebhookEventDataIntervalMonth ConnectionCreatedWebhookEventDataInterval = "month"`

        - `const ConnectionCreatedWebhookEventDataIntervalYear ConnectionCreatedWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const ConnectionCreatedWebhookEventDataModePayment ConnectionCreatedWebhookEventDataMode = "payment"`

        - `const ConnectionCreatedWebhookEventDataModeSubscription ConnectionCreatedWebhookEventDataMode = "subscription"`

      - `Natural ConnectionCreatedWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const ConnectionCreatedWebhookEventDataRailStripe ConnectionCreatedWebhookEventDataRail = "stripe"`

        - `const ConnectionCreatedWebhookEventDataRailNatural ConnectionCreatedWebhookEventDataRail = "natural"`

      - `Stripe ConnectionCreatedWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType ConnectionCreatedWebhookEventEventType`

      - `const ConnectionCreatedWebhookEventEventTypePaymentSucceeded ConnectionCreatedWebhookEventEventType = "payment.succeeded"`

      - `const ConnectionCreatedWebhookEventEventTypePaymentCanceled ConnectionCreatedWebhookEventEventType = "payment.canceled"`

      - `const ConnectionCreatedWebhookEventEventTypePaymentExpired ConnectionCreatedWebhookEventEventType = "payment.expired"`

      - `const ConnectionCreatedWebhookEventEventTypeMessageSent ConnectionCreatedWebhookEventEventType = "message.sent"`

      - `const ConnectionCreatedWebhookEventEventTypeMessageReceived ConnectionCreatedWebhookEventEventType = "message.received"`

      - `const ConnectionCreatedWebhookEventEventTypeMessageRead ConnectionCreatedWebhookEventEventType = "message.read"`

      - `const ConnectionCreatedWebhookEventEventTypeMessageDelivered ConnectionCreatedWebhookEventEventType = "message.delivered"`

      - `const ConnectionCreatedWebhookEventEventTypeMessageFailed ConnectionCreatedWebhookEventEventType = "message.failed"`

      - `const ConnectionCreatedWebhookEventEventTypeMessageEdited ConnectionCreatedWebhookEventEventType = "message.edited"`

      - `const ConnectionCreatedWebhookEventEventTypeReactionAdded ConnectionCreatedWebhookEventEventType = "reaction.added"`

      - `const ConnectionCreatedWebhookEventEventTypeReactionRemoved ConnectionCreatedWebhookEventEventType = "reaction.removed"`

      - `const ConnectionCreatedWebhookEventEventTypePollReceived ConnectionCreatedWebhookEventEventType = "poll.received"`

      - `const ConnectionCreatedWebhookEventEventTypePollFailed ConnectionCreatedWebhookEventEventType = "poll.failed"`

      - `const ConnectionCreatedWebhookEventEventTypePollSent ConnectionCreatedWebhookEventEventType = "poll.sent"`

      - `const ConnectionCreatedWebhookEventEventTypePollDelivered ConnectionCreatedWebhookEventEventType = "poll.delivered"`

      - `const ConnectionCreatedWebhookEventEventTypePollRead ConnectionCreatedWebhookEventEventType = "poll.read"`

      - `const ConnectionCreatedWebhookEventEventTypePollUpdated ConnectionCreatedWebhookEventEventType = "poll.updated"`

      - `const ConnectionCreatedWebhookEventEventTypePollVoteAdded ConnectionCreatedWebhookEventEventType = "poll.vote.added"`

      - `const ConnectionCreatedWebhookEventEventTypePollVoteRemoved ConnectionCreatedWebhookEventEventType = "poll.vote.removed"`

      - `const ConnectionCreatedWebhookEventEventTypePollReactionAdded ConnectionCreatedWebhookEventEventType = "poll.reaction.added"`

      - `const ConnectionCreatedWebhookEventEventTypeParticipantAdded ConnectionCreatedWebhookEventEventType = "participant.added"`

      - `const ConnectionCreatedWebhookEventEventTypeParticipantRemoved ConnectionCreatedWebhookEventEventType = "participant.removed"`

      - `const ConnectionCreatedWebhookEventEventTypeChatCreated ConnectionCreatedWebhookEventEventType = "chat.created"`

      - `const ConnectionCreatedWebhookEventEventTypeChatGroupNameUpdated ConnectionCreatedWebhookEventEventType = "chat.group_name_updated"`

      - `const ConnectionCreatedWebhookEventEventTypeChatGroupIconUpdated ConnectionCreatedWebhookEventEventType = "chat.group_icon_updated"`

      - `const ConnectionCreatedWebhookEventEventTypeChatGroupNameUpdateFailed ConnectionCreatedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const ConnectionCreatedWebhookEventEventTypeChatGroupIconUpdateFailed ConnectionCreatedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const ConnectionCreatedWebhookEventEventTypeChatBackgroundUpdated ConnectionCreatedWebhookEventEventType = "chat.background_updated"`

      - `const ConnectionCreatedWebhookEventEventTypeChatBackgroundUpdateFailed ConnectionCreatedWebhookEventEventType = "chat.background_update_failed"`

      - `const ConnectionCreatedWebhookEventEventTypeChatTypingIndicatorStarted ConnectionCreatedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const ConnectionCreatedWebhookEventEventTypeChatTypingIndicatorStopped ConnectionCreatedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const ConnectionCreatedWebhookEventEventTypePhoneNumberStatusUpdated ConnectionCreatedWebhookEventEventType = "phone_number.status_updated"`

      - `const ConnectionCreatedWebhookEventEventTypeContactCardReceived ConnectionCreatedWebhookEventEventType = "contact_card.received"`

      - `const ConnectionCreatedWebhookEventEventTypeCallInitiated ConnectionCreatedWebhookEventEventType = "call.initiated"`

      - `const ConnectionCreatedWebhookEventEventTypeCallRinging ConnectionCreatedWebhookEventEventType = "call.ringing"`

      - `const ConnectionCreatedWebhookEventEventTypeCallAnswered ConnectionCreatedWebhookEventEventType = "call.answered"`

      - `const ConnectionCreatedWebhookEventEventTypeCallEnded ConnectionCreatedWebhookEventEventType = "call.ended"`

      - `const ConnectionCreatedWebhookEventEventTypeCallFailed ConnectionCreatedWebhookEventEventType = "call.failed"`

      - `const ConnectionCreatedWebhookEventEventTypeCallDeclined ConnectionCreatedWebhookEventEventType = "call.declined"`

      - `const ConnectionCreatedWebhookEventEventTypeCallNoAnswer ConnectionCreatedWebhookEventEventType = "call.no_answer"`

      - `const ConnectionCreatedWebhookEventEventTypeLocationSharingStarted ConnectionCreatedWebhookEventEventType = "location.sharing.started"`

      - `const ConnectionCreatedWebhookEventEventTypeLocationSharingStopped ConnectionCreatedWebhookEventEventType = "location.sharing.stopped"`

      - `const ConnectionCreatedWebhookEventEventTypePaymentDeclined ConnectionCreatedWebhookEventEventType = "payment.declined"`

      - `const ConnectionCreatedWebhookEventEventTypePaymentAuthorized ConnectionCreatedWebhookEventEventType = "payment.authorized"`

      - `const ConnectionCreatedWebhookEventEventTypeConnectionCreated ConnectionCreatedWebhookEventEventType = "connection.created"`

      - `const ConnectionCreatedWebhookEventEventTypeConnectionRevoked ConnectionCreatedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type ConnectionRevokedWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data ConnectionRevokedWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const ConnectionRevokedWebhookEventDataStatusSucceeded ConnectionRevokedWebhookEventDataStatus = "succeeded"`

        - `const ConnectionRevokedWebhookEventDataStatusFailed ConnectionRevokedWebhookEventDataStatus = "failed"`

        - `const ConnectionRevokedWebhookEventDataStatusCanceled ConnectionRevokedWebhookEventDataStatus = "canceled"`

        - `const ConnectionRevokedWebhookEventDataStatusExpired ConnectionRevokedWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount ConnectionRevokedWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const ConnectionRevokedWebhookEventDataIntervalDay ConnectionRevokedWebhookEventDataInterval = "day"`

        - `const ConnectionRevokedWebhookEventDataIntervalWeek ConnectionRevokedWebhookEventDataInterval = "week"`

        - `const ConnectionRevokedWebhookEventDataIntervalMonth ConnectionRevokedWebhookEventDataInterval = "month"`

        - `const ConnectionRevokedWebhookEventDataIntervalYear ConnectionRevokedWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const ConnectionRevokedWebhookEventDataModePayment ConnectionRevokedWebhookEventDataMode = "payment"`

        - `const ConnectionRevokedWebhookEventDataModeSubscription ConnectionRevokedWebhookEventDataMode = "subscription"`

      - `Natural ConnectionRevokedWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const ConnectionRevokedWebhookEventDataRailStripe ConnectionRevokedWebhookEventDataRail = "stripe"`

        - `const ConnectionRevokedWebhookEventDataRailNatural ConnectionRevokedWebhookEventDataRail = "natural"`

      - `Stripe ConnectionRevokedWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType ConnectionRevokedWebhookEventEventType`

      - `const ConnectionRevokedWebhookEventEventTypePaymentSucceeded ConnectionRevokedWebhookEventEventType = "payment.succeeded"`

      - `const ConnectionRevokedWebhookEventEventTypePaymentCanceled ConnectionRevokedWebhookEventEventType = "payment.canceled"`

      - `const ConnectionRevokedWebhookEventEventTypePaymentExpired ConnectionRevokedWebhookEventEventType = "payment.expired"`

      - `const ConnectionRevokedWebhookEventEventTypeMessageSent ConnectionRevokedWebhookEventEventType = "message.sent"`

      - `const ConnectionRevokedWebhookEventEventTypeMessageReceived ConnectionRevokedWebhookEventEventType = "message.received"`

      - `const ConnectionRevokedWebhookEventEventTypeMessageRead ConnectionRevokedWebhookEventEventType = "message.read"`

      - `const ConnectionRevokedWebhookEventEventTypeMessageDelivered ConnectionRevokedWebhookEventEventType = "message.delivered"`

      - `const ConnectionRevokedWebhookEventEventTypeMessageFailed ConnectionRevokedWebhookEventEventType = "message.failed"`

      - `const ConnectionRevokedWebhookEventEventTypeMessageEdited ConnectionRevokedWebhookEventEventType = "message.edited"`

      - `const ConnectionRevokedWebhookEventEventTypeReactionAdded ConnectionRevokedWebhookEventEventType = "reaction.added"`

      - `const ConnectionRevokedWebhookEventEventTypeReactionRemoved ConnectionRevokedWebhookEventEventType = "reaction.removed"`

      - `const ConnectionRevokedWebhookEventEventTypePollReceived ConnectionRevokedWebhookEventEventType = "poll.received"`

      - `const ConnectionRevokedWebhookEventEventTypePollFailed ConnectionRevokedWebhookEventEventType = "poll.failed"`

      - `const ConnectionRevokedWebhookEventEventTypePollSent ConnectionRevokedWebhookEventEventType = "poll.sent"`

      - `const ConnectionRevokedWebhookEventEventTypePollDelivered ConnectionRevokedWebhookEventEventType = "poll.delivered"`

      - `const ConnectionRevokedWebhookEventEventTypePollRead ConnectionRevokedWebhookEventEventType = "poll.read"`

      - `const ConnectionRevokedWebhookEventEventTypePollUpdated ConnectionRevokedWebhookEventEventType = "poll.updated"`

      - `const ConnectionRevokedWebhookEventEventTypePollVoteAdded ConnectionRevokedWebhookEventEventType = "poll.vote.added"`

      - `const ConnectionRevokedWebhookEventEventTypePollVoteRemoved ConnectionRevokedWebhookEventEventType = "poll.vote.removed"`

      - `const ConnectionRevokedWebhookEventEventTypePollReactionAdded ConnectionRevokedWebhookEventEventType = "poll.reaction.added"`

      - `const ConnectionRevokedWebhookEventEventTypeParticipantAdded ConnectionRevokedWebhookEventEventType = "participant.added"`

      - `const ConnectionRevokedWebhookEventEventTypeParticipantRemoved ConnectionRevokedWebhookEventEventType = "participant.removed"`

      - `const ConnectionRevokedWebhookEventEventTypeChatCreated ConnectionRevokedWebhookEventEventType = "chat.created"`

      - `const ConnectionRevokedWebhookEventEventTypeChatGroupNameUpdated ConnectionRevokedWebhookEventEventType = "chat.group_name_updated"`

      - `const ConnectionRevokedWebhookEventEventTypeChatGroupIconUpdated ConnectionRevokedWebhookEventEventType = "chat.group_icon_updated"`

      - `const ConnectionRevokedWebhookEventEventTypeChatGroupNameUpdateFailed ConnectionRevokedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const ConnectionRevokedWebhookEventEventTypeChatGroupIconUpdateFailed ConnectionRevokedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const ConnectionRevokedWebhookEventEventTypeChatBackgroundUpdated ConnectionRevokedWebhookEventEventType = "chat.background_updated"`

      - `const ConnectionRevokedWebhookEventEventTypeChatBackgroundUpdateFailed ConnectionRevokedWebhookEventEventType = "chat.background_update_failed"`

      - `const ConnectionRevokedWebhookEventEventTypeChatTypingIndicatorStarted ConnectionRevokedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const ConnectionRevokedWebhookEventEventTypeChatTypingIndicatorStopped ConnectionRevokedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const ConnectionRevokedWebhookEventEventTypePhoneNumberStatusUpdated ConnectionRevokedWebhookEventEventType = "phone_number.status_updated"`

      - `const ConnectionRevokedWebhookEventEventTypeContactCardReceived ConnectionRevokedWebhookEventEventType = "contact_card.received"`

      - `const ConnectionRevokedWebhookEventEventTypeCallInitiated ConnectionRevokedWebhookEventEventType = "call.initiated"`

      - `const ConnectionRevokedWebhookEventEventTypeCallRinging ConnectionRevokedWebhookEventEventType = "call.ringing"`

      - `const ConnectionRevokedWebhookEventEventTypeCallAnswered ConnectionRevokedWebhookEventEventType = "call.answered"`

      - `const ConnectionRevokedWebhookEventEventTypeCallEnded ConnectionRevokedWebhookEventEventType = "call.ended"`

      - `const ConnectionRevokedWebhookEventEventTypeCallFailed ConnectionRevokedWebhookEventEventType = "call.failed"`

      - `const ConnectionRevokedWebhookEventEventTypeCallDeclined ConnectionRevokedWebhookEventEventType = "call.declined"`

      - `const ConnectionRevokedWebhookEventEventTypeCallNoAnswer ConnectionRevokedWebhookEventEventType = "call.no_answer"`

      - `const ConnectionRevokedWebhookEventEventTypeLocationSharingStarted ConnectionRevokedWebhookEventEventType = "location.sharing.started"`

      - `const ConnectionRevokedWebhookEventEventTypeLocationSharingStopped ConnectionRevokedWebhookEventEventType = "location.sharing.stopped"`

      - `const ConnectionRevokedWebhookEventEventTypePaymentDeclined ConnectionRevokedWebhookEventEventType = "payment.declined"`

      - `const ConnectionRevokedWebhookEventEventTypePaymentAuthorized ConnectionRevokedWebhookEventEventType = "payment.authorized"`

      - `const ConnectionRevokedWebhookEventEventTypeConnectionCreated ConnectionRevokedWebhookEventEventType = "connection.created"`

      - `const ConnectionRevokedWebhookEventEventTypeConnectionRevoked ConnectionRevokedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type LocationSharingStartedWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data LocationSharingStartedWebhookEventData`

      - `BeganAt Time`

        When location sharing started. Always present: falls back to when the share was first observed if the device reported no start time.

      - `ChatID string`

        The chat this share was first sent to. Location sharing is per-contact rather than per-chat, so the location may also be visible in other chats with the same handle; this identifies where the share originated and does not change if the contact later shares into another chat. Null when the originating chat could not be determined.

      - `EndsAt Time`

        When location sharing will expire. Null when sharing indefinitely.

      - `SharedBy string`

        Phone number of the person sharing their location

      - `SharedWith string`

        Your phone number receiving the location

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType LocationSharingStartedWebhookEventEventType`

      - `const LocationSharingStartedWebhookEventEventTypeLocationSharingStarted LocationSharingStartedWebhookEventEventType = "location.sharing.started"`

      - `const LocationSharingStartedWebhookEventEventTypeMessageSent LocationSharingStartedWebhookEventEventType = "message.sent"`

      - `const LocationSharingStartedWebhookEventEventTypeMessageReceived LocationSharingStartedWebhookEventEventType = "message.received"`

      - `const LocationSharingStartedWebhookEventEventTypeMessageRead LocationSharingStartedWebhookEventEventType = "message.read"`

      - `const LocationSharingStartedWebhookEventEventTypeMessageDelivered LocationSharingStartedWebhookEventEventType = "message.delivered"`

      - `const LocationSharingStartedWebhookEventEventTypeMessageFailed LocationSharingStartedWebhookEventEventType = "message.failed"`

      - `const LocationSharingStartedWebhookEventEventTypeMessageEdited LocationSharingStartedWebhookEventEventType = "message.edited"`

      - `const LocationSharingStartedWebhookEventEventTypeReactionAdded LocationSharingStartedWebhookEventEventType = "reaction.added"`

      - `const LocationSharingStartedWebhookEventEventTypeReactionRemoved LocationSharingStartedWebhookEventEventType = "reaction.removed"`

      - `const LocationSharingStartedWebhookEventEventTypePollReceived LocationSharingStartedWebhookEventEventType = "poll.received"`

      - `const LocationSharingStartedWebhookEventEventTypePollFailed LocationSharingStartedWebhookEventEventType = "poll.failed"`

      - `const LocationSharingStartedWebhookEventEventTypePollSent LocationSharingStartedWebhookEventEventType = "poll.sent"`

      - `const LocationSharingStartedWebhookEventEventTypePollDelivered LocationSharingStartedWebhookEventEventType = "poll.delivered"`

      - `const LocationSharingStartedWebhookEventEventTypePollRead LocationSharingStartedWebhookEventEventType = "poll.read"`

      - `const LocationSharingStartedWebhookEventEventTypePollUpdated LocationSharingStartedWebhookEventEventType = "poll.updated"`

      - `const LocationSharingStartedWebhookEventEventTypePollVoteAdded LocationSharingStartedWebhookEventEventType = "poll.vote.added"`

      - `const LocationSharingStartedWebhookEventEventTypePollVoteRemoved LocationSharingStartedWebhookEventEventType = "poll.vote.removed"`

      - `const LocationSharingStartedWebhookEventEventTypePollReactionAdded LocationSharingStartedWebhookEventEventType = "poll.reaction.added"`

      - `const LocationSharingStartedWebhookEventEventTypeParticipantAdded LocationSharingStartedWebhookEventEventType = "participant.added"`

      - `const LocationSharingStartedWebhookEventEventTypeParticipantRemoved LocationSharingStartedWebhookEventEventType = "participant.removed"`

      - `const LocationSharingStartedWebhookEventEventTypeChatCreated LocationSharingStartedWebhookEventEventType = "chat.created"`

      - `const LocationSharingStartedWebhookEventEventTypeChatGroupNameUpdated LocationSharingStartedWebhookEventEventType = "chat.group_name_updated"`

      - `const LocationSharingStartedWebhookEventEventTypeChatGroupIconUpdated LocationSharingStartedWebhookEventEventType = "chat.group_icon_updated"`

      - `const LocationSharingStartedWebhookEventEventTypeChatGroupNameUpdateFailed LocationSharingStartedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const LocationSharingStartedWebhookEventEventTypeChatGroupIconUpdateFailed LocationSharingStartedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const LocationSharingStartedWebhookEventEventTypeChatBackgroundUpdated LocationSharingStartedWebhookEventEventType = "chat.background_updated"`

      - `const LocationSharingStartedWebhookEventEventTypeChatBackgroundUpdateFailed LocationSharingStartedWebhookEventEventType = "chat.background_update_failed"`

      - `const LocationSharingStartedWebhookEventEventTypeChatTypingIndicatorStarted LocationSharingStartedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const LocationSharingStartedWebhookEventEventTypeChatTypingIndicatorStopped LocationSharingStartedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const LocationSharingStartedWebhookEventEventTypePhoneNumberStatusUpdated LocationSharingStartedWebhookEventEventType = "phone_number.status_updated"`

      - `const LocationSharingStartedWebhookEventEventTypeContactCardReceived LocationSharingStartedWebhookEventEventType = "contact_card.received"`

      - `const LocationSharingStartedWebhookEventEventTypeCallInitiated LocationSharingStartedWebhookEventEventType = "call.initiated"`

      - `const LocationSharingStartedWebhookEventEventTypeCallRinging LocationSharingStartedWebhookEventEventType = "call.ringing"`

      - `const LocationSharingStartedWebhookEventEventTypeCallAnswered LocationSharingStartedWebhookEventEventType = "call.answered"`

      - `const LocationSharingStartedWebhookEventEventTypeCallEnded LocationSharingStartedWebhookEventEventType = "call.ended"`

      - `const LocationSharingStartedWebhookEventEventTypeCallFailed LocationSharingStartedWebhookEventEventType = "call.failed"`

      - `const LocationSharingStartedWebhookEventEventTypeCallDeclined LocationSharingStartedWebhookEventEventType = "call.declined"`

      - `const LocationSharingStartedWebhookEventEventTypeCallNoAnswer LocationSharingStartedWebhookEventEventType = "call.no_answer"`

      - `const LocationSharingStartedWebhookEventEventTypeLocationSharingStopped LocationSharingStartedWebhookEventEventType = "location.sharing.stopped"`

      - `const LocationSharingStartedWebhookEventEventTypePaymentSucceeded LocationSharingStartedWebhookEventEventType = "payment.succeeded"`

      - `const LocationSharingStartedWebhookEventEventTypePaymentCanceled LocationSharingStartedWebhookEventEventType = "payment.canceled"`

      - `const LocationSharingStartedWebhookEventEventTypePaymentExpired LocationSharingStartedWebhookEventEventType = "payment.expired"`

      - `const LocationSharingStartedWebhookEventEventTypePaymentDeclined LocationSharingStartedWebhookEventEventType = "payment.declined"`

      - `const LocationSharingStartedWebhookEventEventTypePaymentAuthorized LocationSharingStartedWebhookEventEventType = "payment.authorized"`

      - `const LocationSharingStartedWebhookEventEventTypeConnectionCreated LocationSharingStartedWebhookEventEventType = "connection.created"`

      - `const LocationSharingStartedWebhookEventEventTypeConnectionRevoked LocationSharingStartedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type LocationSharingStoppedWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data LocationSharingStoppedWebhookEventData`

      - `BeganAt Time`

        When the sharing session started, matching began_at on its started event. Always present.

      - `ChatID string`

        The chat the ended share was first sent to, matching the chat_id on its started event. Sharing always stops for the contact as a whole, never for a single chat, so this is the session's origin rather than the chat it stopped in. Null when the originating chat could not be determined.

      - `EndedAt Time`

        When the sharing session was observed to stop.

      - `SharedBy string`

        Phone number of the person who stopped sharing

      - `SharedWith string`

        Your phone number that was receiving the location

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType LocationSharingStoppedWebhookEventEventType`

      - `const LocationSharingStoppedWebhookEventEventTypeLocationSharingStopped LocationSharingStoppedWebhookEventEventType = "location.sharing.stopped"`

      - `const LocationSharingStoppedWebhookEventEventTypeMessageSent LocationSharingStoppedWebhookEventEventType = "message.sent"`

      - `const LocationSharingStoppedWebhookEventEventTypeMessageReceived LocationSharingStoppedWebhookEventEventType = "message.received"`

      - `const LocationSharingStoppedWebhookEventEventTypeMessageRead LocationSharingStoppedWebhookEventEventType = "message.read"`

      - `const LocationSharingStoppedWebhookEventEventTypeMessageDelivered LocationSharingStoppedWebhookEventEventType = "message.delivered"`

      - `const LocationSharingStoppedWebhookEventEventTypeMessageFailed LocationSharingStoppedWebhookEventEventType = "message.failed"`

      - `const LocationSharingStoppedWebhookEventEventTypeMessageEdited LocationSharingStoppedWebhookEventEventType = "message.edited"`

      - `const LocationSharingStoppedWebhookEventEventTypeReactionAdded LocationSharingStoppedWebhookEventEventType = "reaction.added"`

      - `const LocationSharingStoppedWebhookEventEventTypeReactionRemoved LocationSharingStoppedWebhookEventEventType = "reaction.removed"`

      - `const LocationSharingStoppedWebhookEventEventTypePollReceived LocationSharingStoppedWebhookEventEventType = "poll.received"`

      - `const LocationSharingStoppedWebhookEventEventTypePollFailed LocationSharingStoppedWebhookEventEventType = "poll.failed"`

      - `const LocationSharingStoppedWebhookEventEventTypePollSent LocationSharingStoppedWebhookEventEventType = "poll.sent"`

      - `const LocationSharingStoppedWebhookEventEventTypePollDelivered LocationSharingStoppedWebhookEventEventType = "poll.delivered"`

      - `const LocationSharingStoppedWebhookEventEventTypePollRead LocationSharingStoppedWebhookEventEventType = "poll.read"`

      - `const LocationSharingStoppedWebhookEventEventTypePollUpdated LocationSharingStoppedWebhookEventEventType = "poll.updated"`

      - `const LocationSharingStoppedWebhookEventEventTypePollVoteAdded LocationSharingStoppedWebhookEventEventType = "poll.vote.added"`

      - `const LocationSharingStoppedWebhookEventEventTypePollVoteRemoved LocationSharingStoppedWebhookEventEventType = "poll.vote.removed"`

      - `const LocationSharingStoppedWebhookEventEventTypePollReactionAdded LocationSharingStoppedWebhookEventEventType = "poll.reaction.added"`

      - `const LocationSharingStoppedWebhookEventEventTypeParticipantAdded LocationSharingStoppedWebhookEventEventType = "participant.added"`

      - `const LocationSharingStoppedWebhookEventEventTypeParticipantRemoved LocationSharingStoppedWebhookEventEventType = "participant.removed"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatCreated LocationSharingStoppedWebhookEventEventType = "chat.created"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatGroupNameUpdated LocationSharingStoppedWebhookEventEventType = "chat.group_name_updated"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatGroupIconUpdated LocationSharingStoppedWebhookEventEventType = "chat.group_icon_updated"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatGroupNameUpdateFailed LocationSharingStoppedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatGroupIconUpdateFailed LocationSharingStoppedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatBackgroundUpdated LocationSharingStoppedWebhookEventEventType = "chat.background_updated"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatBackgroundUpdateFailed LocationSharingStoppedWebhookEventEventType = "chat.background_update_failed"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatTypingIndicatorStarted LocationSharingStoppedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const LocationSharingStoppedWebhookEventEventTypeChatTypingIndicatorStopped LocationSharingStoppedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const LocationSharingStoppedWebhookEventEventTypePhoneNumberStatusUpdated LocationSharingStoppedWebhookEventEventType = "phone_number.status_updated"`

      - `const LocationSharingStoppedWebhookEventEventTypeContactCardReceived LocationSharingStoppedWebhookEventEventType = "contact_card.received"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallInitiated LocationSharingStoppedWebhookEventEventType = "call.initiated"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallRinging LocationSharingStoppedWebhookEventEventType = "call.ringing"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallAnswered LocationSharingStoppedWebhookEventEventType = "call.answered"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallEnded LocationSharingStoppedWebhookEventEventType = "call.ended"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallFailed LocationSharingStoppedWebhookEventEventType = "call.failed"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallDeclined LocationSharingStoppedWebhookEventEventType = "call.declined"`

      - `const LocationSharingStoppedWebhookEventEventTypeCallNoAnswer LocationSharingStoppedWebhookEventEventType = "call.no_answer"`

      - `const LocationSharingStoppedWebhookEventEventTypeLocationSharingStarted LocationSharingStoppedWebhookEventEventType = "location.sharing.started"`

      - `const LocationSharingStoppedWebhookEventEventTypePaymentSucceeded LocationSharingStoppedWebhookEventEventType = "payment.succeeded"`

      - `const LocationSharingStoppedWebhookEventEventTypePaymentCanceled LocationSharingStoppedWebhookEventEventType = "payment.canceled"`

      - `const LocationSharingStoppedWebhookEventEventTypePaymentExpired LocationSharingStoppedWebhookEventEventType = "payment.expired"`

      - `const LocationSharingStoppedWebhookEventEventTypePaymentDeclined LocationSharingStoppedWebhookEventEventType = "payment.declined"`

      - `const LocationSharingStoppedWebhookEventEventTypePaymentAuthorized LocationSharingStoppedWebhookEventEventType = "payment.authorized"`

      - `const LocationSharingStoppedWebhookEventEventTypeConnectionCreated LocationSharingStoppedWebhookEventEventType = "connection.created"`

      - `const LocationSharingStoppedWebhookEventEventTypeConnectionRevoked LocationSharingStoppedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PaymentAuthorizedWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PaymentAuthorizedWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const PaymentAuthorizedWebhookEventDataStatusSucceeded PaymentAuthorizedWebhookEventDataStatus = "succeeded"`

        - `const PaymentAuthorizedWebhookEventDataStatusFailed PaymentAuthorizedWebhookEventDataStatus = "failed"`

        - `const PaymentAuthorizedWebhookEventDataStatusCanceled PaymentAuthorizedWebhookEventDataStatus = "canceled"`

        - `const PaymentAuthorizedWebhookEventDataStatusExpired PaymentAuthorizedWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount PaymentAuthorizedWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const PaymentAuthorizedWebhookEventDataIntervalDay PaymentAuthorizedWebhookEventDataInterval = "day"`

        - `const PaymentAuthorizedWebhookEventDataIntervalWeek PaymentAuthorizedWebhookEventDataInterval = "week"`

        - `const PaymentAuthorizedWebhookEventDataIntervalMonth PaymentAuthorizedWebhookEventDataInterval = "month"`

        - `const PaymentAuthorizedWebhookEventDataIntervalYear PaymentAuthorizedWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const PaymentAuthorizedWebhookEventDataModePayment PaymentAuthorizedWebhookEventDataMode = "payment"`

        - `const PaymentAuthorizedWebhookEventDataModeSubscription PaymentAuthorizedWebhookEventDataMode = "subscription"`

      - `Natural PaymentAuthorizedWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const PaymentAuthorizedWebhookEventDataRailStripe PaymentAuthorizedWebhookEventDataRail = "stripe"`

        - `const PaymentAuthorizedWebhookEventDataRailNatural PaymentAuthorizedWebhookEventDataRail = "natural"`

      - `Stripe PaymentAuthorizedWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType PaymentAuthorizedWebhookEventEventType`

      - `const PaymentAuthorizedWebhookEventEventTypePaymentSucceeded PaymentAuthorizedWebhookEventEventType = "payment.succeeded"`

      - `const PaymentAuthorizedWebhookEventEventTypePaymentCanceled PaymentAuthorizedWebhookEventEventType = "payment.canceled"`

      - `const PaymentAuthorizedWebhookEventEventTypePaymentExpired PaymentAuthorizedWebhookEventEventType = "payment.expired"`

      - `const PaymentAuthorizedWebhookEventEventTypeMessageSent PaymentAuthorizedWebhookEventEventType = "message.sent"`

      - `const PaymentAuthorizedWebhookEventEventTypeMessageReceived PaymentAuthorizedWebhookEventEventType = "message.received"`

      - `const PaymentAuthorizedWebhookEventEventTypeMessageRead PaymentAuthorizedWebhookEventEventType = "message.read"`

      - `const PaymentAuthorizedWebhookEventEventTypeMessageDelivered PaymentAuthorizedWebhookEventEventType = "message.delivered"`

      - `const PaymentAuthorizedWebhookEventEventTypeMessageFailed PaymentAuthorizedWebhookEventEventType = "message.failed"`

      - `const PaymentAuthorizedWebhookEventEventTypeMessageEdited PaymentAuthorizedWebhookEventEventType = "message.edited"`

      - `const PaymentAuthorizedWebhookEventEventTypeReactionAdded PaymentAuthorizedWebhookEventEventType = "reaction.added"`

      - `const PaymentAuthorizedWebhookEventEventTypeReactionRemoved PaymentAuthorizedWebhookEventEventType = "reaction.removed"`

      - `const PaymentAuthorizedWebhookEventEventTypePollReceived PaymentAuthorizedWebhookEventEventType = "poll.received"`

      - `const PaymentAuthorizedWebhookEventEventTypePollFailed PaymentAuthorizedWebhookEventEventType = "poll.failed"`

      - `const PaymentAuthorizedWebhookEventEventTypePollSent PaymentAuthorizedWebhookEventEventType = "poll.sent"`

      - `const PaymentAuthorizedWebhookEventEventTypePollDelivered PaymentAuthorizedWebhookEventEventType = "poll.delivered"`

      - `const PaymentAuthorizedWebhookEventEventTypePollRead PaymentAuthorizedWebhookEventEventType = "poll.read"`

      - `const PaymentAuthorizedWebhookEventEventTypePollUpdated PaymentAuthorizedWebhookEventEventType = "poll.updated"`

      - `const PaymentAuthorizedWebhookEventEventTypePollVoteAdded PaymentAuthorizedWebhookEventEventType = "poll.vote.added"`

      - `const PaymentAuthorizedWebhookEventEventTypePollVoteRemoved PaymentAuthorizedWebhookEventEventType = "poll.vote.removed"`

      - `const PaymentAuthorizedWebhookEventEventTypePollReactionAdded PaymentAuthorizedWebhookEventEventType = "poll.reaction.added"`

      - `const PaymentAuthorizedWebhookEventEventTypeParticipantAdded PaymentAuthorizedWebhookEventEventType = "participant.added"`

      - `const PaymentAuthorizedWebhookEventEventTypeParticipantRemoved PaymentAuthorizedWebhookEventEventType = "participant.removed"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatCreated PaymentAuthorizedWebhookEventEventType = "chat.created"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatGroupNameUpdated PaymentAuthorizedWebhookEventEventType = "chat.group_name_updated"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatGroupIconUpdated PaymentAuthorizedWebhookEventEventType = "chat.group_icon_updated"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatGroupNameUpdateFailed PaymentAuthorizedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatGroupIconUpdateFailed PaymentAuthorizedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatBackgroundUpdated PaymentAuthorizedWebhookEventEventType = "chat.background_updated"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatBackgroundUpdateFailed PaymentAuthorizedWebhookEventEventType = "chat.background_update_failed"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatTypingIndicatorStarted PaymentAuthorizedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const PaymentAuthorizedWebhookEventEventTypeChatTypingIndicatorStopped PaymentAuthorizedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const PaymentAuthorizedWebhookEventEventTypePhoneNumberStatusUpdated PaymentAuthorizedWebhookEventEventType = "phone_number.status_updated"`

      - `const PaymentAuthorizedWebhookEventEventTypeContactCardReceived PaymentAuthorizedWebhookEventEventType = "contact_card.received"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallInitiated PaymentAuthorizedWebhookEventEventType = "call.initiated"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallRinging PaymentAuthorizedWebhookEventEventType = "call.ringing"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallAnswered PaymentAuthorizedWebhookEventEventType = "call.answered"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallEnded PaymentAuthorizedWebhookEventEventType = "call.ended"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallFailed PaymentAuthorizedWebhookEventEventType = "call.failed"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallDeclined PaymentAuthorizedWebhookEventEventType = "call.declined"`

      - `const PaymentAuthorizedWebhookEventEventTypeCallNoAnswer PaymentAuthorizedWebhookEventEventType = "call.no_answer"`

      - `const PaymentAuthorizedWebhookEventEventTypeLocationSharingStarted PaymentAuthorizedWebhookEventEventType = "location.sharing.started"`

      - `const PaymentAuthorizedWebhookEventEventTypeLocationSharingStopped PaymentAuthorizedWebhookEventEventType = "location.sharing.stopped"`

      - `const PaymentAuthorizedWebhookEventEventTypePaymentDeclined PaymentAuthorizedWebhookEventEventType = "payment.declined"`

      - `const PaymentAuthorizedWebhookEventEventTypePaymentAuthorized PaymentAuthorizedWebhookEventEventType = "payment.authorized"`

      - `const PaymentAuthorizedWebhookEventEventTypeConnectionCreated PaymentAuthorizedWebhookEventEventType = "connection.created"`

      - `const PaymentAuthorizedWebhookEventEventTypeConnectionRevoked PaymentAuthorizedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PaymentCanceledWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PaymentCanceledWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const PaymentCanceledWebhookEventDataStatusSucceeded PaymentCanceledWebhookEventDataStatus = "succeeded"`

        - `const PaymentCanceledWebhookEventDataStatusFailed PaymentCanceledWebhookEventDataStatus = "failed"`

        - `const PaymentCanceledWebhookEventDataStatusCanceled PaymentCanceledWebhookEventDataStatus = "canceled"`

        - `const PaymentCanceledWebhookEventDataStatusExpired PaymentCanceledWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount PaymentCanceledWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const PaymentCanceledWebhookEventDataIntervalDay PaymentCanceledWebhookEventDataInterval = "day"`

        - `const PaymentCanceledWebhookEventDataIntervalWeek PaymentCanceledWebhookEventDataInterval = "week"`

        - `const PaymentCanceledWebhookEventDataIntervalMonth PaymentCanceledWebhookEventDataInterval = "month"`

        - `const PaymentCanceledWebhookEventDataIntervalYear PaymentCanceledWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const PaymentCanceledWebhookEventDataModePayment PaymentCanceledWebhookEventDataMode = "payment"`

        - `const PaymentCanceledWebhookEventDataModeSubscription PaymentCanceledWebhookEventDataMode = "subscription"`

      - `Natural PaymentCanceledWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const PaymentCanceledWebhookEventDataRailStripe PaymentCanceledWebhookEventDataRail = "stripe"`

        - `const PaymentCanceledWebhookEventDataRailNatural PaymentCanceledWebhookEventDataRail = "natural"`

      - `Stripe PaymentCanceledWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType PaymentCanceledWebhookEventEventType`

      - `const PaymentCanceledWebhookEventEventTypePaymentSucceeded PaymentCanceledWebhookEventEventType = "payment.succeeded"`

      - `const PaymentCanceledWebhookEventEventTypePaymentCanceled PaymentCanceledWebhookEventEventType = "payment.canceled"`

      - `const PaymentCanceledWebhookEventEventTypePaymentExpired PaymentCanceledWebhookEventEventType = "payment.expired"`

      - `const PaymentCanceledWebhookEventEventTypeMessageSent PaymentCanceledWebhookEventEventType = "message.sent"`

      - `const PaymentCanceledWebhookEventEventTypeMessageReceived PaymentCanceledWebhookEventEventType = "message.received"`

      - `const PaymentCanceledWebhookEventEventTypeMessageRead PaymentCanceledWebhookEventEventType = "message.read"`

      - `const PaymentCanceledWebhookEventEventTypeMessageDelivered PaymentCanceledWebhookEventEventType = "message.delivered"`

      - `const PaymentCanceledWebhookEventEventTypeMessageFailed PaymentCanceledWebhookEventEventType = "message.failed"`

      - `const PaymentCanceledWebhookEventEventTypeMessageEdited PaymentCanceledWebhookEventEventType = "message.edited"`

      - `const PaymentCanceledWebhookEventEventTypeReactionAdded PaymentCanceledWebhookEventEventType = "reaction.added"`

      - `const PaymentCanceledWebhookEventEventTypeReactionRemoved PaymentCanceledWebhookEventEventType = "reaction.removed"`

      - `const PaymentCanceledWebhookEventEventTypePollReceived PaymentCanceledWebhookEventEventType = "poll.received"`

      - `const PaymentCanceledWebhookEventEventTypePollFailed PaymentCanceledWebhookEventEventType = "poll.failed"`

      - `const PaymentCanceledWebhookEventEventTypePollSent PaymentCanceledWebhookEventEventType = "poll.sent"`

      - `const PaymentCanceledWebhookEventEventTypePollDelivered PaymentCanceledWebhookEventEventType = "poll.delivered"`

      - `const PaymentCanceledWebhookEventEventTypePollRead PaymentCanceledWebhookEventEventType = "poll.read"`

      - `const PaymentCanceledWebhookEventEventTypePollUpdated PaymentCanceledWebhookEventEventType = "poll.updated"`

      - `const PaymentCanceledWebhookEventEventTypePollVoteAdded PaymentCanceledWebhookEventEventType = "poll.vote.added"`

      - `const PaymentCanceledWebhookEventEventTypePollVoteRemoved PaymentCanceledWebhookEventEventType = "poll.vote.removed"`

      - `const PaymentCanceledWebhookEventEventTypePollReactionAdded PaymentCanceledWebhookEventEventType = "poll.reaction.added"`

      - `const PaymentCanceledWebhookEventEventTypeParticipantAdded PaymentCanceledWebhookEventEventType = "participant.added"`

      - `const PaymentCanceledWebhookEventEventTypeParticipantRemoved PaymentCanceledWebhookEventEventType = "participant.removed"`

      - `const PaymentCanceledWebhookEventEventTypeChatCreated PaymentCanceledWebhookEventEventType = "chat.created"`

      - `const PaymentCanceledWebhookEventEventTypeChatGroupNameUpdated PaymentCanceledWebhookEventEventType = "chat.group_name_updated"`

      - `const PaymentCanceledWebhookEventEventTypeChatGroupIconUpdated PaymentCanceledWebhookEventEventType = "chat.group_icon_updated"`

      - `const PaymentCanceledWebhookEventEventTypeChatGroupNameUpdateFailed PaymentCanceledWebhookEventEventType = "chat.group_name_update_failed"`

      - `const PaymentCanceledWebhookEventEventTypeChatGroupIconUpdateFailed PaymentCanceledWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const PaymentCanceledWebhookEventEventTypeChatBackgroundUpdated PaymentCanceledWebhookEventEventType = "chat.background_updated"`

      - `const PaymentCanceledWebhookEventEventTypeChatBackgroundUpdateFailed PaymentCanceledWebhookEventEventType = "chat.background_update_failed"`

      - `const PaymentCanceledWebhookEventEventTypeChatTypingIndicatorStarted PaymentCanceledWebhookEventEventType = "chat.typing_indicator.started"`

      - `const PaymentCanceledWebhookEventEventTypeChatTypingIndicatorStopped PaymentCanceledWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const PaymentCanceledWebhookEventEventTypePhoneNumberStatusUpdated PaymentCanceledWebhookEventEventType = "phone_number.status_updated"`

      - `const PaymentCanceledWebhookEventEventTypeContactCardReceived PaymentCanceledWebhookEventEventType = "contact_card.received"`

      - `const PaymentCanceledWebhookEventEventTypeCallInitiated PaymentCanceledWebhookEventEventType = "call.initiated"`

      - `const PaymentCanceledWebhookEventEventTypeCallRinging PaymentCanceledWebhookEventEventType = "call.ringing"`

      - `const PaymentCanceledWebhookEventEventTypeCallAnswered PaymentCanceledWebhookEventEventType = "call.answered"`

      - `const PaymentCanceledWebhookEventEventTypeCallEnded PaymentCanceledWebhookEventEventType = "call.ended"`

      - `const PaymentCanceledWebhookEventEventTypeCallFailed PaymentCanceledWebhookEventEventType = "call.failed"`

      - `const PaymentCanceledWebhookEventEventTypeCallDeclined PaymentCanceledWebhookEventEventType = "call.declined"`

      - `const PaymentCanceledWebhookEventEventTypeCallNoAnswer PaymentCanceledWebhookEventEventType = "call.no_answer"`

      - `const PaymentCanceledWebhookEventEventTypeLocationSharingStarted PaymentCanceledWebhookEventEventType = "location.sharing.started"`

      - `const PaymentCanceledWebhookEventEventTypeLocationSharingStopped PaymentCanceledWebhookEventEventType = "location.sharing.stopped"`

      - `const PaymentCanceledWebhookEventEventTypePaymentDeclined PaymentCanceledWebhookEventEventType = "payment.declined"`

      - `const PaymentCanceledWebhookEventEventTypePaymentAuthorized PaymentCanceledWebhookEventEventType = "payment.authorized"`

      - `const PaymentCanceledWebhookEventEventTypeConnectionCreated PaymentCanceledWebhookEventEventType = "connection.created"`

      - `const PaymentCanceledWebhookEventEventTypeConnectionRevoked PaymentCanceledWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PaymentDeclinedWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PaymentDeclinedWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const PaymentDeclinedWebhookEventDataStatusSucceeded PaymentDeclinedWebhookEventDataStatus = "succeeded"`

        - `const PaymentDeclinedWebhookEventDataStatusFailed PaymentDeclinedWebhookEventDataStatus = "failed"`

        - `const PaymentDeclinedWebhookEventDataStatusCanceled PaymentDeclinedWebhookEventDataStatus = "canceled"`

        - `const PaymentDeclinedWebhookEventDataStatusExpired PaymentDeclinedWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount PaymentDeclinedWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const PaymentDeclinedWebhookEventDataIntervalDay PaymentDeclinedWebhookEventDataInterval = "day"`

        - `const PaymentDeclinedWebhookEventDataIntervalWeek PaymentDeclinedWebhookEventDataInterval = "week"`

        - `const PaymentDeclinedWebhookEventDataIntervalMonth PaymentDeclinedWebhookEventDataInterval = "month"`

        - `const PaymentDeclinedWebhookEventDataIntervalYear PaymentDeclinedWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const PaymentDeclinedWebhookEventDataModePayment PaymentDeclinedWebhookEventDataMode = "payment"`

        - `const PaymentDeclinedWebhookEventDataModeSubscription PaymentDeclinedWebhookEventDataMode = "subscription"`

      - `Natural PaymentDeclinedWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const PaymentDeclinedWebhookEventDataRailStripe PaymentDeclinedWebhookEventDataRail = "stripe"`

        - `const PaymentDeclinedWebhookEventDataRailNatural PaymentDeclinedWebhookEventDataRail = "natural"`

      - `Stripe PaymentDeclinedWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType PaymentDeclinedWebhookEventEventType`

      - `const PaymentDeclinedWebhookEventEventTypePaymentSucceeded PaymentDeclinedWebhookEventEventType = "payment.succeeded"`

      - `const PaymentDeclinedWebhookEventEventTypePaymentCanceled PaymentDeclinedWebhookEventEventType = "payment.canceled"`

      - `const PaymentDeclinedWebhookEventEventTypePaymentExpired PaymentDeclinedWebhookEventEventType = "payment.expired"`

      - `const PaymentDeclinedWebhookEventEventTypeMessageSent PaymentDeclinedWebhookEventEventType = "message.sent"`

      - `const PaymentDeclinedWebhookEventEventTypeMessageReceived PaymentDeclinedWebhookEventEventType = "message.received"`

      - `const PaymentDeclinedWebhookEventEventTypeMessageRead PaymentDeclinedWebhookEventEventType = "message.read"`

      - `const PaymentDeclinedWebhookEventEventTypeMessageDelivered PaymentDeclinedWebhookEventEventType = "message.delivered"`

      - `const PaymentDeclinedWebhookEventEventTypeMessageFailed PaymentDeclinedWebhookEventEventType = "message.failed"`

      - `const PaymentDeclinedWebhookEventEventTypeMessageEdited PaymentDeclinedWebhookEventEventType = "message.edited"`

      - `const PaymentDeclinedWebhookEventEventTypeReactionAdded PaymentDeclinedWebhookEventEventType = "reaction.added"`

      - `const PaymentDeclinedWebhookEventEventTypeReactionRemoved PaymentDeclinedWebhookEventEventType = "reaction.removed"`

      - `const PaymentDeclinedWebhookEventEventTypePollReceived PaymentDeclinedWebhookEventEventType = "poll.received"`

      - `const PaymentDeclinedWebhookEventEventTypePollFailed PaymentDeclinedWebhookEventEventType = "poll.failed"`

      - `const PaymentDeclinedWebhookEventEventTypePollSent PaymentDeclinedWebhookEventEventType = "poll.sent"`

      - `const PaymentDeclinedWebhookEventEventTypePollDelivered PaymentDeclinedWebhookEventEventType = "poll.delivered"`

      - `const PaymentDeclinedWebhookEventEventTypePollRead PaymentDeclinedWebhookEventEventType = "poll.read"`

      - `const PaymentDeclinedWebhookEventEventTypePollUpdated PaymentDeclinedWebhookEventEventType = "poll.updated"`

      - `const PaymentDeclinedWebhookEventEventTypePollVoteAdded PaymentDeclinedWebhookEventEventType = "poll.vote.added"`

      - `const PaymentDeclinedWebhookEventEventTypePollVoteRemoved PaymentDeclinedWebhookEventEventType = "poll.vote.removed"`

      - `const PaymentDeclinedWebhookEventEventTypePollReactionAdded PaymentDeclinedWebhookEventEventType = "poll.reaction.added"`

      - `const PaymentDeclinedWebhookEventEventTypeParticipantAdded PaymentDeclinedWebhookEventEventType = "participant.added"`

      - `const PaymentDeclinedWebhookEventEventTypeParticipantRemoved PaymentDeclinedWebhookEventEventType = "participant.removed"`

      - `const PaymentDeclinedWebhookEventEventTypeChatCreated PaymentDeclinedWebhookEventEventType = "chat.created"`

      - `const PaymentDeclinedWebhookEventEventTypeChatGroupNameUpdated PaymentDeclinedWebhookEventEventType = "chat.group_name_updated"`

      - `const PaymentDeclinedWebhookEventEventTypeChatGroupIconUpdated PaymentDeclinedWebhookEventEventType = "chat.group_icon_updated"`

      - `const PaymentDeclinedWebhookEventEventTypeChatGroupNameUpdateFailed PaymentDeclinedWebhookEventEventType = "chat.group_name_update_failed"`

      - `const PaymentDeclinedWebhookEventEventTypeChatGroupIconUpdateFailed PaymentDeclinedWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const PaymentDeclinedWebhookEventEventTypeChatBackgroundUpdated PaymentDeclinedWebhookEventEventType = "chat.background_updated"`

      - `const PaymentDeclinedWebhookEventEventTypeChatBackgroundUpdateFailed PaymentDeclinedWebhookEventEventType = "chat.background_update_failed"`

      - `const PaymentDeclinedWebhookEventEventTypeChatTypingIndicatorStarted PaymentDeclinedWebhookEventEventType = "chat.typing_indicator.started"`

      - `const PaymentDeclinedWebhookEventEventTypeChatTypingIndicatorStopped PaymentDeclinedWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const PaymentDeclinedWebhookEventEventTypePhoneNumberStatusUpdated PaymentDeclinedWebhookEventEventType = "phone_number.status_updated"`

      - `const PaymentDeclinedWebhookEventEventTypeContactCardReceived PaymentDeclinedWebhookEventEventType = "contact_card.received"`

      - `const PaymentDeclinedWebhookEventEventTypeCallInitiated PaymentDeclinedWebhookEventEventType = "call.initiated"`

      - `const PaymentDeclinedWebhookEventEventTypeCallRinging PaymentDeclinedWebhookEventEventType = "call.ringing"`

      - `const PaymentDeclinedWebhookEventEventTypeCallAnswered PaymentDeclinedWebhookEventEventType = "call.answered"`

      - `const PaymentDeclinedWebhookEventEventTypeCallEnded PaymentDeclinedWebhookEventEventType = "call.ended"`

      - `const PaymentDeclinedWebhookEventEventTypeCallFailed PaymentDeclinedWebhookEventEventType = "call.failed"`

      - `const PaymentDeclinedWebhookEventEventTypeCallDeclined PaymentDeclinedWebhookEventEventType = "call.declined"`

      - `const PaymentDeclinedWebhookEventEventTypeCallNoAnswer PaymentDeclinedWebhookEventEventType = "call.no_answer"`

      - `const PaymentDeclinedWebhookEventEventTypeLocationSharingStarted PaymentDeclinedWebhookEventEventType = "location.sharing.started"`

      - `const PaymentDeclinedWebhookEventEventTypeLocationSharingStopped PaymentDeclinedWebhookEventEventType = "location.sharing.stopped"`

      - `const PaymentDeclinedWebhookEventEventTypePaymentDeclined PaymentDeclinedWebhookEventEventType = "payment.declined"`

      - `const PaymentDeclinedWebhookEventEventTypePaymentAuthorized PaymentDeclinedWebhookEventEventType = "payment.authorized"`

      - `const PaymentDeclinedWebhookEventEventTypeConnectionCreated PaymentDeclinedWebhookEventEventType = "connection.created"`

      - `const PaymentDeclinedWebhookEventEventTypeConnectionRevoked PaymentDeclinedWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PaymentExpiredWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PaymentExpiredWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const PaymentExpiredWebhookEventDataStatusSucceeded PaymentExpiredWebhookEventDataStatus = "succeeded"`

        - `const PaymentExpiredWebhookEventDataStatusFailed PaymentExpiredWebhookEventDataStatus = "failed"`

        - `const PaymentExpiredWebhookEventDataStatusCanceled PaymentExpiredWebhookEventDataStatus = "canceled"`

        - `const PaymentExpiredWebhookEventDataStatusExpired PaymentExpiredWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount PaymentExpiredWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const PaymentExpiredWebhookEventDataIntervalDay PaymentExpiredWebhookEventDataInterval = "day"`

        - `const PaymentExpiredWebhookEventDataIntervalWeek PaymentExpiredWebhookEventDataInterval = "week"`

        - `const PaymentExpiredWebhookEventDataIntervalMonth PaymentExpiredWebhookEventDataInterval = "month"`

        - `const PaymentExpiredWebhookEventDataIntervalYear PaymentExpiredWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const PaymentExpiredWebhookEventDataModePayment PaymentExpiredWebhookEventDataMode = "payment"`

        - `const PaymentExpiredWebhookEventDataModeSubscription PaymentExpiredWebhookEventDataMode = "subscription"`

      - `Natural PaymentExpiredWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const PaymentExpiredWebhookEventDataRailStripe PaymentExpiredWebhookEventDataRail = "stripe"`

        - `const PaymentExpiredWebhookEventDataRailNatural PaymentExpiredWebhookEventDataRail = "natural"`

      - `Stripe PaymentExpiredWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType PaymentExpiredWebhookEventEventType`

      - `const PaymentExpiredWebhookEventEventTypePaymentSucceeded PaymentExpiredWebhookEventEventType = "payment.succeeded"`

      - `const PaymentExpiredWebhookEventEventTypePaymentCanceled PaymentExpiredWebhookEventEventType = "payment.canceled"`

      - `const PaymentExpiredWebhookEventEventTypePaymentExpired PaymentExpiredWebhookEventEventType = "payment.expired"`

      - `const PaymentExpiredWebhookEventEventTypeMessageSent PaymentExpiredWebhookEventEventType = "message.sent"`

      - `const PaymentExpiredWebhookEventEventTypeMessageReceived PaymentExpiredWebhookEventEventType = "message.received"`

      - `const PaymentExpiredWebhookEventEventTypeMessageRead PaymentExpiredWebhookEventEventType = "message.read"`

      - `const PaymentExpiredWebhookEventEventTypeMessageDelivered PaymentExpiredWebhookEventEventType = "message.delivered"`

      - `const PaymentExpiredWebhookEventEventTypeMessageFailed PaymentExpiredWebhookEventEventType = "message.failed"`

      - `const PaymentExpiredWebhookEventEventTypeMessageEdited PaymentExpiredWebhookEventEventType = "message.edited"`

      - `const PaymentExpiredWebhookEventEventTypeReactionAdded PaymentExpiredWebhookEventEventType = "reaction.added"`

      - `const PaymentExpiredWebhookEventEventTypeReactionRemoved PaymentExpiredWebhookEventEventType = "reaction.removed"`

      - `const PaymentExpiredWebhookEventEventTypePollReceived PaymentExpiredWebhookEventEventType = "poll.received"`

      - `const PaymentExpiredWebhookEventEventTypePollFailed PaymentExpiredWebhookEventEventType = "poll.failed"`

      - `const PaymentExpiredWebhookEventEventTypePollSent PaymentExpiredWebhookEventEventType = "poll.sent"`

      - `const PaymentExpiredWebhookEventEventTypePollDelivered PaymentExpiredWebhookEventEventType = "poll.delivered"`

      - `const PaymentExpiredWebhookEventEventTypePollRead PaymentExpiredWebhookEventEventType = "poll.read"`

      - `const PaymentExpiredWebhookEventEventTypePollUpdated PaymentExpiredWebhookEventEventType = "poll.updated"`

      - `const PaymentExpiredWebhookEventEventTypePollVoteAdded PaymentExpiredWebhookEventEventType = "poll.vote.added"`

      - `const PaymentExpiredWebhookEventEventTypePollVoteRemoved PaymentExpiredWebhookEventEventType = "poll.vote.removed"`

      - `const PaymentExpiredWebhookEventEventTypePollReactionAdded PaymentExpiredWebhookEventEventType = "poll.reaction.added"`

      - `const PaymentExpiredWebhookEventEventTypeParticipantAdded PaymentExpiredWebhookEventEventType = "participant.added"`

      - `const PaymentExpiredWebhookEventEventTypeParticipantRemoved PaymentExpiredWebhookEventEventType = "participant.removed"`

      - `const PaymentExpiredWebhookEventEventTypeChatCreated PaymentExpiredWebhookEventEventType = "chat.created"`

      - `const PaymentExpiredWebhookEventEventTypeChatGroupNameUpdated PaymentExpiredWebhookEventEventType = "chat.group_name_updated"`

      - `const PaymentExpiredWebhookEventEventTypeChatGroupIconUpdated PaymentExpiredWebhookEventEventType = "chat.group_icon_updated"`

      - `const PaymentExpiredWebhookEventEventTypeChatGroupNameUpdateFailed PaymentExpiredWebhookEventEventType = "chat.group_name_update_failed"`

      - `const PaymentExpiredWebhookEventEventTypeChatGroupIconUpdateFailed PaymentExpiredWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const PaymentExpiredWebhookEventEventTypeChatBackgroundUpdated PaymentExpiredWebhookEventEventType = "chat.background_updated"`

      - `const PaymentExpiredWebhookEventEventTypeChatBackgroundUpdateFailed PaymentExpiredWebhookEventEventType = "chat.background_update_failed"`

      - `const PaymentExpiredWebhookEventEventTypeChatTypingIndicatorStarted PaymentExpiredWebhookEventEventType = "chat.typing_indicator.started"`

      - `const PaymentExpiredWebhookEventEventTypeChatTypingIndicatorStopped PaymentExpiredWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const PaymentExpiredWebhookEventEventTypePhoneNumberStatusUpdated PaymentExpiredWebhookEventEventType = "phone_number.status_updated"`

      - `const PaymentExpiredWebhookEventEventTypeContactCardReceived PaymentExpiredWebhookEventEventType = "contact_card.received"`

      - `const PaymentExpiredWebhookEventEventTypeCallInitiated PaymentExpiredWebhookEventEventType = "call.initiated"`

      - `const PaymentExpiredWebhookEventEventTypeCallRinging PaymentExpiredWebhookEventEventType = "call.ringing"`

      - `const PaymentExpiredWebhookEventEventTypeCallAnswered PaymentExpiredWebhookEventEventType = "call.answered"`

      - `const PaymentExpiredWebhookEventEventTypeCallEnded PaymentExpiredWebhookEventEventType = "call.ended"`

      - `const PaymentExpiredWebhookEventEventTypeCallFailed PaymentExpiredWebhookEventEventType = "call.failed"`

      - `const PaymentExpiredWebhookEventEventTypeCallDeclined PaymentExpiredWebhookEventEventType = "call.declined"`

      - `const PaymentExpiredWebhookEventEventTypeCallNoAnswer PaymentExpiredWebhookEventEventType = "call.no_answer"`

      - `const PaymentExpiredWebhookEventEventTypeLocationSharingStarted PaymentExpiredWebhookEventEventType = "location.sharing.started"`

      - `const PaymentExpiredWebhookEventEventTypeLocationSharingStopped PaymentExpiredWebhookEventEventType = "location.sharing.stopped"`

      - `const PaymentExpiredWebhookEventEventTypePaymentDeclined PaymentExpiredWebhookEventEventType = "payment.declined"`

      - `const PaymentExpiredWebhookEventEventTypePaymentAuthorized PaymentExpiredWebhookEventEventType = "payment.authorized"`

      - `const PaymentExpiredWebhookEventEventTypeConnectionCreated PaymentExpiredWebhookEventEventType = "connection.created"`

      - `const PaymentExpiredWebhookEventEventTypeConnectionRevoked PaymentExpiredWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.

  - `type PaymentSucceededWebhookEvent struct{…}`

    - `APIVersion string`

      API version for the webhook payload format

    - `CreatedAt Time`

      When the event was created

    - `Data PaymentSucceededWebhookEventData`

      The payment request, as returned by
      `GET /v3/payment_requests/{paymentRequestId}`.

      - `ID string`

        The payment request id.

      - `Amount int64`

        What was charged at checkout, in the currency's minor
        units. In `subscription` mode this is the first invoice's
        total — all items after any discounts are applied.

      - `CheckoutURL string`

        URL the recipient opens to pay
        (`https://zero.linqapp.com/pay/{slug}?session=...`).

      - `CreatedAt Time`

      - `Currency string`

      - `Object string`

      - `Status string`

        - `const PaymentSucceededWebhookEventDataStatusSucceeded PaymentSucceededWebhookEventDataStatus = "succeeded"`

        - `const PaymentSucceededWebhookEventDataStatusFailed PaymentSucceededWebhookEventDataStatus = "failed"`

        - `const PaymentSucceededWebhookEventDataStatusCanceled PaymentSucceededWebhookEventDataStatus = "canceled"`

        - `const PaymentSucceededWebhookEventDataStatusExpired PaymentSucceededWebhookEventDataStatus = "expired"`

      - `Description string`

      - `Discount PaymentSucceededWebhookEventDataDiscount`

        Subscription mode — the discount Stripe applied, read back
        from the coupon. Absent when none was applied.

        - `Coupon string`

        - `Label string`

          Name of the coupon/promo code displayed to customers.

        - `PromotionCode string`

      - `Interval string`

        Subscription mode — how often the subscription renews.

        - `const PaymentSucceededWebhookEventDataIntervalDay PaymentSucceededWebhookEventDataInterval = "day"`

        - `const PaymentSucceededWebhookEventDataIntervalWeek PaymentSucceededWebhookEventDataInterval = "week"`

        - `const PaymentSucceededWebhookEventDataIntervalMonth PaymentSucceededWebhookEventDataInterval = "month"`

        - `const PaymentSucceededWebhookEventDataIntervalYear PaymentSucceededWebhookEventDataInterval = "year"`

      - `IntervalCount int64`

        Subscription mode — intervals per renewal.

      - `Metadata map[string, string]`

      - `Mode string`

        Whether the request collected a one-time charge or started a subscription.

        - `const PaymentSucceededWebhookEventDataModePayment PaymentSucceededWebhookEventDataMode = "payment"`

        - `const PaymentSucceededWebhookEventDataModeSubscription PaymentSucceededWebhookEventDataMode = "subscription"`

      - `Natural PaymentSucceededWebhookEventDataNatural`

        Natural-rail join keys, present when `rail: natural`.

        - `PaymentRequestID string`

          The Natural payment request (`prq_...`).

        - `TransactionID string`

          The settled transaction (`txn_...`).

      - `PriceID string`

        Subscription mode — the recurring price subscribed to.

      - `Quantity int64`

        Subscription mode — units of the price subscribed to.

      - `Rail string`

        The rail this request settled on.

        - `const PaymentSucceededWebhookEventDataRailStripe PaymentSucceededWebhookEventDataRail = "stripe"`

        - `const PaymentSucceededWebhookEventDataRailNatural PaymentSucceededWebhookEventDataRail = "natural"`

      - `Stripe PaymentSucceededWebhookEventDataStripe`

        Ids of the Stripe objects on your connected account — join
        keys into your own Stripe Dashboard/API. Manage a
        subscription's post-checkout lifecycle with `subscription_id`.

        - `CustomerID string`

          The Customer the request is attached to (`cus_...`).
          Always set in subscription mode; set in payment mode
          only when the request was created with a `customer_id`.

        - `PaymentIntentID string`

          The PaymentIntent collected at checkout (`pi_...`).

        - `SubscriptionID string`

          Subscription mode — the Subscription (`sub_...`).

      - `TrialEnd Time`

        Subscription mode — when the free trial ends and the first
        charge happens. On a trial request, `payment.succeeded`
        means the payment method was collected ($0 moved).

      - `UpdatedAt Time`

    - `EventID string`

      Unique identifier for this event (for deduplication)

    - `EventType PaymentSucceededWebhookEventEventType`

      - `const PaymentSucceededWebhookEventEventTypePaymentSucceeded PaymentSucceededWebhookEventEventType = "payment.succeeded"`

      - `const PaymentSucceededWebhookEventEventTypePaymentCanceled PaymentSucceededWebhookEventEventType = "payment.canceled"`

      - `const PaymentSucceededWebhookEventEventTypePaymentExpired PaymentSucceededWebhookEventEventType = "payment.expired"`

      - `const PaymentSucceededWebhookEventEventTypeMessageSent PaymentSucceededWebhookEventEventType = "message.sent"`

      - `const PaymentSucceededWebhookEventEventTypeMessageReceived PaymentSucceededWebhookEventEventType = "message.received"`

      - `const PaymentSucceededWebhookEventEventTypeMessageRead PaymentSucceededWebhookEventEventType = "message.read"`

      - `const PaymentSucceededWebhookEventEventTypeMessageDelivered PaymentSucceededWebhookEventEventType = "message.delivered"`

      - `const PaymentSucceededWebhookEventEventTypeMessageFailed PaymentSucceededWebhookEventEventType = "message.failed"`

      - `const PaymentSucceededWebhookEventEventTypeMessageEdited PaymentSucceededWebhookEventEventType = "message.edited"`

      - `const PaymentSucceededWebhookEventEventTypeReactionAdded PaymentSucceededWebhookEventEventType = "reaction.added"`

      - `const PaymentSucceededWebhookEventEventTypeReactionRemoved PaymentSucceededWebhookEventEventType = "reaction.removed"`

      - `const PaymentSucceededWebhookEventEventTypePollReceived PaymentSucceededWebhookEventEventType = "poll.received"`

      - `const PaymentSucceededWebhookEventEventTypePollFailed PaymentSucceededWebhookEventEventType = "poll.failed"`

      - `const PaymentSucceededWebhookEventEventTypePollSent PaymentSucceededWebhookEventEventType = "poll.sent"`

      - `const PaymentSucceededWebhookEventEventTypePollDelivered PaymentSucceededWebhookEventEventType = "poll.delivered"`

      - `const PaymentSucceededWebhookEventEventTypePollRead PaymentSucceededWebhookEventEventType = "poll.read"`

      - `const PaymentSucceededWebhookEventEventTypePollUpdated PaymentSucceededWebhookEventEventType = "poll.updated"`

      - `const PaymentSucceededWebhookEventEventTypePollVoteAdded PaymentSucceededWebhookEventEventType = "poll.vote.added"`

      - `const PaymentSucceededWebhookEventEventTypePollVoteRemoved PaymentSucceededWebhookEventEventType = "poll.vote.removed"`

      - `const PaymentSucceededWebhookEventEventTypePollReactionAdded PaymentSucceededWebhookEventEventType = "poll.reaction.added"`

      - `const PaymentSucceededWebhookEventEventTypeParticipantAdded PaymentSucceededWebhookEventEventType = "participant.added"`

      - `const PaymentSucceededWebhookEventEventTypeParticipantRemoved PaymentSucceededWebhookEventEventType = "participant.removed"`

      - `const PaymentSucceededWebhookEventEventTypeChatCreated PaymentSucceededWebhookEventEventType = "chat.created"`

      - `const PaymentSucceededWebhookEventEventTypeChatGroupNameUpdated PaymentSucceededWebhookEventEventType = "chat.group_name_updated"`

      - `const PaymentSucceededWebhookEventEventTypeChatGroupIconUpdated PaymentSucceededWebhookEventEventType = "chat.group_icon_updated"`

      - `const PaymentSucceededWebhookEventEventTypeChatGroupNameUpdateFailed PaymentSucceededWebhookEventEventType = "chat.group_name_update_failed"`

      - `const PaymentSucceededWebhookEventEventTypeChatGroupIconUpdateFailed PaymentSucceededWebhookEventEventType = "chat.group_icon_update_failed"`

      - `const PaymentSucceededWebhookEventEventTypeChatBackgroundUpdated PaymentSucceededWebhookEventEventType = "chat.background_updated"`

      - `const PaymentSucceededWebhookEventEventTypeChatBackgroundUpdateFailed PaymentSucceededWebhookEventEventType = "chat.background_update_failed"`

      - `const PaymentSucceededWebhookEventEventTypeChatTypingIndicatorStarted PaymentSucceededWebhookEventEventType = "chat.typing_indicator.started"`

      - `const PaymentSucceededWebhookEventEventTypeChatTypingIndicatorStopped PaymentSucceededWebhookEventEventType = "chat.typing_indicator.stopped"`

      - `const PaymentSucceededWebhookEventEventTypePhoneNumberStatusUpdated PaymentSucceededWebhookEventEventType = "phone_number.status_updated"`

      - `const PaymentSucceededWebhookEventEventTypeContactCardReceived PaymentSucceededWebhookEventEventType = "contact_card.received"`

      - `const PaymentSucceededWebhookEventEventTypeCallInitiated PaymentSucceededWebhookEventEventType = "call.initiated"`

      - `const PaymentSucceededWebhookEventEventTypeCallRinging PaymentSucceededWebhookEventEventType = "call.ringing"`

      - `const PaymentSucceededWebhookEventEventTypeCallAnswered PaymentSucceededWebhookEventEventType = "call.answered"`

      - `const PaymentSucceededWebhookEventEventTypeCallEnded PaymentSucceededWebhookEventEventType = "call.ended"`

      - `const PaymentSucceededWebhookEventEventTypeCallFailed PaymentSucceededWebhookEventEventType = "call.failed"`

      - `const PaymentSucceededWebhookEventEventTypeCallDeclined PaymentSucceededWebhookEventEventType = "call.declined"`

      - `const PaymentSucceededWebhookEventEventTypeCallNoAnswer PaymentSucceededWebhookEventEventType = "call.no_answer"`

      - `const PaymentSucceededWebhookEventEventTypeLocationSharingStarted PaymentSucceededWebhookEventEventType = "location.sharing.started"`

      - `const PaymentSucceededWebhookEventEventTypeLocationSharingStopped PaymentSucceededWebhookEventEventType = "location.sharing.stopped"`

      - `const PaymentSucceededWebhookEventEventTypePaymentDeclined PaymentSucceededWebhookEventEventType = "payment.declined"`

      - `const PaymentSucceededWebhookEventEventTypePaymentAuthorized PaymentSucceededWebhookEventEventType = "payment.authorized"`

      - `const PaymentSucceededWebhookEventEventTypeConnectionCreated PaymentSucceededWebhookEventEventType = "connection.created"`

      - `const PaymentSucceededWebhookEventEventTypeConnectionRevoked PaymentSucceededWebhookEventEventType = "connection.revoked"`

    - `PartnerID string`

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

    - `TraceID string`

      Trace ID for debugging and correlation across systems.

    - `WebhookVersion string`

      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.
