Skip to main content
A client’s binder is the container for the documents Filed has ingested for that client. It holds the uploaded files (subdocuments), the missing-item checklist the run produces, message counts for quick badges, and a search surface across bookmarks, annotations, and document contents. Read it with the binder field on a client. The binder is reached through the me query resolved as a WorkspaceUser, so every binder operation requires a workspaceToken (see Authentication). All requests go to:
There is no top-level binder query. The binder belongs to a client, so you read it through me { ... on WorkspaceUser { workspace { clients(filters: { ids: [$clientId] }) { binder { ... } } } } }. The workspaceToken already identifies the workspace, so you never pass a workspace ID to read the binder.

Query a client’s binder

Use this query when an app, agent, or MCP tool needs the binder overview for a client: filed documents, open missing items, quick counts, and signed URLs for the original uploads and page renders.

Arguments

ID!
required
The client whose binder you want to read. Pass it via filters.ids on clients.

Returns

Binder
The binder for the requested client. It contains filed documents, missing items, message counts, and search.
[SubDocument!]!
The logical documents Filed extracted or filed into the binder. Save each id: it is the documentPath used by document messages and file-level leadsheet signoff.
SignedPath!
Signed URL for the original uploaded file. Signed URLs are time-limited.
[SubdocPage!]!
Signed page image and markdown URLs for rendering or reading the parent document page by page.
BinderMissingItemsAssessment!
The status, reason, count, and filtered items for the missing-document check. Treat an empty item list as an all-clear only when status is AVAILABLE.
BinderMessageCounts!
Small counts for badges and summaries without fetching all messages.

MCP usage pattern

  1. Start with clients(filters: { ids: [$clientId] }) and read binder.
  2. Use binder.subdocuments for the document list and preserve each subdocument id for later annotation, signoff, or leadsheet operations.
  3. Use parentDocument.url when the user needs the original upload, and parentDocument.subdocPages when the user needs page images or page markdown.
  4. Use missingItemsAssessment.count and messageCounts for compact summaries before displaying full lists.
  5. Use binder.search when the user asks about specific content, issuers, categories, annotations, marks, or values inside the documents.

The Binder type

The top-level binder container for one client.
ID!
The binder’s unique identifier.
ID!
The client this binder belongs to.
[SubDocument!]!
The files filed in the binder. Pass a SubDocumentsFilter to narrow to unreviewed, flagged, or files under one parent document. See List the files in a binder.
String!
When the binder was created (ISO 8601 timestamp).
String!
When the binder was last updated (ISO 8601 timestamp).
BinderMissingItemsAssessment!
The state and filtered result of the missing-document check. Pass a BinderMissingItemsFilter to narrow by item status. See List missing items.
[BinderMissingItem!]!
Deprecated. Use missingItemsAssessment.items so you can distinguish an available empty result from a pending or unavailable assessment.
Int!
Deprecated. Use missingItemsAssessment.count.
BinderMessageCounts!
Open missing-item and notes counts for badge rendering. See Read message counts.
Search across bookmarks, annotations, marks, and document contents. See Search the binder.
Leadsheets
The leadsheets tree for a TAX_PREP or TAX_REVIEW run. Pass the run’s taskId to read that run’s tree; omit it to read the most recent tree. Leadsheets are documented separately on Leadsheets and review; this page does not re-document them.

The SubDocument type

One file in a binder. A subdocument is one logical document extracted from an uploaded parent (for example one 1099-INT inside a larger uploaded packet).
ID!
The subdocument’s unique identifier. This is the value you pass as documentPath when creating a document message or signing off on a file.
ID!
The client this subdocument belongs to.
String!
The ID of the parent document this subdocument was extracted from.
String!
The file name, for example 1099-INT-Acme-Broker.pdf.
[Int!]!
The pages inside the parent document this subdocument covers, 1-indexed.
String!
The document type the extractor classified this as, for example 1099-INT or W-2.
String!
The issuer or payer named on the document, for example Acme Broker.
Int!
The tax year this document covers, for example 2025.
String!
The ingestion or review status of this subdocument, for example ingested or reviewed.
String
The binder grouping category, when one has been assigned. Nullable: some subdocuments are uncategorized until a reviewer files them.
Int!
The sort order of this subdocument within the binder.
String!
When the subdocument was created (ISO 8601 timestamp).
String!
When the subdocument was last updated (ISO 8601 timestamp).
ParentDocument
The parent document this subdocument was extracted from. See ParentDocument.
String
The path to the canonical.json file in the per-client git repo. Populated when a tax-prep run has picked up this subdocument; null until then.
String
The use-case bucket the subdocument lives in on disk, for example source_docs, prior_year_docs, or current_year_drafts. null when the subdocument has not yet been migrated into a bucket.

