Invoice & Utility Bill Data Extractor: Totals, kWh, Line Items
Pricing
from $1.70 / 1,000 extracted documents
Invoice & Utility Bill Data Extractor: Totals, kWh, Line Items
Bulk extract vendor, dates, totals, tax, kWh and line items from invoice and utility bill PDFs and photos. Auto-detects each document, runs one or several AI models, checks the arithmetic and flags what to review.
Pricing
from $1.70 / 1,000 extracted documents
Rating
0.0
(0)
Developer
Youssef Farhan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Turn a folder of invoices and utility bills (PDF, scans or phone photos) into one clean spreadsheet row per document. It reads the vendor or provider, invoice or account number, dates, subtotal, tax, total, amount due, currency, kWh or other usage and every line item, then checks the arithmetic itself and tells you which documents a person should look at.
PDF / scan / phone photo one row per document┌──────────────────────┐ ┌─────────────────────────────────────────────┐│ ACME Ltd INV-1042 │ AI vision model │ vendor invoice_no date total conf. ││ Hosting 120.00 │ ───────────────▶ │ ACME Ltd INV-1042 2026-03-02 144.00 high ││ Tax 20% 24.00 │ + free math checks│ + line_items, tax, currency, review flag ││ Total 144.00 │ └─────────────────────────────────────────────┘└──────────────────────┘ subtotal + tax = total? lines = subtotal? dates in order?
Built for accounts payable teams, bookkeepers, energy audits, ESG and carbon reporting, and property managers: anyone who types numbers from invoices and bills into a sheet by hand.
What makes it different
- Invoices and utility bills in one run. Auto-detect reads each file as an invoice or a utility bill and fills the matching columns, so a mixed folder just works. Or pick one type.
- You choose the AI models, one or several. Pick any vision model on OpenRouter. With two or more, every document is read by each model and the answers are compared field by field.
- Confidence you can act on. Free arithmetic checks run on every document (line items against subtotal and total, subtotal plus tax against total, charge lines against the bill total, meter readings against usage, date order, currency code). Optional: a cheap referee model re-reads the page, but only for fields where models disagree or a check failed.
- Bulk without babysitting. Hundreds of files from links or one ZIP upload. A bad link, a password-protected PDF or a file that is not a document becomes a line in a failure list, never a stopped run. Interrupted runs resume where they stopped.
- Any other document too. Switch to "custom fields only" and define your own fields for insurance letters, delivery notes, contracts or forms.
- Full text is optional and off by default, because AI models bill per output token.
What you get per document
Columns for the other document type are left out of the row in auto-detect mode.
| Column | Meaning |
|---|---|
document_type | invoice, utility_bill or other (auto-detect mode) |
invoice_number, vendor_name, vendor_tax_id, customer_name | Invoice header |
invoice_date, due_date, po_number, payment_terms, iban | Invoice dates and payment details |
subtotal, tax_total | Before-tax total and total tax |
line_items | Each invoice line with description, quantity, unit price and amount |
provider, service_type, account_number, service_address | Utility bill header (electricity, gas, water, sewer, combined) |
statement_date, billing_period_start, billing_period_end | Utility bill dates |
usage_kwh | Electricity kWh for the bill, empty for gas and water |
usage_value, usage_unit, previous_reading, current_reading, tariff | Main consumption with its printed unit, meter readings, rate plan |
charges, previous_balance | Each utility charge line (credits negative) and the carried balance |
total_amount, amount_due, currency | Document total, what is still payable now (0 if paid), ISO currency code. Kept apart on purpose |
confidence, needs_review, review_reasons | See below |
models_used, models_agree, field_confidence, by_model | Multi-model runs: who answered and where they differ |
full_text | Whole transcription, only when you turn it on |
cost_usd, tokens | Model usage for that document (billed separately, see Pricing) |
Dates are ISO (YYYY-MM-DD). Fields the document does not show are empty, never guessed. A water bill returns no kWh.
How confidence works
| Label | Meaning |
|---|---|
high | Two or more models agree on every field and every check passes |
medium | One model with every check passing, or a referee settled a disagreement or a failed check |
low | An unresolved disagreement, a failed check, or a key field is missing (invoices: number, vendor, date, total, currency; utility bills: provider, account, period, total, currency). needs_review is true and review_reasons says why |
Honest limits: agreement between models is evidence, not proof, and a single model can still be wrong in a way no check catches. Handwritten or very damaged documents often come back low, and that is the intended signal to look at them.
The referee option
Turn on "Check confidence with a cheap referee model" and, for each document, the referee looks at the page again but only for the disputed fields, and answers with the value it reads. This costs a fraction of a full read. The referee can only pick a value one of your models gave, unless an arithmetic check failed on that field, so it cannot invent new data.
Input
| Field | What it does |
|---|---|
| Documents (links) | PDF, PNG, JPG, WEBP, TIFF or GIF links. Upload a text file with one link per line for big batches. Google Drive file links work when shared with anyone with the link |
| Documents (ZIP upload) | One ZIP with all files, any folder depth |
| What are you extracting from? | Auto-detect, invoices, utility bills, or any other document with your own fields |
| Extra fields | One per line, name: what to look for. Each becomes a column |
| Extra instructions | Free text, for example "amounts are in CAD" |
| AI models | One or more. The first is primary. Prices per million tokens are shown in the list |
| Referee model | Optional second look at disputed fields |
| Full text | Off by default |
| Extract every line item | On by default, used for the totals check |
| Cheaper, faster reading | Turns the models' hidden thinking off. Cheaper and faster, a little less accurate on dense documents |
| Maximum pages per document | Default 5. Raise it for long statements |
| Documents in parallel | Default 4 |
The form is pre-filled with three public samples (a Toronto Hydro bill and two invoices), so you can press Start and see a result.
Example:
{"documentUrls": [{ "url": "https://example.com/invoices/2026-05.pdf" }],"documentType": "auto","models": ["google/gemini-2.5-flash", "anthropic/claude-haiku-5.5"],"useRefereeModel": true}
Choosing models
Measured in October 2026 on documents I could check against the right answers: three sample invoices from the open-source invoice2data test set and two utility bills.
| Model | Result | Typical model cost per document |
|---|---|---|
| Gemini 2.5 Flash (default) | Invoice number, date, vendor, totals, tax and currency right on all three invoices. One of two utility bills had a wrong total choice and an adjusted kWh, and was correctly flagged for review | about $0.002 |
| Gemini 3 Flash | Every checked utility-bill field right on all three test bills | about $0.002 to $0.003 |
| Claude Haiku 5.5 | Every checked utility-bill field right on all three test bills | about $0.001 |
| Gemini 2.5 Flash Lite | Cheapest and fastest, misses some dense lines | about $0.0002 |
| Mistral Medium 3.1 | Good values, but its line sums often fail the total check | about $0.001 |
| DeepSeek V4.1 Flash | Very cheap but unreliable as a main reader, so it is the default referee only | under $0.001 |
A public benchmark (ArbitrAI OCR mini-bench, July 2026) also places Gemini models at or near the top on cost for quality across receipts, invoices and logistics documents. Treat it as a hint, not proof.
These are model costs measured on a handful of documents, not a promise, and prices change. The model list in the input form is refreshed from OpenRouter and always shows current prices. Dense multi-page statements cost more than a one-page invoice.
For an invoice-heavy workload, running two models together with the referee gives the best accuracy and flags the rest.
Pricing
You pay per extracted document. Documents that could not be read are not charged and are listed in the FAILED_DOCUMENTS record. The current rate is shown on this Actor's Store page.
Model usage is a separate cost, and this Actor does not add a token meter on top of it:
- Default: AI usage runs through Apify's built-in OpenRouter access and is billed to your Apify account. No key needed.
- Your own key: add an OpenRouter key under "Bring your own API access" and usage is billed by OpenRouter on your account.
Free plan
Free runs read the first 3 documents with one model. Apify's built-in AI access is not available on the free plan, so free runs need your own OpenRouter key. A paid Apify plan removes both limits.
Good to know
- PDFs are rendered to page images and, when they have a real text layer, that text is sent too, so digital invoices are read exactly.
- Day/month order on ambiguous dates is resolved from the document itself. If it cannot be resolved the date is left empty and the document is flagged.
- Files over 30 MB, password-protected PDFs, HEIC photos and nested ZIPs are reported as failures. Convert HEIC to JPG first.
- Documents in any language work. Values are copied in the language printed on the document.
- Who is the vendor and who is the customer is decided from the layout, so a document that shows only one party can read ambiguously. Check
needs_reviewrows first.
Support and custom work
Found a bug or a document that reads wrong? Open an Issue on this Actor and attach the file if you can.
💼 Need a custom version or another document type? Contact me through my Apify profile