# Messages

## Get all messages in a thread

`messages.list_messages_thread(strmessage_id, MessageListMessagesThreadParams**kwargs)  -> SyncListMessagesPagination[Message]`

**get** `/v3/messages/{messageId}/thread`

Retrieve all messages in a conversation thread. Given any message ID in the thread,
returns the originator message and all replies in chronological order.

If the message is not part of a thread, returns just that single message.

Supports pagination and configurable ordering.

### Parameters

- `message_id: str`

- `cursor: Optional[str]`

  Pagination cursor from previous next_cursor response

- `limit: Optional[int]`

  Maximum number of messages to return

- `order: Optional[Literal["asc", "desc"]]`

  Sort order for messages (asc = oldest first, desc = newest first)

  - `"asc"`

  - `"desc"`

### Returns

- `class Message: …`

  - `id: str`

    Unique identifier for the message

  - `chat_id: str`

    ID of the chat this message belongs to

  - `created_at: datetime`

    When the message was created

  - `is_delivered: bool`

    Whether the message has been delivered

  - `is_from_me: bool`

    Whether this message was sent by the authenticated user

  - `is_read: bool`

    Whether the message has been read

  - `updated_at: datetime`

    When the message was last updated

  - `delivered_at: Optional[datetime]`

    When the message was delivered

  - `effect: Optional[MessageEffect]`

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

    - `name: Optional[str]`

      Name of the effect. Common values:

      - Screen effects: confetti, fireworks, lasers, sparkles, celebration, hearts, love, balloons, happy_birthday, echo, spotlight
      - Bubble effects: slam, loud, gentle, invisible

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

      Type of effect

      - `"screen"`

      - `"bubble"`

  - `from_: Optional[str]`

    DEPRECATED: Use from_handle instead. Phone number of the message sender.

  - `from_handle: Optional[ChatHandle]`

    The sender of this message as a full handle object

    - `id: str`

      Unique identifier for this handle

    - `handle: str`

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

    - `joined_at: datetime`

      When this participant joined the chat

    - `service: ServiceType`

      Messaging service type

      - `"iMessage"`

      - `"SMS"`

      - `"RCS"`

    - `is_me: Optional[bool]`

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

    - `left_at: Optional[datetime]`

      When they left (if applicable)

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

      Participant status

      - `"active"`

      - `"left"`

      - `"removed"`

  - `parts: Optional[List[Part]]`

    Message parts in order (text, media, and link)

    - `class TextPartResponse: …`

      A text message part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

          - `"love"`

          - `"like"`

          - `"dislike"`

          - `"laugh"`

          - `"emphasize"`

          - `"question"`

          - `"custom"`

          - `"sticker"`

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

          - `file_name: Optional[str]`

            Filename of the sticker

          - `height: Optional[int]`

            Sticker image height in pixels

          - `mime_type: Optional[str]`

            MIME type of the sticker image

          - `url: Optional[str]`

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

          - `width: Optional[int]`

            Sticker image width in pixels

      - `type: Literal["text"]`

        Indicates this is a text message part

        - `"text"`

      - `value: str`

        The text content

      - `text_decorations: Optional[List[TextDecoration]]`

        Text decorations applied to character ranges in the value

        - `range: List[int]`

          Character range `[start, end)` in the `value` string where the decoration applies.
          `start` is inclusive, `end` is exclusive.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

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

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

          - `"big"`

          - `"small"`

          - `"shake"`

          - `"nod"`

          - `"explode"`

          - `"ripple"`

          - `"bloom"`

          - `"jitter"`

        - `style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]`

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

          - `"bold"`

          - `"italic"`

          - `"strikethrough"`

          - `"underline"`

    - `class MediaPartResponse: …`

      A media attachment part

      - `id: str`

        Unique attachment identifier

      - `filename: str`

        Original filename

      - `mime_type: str`

        MIME type of the file

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `size_bytes: int`

        File size in bytes

      - `type: Literal["media"]`

        Indicates this is a media attachment part

        - `"media"`

      - `url: str`

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

    - `class LinkPartResponse: …`

      A rich link preview part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `type: Literal["link"]`

        Indicates this is a rich link preview part

        - `"link"`

      - `value: str`

        The URL

  - `preferred_service: Optional[ServiceType]`

    Messaging service type

  - `read_at: Optional[datetime]`

    When the message was read

  - `reply_to: Optional[ReplyTo]`

    Indicates this message is a threaded reply to another message

    - `message_id: str`

      The ID of the message to reply to

    - `part_index: Optional[int]`

      The specific message part to reply to (0-based index).
      Defaults to 0 (first part) if not provided.
      Use this when replying to a specific part of a multipart message.

  - `sent_at: Optional[datetime]`

    When the message was sent

  - `service: Optional[ServiceType]`

    Messaging service type

