optii by chut.app

Paper in.
Fields out.

optii reads Belgian invoices, credit notes, receipts and 29 other document types in French, Dutch, German and English. It gives back text with coordinates, fields with their checks, or a type with a score. On a GPU, in the EU, in under half a second. It keeps nothing.

POST /ocr/extract · X-API-Key · pdf png jpg tiff bmp webp · 20 MB

▸ read facture-2024-0847.pdf
1 page · source ocr · lang fr
16 lines · 11 fields · 4 checks ✓
conf 0.991 · 342 ms · 0 bytes kept

read_depth = 1 of 3

Same file.
Three depths
of reading.

POST/ocr/extract

Every line as the engine read it, where it sits on the page, and how sure it is. A clean PDF’s own text layer is used verbatim and the response says so.

  • bbox in page pixels, reading order kept
  • confidence per line, 0 to 1
  • source: text · ocr · hybrid
facture-2024-0847.pdf · page 1342 ms
01DUMONT & FILS SPRLbbox 50,50 → 254,340.996
02Rue de la Loi 42 · 1000 Bruxellesbbox 56,82 → 230,180.991
03TVA BE0202239951bbox 56,106 → 142,180.993
04FACTURE N° 2024-0847bbox 56,157 → 272,320.998
05Date 15/03/2024bbox 56,204 → 126,180.995
06Échéance 14/04/2024bbox 330,204 → 156,180.982
07Communication +++123/4567/89002+++bbox 56,228 → 282,180.974
…9 more linessource ocr · quality ok · low_confidence_ratio 0.000.991

read_depth = 2 of 3

POST/ocr/extract?structured=true

The invoice, as fields. Each one checked against Belgian rules.

Supplier, VAT number, IBAN, document number, dates, totals, VAT subtotals, line items, structured communication. If a field is not on the page, it comes back null, never guessed.

  • VAT checksum · IBAN mod 97 · +++ communication mod 97
  • excl + VAT = incl, or it is flagged
  • invoice · credit_note · debit_note · receipt
structured · document_type invoiceconf 0.91
supplier_nameDumont & Fils SPRL
supplier_vatBE0202239951
supplier_ibanBE68 5390 0754 7034
document_number2024-0847
document_date · due_date15/03/2024 · 14/04/2024
structured_communication+++123/4567/89002+++
total_excl_vat1250.00
total_vat (21 %)262.50
total_incl_vat1512.50 EUR
payment_termsnull

read_depth = 3 of 3

POST/ocr/classify

Which of 32 Belgian documents is this?

An XLM-RoBERTa model trained on the paper Belgian firms actually receive. Top-k probabilities and a plain confident flag. Below the threshold it says unknown instead of guessing.

  • accounting · HR · legal · social · tax
  • FR, NL, DE and EN, mixed on one page is fine
  • route before you extract
document_type acc_purchase_invoiceconfident true
acc_purchase_invoice
93.6 %
acc_sales_invoice
3.0 %
30 other types
3.4 %
✓0.936 is above the threshold, so document_type is set. The "FACTURE" header, a supplier VAT and a TVAC total drive the call.

validations[]

It checks its own reading.

Belgian numbers carry their own proof. A VAT number, an IBAN and a structured communication each end in a mod-97 check digit. optii runs them, and adds the totals up, before you ever see the JSON.

1.250,00 + 262,50 = 1.512,50
✓totals_sum
BE 0202239951 → 97 − (02022399 mod 97) = 51
✓vat_checkdigit
+++123/4567/89002+++ → 1234567890 mod 97 = 02
✓structured_comm_mod97
BE68 5390 0754 7034 → rearranged mod 97 = 1
✓iban_mod97
3 of 3 totals present · 1 of 1 VAT subtotal · supplier identified
✓confidence 0.91

quality.warnings[]

Bad scans get called out.

A photo of a photo still returns text. It also returns a warning, so your app can ask for a rescan instead of trusting the numbers.

FACTURE N° 2024-0847
Dumont & Fils SPRL · TVA BE0202239951
Date 15/03/2024 · Échéance 14/04/2024
Conseil juridique — mars 2024 · 1.250,00
Total HTVA 1.250,00 · TVA 262,50
Total TVAC 1.512,50 EUR
laplacian var 212
⚠ blurry

Out of focus

Variance of the Laplacian under 400 on the page. Digits like 3 and 8 start to merge. The read is returned with the flag.

FACTURE N° 2024-0847
Dumont & Fils SPRL · TVA BE0202239951
Date 15/03/2024 · Échéance 14/04/2024
Conseil juridique · 1.250,00
Total HTVA 1.250,00 · TVA 262,50
Total TVAC 1.512,50 EUR
long side 840 px
⚠ low_resolution

Too small

The page’s long side is under 1500 px. WhatsApp compression does this. The text comes back, with the warning.

