---
title: Reactions | API Docs
description: Add and remove emoji reactions on messages.
---

React to any message with built-in iMessage tapbacks or custom Unicode emoji. Reactions are an iMessage feature — see [Protocol Selection](/guides/messaging/protocol-selection/index.md) for protocol capabilities. See the [Reactions API Reference](/api/resources/messages/methods/add_reaction/index.md) for the full endpoint specification.

## Adding a reaction

- [cURL](#tab-panel-64)
- [TypeScript](#tab-panel-65)
- [Python](#tab-panel-66)
- [Go](#tab-panel-67)

Terminal window

```
curl -X POST https://api.linqapp.com/api/partner/v3/messages/{messageId}/reactions \
  -H "Authorization: Bearer $LINQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "operation": "add",
      "type": "love"
    }'
```

```
await client.messages.addReaction({messageId}, {
  operation: "add",
  type: "love",
});
```

```
client.messages.add_reaction(
    {message_id},
    operation="add",
    type="love",
)
```

```
client.Messages.AddReaction(context.TODO(), {messageId}, linq.MessageAddReactionParams{
  Operation: linq.F("add"),
  Type: linq.F("love"),
})
```

## Built-in reaction types

These map to the standard iMessage tapback reactions:

| Type        | Description       |
| ----------- | ----------------- |
| `love`      | Heart             |
| `like`      | Thumbs up         |
| `dislike`   | Thumbs down       |
| `laugh`     | Ha ha             |
| `emphasize` | Exclamation marks |
| `question`  | Question mark     |

## Custom emoji reactions

Send any Unicode emoji as a reaction:

- [cURL](#tab-panel-68)
- [TypeScript](#tab-panel-69)
- [Python](#tab-panel-70)
- [Go](#tab-panel-71)

Terminal window

```
curl -X POST https://api.linqapp.com/api/partner/v3/messages/{messageId}/reactions \
  -H "Authorization: Bearer $LINQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "operation": "add",
      "type": "custom",
      "custom_emoji": "😍"
    }'
```

```
await client.messages.addReaction({messageId}, {
  operation: "add",
  type: "custom",
  custom_emoji: "😍",
});
```

```
client.messages.add_reaction(
    {message_id},
    operation="add",
    type="custom",
    custom_emoji="😍",
)
```

```
client.Messages.AddReaction(context.TODO(), {messageId}, linq.MessageAddReactionParams{
  Operation: linq.F("add"),
  Type: linq.F("custom"),
  CustomEmoji: linq.F("😍"),
})
```

## Targeting multipart messages

For messages with multiple parts, target a specific part using `part_index` (0-based):

- [cURL](#tab-panel-72)
- [TypeScript](#tab-panel-73)
- [Python](#tab-panel-74)
- [Go](#tab-panel-75)

Terminal window

```
curl -X POST https://api.linqapp.com/api/partner/v3/messages/{messageId}/reactions \
  -H "Authorization: Bearer $LINQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "operation": "add",
      "type": "laugh",
      "part_index": 1
    }'
```

```
await client.messages.addReaction({messageId}, {
  operation: "add",
  type: "laugh",
  part_index: 1,
});
```

```
client.messages.add_reaction(
    {message_id},
    operation="add",
    type="laugh",
    part_index=1,
)
```

```
client.Messages.AddReaction(context.TODO(), {messageId}, linq.MessageAddReactionParams{
  Operation: linq.F("add"),
  Type: linq.F("laugh"),
  PartIndex: linq.F(1),
})
```

If `part_index` is omitted, the reaction applies to the first part.

## Removing reactions

Use the same endpoint with `"operation": "remove"` and the matching `type` you originally added:

- [cURL](#tab-panel-76)
- [TypeScript](#tab-panel-77)
- [Python](#tab-panel-78)
- [Go](#tab-panel-79)

Terminal window

```
curl -X POST https://api.linqapp.com/api/partner/v3/messages/{messageId}/reactions \
  -H "Authorization: Bearer $LINQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "operation": "remove",
      "type": "like"
    }'
```

```
await client.messages.addReaction({messageId}, {
  operation: "remove",
  type: "like",
});
```

```
client.messages.add_reaction(
    {message_id},
    operation="remove",
    type="like",
)
```

```
client.Messages.AddReaction(context.TODO(), {messageId}, linq.MessageAddReactionParams{
  Operation: linq.F("remove"),
  Type: linq.F("like"),
})
```

## Sticker attachments

A contact can attach a sticker to any message part in iMessage. This is distinct from a custom sticker reaction — the `type` is `"sticker"` and the payload includes image metadata.

Sticker attachments are **inbound only**; the API does not support sending them.

They appear inside `parts[].reactions[]` on the message and trigger a [`reaction.added`](/guides/webhooks/events/#reaction-events/index.md) event:

```
{
  "parts": [
    {
      "type": "text",
      "value": "Hey yea",
      "reactions": [
        {
          "type": "sticker",
          "is_me": false,
          "custom_emoji": null,
          "sticker": {
            "file_name": "sticker-abc123.png",
            "mime_type": "image/png",
            "url": "https://cdn.linqapp.com/attachments/550e8400/sticker-abc123.png",
            "width": 320,
            "height": 320
          },
          "handle": {
            "id": "550e8400-e29b-41d4-a716-446655440011",
            "handle": "+14155559876",
            "is_me": false,
            "service": "iMessage",
            "status": "active",
            "joined_at": "2025-11-23T17:30:00.000Z",
            "left_at": null
          }
        }
      ]
    }
  ]
}
```

## Reaction webhook events

| Event              | Description                           |
| ------------------ | ------------------------------------- |
| `reaction.added`   | A reaction was added to a message     |
| `reaction.removed` | A reaction was removed from a message |

Webhook payloads include `reaction_type`, `message_id`, `part_index`, and sender information. See [Reaction events](/guides/webhooks/events#reaction-events/index.md) for full payload details.