### Example

```python
import os
from linq import LinqAPIV3

client = LinqAPIV3(
    api_key=os.environ.get("LINQ_API_V3_API_KEY"),  # This is the default and can be omitted
)
page = client.messages.list_messages_thread(
    message_id="69a37c7d-af4f-4b5e-af42-e28e98ce873a",
)
page = page.messages[0]
print(page.id)
```

#### Response

```json
{
  "messages": [
    {
      "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
      "chat_id": "94c6bf33-31d9-40e3-a0e9-f94250ecedb9",
      "created_at": "2024-01-15T10:30:00Z",
      "is_delivered": true,
      "is_from_me": true,
      "is_read": false,
      "updated_at": "2024-01-15T10:30:00Z",
      "delivered_at": "2024-01-15T10:30:10Z",
      "effect": {
        "name": "confetti",
        "type": "screen"
      },
      "from": "+12052535597",
      "from_handle": {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "handle": "+15551234567",
        "joined_at": "2025-05-21T15:30:00.000-05:00",
        "service": "iMessage",
        "is_me": false,
        "left_at": "2019-12-27T18:11:19.117Z",
        "status": "active"
      },
      "parts": [
        {
          "reactions": [
            {
              "handle": {
                "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
                "handle": "+15551234567",
                "joined_at": "2025-05-21T15:30:00.000-05:00",
                "service": "iMessage",
                "is_me": false,
                "left_at": "2019-12-27T18:11:19.117Z",
                "status": "active"
              },
              "is_me": false,
              "type": "love",
              "custom_emoji": null,
              "sticker": {
                "file_name": "sticker.png",
                "height": 420,
                "mime_type": "image/png",
                "url": "https://cdn.linqapp.com/attachments/a1b2c3d4/sticker.png?signature=...",
                "width": 420
              }
            }
          ],
          "type": "text",
          "value": "Hello!",
          "text_decorations": [
            {
              "range": [
                0,
                5
              ],
              "animation": "shake",
              "style": "bold"
            }
          ]
        }
      ],
      "preferred_service": "iMessage",
      "read_at": "2024-01-15T10:35:00Z",
      "reply_to": {
        "message_id": "550e8400-e29b-41d4-a716-446655440000",
        "part_index": 0
      },
      "sent_at": "2024-01-15T10:30:05Z",
      "service": "iMessage"
    }
  ],
  "next_cursor": "eyJpZCI6IjEyMzQ1Njc4OTAiLCJ0cyI6MTYzMDUwMDAwMH0="
}
```

## Get a message by ID

`messages.retrieve(strmessage_id)  -> Message`

**get** `/v3/messages/{messageId}`

Retrieve a specific message by its ID. This endpoint returns the full message
details including text, attachments, reactions, and metadata.

### Parameters

- `message_id: str`

### Returns

