# Fetch a tool call's full result on a shared thread

The share-link twin of [Fetch a tool call's full result](/api-reference/threads/get-tool-call-result). Returns the complete, untruncated `result` of one stored tool call to a recipient reading the thread through a share link.

Rendered `tool_call` blocks inline a result only up to a byte budget (32 KiB by default) and mark the cut with `result_truncated: true` plus a `result_bytes` giving the full size. This endpoint serves the rest, once, when the recipient expands the block.

## Authentication

**User authentication only** (Bearer token). A share link is resolved against a recipient, and an API key has no recipient — an `x-api-key` request is rejected with `403`, exactly as on every other `/shared-threads` route.

Authorization is otherwise identical to [Get shared thread messages](/api-reference/shared-threads/get-shared-thread-messages): the link must exist, be unrevoked and unexpired, and resolve for the calling user (active member of the owning organization, with an explicit grant). Anything else is a `404` — an unknown slug and a revoked one are indistinguishable.

As on the owner surface, a message the shared message list would not show, and a tool call it would not draw a block for, are `404` here too — as is a record holding no `result` field at all (a failed call, or a card still awaiting approval). A call that succeeded and returned nothing is not in that set: a stored `""` or `null` comes back as a `200` carrying that value with `result_bytes: 0`, matching the block, which shows the same empty value with `result_truncated: false`.

## Path Parameters

**`slug`** string required

The share-link slug, taken from the share URL. The slug alone identifies the thread; a thread id is neither needed nor accepted.

**`message_id`** string required

The message the tool call belongs to (`msg_` prefix). Must be on the thread the slug resolves to.

**`tool_call_id`** string required

The tool call's identifier, taken from the block's `id` (equivalently `tool_call_id`).

Note the path segment is `tool-calls`, hyphenated.

## Returns

Returns `200 OK` with the same body as the owner surface:

- **`message_id`** `string` — The message the tool call belongs to (echoed).
- **`tool_call_id`** `string` — The tool call's identifier (echoed).
- **`tool_name`** `string` — The tool that produced the result.
- **`result`** `any` — The stored result in full.
- **`result_bytes`** `integer` — Size of the STORED result in UTF-8 bytes, matching the `result_bytes` on the block you expanded. Measured before the vendor-term substitution every message read applies, so it answers "is this the whole value" rather than serving as a checksum of the bytes you received.


## Code Examples

### cURL


```bash
curl https://api.aitronos.com/v1/shared-threads/sh_7d21c/messages/msg_1a2b/tool-calls/call_119041/result \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept-Encoding: gzip"
```

### Python SDK


```python
from aitronos import Aitronos  # pip install aitronos-sdk

client = Aitronos(access_token="your-user-token")
full = client.shared_threads.get_tool_call_result(
    slug="sh_7d21c",
    message_id="msg_1a2b",
    tool_call_id="call_119041",
)
print(full.tool_name, full.result_bytes)
```

### Python (requests)


```python
import requests

resp = requests.get(
    "https://api.aitronos.com/v1/shared-threads/sh_7d21c/messages/msg_1a2b"
    "/tool-calls/call_119041/result",
    headers={"Authorization": "Bearer YOUR_TOKEN"},
)
body = resp.json()
# result_bytes is measured on the STORED value, before the vendor-term
# substitution every message read applies — so treat it as "is this the whole
# value" rather than as a checksum. On the rare row where a term is rewritten,
# the delivered string can differ from result_bytes by a few bytes.
assert len(body["result"].encode()) >= body["result_bytes"] - 64
```

### JavaScript


```javascript
const resp = await fetch(
  "https://api.aitronos.com/v1/shared-threads/sh_7d21c/messages/msg_1a2b" +
    "/tool-calls/call_119041/result",
  { headers: { Authorization: "Bearer YOUR_TOKEN" } },
);
const body = await resp.json();
console.log(body.tool_name, body.result_bytes);
```

## Response Example


```json
{
  "message_id": "msg_1a2b3c4d5e6f7081920a1b2c3d4e5f60",
  "tool_call_id": "call_119041",
  "tool_name": "search_knowledge",
  "result": "…the whole stored value…",
  "result_bytes": 481570
}
```

## Error Responses

An API key, or any other non-user credential:


```json
{
  "success": false,
  "error": {
    "code": "INSUFFICIENT_PERMISSIONS",
    "message": "Share links can only be opened with user authentication",
    "type": "client_error",
    "status": 403,
    "details": {"auth_method": "api_key"},
    "trace_id": "trc_example",
    "timestamp": "2026-09-02T12:00:00Z"
  }
}
```

An unknown, revoked or expired link, or one not granted to this user:


```json
{
  "success": false,
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "Shared thread not found",
    "type": "client_error",
    "status": 404,
    "details": {"slug": "sh_7d21c"},
    "trace_id": "trc_example",
    "timestamp": "2026-09-02T12:00:00Z"
  }
}
```

## Related Resources

- [Get shared thread messages](/api-reference/shared-threads/get-shared-thread-messages)
- [Fetch a tool call's full result](/api-reference/threads/get-tool-call-result)
- [Check source on a shared thread](/api-reference/shared-threads/check-source)
- [Get shared thread turns](/api-reference/shared-threads/get-shared-thread-turns)