# Shared Thread Reactions

Add, list, and remove emoji reactions on a message of a **live-shared** thread you **joined** — the slug-scoped twin of the owner reaction endpoints, for a participant who joined the thread via a share link but does not own it.

Reactions are the most visible co-working feature: a reaction added by a joiner fans out to the owner and every other participant on the live stream in real time, and appears in the owner's own reaction list too.

Every operation is authorized by the joiner's **live**-share grant on the slug — the same resolution as opening the link, plus the link's `access_level` must be `live`. A `view` or `fork` slug returns `403`; an unknown or unauthorized link returns `404`.

## Authentication

Requires **user** authentication (Bearer token). API-key authentication is rejected — a reaction is a per-user action.

## Path Parameters

**`slug`** string required

The share-link slug, from the share URL. The link must be a `live` link.

**`message_id`** string required

The message to react to (prefixed `msg_`). Must belong to the shared thread.

## Body Parameters

**`emoji`** string required

The emoji to toggle. Adds the reaction if the caller has not used that emoji on the message, removes it if they have.

## Returns

Returns the message's full, updated reaction set plus whether this call added or removed:

- **message_id** `string` — the message the reactions are on.
- **reactions** `array` — the message's current reactions: `{ id, emoji, actor_id, actor_name, created_at }`.
- **toggled** `string` — `"added"` or `"removed"`.


## Other Operations

### List reactions

Returns all reactions on the message, oldest-first, as an array of `{ id, emoji, actor_id, actor_name, created_at }`.

### Remove a specific reaction

Removes the caller's reaction for the given `emoji` query parameter. Idempotent — removing an absent reaction is a no-op. Returns the same shape as the toggle (with `toggled: "removed"`).

## Code Examples

### cURL


```bash
# Toggle a 👍
curl -X POST "https://api.aitronos.com/v1/shared-threads/abc123slug/messages/msg_abc/reactions" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"emoji": "👍"}'

# List
curl "https://api.aitronos.com/v1/shared-threads/abc123slug/messages/msg_abc/reactions" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Remove a 👍
curl -X DELETE "https://api.aitronos.com/v1/shared-threads/abc123slug/messages/msg_abc/reactions?emoji=%F0%9F%91%8D" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

### Python SDK


```python
from aitronos import Aitronos

client = Aitronos(api_key="", token="YOUR_TOKEN")
result = client.threads.shared.reactions.toggle(
    slug="abc123slug", message_id="msg_abc", emoji="👍"
)
print(result.toggled, result.reactions)
```

### Python (requests)


```python
import requests

response = requests.post(
    "https://api.aitronos.com/v1/shared-threads/abc123slug/messages/msg_abc/reactions",
    headers={"Authorization": "Bearer YOUR_TOKEN"},
    json={"emoji": "👍"},
)
print(response.json()["toggled"])
```

### JavaScript


```javascript
const response = await fetch(
  "https://api.aitronos.com/v1/shared-threads/abc123slug/messages/msg_abc/reactions",
  {
    method: "POST",
    headers: {
      Authorization: "Bearer YOUR_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ emoji: "👍" }),
  },
);
const result = await response.json();
console.log(result.toggled, result.reactions);
```

## Response Examples

### Success (200)


```json
{
  "message_id": "msg_abc",
  "reactions": [
    {
      "id": "tmrx_0d27ed63a3f848cea92161d15b67fc69",
      "emoji": "👍",
      "actor_id": "usr_bc748f25224f4015abb43369d2025487",
      "actor_name": "Jordan Rivera",
      "created_at": "2026-07-06T11:26:38Z"
    }
  ],
  "toggled": "added"
}
```

### Error — Not a live link (403)


```json
{
  "success": false,
  "error": {
    "code": "INSUFFICIENT_PERMISSIONS",
    "message": "You do not have permission to perform this action.",
    "system_message": "This share link does not grant live co-working access",
    "type": "authorization_error",
    "status": 403,
    "details": { "link_id": "tslnk_...", "access_level": "view" },
    "trace_id": "...",
    "timestamp": "..."
  }
}
```

### Error — Link not found or not authorized (404)


```json
{
  "success": false,
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "The requested resource could not be found.",
    "system_message": "Share link not found",
    "type": "client_error",
    "status": 404,
    "details": {},
    "trace_id": "...",
    "timestamp": "..."
  }
}
```

## Related Resources

- [Join Shared Thread](/api-reference/shared-threads/join-shared-thread) — Join the live-shared thread first
- [Get Shared Thread Messages](/api-reference/shared-threads/get-shared-thread-messages) — Read the messages you can react to
- [Shared Thread Compose State](/api-reference/shared-threads/shared-thread-compose-state) — Edit an email compose card as a joiner
- [Shared Thread Tool Approval](/api-reference/shared-threads/shared-thread-tool-approval) — Approve a parked tool as a joiner
- [Live Shared Thread](/api-reference/shared-threads/live-shared-thread) — The real-time stream reactions fan out on