- `class Message: …`

  - `id: str`

    Unique identifier for the message

  - `chat_id: str`

    ID of the chat this message belongs to

  - `created_at: datetime`

    When the message was created

  - `is_delivered: bool`

    Whether the message has been delivered

  - `is_from_me: bool`

    Whether this message was sent by the authenticated user

  - `is_read: bool`

    Whether the message has been read

  - `updated_at: datetime`

    When the message was last updated

  - `delivered_at: Optional[datetime]`

    When the message was delivered

  - `effect: Optional[MessageEffect]`

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

    - `name: Optional[str]`

      Name of the effect. Common values:

      - Screen effects: confetti, fireworks, lasers, sparkles, celebration, hearts, love, balloons, happy_birthday, echo, spotlight
      - Bubble effects: slam, loud, gentle, invisible

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

      Type of effect

      - `"screen"`

      - `"bubble"`

  - `from_: Optional[str]`

    DEPRECATED: Use from_handle instead. Phone number of the message sender.

  - `from_handle: Optional[ChatHandle]`

    The sender of this message as a full handle object

    - `id: str`

      Unique identifier for this handle

    - `handle: str`

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

    - `joined_at: datetime`

      When this participant joined the chat

    - `service: ServiceType`

      Messaging service type

      - `"iMessage"`

      - `"SMS"`

      - `"RCS"`

    - `is_me: Optional[bool]`

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

    - `left_at: Optional[datetime]`

      When they left (if applicable)

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

      Participant status

      - `"active"`

      - `"left"`

      - `"removed"`

  - `parts: Optional[List[Part]]`

    Message parts in order (text, media, and link)

    - `class TextPartResponse: …`

      A text message part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

          - `"love"`

          - `"like"`

          - `"dislike"`

          - `"laugh"`

          - `"emphasize"`

          - `"question"`

          - `"custom"`

          - `"sticker"`

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

          - `file_name: Optional[str]`

            Filename of the sticker

          - `height: Optional[int]`

            Sticker image height in pixels

          - `mime_type: Optional[str]`

            MIME type of the sticker image

          - `url: Optional[str]`

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

          - `width: Optional[int]`

            Sticker image width in pixels

      - `type: Literal["text"]`

        Indicates this is a text message part

        - `"text"`

      - `value: str`

        The text content

      - `text_decorations: Optional[List[TextDecoration]]`

        Text decorations applied to character ranges in the value

        - `range: List[int]`

          Character range `[start, end)` in the `value` string where the decoration applies.
          `start` is inclusive, `end` is exclusive.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

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

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

          - `"big"`

          - `"small"`

          - `"shake"`

          - `"nod"`

          - `"explode"`

          - `"ripple"`

          - `"bloom"`

          - `"jitter"`

        - `style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]`

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

          - `"bold"`

          - `"italic"`

          - `"strikethrough"`

          - `"underline"`

    - `class MediaPartResponse: …`

      A media attachment part

      - `id: str`

        Unique attachment identifier

      - `filename: str`

        Original filename

      - `mime_type: str`

        MIME type of the file

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `size_bytes: int`

        File size in bytes

      - `type: Literal["media"]`

        Indicates this is a media attachment part

        - `"media"`

      - `url: str`

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

    - `class LinkPartResponse: …`

      A rich link preview part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `type: Literal["link"]`

        Indicates this is a rich link preview part

        - `"link"`

      - `value: str`

        The URL

  - `preferred_service: Optional[ServiceType]`

    Messaging service type

  - `read_at: Optional[datetime]`

    When the message was read

  - `reply_to: Optional[ReplyTo]`

    Indicates this message is a threaded reply to another message

    - `message_id: str`

      The ID of the message to reply to

    - `part_index: Optional[int]`

      The specific message part to reply to (0-based index).
      Defaults to 0 (first part) if not provided.
      Use this when replying to a specific part of a multipart message.

  - `sent_at: Optional[datetime]`

    When the message was sent

  - `service: Optional[ServiceType]`

    Messaging service type

### Example

```python
import os
from linq import LinqAPIV3

client = LinqAPIV3(
    api_key=os.environ.get("LINQ_API_V3_API_KEY"),  # This is the default and can be omitted
)
message = client.messages.retrieve(
    "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
)
print(message.id)
```

#### Response

