---
title: "Save the review of a purchase scan"
method: PATCH
path: "/companies/{company}/purchase-scans/{purchase_scan}/review"
tags: ["Purchase Scans"]
---

# Save the review of a purchase scan

`PATCH /companies/{company}/purchase-scans/{purchase_scan}/review`

## Request

- Base URL: `https://api.factuarea.com/v1`
- URL: `https://api.factuarea.com/v1/companies/{company}/purchase-scans/{purchase_scan}/review`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Persist the human corrections of a scan in `needs_review`: supplier, fiscal header, lines and notes, each field marked as verified. Requires `expected_version`; a stale version responds `409` and the latest version must be reloaded. Returns the updated scan. Malformed payloads return `422` before version comparison.

## Path parameters

- `company` string, uuid, required
- `purchase_scan` string, uuid, required

## Headers

- `Idempotency-Key` string
- `Factuarea-Version` string, date

## Request body

- SavePurchaseScanReviewV1Request
  - `expected_version` integer, required
  - `fields` object
    - `supplier_id` object
      - `value` string, uuid, nullable, required
      - `issue_codes` string[]
    - `supplier_name` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `supplier_tax_id` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `is_simplified` object
      - `value` boolean, nullable, required
      - `issue_codes` string[]
    - `document_number` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `issue_date` object
      - `value` string, date, nullable, required
      - `issue_codes` string[]
    - `reception_date` object
      - `value` string, date, nullable, required
      - `issue_codes` string[]
    - `due_date` object
      - `value` string, date, nullable, required
      - `issue_codes` string[]
    - `currency` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `payment_method` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `expense_category` object
      - `value` string, uuid, nullable, required
      - `issue_codes` string[]
    - `operation_class` object
      - `value` 'corriente' | 'bien_inversion' | 'importacion' | 'intracomunitaria' | 'isp' | 'null', nullable, required
      - `issue_codes` string[]
    - `notes` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `issuer_tax_id` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `recipient_tax_id` object
      - `value` string, nullable, required
      - `issue_codes` string[]
    - `totals_confirmed` object
      - `value` boolean, nullable, required
      - `issue_codes` string[]
    - `extraction_confirmed` object
      - `value` boolean, nullable, required
      - `issue_codes` string[]
  - `lines` union[]: Partial edits preserve omitted fields and lines. Add omits line_id (allocated by the server); update/remove use the existing line_id.
    - union
      - object
        - `line_id` string, uuid, required
        - `operation` 'update'
        - `fields` object, required
          - `description` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `additional_description` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `supplier_sku` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `unit_code` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `price_unit_code` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `package_quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `measured_base_quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `unit_price` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `discount_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `tax_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `retention_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `surcharge_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `vat_deductible` object
            - `value` boolean, nullable, required
            - `issue_codes` string[]
          - `indirect_tax_regime` object
            - `value` 'iva' | 'igic' | 'ipsi' | 'null', nullable, required
            - `issue_codes` string[]
          - `exemption_reason` object
            - `value` 'E1' | 'E2' | 'E3' | 'E4' | 'E5' | 'E6' | 'N1' | 'N2' | 'null', nullable, required
            - `issue_codes` string[]
          - `line_subtotal` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `tax_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `retention_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `surcharge_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `line_total` object
            - `value` string, nullable, required
            - `issue_codes` string[]
        - `catalog_selection` PurchaseScanCatalogSelection, nullable: Catalog selection made by a person during review, never by OCR. In the review request, omit it to keep the current selection and send null to unlink the line. Company ownership is verified when the review is saved; the combination is resolved when the scan is converted.
          - `product_id` string, uuid, required
          - `variant_id` string, uuid, nullable
          - `presentation_id` string, uuid, nullable
          - `supplier_offer_id` string, uuid, nullable
          - `configuration_id` string, uuid, nullable
          - `configuration_signature` string, nullable
          - `options` object[], nullable: Chosen option values, at most one per option group.
            - `group_id` string, uuid, required
            - `value_id` string, uuid, required
          - `purchase_measurement` object, nullable
            - `package_quantity` string, nullable: Decimal string greater than zero when provided.
            - `cost_basis` 'offer_unit' | 'base_unit' | 'presentation_unit', required
          - `confirmed_base_quantity` string, nullable: Decimal string greater than zero when provided.
      - object
        - `operation` 'add', required
        - `fields` object, required
          - `description` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `additional_description` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `supplier_sku` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `unit_code` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `price_unit_code` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `package_quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `measured_base_quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `unit_price` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `discount_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `tax_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `retention_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `surcharge_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `vat_deductible` object
            - `value` boolean, nullable, required
            - `issue_codes` string[]
          - `indirect_tax_regime` object
            - `value` 'iva' | 'igic' | 'ipsi' | 'null', nullable, required
            - `issue_codes` string[]
          - `exemption_reason` object
            - `value` 'E1' | 'E2' | 'E3' | 'E4' | 'E5' | 'E6' | 'N1' | 'N2' | 'null', nullable, required
            - `issue_codes` string[]
          - `line_subtotal` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `tax_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `retention_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `surcharge_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `line_total` object
            - `value` string, nullable, required
            - `issue_codes` string[]
        - `catalog_selection` PurchaseScanCatalogSelection, nullable: Catalog selection made by a person during review, never by OCR. In the review request, omit it to keep the current selection and send null to unlink the line. Company ownership is verified when the review is saved; the combination is resolved when the scan is converted.
          - `product_id` string, uuid, required
          - `variant_id` string, uuid, nullable
          - `presentation_id` string, uuid, nullable
          - `supplier_offer_id` string, uuid, nullable
          - `configuration_id` string, uuid, nullable
          - `configuration_signature` string, nullable
          - `options` object[], nullable: Chosen option values, at most one per option group.
            - `group_id` string, uuid, required
            - `value_id` string, uuid, required
          - `purchase_measurement` object, nullable
            - `package_quantity` string, nullable: Decimal string greater than zero when provided.
            - `cost_basis` 'offer_unit' | 'base_unit' | 'presentation_unit', required
          - `confirmed_base_quantity` string, nullable: Decimal string greater than zero when provided.
      - object
        - `line_id` string, uuid, required
        - `operation` 'remove', required
        - `fields` object
          - `description` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `additional_description` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `supplier_sku` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `unit_code` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `price_unit_code` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `package_quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `measured_base_quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `quantity` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `unit_price` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `discount_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `tax_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `retention_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `surcharge_rate` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `vat_deductible` object
            - `value` boolean, nullable, required
            - `issue_codes` string[]
          - `indirect_tax_regime` object
            - `value` 'iva' | 'igic' | 'ipsi' | 'null', nullable, required
            - `issue_codes` string[]
          - `exemption_reason` object
            - `value` 'E1' | 'E2' | 'E3' | 'E4' | 'E5' | 'E6' | 'N1' | 'N2' | 'null', nullable, required
            - `issue_codes` string[]
          - `line_subtotal` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `tax_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `retention_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `surcharge_amount` object
            - `value` string, nullable, required
            - `issue_codes` string[]
          - `line_total` object
            - `value` string, nullable, required
            - `issue_codes` string[]

## Response `200`

Successful scanner operation.

- object
  - `data` PurchaseScan, required
    - `id` string, uuid, required
    - `version` integer, required
    - `source` 'upload' | 'email' | 'api', required
    - `status` 'received' | 'queued' | 'processing' | 'needs_review' | 'duplicate' | 'failed' | 'auto_created' | 'created' | 'archived', required
    - `original_filename` string, required
    - `mime_type` string, required
    - `page_count` integer, required
    - `received_at` string, date-time, required
    - `uploaded_by` object, required
      - `name` string, nullable, required
    - `supplier_id` string, uuid, nullable, required
    - `supplier_name` string, nullable, required
    - `document_number` string, nullable, required
    - `issue_date` string, date, nullable, required
    - `currency` string, nullable, required
    - `total` string, nullable, required
    - `issue_count` integer, required: Number of issues still pending review: one per field, supplier identity counted once, 0 before the first extraction.
    - `available_actions` string[], required
    - `purchase_invoice_id` string, uuid, nullable, required
    - `last_error` object, nullable, required
      - `code` 'ocr_temporarily_unavailable' | 'scan_storage_unavailable' | 'file_safety_unavailable' | 'inbound_provider_unavailable' | 'resource_locked' | 'queue_delivery_failed' | 'purchase_scanner_disabled' | 'ocr_company_quota_exceeded' | 'module_upgrade_required' | 'unsupported_scan_format' | 'unsupported_purchase_document_type' | 'unsafe_scan_file' | 'scan_page_limit_exceeded' | 'purchase_scanner_internal_error', required
      - `recoverable` boolean, required
      - `message` string, required
    - `deferred_until` string, date-time, nullable, required: When set, the scan is waiting for the company daily OCR quota to reset; it will be retried automatically.
    - `deferred_reason` 'ocr_daily_quota_reached' | 'null', nullable, required
    - `file_revision` integer, required
    - `extraction_revision` integer, nullable, required
    - `bytes` integer, required
    - `updated_at` string, date-time, required
    - `preview` object, required
      - `url` string, nullable, required
      - `source_url` string, required
      - `page_count` integer, required
    - `review` object, required
      - `version` integer, required
      - `extraction_revision` integer, nullable, required
    - `extraction` object, required
      - `supplier_id` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `supplier_name` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `supplier_tax_id` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `is_simplified` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `document_number` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `issue_date` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `reception_date` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `due_date` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `currency` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `payment_method` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `expense_category` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `operation_class` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `notes` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `issuer_tax_id` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `recipient_tax_id` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `totals_confirmed` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `extraction_confirmed` PurchaseScanExtractedField, required
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
      - `totals` object, required
        - `subtotal` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `tax` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `retention` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `surcharge` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `total` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
      - `printed_totals` object, required
        - `subtotal` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `tax` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `retention` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `surcharge` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `total` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
      - `detected_document_type` PurchaseScanExtractedField
        - `original` string, nullable, required
        - `value` union, required
          - string
          - boolean
        - `confidence` string, nullable, required
        - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
        - `issue_codes` string[], required
        - `extraction_issues` object[], required
          - `code` string, required
          - `path` string, required
          - `recoverable` boolean, required
          - `file_revision` integer, required
        - `source` 'ocr' | 'human' | 'system', required
        - `evidence` object[], required
          - `page` integer, required
          - `bbox` object, required
            - `x` number, required
            - `y` number, required
            - `width` number, required
            - `height` number, required
    - `lines` object[], required
      - `line_id` string, uuid, required
      - `fields` object, required
        - `description` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `additional_description` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `supplier_sku` PurchaseScanExtractedField
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `unit_code` PurchaseScanExtractedField
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `price_unit_code` PurchaseScanExtractedField
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `package_quantity` PurchaseScanExtractedField
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `measured_base_quantity` PurchaseScanExtractedField
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `quantity` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `unit_price` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `discount_rate` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `tax_rate` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `retention_rate` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `surcharge_rate` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `vat_deductible` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `indirect_tax_regime` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `exemption_reason` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `line_subtotal` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `tax_amount` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `retention_amount` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `surcharge_amount` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
        - `line_total` PurchaseScanExtractedField, required
          - `original` string, nullable, required
          - `value` union, required
            - string
            - boolean
          - `confidence` string, nullable, required
          - `confidence_band` 'high' | 'medium' | 'low' | 'unknown', required
          - `issue_codes` string[], required
          - `extraction_issues` object[], required
            - `code` string, required
            - `path` string, required
            - `recoverable` boolean, required
            - `file_revision` integer, required
          - `source` 'ocr' | 'human' | 'system', required
          - `evidence` object[], required
            - `page` integer, required
            - `bbox` object, required
              - …
      - `catalog_selection` PurchaseScanCatalogSelection, nullable: Catalog selection made by a person during review, never by OCR. In the review request, omit it to keep the current selection and send null to unlink the line. Company ownership is verified when the review is saved; the combination is resolved when the scan is converted.
        - `product_id` string, uuid, required
        - `variant_id` string, uuid, nullable
        - `presentation_id` string, uuid, nullable
        - `supplier_offer_id` string, uuid, nullable
        - `configuration_id` string, uuid, nullable
        - `configuration_signature` string, nullable
        - `options` object[], nullable: Chosen option values, at most one per option group.
          - `group_id` string, uuid, required
          - `value_id` string, uuid, required
        - `purchase_measurement` object, nullable
          - `package_quantity` string, nullable: Decimal string greater than zero when provided.
          - `cost_basis` 'offer_unit' | 'base_unit' | 'presentation_unit', required
        - `confirmed_base_quantity` string, nullable: Decimal string greater than zero when provided.
    - `issues` object[], required
      - `code` string, required
      - `severity` 'info' | 'warning' | 'error'
      - `field` string, nullable
      - `line_id` string, uuid, nullable
      - `message` string, nullable
    - `duplicate` object, nullable, required
      - `type` string
      - `candidate_id` string, uuid, nullable
      - `candidate_purchase_invoice_id` string, uuid, nullable
      - `matched_fields` string[]
      - `override_authorized` boolean
      - `linked` boolean
      - `override_reason` string, nullable
      - `resolved_at` string, nullable
    - `attempts` object[], required: The 50 most recent processing attempts, newest first. `attempts_total` holds how many there are in all.
      - `id` string, uuid, required
      - `invocation_number` integer
      - `status` string, required
      - `started_at` string, date-time
      - `finished_at` string, date-time
      - `latency_ms` integer
      - `pages` integer
      - `cache_hit` boolean
      - `error_code` string
      - `error_recoverable` boolean
    - `attempts_total` integer, required: Total number of processing attempts, including those not listed in `attempts`.
    - `audit` object[], required: The 50 most recent audit events, newest first. `audit_total` holds how many there are in all.
      - `id` string, uuid, required
      - `action` string, required
      - `before_version` integer
      - `after_version` integer
      - `correlation_id` string
      - `occurred_at` string, date-time
    - `audit_total` integer, required: Total number of audit events, including those not listed in `audit`.
    - `linked_purchase_invoice` object, nullable, required
      - `id` string, uuid, required
    - `supplier_resolution` object, nullable, required
      - `status` 'matched' | 'new_candidate' | 'ambiguous' | 'incomplete' | 'invalid' | 'inactive' | 'role_required' | 'conflict', required
      - `reason_code` string, nullable, required
      - `scan_version` integer, required
      - `supplier_id` string, uuid, nullable, required
      - `candidates` object[], required
        - `id` string, uuid, required
        - `name` string, required
        - `tax_id` string, nullable, required
      - `can_create` boolean, required
      - `blocked_reason` string, nullable, required
    - `conversion_readiness` object, nullable, required
      - `can_convert` boolean, required
      - `requires_supplier_creation` boolean, required
      - `blocking_fields` string[], required
    - `source_retained` boolean, required: Whether the original file is still retained. It does not depend on the API key permissions: `download_source` can be missing from `available_actions` while this is true.
    - `review_fields` object, required
      - `document` string[], required
      - `read_only` string[], required
      - `totals` string[], required
      - `line` string[], required
      - `exemption_reasons` string[], required
      - `operation_classes` string[], required: Accepted values of the `operation_class` review field.
    - `automation` object, required
      - `rejection_code` string, nullable, required: Business rule that stopped the automatic conversion and sent the scan back to review, or null.
    - `can_save_review` boolean, required
    - `can_convert` boolean, required
    - `can_link_existing` boolean, required
    - `can_override_duplicate` boolean, required
    - `can_retry` boolean, required
    - `can_replace_source` boolean, required
    - `can_archive` boolean, required
    - `can_restore` boolean, required
    - `can_download_source` boolean, required
    - `can_view_purchase_invoice` boolean, required

## Other responses

- `400`: `parameter_unknown` with `subcode` `retired_active_profile_header`: the retired `X-Active-Profile` header was sent; the company goes in the path. `parameter_invalid_format` on `Factuarea-Version`: the header is not a `YYYY-MM-DD` date. `unsupported_api_version`: the `Factuarea-Version` date is not a supported version.
- `401`: Missing or invalid API key.
- `403`: The request is not allowed for this API key or its creator. Possible `error.code` values: `insufficient_scope` — the API key lacks the scope this operation requires; `forbidden_action` — the API key has the scope, but the user who created it cannot perform this action for the company.
- `404`: The requested resource does not exist or belongs to another company. `profile_not_found`: the company in the path does not exist, is not in the API key scope or belongs to the other environment (live or test).
- `409`: The request conflicts with data that already exists or with a request running at the same time. `stale_scan_version`: the `expected_version` you sent is not the current version of the scan, because someone changed it in the meantime. Read it again and repeat the operation with the new version.
- `422`: Validation failed. The `error.param` field identifies which input is invalid. `idempotency_key_reused`: the `Idempotency-Key` was already used with a different body; send a new key or the same body. `invalid_param_format` on `Idempotency-Key`: the key must be 1 to 255 printable ASCII characters.
- `429`: Rate limit exceeded. Retry after the duration in `Retry-After`.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/factuarea/apis/factuarea-public-api.md) · [All operations](https://skmtc.dev/factuarea/apis/factuarea-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/factuarea/apis/factuarea-public-api/revisions/718e77934422?raw)
