> This page is for version v2026-02-09 (default).
> For other versions, use one of these documentation indexes:
> - v2026-02-09 (default): https://docs.extend.ai/2026-02-09/llms.txt
> - v2025-04-21: https://docs.extend.ai/2025-04-21/llms.txt
> - v2024-12-23: https://docs.extend.ai/2024-12-23/llms.txt

> ## Documentation Index
> Fetch the complete documentation index at: https://docs.extend.ai/llms.txt
> Use this file to discover all available pages before exploring further.
>
> ## API version
> The current API version is `2026-02-09`, served at the site root (no version prefix in URLs).
> If this page URL contains `/2025-04-21/` or `/2024-12-23/`, you are reading an older API version.
> Prefer the current docs at https://docs.extend.ai/llms.txt unless the user explicitly needs that older version.
> Do not treat older-version pages as the source of truth for new integrations.

# Human Review

> Human-in-the-loop review for document workflows: add a Human Review step, route low-confidence or invalid runs to a review queue, and let operators inspect, correct, approve, or reject output before it reaches downstream systems.

**Human Review** is a workflow step that pauses a run and places it in a review queue in the Extend dashboard. An operator inspects the extracted, classified, or split output beside the source document, corrects anything that is wrong, and approves or rejects the run. Only after approval does the workflow continue to downstream steps such as a Webhook Response.

Use it as the human-in-the-loop safety net for accuracy-critical pipelines: send the runs that need a person to a person, and let everything else flow straight through.

![Human Review page in the Extend dashboard showing the source invoice beside the extracted fields, each with a confidence score, an edit control, and an approve button](/_fern-img/3848bbbfb7325626f6cadcae61d98a1dbb3643a2ec4f82140b2052cf161c88ab.webp)

## What the review step does

* **Pauses the run.** The workflow run status becomes `NEEDS_REVIEW` and the run appears in the workflow's review queue.
* **Shows operators the evidence.** The review page renders the document on the left and the step outputs on the right, with [citations](/extraction/response-format#citations) that highlight where each value came from, [confidence scores](/extraction/confidence-scores), and any issues raised by the [Review Agent](/extraction/review-agent).
* **Lets operators fix, approve, reject, or re-classify.** Corrections are saved on the run, rejected runs never reach downstream systems, and re-classifying restarts the run from the classification step. See [Reviewing a Workflow Run](/workflows/reviewing-workflow-run) for the operator walkthrough.
* **Records what changed.** Reviewed step outputs carry `reviewed` and `edited` flags plus `initialOutput` and `reviewedOutput`, so your systems can tell machine output from operator-corrected output. Operator explanations feed evaluation and tuning.

## Add a Human Review step

In [Extend Studio](https://dashboard.extend.ai/studio), drag a **Human Review** step onto the workflow canvas and connect it between the steps that should be reviewed and the steps that should run after approval.

![Workflow canvas in Extend Studio with a Human Review step placed between the extraction steps and the webhook response step](/_fern-img/7f70da538f9eefa2eb8933d88b08204bb9195b1481e9657dead0bf1c86d0af5e.webp)

In a [workflow version definition](/workflows/configuring-workflows#human-review), add a step of type `HUMAN_REVIEW`:

```json
{
  "steps": [
    { "name": "trigger", "type": "TRIGGER", "next": [{ "step": "parse" }] },
    { "name": "parse", "type": "PARSE", "next": [{ "step": "extract" }] },
    {
      "name": "extract",
      "type": "EXTRACT",
      "config": { "extractor": { "id": "ex_abc123", "version": "latest" } },
      "next": [{ "step": "review" }]
    },
    { "name": "review", "type": "HUMAN_REVIEW", "next": [{ "step": "webhook" }] },
    { "name": "webhook", "type": "WEBHOOK_RESPONSE" }
  ]
}
```

The step has no configuration of its own. What gets reviewed is determined by the steps that feed into it, and who gets to review is governed by [user roles and permissions](/general/user-roles-and-permissions) in your workspace.

## Route only the runs that need a person

Sending every document to review works, but most teams review a fraction of runs. Common routing patterns:

| Pattern                      | How                                                                                                                                                                                                                                                                          |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Confidence-based routing** | Add a [Validation step](/workflows/workflow-steps/validation-step) with rules that read step outputs and their metadata (classification `confidence`, extraction field confidence). Connect **If All Valid** to the Webhook Response and **If Any Invalid** to Human Review. |
| **Business-rule routing**    | Write Validation rules over extracted values (totals reconcile, dates in range, required fields present) or against your own systems via an [External Data Validation step](/workflows/workflow-steps/external-data-validation-step). Failures go to review.                 |
| **Review Agent flags**       | Enable the [Review Agent](/extraction/review-agent) on the extractor. It flags likely errors and produces an intelligent confidence score that reviewers see on the review page, so they can focus on the fields that need attention.                                        |
| **Document-type routing**    | After a Classify step, route only sensitive document types through review and let the rest complete automatically.                                                                                                                                                           |

## Consume the outcome from code

Review happens in the dashboard; there is no API to approve or reject on an operator's behalf. Your integration reacts to the run's state:

1. Detect that a run is waiting by polling for status `NEEDS_REVIEW` or by subscribing to the [`workflow_run.needs_review`](/api-reference/webhook-events/workflow/workflow-run-needs-review-webhook) webhook event.
2. When the operator approves, the run completes and [`workflow_run.completed`](/api-reference/webhook-events/workflow/workflow-run-completed-webhook) fires with the corrected output. Rejected runs emit `workflow_run.rejected` instead.
3. Read the final result with [Get Workflow Run](/api-reference/endpoints/workflow/get-workflow-run). Step outputs that were reviewed include `reviewed: true`, `edited`, `initialOutput`, and `reviewedOutput`.

## Next steps

#### [Reviewing a Workflow Run](/workflows/reviewing-workflow-run)

The operator's walkthrough: correcting, approving, rejecting, and re-classifying.

#### [Configuring Workflows](/workflows/configuring-workflows)

Every step type, including Human Review, in the workflow version definition.

#### [Confidence Scores](/extraction/confidence-scores)

The scores you can route on.

#### [Review Agent](/extraction/review-agent)

Flag likely errors before a person looks at the run.