```json
{
  "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
  "chat_id": "94c6bf33-31d9-40e3-a0e9-f94250ecedb9",
  "created_at": "2024-01-15T10:30:00Z",
  "is_delivered": true,
  "is_from_me": true,
  "is_read": false,
  "updated_at": "2024-01-15T10:30:00Z",
  "delivered_at": "2024-01-15T10:30:10Z",
  "effect": {
    "name": "confetti",
    "type": "screen"
  },
  "from": "+12052535597",
  "from_handle": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "handle": "+15551234567",
    "joined_at": "2025-05-21T15:30:00.000-05:00",
    "service": "iMessage",
    "is_me": false,
    "left_at": "2019-12-27T18:11:19.117Z",
    "status": "active"
  },
  "parts": [
    {
      "reactions": [
        {
          "handle": {
            "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
            "handle": "+15551234567",
            "joined_at": "2025-05-21T15:30:00.000-05:00",
            "service": "iMessage",
            "is_me": false,
            "left_at": "2019-12-27T18:11:19.117Z",
            "status": "active"
          },
          "is_me": false,
          "type": "love",
          "custom_emoji": null,
          "sticker": {
            "file_name": "sticker.png",
            "height": 420,
            "mime_type": "image/png",
            "url": "https://cdn.linqapp.com/attachments/a1b2c3d4/sticker.png?signature=...",
            "width": 420
          }
        }
      ],
      "type": "text",
      "value": "Hello!",
      "text_decorations": [
        {
          "range": [
            0,
            5
          ],
          "animation": "shake",
          "style": "bold"
        }
      ]
    }
  ],
  "preferred_service": "iMessage",
  "read_at": "2024-01-15T10:35:00Z",
  "reply_to": {
    "message_id": "550e8400-e29b-41d4-a716-446655440000",
    "part_index": 0
  },
  "sent_at": "2024-01-15T10:30:05Z",
  "service": "iMessage"
}
```

## Delete a message from system

`messages.delete(strmessage_id)`

**delete** `/v3/messages/{messageId}`

Deletes a message from the Linq API only. This does NOT unsend or remove the message
from the actual chat — recipients will still see the message.

### Parameters

- `message_id: str`

### Example

```python
import os
from linq import LinqAPIV3

client = LinqAPIV3(
    api_key=os.environ.get("LINQ_API_V3_API_KEY"),  # This is the default and can be omitted
)
client.messages.delete(
    "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
)
```

#### Response

```json
{
  "error": {
    "status": 400,
    "code": 1002,
    "message": "Phone number must be in E.164 format",
    "doc_url": "https://docs.linqapp.com/error/codes/1xxx/1002/"
  },
  "success": false
}
```

## Add or remove a reaction to a message

`messages.add_reaction(strmessage_id, MessageAddReactionParams**kwargs)  -> MessageAddReactionResponse`

**post** `/v3/messages/{messageId}/reactions`

Add or remove emoji reactions to messages. Reactions let users express
their response to a message without sending a new message.

**Supported Reactions:**

- love ❤️
- like 👍
- dislike 👎
- laugh 😂
- emphasize ‼️
- question ❓
- custom - any emoji (use `custom_emoji` field to specify)

### Parameters

- `message_id: str`

- `operation: Literal["add", "remove"]`

  Whether to add or remove the reaction

  - `"add"`

  - `"remove"`

- `type: ReactionType`

  Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
  Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
  Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

  - `"love"`

  - `"like"`

  - `"dislike"`

  - `"laugh"`

  - `"emphasize"`

  - `"question"`

  - `"custom"`

  - `"sticker"`

- `custom_emoji: Optional[str]`

  Custom emoji string. Required when type is "custom".

- `part_index: Optional[int]`

  Optional index of the message part to react to.
  If not provided, reacts to the entire message (part 0).

### Returns

- `class MessageAddReactionResponse: …`

  - `message: Optional[str]`

  - `status: Optional[str]`

  - `trace_id: Optional[str]`

### Example

```python
import os
from linq import LinqAPIV3

client = LinqAPIV3(
    api_key=os.environ.get("LINQ_API_V3_API_KEY"),  # This is the default and can be omitted
)
response = client.messages.add_reaction(
    message_id="69a37c7d-af4f-4b5e-af42-e28e98ce873a",
    operation="add",
    type="love",
)
print(response.trace_id)
```

#### Response

```json
{
  "message": "Reaction processed",
  "status": "accepted",
  "trace_id": "trace_id"
}
```

