Skip to main content
Matcher can extract transaction candidates from documents and propose field mappings using AI — but AI output is never authoritative. Nothing is reconciled until a human approves it. This guide covers the human-in-the-loop (HITL) extraction-review queue, AI mapping proposals, and the related job actions.
The document-extraction lane is gated by a global kill-switch and a per-tenant opt-in. A tenant that has not opted in receives 403 before any document bytes are stored or egressed.

Enqueue a document for extraction


Upload a source document (PDF) to run deterministic + AI extraction. The resulting transaction candidates are queued in a review — nothing is reconciled yet.
The response (202 Accepted) returns the queued review id, the candidate count, and a status that is always PENDING_REVIEW on enqueue:

The review queue


List reviews

Cursor-paginated list of extraction reviews for a context, optionally filtered by lifecycle status.
Query parameters: status (PENDING_REVIEW, APPROVED, REJECTED), limit (1–200), and cursor.

Get one review

A review carries its lifecycle, the proposed candidates, provenance, and linkage state:
Each candidate declares the lane that produced it: text_layer (PDF text, higher trust) or vision (OCR/vision model, lower trust). Field values are verbatim tokens — money stays a string, never a parsed amount.

Approve or reject


Approve

Approving a PENDING_REVIEW review runs the single deterministic handoff into the normal ingestion pipeline (dedup + outbox + match-trigger) and links the resulting job to the review. This is the only path from an AI candidate to a reconciled transaction, and it runs only on explicit human approval.

Reject

Rejecting discards the candidates — nothing is ingested. The body is optional; an empty body is a valid “reject with no reason”.
The approving/rejecting principal is recorded for audit.

Mapping proposals


Before you declare a field map by hand, ask the advisor to inspect a representative sample and propose a config-only mapping. It is advisory and side-effect-free: producing a proposal persists nothing. You confirm the result through the existing field-map declaration path.
The response carries the proposed field map, source dialect, and a per-field breakdown with confidence and rationale:
The response never carries parsed values, amounts, or transactions.

Fetch from an external transport


Trigger a manual fetch-and-ingest that lists every object matching the supplied transport coordinates (SFTP today) and streams each into the trusted-content ingestion pipeline. The body carries connection coordinates plus an opaque credential reference — never a secret.
The response (202 Accepted) returns a per-file outcome in fetch order. Per-file intake failures are reported without failing the batch:
A transport-level failure (endpoint unreachable or credential rejected) returns 503.

Inspect job errors


After an import, list the stored per-row parse/normalization errors for a job (capped at 100 per job) to explain failed or partially-failed imports.
totalErrors is the uncapped failure total; truncated is true when it exceeds the stored (capped) set.

Response codes