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.
Requires user authentication (Bearer token). An API key has no recipient identity and is rejected with 403.
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.
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_…), ornulluntil 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, orfailed. Onlycompletedsources are searchable. - chunk_count
integer— number of searchable chunks produced. - source_kind
string— how it was added:file,text_paste,url_capture, ordeep_research. - added_at
string | null— ISO-8601 timestamp it was added to the thread. - added_by
string | null— the person who added it;nullfor a machine-added source. - origin_url / research_session_id / source_type — provenance for captured and researched sources.
- file_id
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.
# 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"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)import requests
response = requests.get(
"https://api.aitronos.com/v1/shared-threads/abc123slug/sources",
headers={"Authorization": "Bearer YOUR_TOKEN"},
)
print(response.json()["sources"])const panel = await (
await fetch(
"https://api.aitronos.com/v1/shared-threads/abc123slug/sources",
{ headers: { Authorization: "Bearer YOUR_TOKEN" } },
)
).json();
console.log(panel.sources);{
"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"
}
]
}{
"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"
}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": "..."
}
}- Check source on a shared thread — Trace a highlighted span to its origin
- Get Shared Thread Messages — The transcript these sources ground
- Get Shared Thread Turns — Every turn in the thread, for the turn rail
- Search Shared Thread Messages — Find a turn anywhere in the thread
- Get Shared Thread — Open the share link