# Shared Thread Sources

Lists the **files that back the conversation** behind a share link, and returns one of them by id. This is what the Knowledge & Sources panel reads on a shared chat view.

These are the slug-scoped equivalents of the ownership-scoped thread sources routes, which return `404` for a share-link recipient. Authorization is the **same** as reading the thread's messages: the slug must resolve for you, at any access level (`view`, `fork`, `live`).

Both routes are **read-only**. Adding or removing a source stays owner/edit-scoped — a link holder can see what the conversation was grounded on, never change it.

**One deliberate difference from the owner routes:** `attached_vector_store_ids` is always empty here. Those are organization knowledge stores merely attached to the thread as extra read sources; a link holder is authorized by possession of a URL, not by membership of those stores, so their ids are withheld — the same reason [Get Shared Thread](/api-reference/shared-threads/get-shared-thread) withholds the thread's space ids. The thread's **own** source files are conversation content the link already grants.

## Authentication

Requires **user** authentication (Bearer token). An API key has no recipient identity and is rejected with `403`.

## Path Parameters

**`slug`** string required

The share-link slug, taken from the share URL.

**`file_id`** string required (detail route only)

The source file's id (`file_…`), taken from an entry of the list route. A file that is not a source of this thread returns `404` — the same status an unknown link returns.

## Returns

The list route returns the thread's source inventory:

- **thread_id** `string` — the thread behind the link.
- **source_vector_store_id** `string | null` — the thread's own per-thread source store id (`tvs_…`), or `null` until the thread has any source.
- **attached_vector_store_ids** `array` — **always empty** on this route (see above).
- **sources** `array` — the thread's own source files. Each entry has:
  - **file_id** `string` — file id (`file_…`).
  - **name** `string | null` — display name.
  - **mime_type** `string | null` — MIME type.
  - **size** `integer` — size in bytes.
  - **processing_status** `string` — `pending`, `processing`, `completed`, or `failed`. Only `completed` sources are searchable.
  - **chunk_count** `integer` — number of searchable chunks produced.
  - **source_kind** `string` — how it was added: `file`, `text_paste`, `url_capture`, or `deep_research`.
  - **added_at** `string | null` — ISO-8601 timestamp it was added to the thread.
  - **added_by** `string | null` — the person who added it; `null` for a machine-added source.
  - **origin_url** / **research_session_id** / **source_type** — provenance for captured and researched sources.


The detail route returns **one** of those `sources` entries, unwrapped — the same object shape. It is metadata only: no file bytes and no download URL are served to a link holder. Use it to refresh a single row (for example to poll a source whose `processing_status` is still `pending`) without re-reading the whole panel.

The assistant's internal per-thread memory is never returned by either route.

## Code Examples

### cURL


```bash
# The whole panel
curl -X GET "https://api.aitronos.com/v1/shared-threads/abc123slug/sources" \
  -H "Authorization: Bearer YOUR_TOKEN"

# One row
curl -X GET "https://api.aitronos.com/v1/shared-threads/abc123slug/sources/file_abc123" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

### Python SDK


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

client = Aitronos(api_key="", token="YOUR_TOKEN")

panel = client.threads.shared.list_sources(slug="abc123slug")
for source in panel.sources:
    print(source.file_id, source.name, source.processing_status)

one = client.threads.shared.get_source(slug="abc123slug", file_id="file_abc123")
print(one.processing_status)
```

### Python (requests)


```python
import requests

response = requests.get(
    "https://api.aitronos.com/v1/shared-threads/abc123slug/sources",
    headers={"Authorization": "Bearer YOUR_TOKEN"},
)
print(response.json()["sources"])
```

### JavaScript


```javascript
const panel = await (
  await fetch(
    "https://api.aitronos.com/v1/shared-threads/abc123slug/sources",
    { headers: { Authorization: "Bearer YOUR_TOKEN" } },
  )
).json();
console.log(panel.sources);
```

## Response Examples

### Success — list (200)


```json
{
  "thread_id": "thread_5f8c2a1b9d4e4c3f8a7b6c5d4e3f2a1b",
  "source_vector_store_id": "tvs_9d4e4c3f8a7b6c5d",
  "attached_vector_store_ids": [],
  "sources": [
    {
      "file_id": "file_abc123",
      "name": "launch-brief.pdf",
      "mime_type": "application/pdf",
      "size": 184320,
      "processing_status": "completed",
      "chunk_count": 42,
      "source_kind": "file",
      "added_at": "2026-08-01T12:00:00Z",
      "added_by": "usr_4e3f2a1b9d4e4c3f",
      "source_type": "web"
    }
  ]
}
```

### Success — one source (200)


```json
{
  "file_id": "file_abc123",
  "name": "launch-brief.pdf",
  "mime_type": "application/pdf",
  "size": 184320,
  "processing_status": "completed",
  "chunk_count": 42,
  "source_kind": "file",
  "added_at": "2026-08-01T12:00:00Z",
  "added_by": "usr_4e3f2a1b9d4e4c3f",
  "source_type": "web"
}
```

### Success — no sources yet (200)

A thread nobody has attached anything to. A normal state, not an error.


```json
{
  "thread_id": "thread_5f8c2a1b9d4e4c3f8a7b6c5d4e3f2a1b",
  "source_vector_store_id": null,
  "attached_vector_store_ids": [],
  "sources": []
}
```

### Error — not a source of this thread, or unknown / unauthorized link (404)

Deliberately the same status for both, so a probe cannot tell them apart.


```json
{
  "success": false,
  "error": {
    "code": "FILE_NOT_FOUND",
    "message": "The requested file could not be found.",
    "system_message": "Source not found on this thread",
    "type": "client_error",
    "status": 404,
    "details": { "thread_id": "thread_5f8c2a1b…", "file_id": "file_ghost" },
    "trace_id": "...",
    "timestamp": "..."
  }
}
```

## Related Resources

- [Check source on a shared thread](/api-reference/shared-threads/check-source) — Trace a highlighted span to its origin
- [Get Shared Thread Messages](/api-reference/shared-threads/get-shared-thread-messages) — The transcript these sources ground
- [Get Shared Thread Turns](/api-reference/shared-threads/get-shared-thread-turns) — Every turn in the thread, for the turn rail
- [Search Shared Thread Messages](/api-reference/shared-threads/search-shared-thread-messages) — Find a turn anywhere in the thread
- [Get Shared Thread](/api-reference/shared-threads/get-shared-thread) — Open the share link