Documents are the step-by-step records a library writes from recorded work. These endpoints list a library's documents, read one in full, walk the edges between documents and show the recordings a document was written from. List responses are paginated; the API overview covers paging. Every request needs your API key as a bearer token; see Authentication.
List a library's documents
GET /libraries/{id}/documentsReturns a paginated list of one library's documents. {id} is the library, as a lib_... ID or slug. To rank documents across every library at once, use search instead.
The filter values come from the library's label endpoints.
Every document in the response belongs to the library you asked for, so the template that shapes their content arrives once as the response's schema rather than on each document.
Get a document
GET /documents/{id}Returns one document in full: its labels, its content, the schema that shapes it, its library and every edge in and out. {id} must be a doc_... ID; document slugs are only unique within a library, so they do not resolve here.
content is keyed by the sections of the library's template and schema describes that template, so you can render any document in the library the same way.
{
"id": "doc_...",
"title": "Refund an order",
"category": "Billing",
"tags": ["stripe", "refunds"],
"applications": ["Stripe", "Gmail"],
"recordingCount": 12,
"deviceCount": 4,
"firstSeen": "2026-05-11T10:03:00Z",
"lastSeen": "2026-07-28T09:41:00Z",
"createdAt": "2026-05-11T10:20:00Z",
"updatedAt": "2026-07-28T09:55:00Z",
"content": { ... },
"schema": { ... },
"library": { "id": "lib_...", "name": "Support" },
"edges": {
"outgoing": [...],
"incoming": [...]
}
}Traverse from a document
GET /documents/{id}/traverseWalks the graph outward from one document, breadth first, following edges for up to depth hops and collecting every document and edge it reaches. Use it to answer questions like "what usually comes after this?" without fetching the whole library graph.
The response returns the root document id, the maxDepth walked and the nodes and edges reached. A walk can cross into another library, so each node names its own libraryId and the templates arrive once each in a schemas map keyed by that id: render a node's content against schemas[node.libraryId].
Read source recordings
GET /documents/{id}/source-recordingsReturns the recordings a document was written from: each with its question-and-answer pairs and its step timeline as plain strings. Only recordings shared with the workspace appear here, and pages are capped at 50 results.
This endpoint needs a key with source recordings access. Without it the request returns 403. See Authentication.
An empty list is normal and does not mean the document is unsupported. Recordings stay private until a member shares them from the desktop app, and on the Individual plan they cannot be shared at all, so a document can be written from recordings that none of them can be shown. The counts tell you which case you are in: total is what you can read, linkedTotal is how many exist (the same number the document reports as recordingCount), privateTotal is the difference, and guidance explains any gap in words. When everything is private, treat the document's own content as the authoritative account.
{
"sourceRecordings": [
{
"id": "rec_...",
"title": "Refund a payment in Stripe",
"status": "...",
"clientCreatedAt": "2026-07-14T11:26:00Z",
"questions": [
{
"id": "ques_...",
"question": "Why did the customer get a refund?",
"response": "They were charged twice",
"sequenceOrder": 1
}
],
"steps": ["...", "..."]
},
...
],
"total": 12,
"linkedTotal": 14,
"privateTotal": 2,
"guidance": "Showing the 12 shared recordings behind this document. A further 2 are private and cannot be shown.",
"page": 1,
"pageSize": 20
}