## Edit the content of a message part

`messages.update(strmessage_id, MessageUpdateParams**kwargs)  -> Message`

**patch** `/v3/messages/{messageId}`

Edit the text content of a specific part of a previously sent message.

**Note:** A message can be edited up to 5 times, and only within 15 minutes of when it was originally sent.

### Parameters

- `message_id: str`

- `text: str`

  New text content for the message part

- `part_index: Optional[int]`

  Index of the message part to edit. Defaults to 0.

### Returns

- `class Message: …`

  - `id: str`

    Unique identifier for the message

  - `chat_id: str`

    ID of the chat this message belongs to

  - `created_at: datetime`

    When the message was created

  - `is_delivered: bool`

    Whether the message has been delivered

  - `is_from_me: bool`

    Whether this message was sent by the authenticated user

  - `is_read: bool`

    Whether the message has been read

  - `updated_at: datetime`

    When the message was last updated

  - `delivered_at: Optional[datetime]`

    When the message was delivered

  - `effect: Optional[MessageEffect]`

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

    - `name: Optional[str]`

      Name of the effect. Common values:

      - Screen effects: confetti, fireworks, lasers, sparkles, celebration, hearts, love, balloons, happy_birthday, echo, spotlight
      - Bubble effects: slam, loud, gentle, invisible

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

      Type of effect

      - `"screen"`

      - `"bubble"`

  - `from_: Optional[str]`

    DEPRECATED: Use from_handle instead. Phone number of the message sender.

  - `from_handle: Optional[ChatHandle]`

    The sender of this message as a full handle object

    - `id: str`

      Unique identifier for this handle

    - `handle: str`

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

    - `joined_at: datetime`

      When this participant joined the chat

    - `service: ServiceType`

      Messaging service type

      - `"iMessage"`

      - `"SMS"`

      - `"RCS"`

    - `is_me: Optional[bool]`

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

    - `left_at: Optional[datetime]`

      When they left (if applicable)

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

      Participant status

      - `"active"`

      - `"left"`

      - `"removed"`

  - `parts: Optional[List[Part]]`

    Message parts in order (text, media, and link)

    - `class TextPartResponse: …`

      A text message part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

          - `"love"`

          - `"like"`

          - `"dislike"`

          - `"laugh"`

          - `"emphasize"`

          - `"question"`

          - `"custom"`

          - `"sticker"`

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

          - `file_name: Optional[str]`

            Filename of the sticker

          - `height: Optional[int]`

            Sticker image height in pixels

          - `mime_type: Optional[str]`

            MIME type of the sticker image

          - `url: Optional[str]`

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

          - `width: Optional[int]`

            Sticker image width in pixels

      - `type: Literal["text"]`

        Indicates this is a text message part

        - `"text"`

      - `value: str`

        The text content

      - `text_decorations: Optional[List[TextDecoration]]`

        Text decorations applied to character ranges in the value

        - `range: List[int]`

          Character range `[start, end)` in the `value` string where the decoration applies.
          `start` is inclusive, `end` is exclusive.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

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

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

          - `"big"`

          - `"small"`

          - `"shake"`

          - `"nod"`

          - `"explode"`

          - `"ripple"`

          - `"bloom"`

          - `"jitter"`

        - `style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]`

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

          - `"bold"`

          - `"italic"`

          - `"strikethrough"`

          - `"underline"`

    - `class MediaPartResponse: …`

      A media attachment part

      - `id: str`

        Unique attachment identifier

      - `filename: str`

        Original filename

      - `mime_type: str`

        MIME type of the file

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `size_bytes: int`

        File size in bytes

      - `type: Literal["media"]`

        Indicates this is a media attachment part

        - `"media"`

      - `url: str`

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

    - `class LinkPartResponse: …`

      A rich link preview part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `type: Literal["link"]`

        Indicates this is a rich link preview part

        - `"link"`

      - `value: str`

        The URL

  - `preferred_service: Optional[ServiceType]`

    Messaging service type

  - `read_at: Optional[datetime]`

    When the message was read

  - `reply_to: Optional[ReplyTo]`

    Indicates this message is a threaded reply to another message

    - `message_id: str`

      The ID of the message to reply to

    - `part_index: Optional[int]`

      The specific message part to reply to (0-based index).
      Defaults to 0 (first part) if not provided.
      Use this when replying to a specific part of a multipart message.

  - `sent_at: Optional[datetime]`

    When the message was sent

  - `service: Optional[ServiceType]`

    Messaging service type