FACTURE N° 2O24-O847
Dumont & Fils SPRL · TVA BE02O2239951
Date 15/O3/2024 · Échéance 14/04/2024
Conseil juridique — mars 2024 · 1.250,00
Total HTVA 1.250,00 · TVA 2б2,5O
Total TVAC 1.5l2,50 EUR
low_confidence_ratio 0.31
⚠ low_confidence

Unsure lines

More than 15 % of the lines read under 0.80. Each line still carries its own score, so you know exactly which ones.

processing_time_ms

89ms
source: text · the PDF has a sound text layer

No OCR runs. The layer is read as is, the fields are extracted and checked. Exact characters, no confidence to worry about.

342ms
source: ocr · a scan or a photo

PP-OCRv6 on an NVIDIA GPU in the EU. Detection, recognition and classification in one pass, one page.

0bytes of your documents kept

data_handling

We keep nothing.
Literally.

01

In memory, then gone

The file lives in RAM for the length of the request. Nothing is written to disk. Nothing exists after the response leaves.

02

Counted, not read

The usage log stores timestamp, key, endpoint, duration and file size. Never the text. Never the file.

03

EU servers, no US cloud in the path

GPU inference and the usage database both run on European infrastructure.

04

Keys are SHA-256 hashes

You see the full key once. Revoking is immediate. Per-key rate limits and quotas.

05

Retries are free

Same Idempotency-Key within 24 h returns the cached result. No second read, no second count. The cache key is a hash of the content, not the content.

dashboard

A key. A quota. A playground.

Sign in with your chut.app account. The dashboard calls the same API your code does: create and revoke keys, watch every call in the logs, drop a file in the playground to read it without writing a line.

optii ▸ dashboard ▸ overviewcabinet-lemaire · free

overview

+ new key
plan
free
10 req/min · 5 MB · upgrade
api keys
1of 1
optii_sk_7f3a…c91e
requests this month82 %
412of 500
usage24h7d30d
120 80 40 thu fri sat sun mon tue wed 89
requests359
avg processing318 ms
data read84.2 MB
plan limitsfree
rate limit10 / min
max file5 MB
api keys1
monthly quota500
keys
keylast usedreq
optii_sk_7f3a…c91e ●2 min412revoke
optii_sk_02b8…44d0 ○12 oct1 938revoked

pricing

Priced like a receipt.
Printed like one too.

OPTII · BY CHUT.APPAPI.OPTII.EU · CHUT.APP BV
Free

To try the API and run small internal tools.


requests / month500
rate limit10 / min
max file5 MB
api keys1
document types32
bytes kept0

TOTAL€0 / mo
Create a free key
NO CARD · NO TRACKING · EU
MOST USED
OPTII · BY CHUT.APPAPI.OPTII.EU · CHUT.APP BV
Pro

For firms and apps that read documents every day.


requests / month10.000
rate limit60 / min
max file20 MB
api keys5
document types32
bytes kept0

TOTAL€ — on request
Ask for Pro
VAT 21 % · INVOICE BY E-MAIL · EU
OPTII · BY CHUT.APPAPI.OPTII.EU · CHUT.APP BV
Enterprise

For platforms and pipelines with their own SLA.


requests / monthunlimited
rate limit300 / min
max file20 MB
api keys100
document types32 + yours
bytes kept0

TOTALCustom
Talk to us
SLA · DEDICATED GPU · EU

Limits are the live API tiers. Pro is priced on request while we finish billing.

questions

Short answers.

Which documents does it handle?
Anything scanned or photographed: PDF, PNG, JPG, TIFF, BMP, WebP, up to 20 MB with a key. Structured fields are tuned for Belgian invoices, credit notes, debit notes and receipts. Classification covers 32 Belgian document types.
Does it use the PDF’s own text?
When the text layer is sound, yes. The response says source: text and the lines are exact. Pages without a usable layer go through OCR (ocr); a mixed document is hybrid.
What do I get on a bad scan?
The text, and a quality block: low_resolution under 1500 px, blurry under a sharpness floor, low_confidence when more than 15 % of lines read under 0.80. Ask for a rescan instead of trusting it.
Is anything stored?
Not the document. The usage log keeps timestamp, key, endpoint, duration and file size. Idempotent replays keep the response for 24 hours, keyed by a content hash.
Can my chut.app workflow call it?
Yes. Inside chut.app the same operations are tools: optii.ocr_extract, optii.ocr_classify, optii.health_probe, through the platform gateway, with the same output shapes as the public API.

about

Read in Belgium.

optii started as the reading engine inside chut.app, the AI back office for SMEs. Accountants kept asking for the OCR on its own. So here it is: the same models, the same EU hosting, behind one key.

It is trained on the paper a Belgian firm actually receives, in the languages it arrives in. Find one it reads badly? Send it. That is how it gets better.

Sid, founder · Wevelgem

Learn more →