Utility bill data extraction

Utility bill data extraction reads an electricity, gas or water bill and returns the provider, service address, billing period, charges, meter readings and consumption as structured data. docRefinery's utility bill OCR API covers 55 field definitions across two repeating tables, one for meters and one for charges. Extracted values carry a confidence score and a page and box citation.

Updated

Three teams, three reasons to read a utility bill

  • Onboarding and KYC analysts want a name, a service address and a date, because bills are common proof of address. Acceptance windows vary: one UK council asks for a bill dated within the last three months. Bill Date and Service Address answer that; the KYC workload has the wider picture.
  • Accounts payable and property teams pay hundreds of bills across sites and need amounts, due dates and account numbers.
  • Energy and sustainability reporters need consumption, not money: units per meter per period, for every site.

Providers rarely change their format, so a portfolio of sites reduces to a handful of layouts, each learned once and remembered.

Utility bill fields docRefinery extracts

There are 55 definitions, the most after invoices. Mailing and service addresses are separate because they often aren't the same place, and that difference matters for proof of address.

The 55 utility bill field definitions, by category
CategoryFields
ProviderUtility Type, Provider Name, Provider Address, Provider Phone, Provider Website, Provider Tax ID
AccountAccount Number, Invoice Number, Customer Name, Service Address, Mailing Address, Rate Plan
PeriodBill Date, Due Date, Billing Period Start, Billing Period End, Number of Days Billed
BalanceCurrency, Previous Balance, Payments Received, Balance Forward, Adjustments Amount, Current Charges, Total Tax Amount, Late Payment Charge, Total Amount Due, Amount After Due Date, Deposit Held, Equal Payment Plan Amount
PaymentPayment Method, AutoPay Enrolled, Remit To Address, Payment Stub Reference
ConsumptionConsumption Amount, Consumption Unit, Average Daily Consumption, Consumption Same Period Last Year
Meter Item (table)Meter Number, Previous Reading, Current Reading, Previous Reading Date, Current Reading Date, Reading Type, Multiplier, Consumption, Meter Consumption Unit
Charge Item (table)Description, Charge Type, Quantity, Unit, Rate, Period, Amount

Example utility bill JSON

A trimmed excerpt with invented values. Total Amount Due is read, but its location is null: the figure is printed in the summary and again on the tear-off stub, with nothing to say which copy it is. See Extract a document for the complete response.

Excerpt: utility bill result
{
  "document_type": "utility_bill",
  "result": {
    "fields": [
      { "alias": "Service Address", "text": "1 Example Road, Sampletown", "field_confidence": 0.95,
        "location": { "page": 1, "bbox": [0.08, 0.20, 0.42, 0.24] } },
      { "alias": "Total Amount Due", "text": "84.17", "field_confidence": 0.97, "location": null },
      { "alias": "Deposit Held", "text": null, "location": null },
      { "alias": "Meter Item", "table": [[
        { "alias": "Meter Number", "text": "E00000001", "field_confidence": 0.96,
          "location": { "page": 2, "bbox": [0.08, 0.30, 0.24, 0.32] } },
        { "alias": "Reading Type", "text": "Estimated", "field_confidence": 0.90,
          "location": { "page": 2, "bbox": [0.60, 0.30, 0.72, 0.32] } },
        { "alias": "Consumption", "text": "312", "field_confidence": 0.94,
          "location": { "page": 2, "bbox": [0.76, 0.30, 0.82, 0.32] } }
      ]] }
    ],
    "extraction_approval": "auto",
    "low_confidence_fields": []
  }
}

Why bill portfolios suit docRefinery

Across a property portfolio, bills are a volume problem first. A stack scanned into one long PDF is segmented into the bills inside it, and each provider's layout is recalled once it has been learned. Meter Item and Charge Item come back as rows, so a site with four meters stays four rows. Insights shows vendors and flagged fields across the account, so a provider that keeps failing stands out.

Several teams can share one account without arguing over the output. The organisation governs which fields are on, and a Return as alias names each value for where it is going: Consumption Amount can arrive as kwh_used for a carbon report, Service Address as service_addr for onboarding. Every bill, from any provider, returns the same format as an invoice or a statement, so one parser feeds AP, onboarding and reporting.

Bills from several countries are covered by 70+ languages and scripts. The XLSX export gives each table its own sheet, corrections included, and a reviewer's fix can become a suggested fix, tested on that provider's own bills before anyone applies it.

What makes utility bills hard to read

  • Units aren't comparable. A UK gas bill turns metered volume into kWh using a correction factor and a calorific value, so one bill can print cubic metres and kWh side by side. Reporting on the wrong one is an easy mistake.
  • Estimated readings. Actual and estimated reads look alike, and an estimate can distort an energy report.
  • Balance arithmetic. Previous balance, payments, adjustments and current charges all sit near the amount due, and only one of them is what's owed now.
  • Two amounts due. Some bills print a different figure for payment after the due date.
  • Multi-meter and multi-service bills. One document can cover several meters, or gas and electricity together, with tiered rates, standing charges and levies.
  • Charts. Usage graphs carry figures that look like data but belong to other periods.

How low-confidence utility values are handled

What counts as too uncertain depends on who is reading. An onboarding team can hold Service Address at a high threshold and ignore the charges; an energy analyst can do the reverse with Consumption and Consumption Unit. Values under the bar go to the review queue with their box highlighted. Where a bill doesn't print a field, you get null: docRefinery won't work out a kWh figure the page doesn't show, and it won't fill in a reading. If the numbers need to agree, a workflow rule can say that previous and current readings match the consumption, and a failure is flagged.

Common questions

Can a utility bill extraction API confirm someone's address?

No. It reads the name, service address and date as printed. Whether that satisfies your proof-of-address policy, and whether the bill is genuine, is your team's decision. Forgery detection is research on our roadmap, not a product.

Does it handle bills with several meters?

Yes. Meter Item is a repeating table, so each meter returns its own number, readings, dates, multiplier and consumption, each with its own score, and a location where it can be placed.

Does it work on phone bills too?

Phone bills are a related case: the dashboard has a sample one showing charges per line. The 55 fields here are the utility bill schema; custom fields can be added.

Can consumption data come back in our reporting format?

Yes. Give Consumption Amount, Consumption Unit and each meter column a Return as alias, and those names become the JSON keys and CSV headers. The format is the same for every provider, so a new supplier adds no parsing work. Units stay as printed: docRefinery doesn't convert them.

Sources

  1. British Gas: converting gas m³ to kWh
  2. Royal Borough of Kensington and Chelsea: proof of address documents

Related

Try it on your own documents.

Upload a real file and see each field with its confidence score, ready to check.

100 pages a month free. No credit card, no sales call.