Skip to content

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 withholds the thread's space ids. The thread's own source files are conversation content the link already grants.

GEThttps://api.aitronos.com/v1/shared-threads/{slug}/sources
GEThttps://api.aitronos.com/v1/shared-threads/{slug}/sources/{file_id}

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

# 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

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)

import requests

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

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)

{
  "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)

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

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

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

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