Skip to main content
Tax prep is the pipeline that extracts forms from a client’s binder, reconciles them, optionally enters them into tax software, and produces a set of review items. It is a background task: you start it with the triggerTaxPrep mutation and follow the resulting task to completion with the tasks API.
triggerTaxPrep is deprecated and now starts AI data entry. See Start a tax prep run for what callers see.
Tax prep operations are reached through the me query resolved as a WorkspaceUser, so the trigger mutation and the task poll both require a workspaceToken (see Authentication). The two backoffice operations on this page (retriggerTaxPrepStep and setTaxPrepTaskStatus) require a user token instead, called out below. All requests go to:
Tax prep runs as a polled background task. This page documents how to start a run and read its result. For the polling pattern itself (listing tasks, reading status, subTasks, and the TaskResult union), see Tasks; this page does not re-explain it.

The TaskTaxPrepResult type

When a TAX_PREP task reaches status: COMPLETED, its result field resolves to TaskTaxPrepResult. It carries a summary plus document and form counts, and the individual review items the run produced.
Int!
The tax year the run was prepared for, for example 2025.
ReturnType!
The return form: F1040, F1041, F1065, F1120, F1120S, or F990 (see ReturnType).
String!
A human-readable summary of the prepared return.
Int!
Number of documents processed from the client’s binder.
Int!
Number of forms extracted from those documents.
Int!
Number of review items produced. Use this as a quick “needs attention” count before paging through reviewItems.
[TaxPrepReviewItem!]!
The review items. Each has severity, category, and description (all String!).
TaskTaxPrepResult is one member of the TaskResult union. The other tax members are TaskTaxReviewResult (returned for TAX_REVIEW tasks, with issue counts by severity and form) and TaskTaxAdvisorResult (returned for TAX_ADVISOR tasks). See Tasks, task result for the full union and the inline-fragment pattern used to select it.

Start a tax prep run

triggerTaxPrep is deprecated and now starts AI data entry. Use startDataEntry for new work. Existing calls keep working:
  • The returned task is listed by tasks(filters: { type: TAX_PREP }) and its webhooks carry taskType: TAX_PREP.
  • It is RUNNING while it works. When its plan is ready for review it is PAUSED, and a task.paused webhook with reason: ready_for_review links to the review page. Once someone at the firm sends the plan and Filed verifies it in the tax software, it is COMPLETED. A failed preparation or send is FAILED.
  • File webhooks (task.files_ready) for the return PDF, tax-software backup and Binder carry taskType: TAX_PREP.
  • TaskTaxPrepResult is available from PAUSED on and describes the plan: extractedFormCount is the forms in it, documentCount the documents they came from, and reviewItems its open review flags.
  • The workspace needs a tax-software connection. Without softwareClientId, Filed matches the client to the tax software by name; when no single client matches, the task stays RUNNING until someone at the firm picks one.
  • runDataEntry, dataEntryMethod, cchImportMode, force, forceReconcile, skills, taskId, software and softwareClientVersion are ignored. A second call for the same client returns the same task.
triggerTaxPrep starts a tax prep run for a client and returns the taskId you poll. It requires a workspaceToken.

Input: TriggerTaxPrepInput

ID!
required
The client to prepare the return for.
ReturnType!
required
The return form to prepare. Must match the client’s returnType (see clients).
ID
Optional. Pass an existing tax prep task ID to target an in-flight or prior run rather than starting a brand-new one. Omit for a fresh run.
String
The tax software provider key, as exposed by the workspace’s connected tax software integrations. Required only when runDataEntry is true.
String
The client identifier inside the tax software. Required only when runDataEntry is true.
String
The tax software client version string, when relevant to the integration.
Boolean
When true, the pipeline continues past extraction and reconciliation into data entry, writing the prepared return back to the tax software. Requires software and softwareClientId.
Boolean
When true, re-run reconciliation even if a prior reconcile already succeeded.
Boolean
When true, start a fresh run even if another tax prep task for this client is already RUNNING.
RunSkillSelectionInput
Optional. Override which workspace and user skills apply to this run. Omit to apply all active skills; pass an empty list for a scope to censor every skill in that scope.

Returns: TriggerTaskResult

ID!
The ID of the started TAX_PREP task. Poll it until status is no longer RUNNING, then read result as TaskTaxPrepResult.

Poll the task to completion

There is no task(id:) query. Poll the task you just started by listing the client’s TAX_PREP tasks and reading the entry whose id matches the taskId returned above. The polling mechanics are documented on Tasks; the short version:
Poll on an interval (for example every few seconds) until status is no longer RUNNING. COMPLETED means the run succeeded and result is now selectable as TaskTaxPrepResult; FAILED means it did not, and errorMessage (plus subTasks[].errorMessage) explains which stage failed.

Read the completed result

When the task is COMPLETED, select result with an inline fragment on TaskTaxPrepResult to read the summary, counts, and review items.
Always read __typename on result and include a ... on TaskUnknownResult fallback. A TAX_PREP task that fails after the run starts can resolve to TaskUnknownResult instead of TaskTaxPrepResult; branching on __typename keeps your client from throwing on the unexpected member.

Re-trigger a tax prep step

retriggerTaxPrepStep re-runs a single stage of an existing tax prep task. It is a backoffice operation and requires a user token (not a workspaceToken); the schema marks it @requiresScopes(scopes: [["user"]]).

Input: RetriggerTaxPrepStepInput

ID!
required
The workspace the client belongs to.
ID!
required
The client whose tax prep run you want to re-run a step for.
TaxPrepStep!
required
The stage to re-run: IMPORT_PRIOR_YEAR, EXTRACT, RECONCILE, PRE_ENTRY_EXPORT, DATA_ENTRY, POST_ENTRY_EXPORT, or VALIDATE.
String
The tax software provider key. Pass it when the re-triggered step writes to or reads from the tax software (the data-entry and export stages).
String
The client identifier inside the tax software. Pass it alongside software for the data-entry and export stages.

Returns: BackofficeTriggerResult

ID!
The ID of the task the re-triggered step belongs to. Poll it with the tasks API for the new stage’s outcome.
retriggerTaxPrepStep requires a user token (a personal backoffice session), not the workspaceToken used by the rest of the tax prep flow. The workspaceToken issued from an API key is rejected by this operation.

Set a tax prep task’s status

setTaxPrepTaskStatus forces a tax prep task into a given TaskStatus. Like retriggerTaxPrepStep, it is a backoffice operation and requires a user token (@requiresScopes(scopes: [["user"]])).

Input: SetTaxPrepTaskStatusInput

ID!
required
The workspace the task belongs to.
ID!
required
The tax prep task whose status you want to set.
TaskStatus!
required
The status to force the task into: RUNNING, COMPLETED, or FAILED.

Returns: BackofficeTriggerResult

The same BackofficeTriggerResult { taskId: ID! } shape as retriggerTaxPrepStep. See above for the field.
This mutation overwrites the task’s status directly, bypassing the normal pipeline. Use it for backoffice recovery (for example marking a task COMPLETED after a manual fix, or FAILED to release a stuck run). It requires a user token, not a workspaceToken.