The ParentDocument type

The original uploaded document a subdocument was extracted from. Carries the file URL and per-page render URLs.
ID!
The parent document’s unique identifier.
String!
The original uploaded file name.
String!
The MIME type, for example application/pdf.
SignedPath!
A signed URL for downloading the original file. SignedPath is { filePath: String!, url: String! }.
[SubdocPage!]!
Per-page render URLs for the parent document: one image URL and one markdown URL per page, both signed and time-limited.

The BinderMissingItemsAssessment type

The result of the missing-document check for the requested item status.
BinderMissingItemsAssessmentStatus!
PENDING while the check has not completed, AVAILABLE when the result can be used, or UNAVAILABLE when the binder lacks enough evidence to determine missing documents.
String
An explanation for a pending or unavailable assessment. It is null when the assessment is available.
Int!
The number of items returned for the requested filter.
[BinderMissingItem!]!
The missing items matching the requested filter. For an OPEN filter this is empty while the assessment is pending or unavailable.

The BinderMissingItem type

One item on the missing-document checklist the binder produces: a form the run expected to find but did not, with a severity, a reason, and a status you can move between OPEN, IGNORED, and RESOLVED.
ID!
The missing-item record ID. Pass this to ignoreBinderMissingItem or restoreBinderMissingItem.
ID!
The binder this missing item belongs to.
String!
The missing item, for example 1099-INT or W-2 from Acme.
String
The form type expected, when the checklist is form-specific.
String
The issuer the run expected to find, when relevant.
Int
The tax year the missing item applies to.
ChecklistItemSeverity!
How blocking the missing item is: CRITICAL, MEDIUM, or LOW.
String!
Why the run flagged this as missing, for example Expected a 1099-INT from Acme Broker but no matching document was found in the binder.
ChecklistItemStatus!
The current status: OPEN (still needs the document), IGNORED (a reviewer dismissed it via ignoreBinderMissingItem), or RESOLVED (the document was later found and filed).
String
A grouping category, when one has been assigned.
String!
When the missing-item record was created (ISO 8601 timestamp).
String!
When the missing-item record was last updated (ISO 8601 timestamp).

The BinderMessageCounts type

Open missing-item and notes counts. Use missingItemsAssessment when you also need to know whether the missing-document check is available.
Int!
The number of stored missing items in the OPEN status. Do not use this field alone to infer that the missing-document check completed successfully.
Int!
The number of open annotation notes on the binder. See Document messages for the annotation API.

The BinderSearchResults type

The result of Binder.search: four buckets of hits, one per search surface (bookmarks, annotations, marks, and document contents).
[BookmarkSearchHit!]!
Subdocuments whose file name, issuer, type, or category matched the query. See BookmarkSearchHit.
[BinderMessageSearchHit!]!
Binder messages (annotations and notes) whose body or expression matched the query. See BinderMessageSearchHit.
[BinderMessageSearchHit!]!
Binder messages that are marks, whose body or expression matched the query. See BinderMessageSearchHit.
[BinderContentSearchHit!]!
Hits inside document contents, with the matching field names, values, and bounding boxes. See BinderContentSearchHit.

The BookmarkSearchHit type

SubDocument!
The subdocument whose bookmark matched. See SubDocument.
BookmarkMatchField!
Which subdocument field matched: FILE_NAME, ISSUER, TYPE, or CATEGORY.
String!
A snippet of the matched value, for display.

The BinderMessageSearchHit type

A search hit inside a binder message (an annotation or a mark). The underlying message is a BinderMessage, the binder’s internal message type used by search. Annotation and sign-off writes use the DocumentMessage type (see Document messages); BinderMessage is the read shape the search surface returns.
BinderMessage!
The binder message that matched. See BinderMessage.
BinderMessageMatchField!
Which message field matched: BODY (the message body) or EXPRESSION (an expression inside the message content).
String!
A snippet of the matched text, for display.
Boolean!
true when the hit is a reply inside a thread, false when it is a top-level message.

The BinderMessage type

The binder’s internal message type, returned by Binder.search. It carries the message’s anchor (subdocument path, page number, coordinates), content, threads, and tagged users.
ID!
The binder message ID.
ID!
The binder this message belongs to.
ID!
The subdocument path the message is anchored to.
Int!
The page number inside the subdocument the message is anchored to, 1-indexed.
JSON
The on-page coordinates of the message anchor, when the message is pinned to a region. null for messages that are not pinned to a region.
String!
The message type label, for example annotation or mark.
JSON!
The message content as a JSON object.
ID!
The user who created the message.
[BinderMessageThread!]!
Reply threads on the message.
[BinderTaggedUser!]!
Users tagged on the message.
Boolean!
Whether the message has been read by the current user.
String
When the message was deleted, if applicable. null while the message is live.
ID
The user who deleted the message, if applicable.
String!
When the message was created (ISO 8601 timestamp).
String!
When the message was last updated (ISO 8601 timestamp).