### Example

```python
import os
from linq import LinqAPIV3

client = LinqAPIV3(
    api_key=os.environ.get("LINQ_API_V3_API_KEY"),  # This is the default and can be omitted
)
message = client.messages.update(
    message_id="69a37c7d-af4f-4b5e-af42-e28e98ce873a",
    text="This is the edited message content",
    part_index=0,
)
print(message.id)
```

#### Response

```json
{
  "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
  "chat_id": "94c6bf33-31d9-40e3-a0e9-f94250ecedb9",
  "created_at": "2024-01-15T10:30:00Z",
  "is_delivered": true,
  "is_from_me": true,
  "is_read": false,
  "updated_at": "2024-01-15T10:30:00Z",
  "delivered_at": "2024-01-15T10:30:10Z",
  "effect": {
    "name": "confetti",
    "type": "screen"
  },
  "from": "+12052535597",
  "from_handle": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "handle": "+15551234567",
    "joined_at": "2025-05-21T15:30:00.000-05:00",
    "service": "iMessage",
    "is_me": false,
    "left_at": "2019-12-27T18:11:19.117Z",
    "status": "active"
  },
  "parts": [
    {
      "reactions": [
        {
          "handle": {
            "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
            "handle": "+15551234567",
            "joined_at": "2025-05-21T15:30:00.000-05:00",
            "service": "iMessage",
            "is_me": false,
            "left_at": "2019-12-27T18:11:19.117Z",
            "status": "active"
          },
          "is_me": false,
          "type": "love",
          "custom_emoji": null,
          "sticker": {
            "file_name": "sticker.png",
            "height": 420,
            "mime_type": "image/png",
            "url": "https://cdn.linqapp.com/attachments/a1b2c3d4/sticker.png?signature=...",
            "width": 420
          }
        }
      ],
      "type": "text",
      "value": "Hello!",
      "text_decorations": [
        {
          "range": [
            0,
            5
          ],
          "animation": "shake",
          "style": "bold"
        }
      ]
    }
  ],
  "preferred_service": "iMessage",
  "read_at": "2024-01-15T10:35:00Z",
  "reply_to": {
    "message_id": "550e8400-e29b-41d4-a716-446655440000",
    "part_index": 0
  },
  "sent_at": "2024-01-15T10:30:05Z",
  "service": "iMessage"
}
```

## Domain Types

### Message

