> ## Documentation Index
> Fetch the complete documentation index at: https://docs.montra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# get_document

> Read one Montra document with its folder, tickets, and latest generation status.

Reads one document in full: the document itself, the folder it lives in, the status of its latest generation, and the tickets a reader sees in the app. Each ticket's `body` is the markdown implementation spec — that is the work you are being asked to do.

Get a `documentId` from [`list_documents`](/tools/list-documents). For the typical read-then-implement loop, see [the agent workflow guide](/guides/agent-workflow).

## Input

<ParamField body="documentId" type="string (uuid)" required>
  Id of the document to read, as returned by [`list_documents`](/tools/list-documents).
</ParamField>

## Output

<ResponseField name="document" type="object" required>
  <Expandable title="properties">
    <ResponseField name="id" type="string" required>Document id.</ResponseField>
    <ResponseField name="title" type="string" required>Document title.</ResponseField>
    <ResponseField name="summary" type="string" required>Short summary of the document. Empty when none has been written.</ResponseField>
    <ResponseField name="status" type="string" required>Document status.</ResponseField>
    <ResponseField name="completed" type="boolean" required>Whether the document has been marked complete.</ResponseField>
    <ResponseField name="folderId" type="string" required>Id of the folder holding this document. `null` when the document is not in a folder.</ResponseField>
    <ResponseField name="createdAt" type="string" required>When the document was created.</ResponseField>
    <ResponseField name="updatedAt" type="string" required>When the document was last updated.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="folder" type="object">
  The folder holding the document. `null` when the document is not in a folder.

  <Expandable title="properties">
    <ResponseField name="id" type="string" required>Folder id.</ResponseField>
    <ResponseField name="name" type="string" required>Folder name.</ResponseField>
    <ResponseField name="description" type="string" required>Folder description. Empty when none has been written.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="generation" type="object">
  Status of the document's latest generation. `null` when nothing has been generated yet.

  <Expandable title="properties">
    <ResponseField name="status" type="string" required>Status of the latest generation.</ResponseField>
    <ResponseField name="updatedAt" type="string" required>When that generation last changed status.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="tickets" type="object[]" required>
  <Expandable title="properties">
    <ResponseField name="id" type="string" required>Ticket id. Pass this to [`get_ticket`](/tools/get-ticket) or [`get_ticket_images`](/tools/get-ticket-images).</ResponseField>
    <ResponseField name="title" type="string" required>Ticket title.</ResponseField>
    <ResponseField name="summary" type="string" required>One-line summary of the ticket.</ResponseField>
    <ResponseField name="body" type="string" required>Markdown implementation spec. May be empty — see the notes below.</ResponseField>
    <ResponseField name="status" type="string" required>Either `todo` or `done`.</ResponseField>
    <ResponseField name="imageCount" type="integer" required>How many screenshots are attached. Read them with [`get_ticket_images`](/tools/get-ticket-images).</ResponseField>
    <ResponseField name="inputId" type="string" required>Id of the recording or other input this ticket came from. `null` when the ticket is not tied to one. Pass it to [`get_transcript`](/tools/get-transcript) for the narration behind it.</ResponseField>
    <ResponseField name="sortRank" type="string" required>Sort key. Tickets are already returned in this order.</ResponseField>
    <ResponseField name="timestampMs" type="integer" required>Position in the recording, in milliseconds, that the ticket refers to.</ResponseField>
  </Expandable>
</ResponseField>

## Notes

* Tickets that are hidden, deleted, or merged into another ticket are left out, so the list matches what a person sees in the app. The rest are returned in the app's own order.
* A ticket's `body` can come back empty when the document is read in a compact form. When that happens, read the ticket with [`get_ticket`](/tools/get-ticket) to get the full spec rather than treating it as an empty ticket.
* A document outside the bound workspace reads as not found, even if your user account can otherwise reach it — for example a document shared with you from another workspace. Resolve those with a [share link](/guides/share-links) instead.
* `imageCount` above zero means the person marked up real UI screenshots while recording. Fetch them with [`get_ticket_images`](/tools/get-ticket-images) and read them as part of the spec.
