Skip to main content
Every study has a Study Manager: an agent that reads each quality interview in full and keeps one document, the ledger, describing what the study has learned. The ledger holds the questions the study is answering, the answer patterns and themes found so far, a graded quote from every interview that supports each of them, the interviews worth reading, and the agent’s call on where the study stands. The ledger is written only by the study’s agent. Every save creates a new version and records what changed as events. Both are read-only over the API: you read the ledger for the current picture and the events for the delta since you last looked.
GET /v1/studies/:id/themes remains the older automatic themes, regenerated from scratch after each interview. The ledger is the Study Manager’s account: versioned, graded, and counted the same way for every item.

GET /v1/studies/:id/ledger

Retrieve the current version of a study’s ledger.

Request

string
required
Bearer token. See Authentication.
string
required
Study ID (UUID).
string
"all" to include merged and retired items. Default: active items only.
Before the study’s agent has saved its first version, the endpoint returns 404 with error.code "ledger_not_found":
404
Returns 404 with error.code "study_not_found" if the study doesn’t exist or doesn’t belong to your project.

GET /v1/studies/:id/events

List what changed in a study’s ledger, newest first. Each event is derived from the difference between two ledger versions; nothing is computed beside that diff.

Request

string
required
Bearer token. See Authentication.
string
required
Study ID (UUID).
string
Only events created at or after this ISO 8601 timestamp (inclusive), e.g. 2026-09-17T00:00:00Z. An event’s created_at can be passed back as is; URL-encode it, because a + in the offset otherwise decodes as a space.
string
Only events of this kind. Repeat the parameter for several kinds: ?kind=theme_created&kind=item_strengthened. See Event kinds.
integer
Number of events to return. Default 20, max 100.
string
Cursor for pagination. Pass the id of the last event from the previous page.
Returns 404 with error.code "study_not_found" if the study doesn’t exist or doesn’t belong to your project. Before the first save the list is empty, not an error.

Errors

These two endpoints return a structured error body. type is "invalid_request_error" for 400 and 404 responses and "api_error" for 500. param names the query or path parameter the error is about, or is null.
400
Missing or invalid API keys return 401 with the shared error body.

Study ledger object

string
"study_ledger"
string
Study ID (UUID).
integer
The ledger version, starting at 1 on the agent’s first save and increasing by one per save. Events carry the version that produced them.
string
ISO 8601 timestamp of the save that produced this version.
object | null
The agent’s call on where the study stands, with its reason. null until the agent has made one.
study_question[]
The questions the study is answering, each with its answer patterns. The study’s configured questions come first in the study’s order, then questions derived from the research goal, then questions a person asked for. Answer patterns and themes are listed strongest first. See Study question.
study_item[]
Findings nobody asked for. See Study item.
object[]
The interviews worth reading, by rank. At most five.
object[]
Interviews the agent set aside. An excluded interview has no evidence and is not counted.
object[]
Observations, caveats and method remarks that fit no item. Visible, never counted.
object[]
What the study owner told the agent to track or drop, in chat. Preferences bind on every later turn.

Study question

string
"study_question"
string
Question ID, e.g. "q_first_impression". Never reused.
string
The question as the agent phrased it. The agent derives its own list from the study’s goal and configured questions, and may split or rephrase them.
string
Where the question came from: "study:<n>" for the study’s configured question n (0-indexed), "goal" when derived from the research goal, or "user" when a person asked for it in chat.
string
"no_pattern" (no answer pattern yet), "emerging" (at least one pattern, counts still moving), or "answered" (patterns stable; the agent would defend the answer).
string | null
Free text about the question, e.g. "splits by tenure".
study_item[]
The answer patterns found for this question. Several per question is normal. See Study item.

Study item

An answer pattern or a theme. Both carry the same fields and the same counts.
string
"study_item"
string
Item ID: "a_…" for answers, "t_…" for themes. Never reused.
string
"answer" or "theme".
string | null
The question an answer belongs to. null for themes.
string
Names the pattern. Titles never state how many respondents; the counts do.
string
What respondents did or said.
string
"active" (counted and shown), "merged" (folded into merged_into), or "retired" (no longer tracked). Merged and retired items appear only with include=all.
string | null
The item this one was folded into, when status is "merged".
string | null
Why the item was merged or retired.
string | null
The interview that first surfaced the item.
string
ISO 8601 timestamp of the save that created the item.
integer
Interviews whose evidence for this item is graded A, B or C. This is the item’s number; see Grades and counts.
integer
Interviews whose evidence for this item is graded D or E. Not counted in supporters.
integer
Interviews the agent has reviewed and not excluded, in this ledger version. Read supporters against it: 4 of 9 reviewed.
study_evidence[]
One graded quote per supporting interview. See Study evidence.

Study evidence

string
"study_evidence"
string
Interview ID (UUID) the quote comes from.
number
Seconds into the interview where the quoted line starts.
number
Seconds into the interview where the quoted line ends. May equal start.
string
The respondent’s verbatim words, at most thirty words. Every quote is checked against the transcript before the ledger is saved.
string | null
Context the words alone would not carry, such as the interviewer’s question. Present when the grade depends on it.
string
"A" to "E". See Grades and counts.
string
One sentence, in the agent’s words, saying what earned the grade.

Grades and counts

Every piece of evidence is a graded quote. The grade says how much the respondent’s words earn for the item: An item’s supporters is the number of reviewed, non-excluded interviews with evidence graded A to C; weak is the number graded D or E. Both are counted over the same reviewed set, so supporters means the same thing for every item in a ledger. Excluded interviews contribute to neither. Titles and descriptions never state prevalence; compare supporters with reviewed instead.

Study event object

string
"study_event"
string
Event ID (UUID). Use it as starting_after to page.
string
Study ID (UUID).
integer
The ledger version whose save produced this event.
string
One of the event kinds.
string | null
The question, item or note the event is about, when there is one.
string | null
The interview the event is about, when there is one.
object
Small facts about the change. Keys depend on kind; see Event kinds. Never contains quotes.
string
ISO 8601 timestamp of the save that produced the event.

Event kinds

map in detail is "answers" or "themes", naming which kind of item the event is about.
To watch a study, poll GET /v1/studies/:id/events?since=<last poll> and read the ledger when something you care about appears, for example theme_created or item_strengthened. Webhooks do not deliver study-level events in v1.