- `class Message: …`

  - `id: str`

    Unique identifier for the message

  - `chat_id: str`

    ID of the chat this message belongs to

  - `created_at: datetime`

    When the message was created

  - `is_delivered: bool`

    Whether the message has been delivered

  - `is_from_me: bool`

    Whether this message was sent by the authenticated user

  - `is_read: bool`

    Whether the message has been read

  - `updated_at: datetime`

    When the message was last updated

  - `delivered_at: Optional[datetime]`

    When the message was delivered

  - `effect: Optional[MessageEffect]`

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

    - `name: Optional[str]`

      Name of the effect. Common values:

      - Screen effects: confetti, fireworks, lasers, sparkles, celebration, hearts, love, balloons, happy_birthday, echo, spotlight
      - Bubble effects: slam, loud, gentle, invisible

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

      Type of effect

      - `"screen"`

      - `"bubble"`

  - `from_: Optional[str]`

    DEPRECATED: Use from_handle instead. Phone number of the message sender.

  - `from_handle: Optional[ChatHandle]`

    The sender of this message as a full handle object

    - `id: str`

      Unique identifier for this handle

    - `handle: str`

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

    - `joined_at: datetime`

      When this participant joined the chat

    - `service: ServiceType`

      Messaging service type

      - `"iMessage"`

      - `"SMS"`

      - `"RCS"`

    - `is_me: Optional[bool]`

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

    - `left_at: Optional[datetime]`

      When they left (if applicable)

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

      Participant status

      - `"active"`

      - `"left"`

      - `"removed"`

  - `parts: Optional[List[Part]]`

    Message parts in order (text, media, and link)

    - `class TextPartResponse: …`

      A text message part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

          - `"love"`

          - `"like"`

          - `"dislike"`

          - `"laugh"`

          - `"emphasize"`

          - `"question"`

          - `"custom"`

          - `"sticker"`

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

          - `file_name: Optional[str]`

            Filename of the sticker

          - `height: Optional[int]`

            Sticker image height in pixels

          - `mime_type: Optional[str]`

            MIME type of the sticker image

          - `url: Optional[str]`

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

          - `width: Optional[int]`

            Sticker image width in pixels

      - `type: Literal["text"]`

        Indicates this is a text message part

        - `"text"`

      - `value: str`

        The text content

      - `text_decorations: Optional[List[TextDecoration]]`

        Text decorations applied to character ranges in the value

        - `range: List[int]`

          Character range `[start, end)` in the `value` string where the decoration applies.
          `start` is inclusive, `end` is exclusive.
          *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

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

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

          - `"big"`

          - `"small"`

          - `"shake"`

          - `"nod"`

          - `"explode"`

          - `"ripple"`

          - `"bloom"`

          - `"jitter"`

        - `style: Optional[Literal["bold", "italic", "strikethrough", "underline"]]`

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

          - `"bold"`

          - `"italic"`

          - `"strikethrough"`

          - `"underline"`

    - `class MediaPartResponse: …`

      A media attachment part

      - `id: str`

        Unique attachment identifier

      - `filename: str`

        Original filename

      - `mime_type: str`

        MIME type of the file

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `size_bytes: int`

        File size in bytes

      - `type: Literal["media"]`

        Indicates this is a media attachment part

        - `"media"`

      - `url: str`

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

    - `class LinkPartResponse: …`

      A rich link preview part

      - `reactions: Optional[List[Reaction]]`

        Reactions on this message part

        - `handle: ChatHandle`

        - `is_me: bool`

          Whether this reaction is from the current user

        - `type: ReactionType`

          Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
          Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
          Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

        - `custom_emoji: Optional[str]`

          Custom emoji if type is "custom", null otherwise

        - `sticker: Optional[Sticker]`

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

      - `type: Literal["link"]`

        Indicates this is a rich link preview part

        - `"link"`

      - `value: str`

        The URL

  - `preferred_service: Optional[ServiceType]`

    Messaging service type

  - `read_at: Optional[datetime]`

    When the message was read

  - `reply_to: Optional[ReplyTo]`

    Indicates this message is a threaded reply to another message

    - `message_id: str`

      The ID of the message to reply to

    - `part_index: Optional[int]`

      The specific message part to reply to (0-based index).
      Defaults to 0 (first part) if not provided.
      Use this when replying to a specific part of a multipart message.

  - `sent_at: Optional[datetime]`

    When the message was sent

  - `service: Optional[ServiceType]`

    Messaging service type

### Message Effect

- `class MessageEffect: …`

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

  - `name: Optional[str]`

    Name of the effect. Common values:

    - Screen effects: confetti, fireworks, lasers, sparkles, celebration, hearts, love, balloons, happy_birthday, echo, spotlight
    - Bubble effects: slam, loud, gentle, invisible

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

    Type of effect

    - `"screen"`

    - `"bubble"`

### Reply To

- `class ReplyTo: …`

  Indicates this message is a threaded reply to another message

  - `message_id: str`

    The ID of the message to reply to

  - `part_index: Optional[int]`

    The specific message part to reply to (0-based index).
    Defaults to 0 (first part) if not provided.
    Use this when replying to a specific part of a multipart message.

### Message Add Reaction Response

- `class MessageAddReactionResponse: …`

  - `message: Optional[str]`

  - `status: Optional[str]`

  - `trace_id: Optional[str]`
