---
title: "Create the expense from a scan"
method: POST
path: "/companies/{company}/purchase-scans/{purchase_scan}/convert"
tags: ["Purchase Scans"]
---

# Create the expense from a scan

`POST /companies/{company}/purchase-scans/{purchase_scan}/convert`

## Request

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

Create exactly one draft expense from a reviewed scan and link it. Responds `200` on the first call and on replays, returning the same linked expense. Requires `expected_version` and that no blocking issue remains; otherwise `422`.

## Path parameters

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

## Headers

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

## Request body

- ConvertPurchaseScanRequest
  - `expected_version` integer, required
  - `allow_create_supplier` boolean

## 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. `resource_already_exists` with `subcode` `purchase_invoice_already_exists`: the company already registered a purchase invoice with that `external_invoice_number`. `resource_locked`: another operation on the same scan, or the same upload, is still running. Nothing was changed; retry after a few seconds with the same `Idempotency-Key`. `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. `resource_conflict`: another request was reserving identifiers for the same kind of record at that moment and this one could not complete its reservation. Nothing was written; send the request again after a few seconds.
- `422`: The request could not be validated. Possible `error.code` values: `purchase_scan_source_unavailable` — the original was purged or is no longer retained; the scan history remains available (`error.subcode`: `source_unavailable`).
- `429`: Rate limit exceeded. Retry after the duration in `Retry-After`.
- `500`: Unexpected server error.
- `503`: A service this operation depends on is temporarily unavailable. Nothing was changed; retry later (write operations with the same `Idempotency-Key`). Possible `error.code` values: `dependency_unavailable` — a dependency is down; `error.subcode` names it (`file_safety_unavailable` or `scan_storage_unavailable`); `scan_storage_unavailable` — the secure document storage could not be reached.

---

[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)
