*** September 2026 Major Release ***Read and watch
Document type

Extracting data from utility bills

A utility bills every household and every site it serves, monthly, on a layout of its own design. Banks take them as proof of address and energy managers take them for consumption data, so one document serves two unrelated jobs. Both handle thousands a month, as portal downloads and phone photographs.

A verifier needs the account holder, the service address and the bill date; an energy team needs the meter readings, the usage and the charge totals. KYC onboarding checks the address against the application, and an energy management platform tracks cost per unit across sites.

Page 4 of a sample Utility Bill, with extracted values outlined
13,818Markdown characters
164parse blocks
24fields extracted
The problem

What makes utility bills hard

One usage figure, several rates

A month's kWh is priced in blocks: the first 103 at one rate, the next 135 at another, each its own line.

Two services, two meters

Electric and gas share one bill, each with its own meter, readings, usage, charge blocks and total to reconcile.

A year of usage is drawn

The consumption history is a bar chart with a temperature line over it, holding a year of daily averages.

How it works

Parse, extract, verify

1

Parse

Parse turns the document into reading-order Markdown and a hierarchy of blocks (text, tables, figures), and grounds each block to its exact location on the page.

2

Extract

You define the fields in a JSON schema, and Extract returns their values in a consistent, structured format, each linked back to where it appears in the Markdown.

3

Verify

Each value links back to where it appears, down to the character range in the Markdown, and the page and bounding box in the source document, so every result can be verified.

Worked example

One utility bill, end to end

About this document: A PSE&G residential bill covering a single billing period. Four portrait pages: a summary with a payment stub, a charges overview, then a detail page each for gas and electric, every detail page carrying a usage chart. This is a real customer's bill. The name, address, account, invoice, meter and point-of-delivery numbers were replaced with plausible stand-ins before publication.

Processing objective: The objective is to reconcile one service's charges against its meter. Page 4 bills 238 kWh, the difference between two readings, through a service charge and two rate tiers. Delivery of $16.71 plus supply of $29.71 makes the $46.42 total.

Demonstration fields: Account number, Meter number, Delivery charges, Service charges, Total electric charges

The document

4 of 4 pages
  • Page 1 of the sample Utility BillPage 1
  • Page 2 of the sample Utility BillPage 2
  • Page 3 of the sample Utility BillPage 3
  • Page 4 of the sample Utility BillPage 4shown below

Where each value came from

Page 4 of the sample Utility Bill, with every featured field outlined
Account numberaccount_info.account_number
6873630651
The region of the sample Utility Bill containing Account number, with the extracted value outlined
extraction_metadata["account_info.account_number"]
{
  "value": "6873630651",
  "page": 4,
  "range": {
    "end": 10202,
    "start": 10171
  },
  "box": {
    "xmin": 0.68822,
    "ymin": 0.04242,
    "xmax": 0.91347,
    "ymax": 0.05355
  }
}
Meter numberelectric_charges.meter_number
245603755
The region of the sample Utility Bill containing Meter number, with the extracted value outlined
extraction_metadata["electric_charges.meter_number"]
{
  "value": "245603755",
  "page": 4,
  "range": {
    "end": 10344,
    "start": 10327
  },
  "box": {
    "xmin": 0.08519,
    "ymin": 0.13796,
    "xmax": 0.38551,
    "ymax": 0.1558
  }
}
Delivery chargeselectric_charges.total_delivery_charges
$16.71
The region of the sample Utility Bill containing Delivery charges, with the extracted value outlined
extraction_metadata["electric_charges.total_delivery_charges"]
{
  "value": "$16.71",
  "page": 4,
  "range": {
    "end": 10969,
    "start": 10963
  },
  "box": {
    "xmin": 0.472,
    "ymin": 0.30622,
    "xmax": 0.56866,
    "ymax": 0.32274
  }
}
Service chargeselectric_charges.monthly_service_charge
$4.95
The region of the sample Utility Bill containing Service charges, with the extracted value outlined
extraction_metadata["electric_charges.monthly_service_charge"]
{
  "value": "$4.95",
  "page": 4,
  "range": {
    "end": 10687,
    "start": 10682
  },
  "box": {
    "xmin": 0.47196,
    "ymin": 0.23462,
    "xmax": 0.5686,
    "ymax": 0.25159
  }
}
Total electric chargeselectric_charges.total_electric_charges
$46.42
The region of the sample Utility Bill containing Total electric charges, with the extracted value outlined
extraction_metadata["electric_charges.total_electric_charges"]
{
  "value": "$46.42",
  "page": 4,
  "range": {
    "end": 11587,
    "start": 11330
  },
  "box": {
    "xmin": 0.0814,
    "ymin": 0.4216,
    "xmax": 0.61031,
    "ymax": 0.68859
  }
}

How to try it yourself

Everything on this page is reproducible. The sample, its schema, and the Parse and Extract API outputs are published. You can repeat the same two calls from whichever surface you already build on.

  • Claude Skilldescribe the job; the agent writes it
  • CLIno code at all
  • MCPexpose ADE docs as an agent tool
  • REST APIany language
  • Pythonlandingai-ade
  • TypeScriptlandingai-ade
Why LandingAI?

Documents into data

Accurate

The best accuracy on the difficult documents other tools get wrong, such as messy scans, complicated tables, checkboxes and handwriting.

Auditable

Every answer cites its sources. Values come back with an audit trail (page, bounding box, character range) so a human can review them.

Agentic

Applies multi-step reasoning, and plans before it acts. Handles documents it has never seen before and adapts to variations.

API-first

Composable APIs that drop into any tech stack and can be called from anywhere. Easy to build on and embed in your pipelines and products.

Affordable

Cost-competitive rates with complete price transparency. Spend controls before you run, and every job reports its exact cost.

Enterprise-grade

Built for production and scale from day one. Fully observable and monitored, running securely in our cloud or yours.

Built for high-volume, high-throughput production

  • Zero data retention
  • Priority rate limits
  • Enhanced support
  • VPC and on-prem deployment

Available on Team and Enterprise plans.

Compare plans
Capabilities

Utility Bill processing highlights

Electric and gas services
Meter numbers and readings
Tiered rate blocks
Delivery and supply charges
Usage in kWh and therms
Account and invoice numbers
Service and billing addresses
Billing period dates
Usage history charts
Payment stubs
Photographed and scanned bills
Bounding box for every value
FAQs

Questions, answered

Every line. Define the charge blocks as arrays. Each rate tier returns with its quantity, its unit price and its amount, alongside the subtotals the bill prints.

Yes. A usage chart parses as a figure with its data transcribed into a table. The month-by-month averages come back as values, alongside a description of what the chart shows.

Model each service as its own object. Everything below the meter number comes back attributed to the service it belongs to, so a therm figure never lands in a kWh field.

Every value comes back with its page, a bounding box and the character range in the parsed Markdown. On a charge line the box covers the amount at the end of its dotted leader, so a reviewer sees which row it was read from.

A utility bill carries a name, a service address and an account number, which is exactly why it is accepted as proof of address. A schema can ask for the usage and charges alone. Accounts are available with zero data retention, alongside SOC 2 Type II, GDPR and HIPAA compliance.

Start extracting utility bill data

Reliable, structured outputs with full traceability in minutes