## 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)
- sticker - an image peeled onto the message (use `url` or `attachment_id`)

**Stickers** are iMessage-only and cannot be removed — iMessage has no
unpeel operation, so `operation: "remove"` with `type: "sticker"` is
rejected. Position, size and rotation are optional via `placement`, and can
be changed afterwards with
`PATCH /v3/messages/{messageId}/reactions/{reactionId}`.

### 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"`

- `attachment_id: Optional[str]`

  Reference to a sticker image pre-uploaded via `POST /v3/attachments`.
  Only valid when type is "sticker".

  Either `url` or `attachment_id` must be provided when type is
  "sticker", but not both.

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

- `placement: Optional[Placement]`

  Optional position, size and rotation of a sticker on the target
  bubble. Only valid when type is "sticker".

  Every field is independent and optional — omit the object entirely,
  or any field within it, to keep the default (centred, default size,
  unrotated).

  - `rotation: Optional[float]`

    Clockwise rotation in degrees.

  - `scale: Optional[float]`

    Size relative to the default, where 1 matches the size a
    sticker gets natively.

    Values outside 0.5–1.5 are clamped rather than rejected. The
    upper bound keeps a sticker within the size range iMessage
    itself displays: its own limit is larger, but that allowance
    assumes the transparent padding Apple's stickers carry, which
    a full-bleed image does not have.

    Scale is linear, so 1.5 is a little over twice the area.

  - `x: Optional[float]`

    Horizontal position on the target bubble, from -1 (far left) to
    1 (far right). 0 is centred.

  - `y: Optional[float]`

    Vertical position on the target bubble, from -1 (top) to
    1 (bottom). 0 is centred.

- `url: Optional[str]`

  Linq attachment URL of the sticker image — the `download_url`
  returned by `POST /v3/attachments`. Only valid when type is
  "sticker".

  Unlike a media part, this does **not** accept an arbitrary host:
  reactions have no download step, so the image must already be
  stored. To send a sticker from elsewhere, upload it with
  `POST /v3/attachments` first and pass `attachment_id`.

  Either `url` or `attachment_id` must be provided when type is
  "sticker", but not both.

### 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"
}
```
