Read invoices and receipts into JSON and UBL.

Send an invoice or receipt as a PDF, JPEG or PNG and get back what's on it, as JSON and as UBL. Automatically within a few minutes, or checked by one of our processors within 24 working hours.

Status
PreviewBuild on it now with a test key. While in preview, details may still change before it's generally available.
Price
from €0.0350 per document
Operations
ocr.extractubl.verifiedocr.readubl.generateubl.validateocr.feedback

What it does

Two ways to process a document

Automatic (processing: automatic). OCR reads the document and returns the supplier, the invoice number, the dates, the lines, the VAT per rate and the totals. Every field comes with a confidence score, and warnings flag what doesn’t add up, such as totals that don’t reconcile. Expect the result within two minutes.

Verified (processing: verified). After the OCR, one of our processors checks the document against the original and corrects it where needed. They only approve it once the VAT adds up to the total and the UBL passes validation. Done within 24 working hours. The invoice lines are not checked: the UBL gets one line per VAT rate.

What you can do

  • Send a document as base64 in JSON, or as a multipart upload. Up to 10 MB and 50 pages.
  • Fetch the result, or get a webhook the moment it’s ready (document.completed).
  • Download the UBL: UBL 2.1 to Peppol BIS Billing 3.0, always validated.
  • Validate your own UBL files against the UBL schema, EN 16931 and Peppol BIS Billing 3.0.
  • Report a wrong result. We only use the document to improve recognition when you allow it, per document.

Good to know

  • OCR makes mistakes. Use the warnings and the confidence scores to decide which documents a person should look at, or choose verified processing.
  • You pay when the outcome is in. A document we couldn’t read costs nothing, and sending the same file again returns the earlier document, also for free.
  • We keep the document and its result for 7 days after the outcome by default; you can set anything from 0 to 30 days per account. Test documents are deleted after 24 hours.

Example

Real calls with a test key. Replace ac_test_… with your own key.

Send an invoice as base64 in JSON. The answer comes at once; the reading happens after.
POST/v1/documents
Request
curl https://api.accountcloud.io/v1/documents \
  -H "Authorization: Bearer ac_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: inbox-48213" \
  -d '{
    "file": { "name": "factuur-2026-118.pdf", "content_base64": "JVBERi0xLjQK…" },
    "processing": "automatic",
    "output": ["json", "ubl"],
    "reference": "inbox-48213"
  }'
Response202 Acceptedshortened
Location: /v1/documents/doc_01m6j1e9q4a4sncyn7de2ymbe7
AccountCloud-Charged: 0.0000
{
  "id": "doc_01m6j1e9q4a4sncyn7de2ymbe7",
  "object": "document",
  "status": "extracting",
  "processing": "automatic",
  "environment": "test",
  "reference": "inbox-48213",
  "file": {
    "name": "factuur-2026-118.pdf",
    "mime_type": "application/pdf",
    "pages": 1
  },
  "expected_ready_at": "2026-11-04T01:07:43Z",
  "result": null,
  "charge": {
    "operation": "ocr.extract",
    "status": "none",
    "amount": "0.0000",
    "currency": "EUR",
    "live_amount": "0.0350"
  }
}
A few seconds later, or after the document.completed webhook: the result, with a confidence per field and a validated UBL.
GET/v1/documents/{id}
Request
curl https://api.accountcloud.io/v1/documents/doc_01m6j1e9q4a4sncyn7de2ymbe7 \
  -H "Authorization: Bearer ac_test_…"
Response200 OKshortened
AccountCloud-Charged: 0.0000
{
  "id": "doc_01m6j1e9q4a4sncyn7de2ymbe7",
  "status": "completed",
  "result": {
    "document_type": "invoice",
    "invoice_number": "TEST-2026-0001",
    "issue_date": "2026-11-02",
    "due_date": "2026-12-02",
    "currency": "EUR",
    "supplier": {
      "name": "Testleverancier B.V.",
      "vat_number": "NL000000000B02",
      "iban": "NL91ABNA0417164300"
    },
    "lines": [
      {
        "description": "Advieswerk oktober",
        "quantity": "1",
        "unit_price": "100.00",
        "vat_rate": "21.00",
        "amount_excl_vat": "100.00"
      },
      {
        "description": "Vakboeken",
        "quantity": "2",
        "unit_price": "25.00",
        "vat_rate": "9.00",
        "amount_excl_vat": "50.00"
      }
    ],
    "vat_breakdown": [
      { "rate": "21.00", "taxable_amount": "100.00", "vat_amount": "21.00" },
      { "rate": "9.00", "taxable_amount": "50.00", "vat_amount": "4.50" }
    ],
    "totals": {
      "amount_excl_vat": "150.00",
      "vat_amount": "25.50",
      "amount_incl_vat": "175.50"
    }
  },
  "confidence": {
    "document": 0.95,
    "fields": {
      "invoice_number": 0.99,
      "supplier.name": 0.98,
      "totals.amount_incl_vat": 0.99
    }
  },
  "warnings": [],
  "ubl": {
    "available": true,
    "href": "/v1/documents/doc_01m6j1e9q4a4sncyn7de2ymbe7/ubl",
    "valid": true,
    "profile": "peppol-bis-billing-3.0"
  },
  "charge": {
    "operation": "ocr.extract",
    "status": "none",
    "amount": "0.0000",
    "currency": "EUR",
    "live_amount": "0.0350"
  }
}

What it costs

OCR€0.0350an invoice or receipt as JSONper document
Verified UBL€0.3500checked by a processorper document
OCR resultsfreeget, list and delete your documents
Generate UBLfreea UBL file from a document you sent
Validate UBLfreecheck a UBL file
OCR feedbackfreereport a wrong result

Excluding VAT, from your prepaid balance. Test keys are free, and an error or invalid input costs nothing.

Read more

Start with a test key. It's free.

Signing up takes a minute. The quickstart in the docs, five.