The BinderContentSearchHit type

A search hit inside a subdocument’s contents: the matching field names, values, and the page-level bounding boxes that pin them.
SubDocument!
The subdocument whose contents matched. See SubDocument.
String!
A snippet of the matched content, for display.
[BinderContentPageHit!]!
The pages inside the subdocument that carried matches, with the field-level matches on each page.
Int!
The page number, 1-indexed.
[BinderContentFieldMatch!]!
The field-level matches on this page.
String!
The name of the field that matched.
String!
The value of the field that matched.
BinderContentBbox
The bounding box that pins this match on the page. See BinderContentBbox below. null when the match is not pinned to a region.
Int!
Left edge of the box, in page pixels.
Int!
Top edge of the box, in page pixels.
Int!
Right edge of the box, in page pixels.
Int!
Bottom edge of the box, in page pixels.
Int!
The page this box is on, 1-indexed.

List the files in a binder

Read binder.subdocuments to list the files filed in a client’s binder. This is the most common read against the binder: it backs the binder’s Documents screen.

Arguments

ID!
required
The client whose binder you want to read. Pass it via filters.ids on clients.
Boolean
When true, return only subdocuments that have not been reviewed yet.
Boolean
When true, return only subdocuments that carry a flag.
ID
Return only subdocuments extracted from this parent document.
The subdocument id is the value you pass as documentPath when creating a document message or signing off on a file. Save it when you list the binder so you can reference it later.

List missing items

Read binder.missingItemsAssessment to get the state and filtered result of the missing-document check. Filter by item status to read only open, ignored, or resolved history.

Arguments

ID!
required
The client whose binder you want to read. Pass it via filters.ids on clients.
ChecklistItemStatus
Return only missing items in this status: OPEN, IGNORED, or RESOLVED. Omit it to use the default OPEN status.

Returns

BinderMissingItemsAssessmentStatus!
Whether the missing-document check is PENDING, AVAILABLE, or UNAVAILABLE.
String
Why the assessment is pending or unavailable. It is null when available.
Int!
The number of items matching the requested filter.
[BinderMissingItem!]!
The filtered missing-item rows. Open items are empty for pending or unavailable assessments.

Read message counts

Read binder.messageCounts for stored missing-item and open note counts. Use missingItemsAssessment for a missing-document badge so the UI can distinguish an available empty result from a pending or unavailable check.

Arguments

ID!
required
The client whose binder counts you want. Pass it via filters.ids on clients.

Search the binder

Read binder.search to search across bookmarks (subdocuments by file name, issuer, type, or category), annotations, marks, and document contents in one call. The query is debounced in the web app: pass at least two characters.

Arguments

ID!
required
The client whose binder you want to search. Pass it via filters.ids on clients.
String!
required
The search query. The web app debounces the input and requires at least two characters before firing the query.
Int
Maximum number of hits to return per bucket. Defaults to 20.

Ignore a missing item

ignoreBinderMissingItem moves a missing item from OPEN to IGNORED. Use it when a reviewer dismisses a missing item the run flagged. The mutation takes the missing-item id and the workspaceId, and returns the updated BinderMissingItem with its new status.

Input

ID!
required
The ID of the missing item to ignore (the id from List missing items).
String!
required
The workspace ID. Unlike the read fields, this mutation takes the workspace ID explicitly. Use the same workspace ID the workspaceToken was issued for.

Returns: BinderMissingItem!

The ignored BinderMissingItem, with status set to IGNORED.
After ignoring a missing item, refetch the List missing items query so the open count and the list agree. The web app optimistically moves the row from the OPEN assessment to the IGNORED assessment and updates both counts.

Restore a missing item

restoreBinderMissingItem moves a missing item from IGNORED back to OPEN. Use it when a reviewer wants to re-surface a missing item they previously ignored.

Input

ID!
required
The ID of the missing item to restore (the id from List missing items).
String!
required
The workspace ID. Use the same workspace ID the workspaceToken was issued for.

Returns: BinderMissingItem!

The restored BinderMissingItem, with status set to OPEN.
After restoring a missing item, refetch the List missing items query so the open count and the list agree. The web app optimistically moves the row from the IGNORED assessment to the OPEN assessment when the check is available.