---
title: "Extract Invoice"
method: POST
path: "/v1/upload/extract"
tags: ["Upload"]
---

# Extract Invoice

`POST /v1/upload/extract`

Reads a supplier invoice and returns the fields needed to register it as an invoice payable: amount, currency, due date, vendor, line items and the payment options printed on it. Every field is nullable and nothing is guessed; numbers that fail format validation come back null. The result prefills a form, it is not a payable. Limited to 60 requests per minute per instance.

## Query parameters

- `instance_id` string — Instance ID. When provided, the request must be authenticated with an API key scoped to this instance. When omitted, a dashboard (Clerk) session is required.

## Response `200`

Fields read from the invoice

- UploadExtractOut
  - `amount` integer, nullable, required — Total due in cents of `currency`.
  - `currency` string, nullable, required
  - `due_date` string, nullable, required — YYYY-MM-DD.
  - `invoice_number` string, nullable, required
  - `to` object, required — The vendor being paid, as printed on the invoice.
    - `legal_name` string, nullable, required
    - `tax_id` string, nullable, required
    - `address_line_1` string, nullable, required
    - `city` string, nullable, required
    - `state_province_region` string, nullable, required
    - `country` string, nullable, required
    - `postal_code` string, nullable, required
  - `line_items` object[], required — Unit prices in cents of `currency`.
    - `name` string, required
    - `quantity` integer, required
    - `price` integer, required
  - `payment_options` object[], required — One entry per payment instruction block printed on the invoice, ordered by preference: ach, wire, international_swift. Numbers that fail format checks come back null; an option with no usable number is dropped. Empty when the invoice prints no bank instructions.
    - `type` 'ach' | 'wire' | 'international_swift', required
    - `routing_number` string, nullable, required — US rails only.
    - `account_number` string, nullable, required — US rails only.
    - `account_type` 'checking' | 'saving', nullable, required
    - `iban` string, nullable, required — SWIFT only.
    - `swift_bic` string, nullable, required — SWIFT only.
    - `beneficiary_name` string, nullable, required
    - `bank_name` string, nullable, required

## Other responses

- `400` — Possible error codes: `FILES_EMPTY`, `FILES_TOO_LARGE`, `FILES_TYPE_NOT_ALLOWED`, `VALIDATION_FAILED`. See the Error responses section for retry semantics.
- `401` — Possible error codes: `AUTH_UNAUTHORIZED`. See the Error responses section for retry semantics.
- `403` — Possible error codes: `AUTH_FORBIDDEN`. See the Error responses section for retry semantics.
- `422` — Possible error codes: `FILES_ANALYSIS_FAILED`. See the Error responses section for retry semantics.
- `429` — Possible error codes: `AUTH_RATE_LIMITED`. See the Error responses section for retry semantics.
- `500` — Possible error codes: `INTERNAL_ERROR`. See the Error responses section for retry semantics.
- `503` — Possible error codes: `FILES_ANALYSIS_FAILED`. See the Error responses section for retry semantics.

---

[API](https://skmtc.dev/blindpay/apis/blindpay-api.md) · [All operations](https://skmtc.dev/blindpay/apis/blindpay-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/blindpay/blindpay-api/revisions/470de27afb7b/schema)
