status. A pending document can receive one final decision: approval, rejection, or expiry.
Choose the document workflow
review_decision_managed is the persisted document snapshot. False or absent preserves legacy approval, result editing, reapproval, and reflagging through existing endpoints. True uses immutable managed decisions. Enabling a project does not convert historical or already-unmanaged documents. There is no automatic backfill enrollment.
The state table and terminal protections below apply only to managed documents. Historical legacy_reviewed on an unmanaged document does not impose managed read-only behavior.
Opt in only the adopting integration
An adopting robot sendsreview_contract="decisions_v1" in each new extraction request. Batch requests use extraction_request.review_contract. This explicit request field, project activation, and trusted reviewer/API-key-owner access are all prerequisites.
Omitted or "legacy" requests keep the old workflow even in the same enabled project with the same API-key owner. Existing web extraction calls remain legacy. A later opt-in request or reflag never changes an existing document snapshot. Verify the response snapshot before choosing the managed decision flow. See request examples.
Review in the web app
- Open Review and select a pending document.
- Correct extracted fields and choose Save & Mark as Reviewed to approve it.
- If Reject is available, select it and choose a reason: Wrong document, Duplicate document, Out of scope, or Other.
- Add a comment if the reason is Other. Comments accept up to 2000 characters.
- Select Reject document, or select Cancel to return without a decision.
Integration state contract
Managed approved, rejected, expired, and legacy-reviewed records cannot be reopened or overwritten. A new processing attempt requires a new document identity.
needs_review and is_reviewed remain for compatibility. Rejected and expired records keep needs_review=true and is_reviewed=false. Use review_status=pending to query the pending queue. For managed documents, do not infer approval from these booleans, the presence of results, a missing record, or a polling timeout.
Read and decide through the API
Reads requireextractions:read. Decisions require extractions:write and access to the document’s organization and project. Send X-Project-ID when your integration uses an active project. Use the same caller, project, payload, and UUID idempotency key when retrying an uncertain request.
Historical records
Migration keeps historical records unmanaged. Review metadata may label previously reviewed recordslegacy_reviewed; it does not create a new approval event or remove legacy editing/reapproval. Unmanaged historical records are not eligible for managed expiry. Managed expiry uses the recorded UTC review_requested_at, not mutable updated_at.