Skip to content

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.

POSThttps://api.aitronos.com/v1/shared-threads/{slug}/messages/{message_id}/reactions

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

GEThttps://api.aitronos.com/v1/shared-threads/{slug}/messages/{message_id}/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

DELETEhttps://api.aitronos.com/v1/shared-threads/{slug}/messages/{message_id}/reactions?emoji={emoji}

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

# 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

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)

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

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)

{
  "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"
}
{
  "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": "..."
  }
}
{
  "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": "..."
  }
}