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

Extracting data from loan applications

Nearly every US residential mortgage starts with a Uniform Residential Loan Application, Fannie Mae Form 1003 or Freddie Mac Form 65. The lender's loan origination software fills it in. Processors, underwriters and loan buyers review the signed copy for every loan, as a PDF in the loan file.

Underwriting needs the loan amount and purpose, the property value and occupancy, income, assets and liabilities. Those feed automated underwriting, which checks them against the borrower's documents and returns the findings that set the loan's conditions.

Page 3 of a sample Uniform Residential Loan Application, with extracted values outlined
31,466Markdown characters
355parse blocks
122fields extracted
The problem

What makes loan applications hard

Selections carry the meaning

Loan purpose, occupancy, citizenship and every declaration are radio buttons or checkboxes, so the answer is a mark beside a printed option.

Arithmetic across pages

Liabilities listed on one page feed the funds-to-close calculation on another, so related figures sit several pages apart.

System values over a form face

A loan origination system prints its values in its own typeface over the form's lines, often a little off the line they belong to.

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 uniform residential loan application, end to end

About this document: A completed, e-signed Form 1003 for a single-borrower cash-out refinance, generated by a lender's document system. Eight portrait pages: the borrower sections on pages 1 to 6, then the lender's loan information on pages 7 and 8. Page 3 is featured. Every personal value and signature was replaced with stand-ins before parsing.

Processing objective: The objective is to read the loan being applied for: how much, for what purpose, against what property value, and how the borrower will occupy the home. Purpose and occupancy are ticked boxes, and each value grounds to its own line of the form.

Demonstration fields: Loan amount, Loan purpose, Property value, Occupancy, Number of units

The document

4 of 8 pages
  • Page 1 of the sample Uniform Residential Loan ApplicationPage 1
  • Page 2 of the sample Uniform Residential Loan ApplicationPage 2
  • Page 3 of the sample Uniform Residential Loan ApplicationPage 3shown below
  • Page 7 of the sample Uniform Residential Loan ApplicationPage 7

Where each value came from

Page 3 of the sample Uniform Residential Loan Application, with every featured field outlined
Loan amountloan_and_property.loan_amount
404,500
The region of the sample Uniform Residential Loan Application containing Loan amount, with the extracted value outlined
extraction_metadata["loan_and_property.loan_amount"]
{
  "value": 404500,
  "page": 3,
  "range": {
    "end": 10049,
    "start": 10023
  },
  "box": {
    "xmin": 0.02554,
    "ymin": 0.38216,
    "xmax": 0.97421,
    "ymax": 0.39853
  }
}
Loan purposeloan_and_property.loan_purpose
Refinance
The region of the sample Uniform Residential Loan Application containing Loan purpose, with the extracted value outlined
extraction_metadata["loan_and_property.loan_purpose"]
{
  "value": "Refinance",
  "page": 3,
  "range": {
    "end": 10095,
    "start": 10080
  },
  "box": {
    "xmin": 0.02554,
    "ymin": 0.38216,
    "xmax": 0.97421,
    "ymax": 0.39853
  }
}
Property valueloan_and_property.property_value
608,200
The region of the sample Uniform Residential Loan Application containing Property value, with the extracted value outlined
extraction_metadata["loan_and_property.property_value"]
{
  "value": 608200,
  "page": 3,
  "range": {
    "end": 10267,
    "start": 10238
  },
  "box": {
    "xmin": 0.15202,
    "ymin": 0.4327,
    "xmax": 0.62661,
    "ymax": 0.44852
  }
}
Occupancyloan_and_property.occupancy
Primary Residence
The region of the sample Uniform Residential Loan Application containing Occupancy, with the extracted value outlined
extraction_metadata["loan_and_property.occupancy"]
{
  "value": "Primary Residence",
  "page": 3,
  "range": {
    "end": 10302,
    "start": 10279
  },
  "box": {
    "xmin": 0.02509,
    "ymin": 0.44952,
    "xmax": 0.91703,
    "ymax": 0.4659
  }
}
Number of unitsloan_and_property.number_of_units
1
The region of the sample Uniform Residential Loan Application containing Number of units, with the extracted value outlined
extraction_metadata["loan_and_property.number_of_units"]
{
  "value": 1,
  "page": 3,
  "range": {
    "end": 10237,
    "start": 10219
  },
  "box": {
    "xmin": 0.15202,
    "ymin": 0.4327,
    "xmax": 0.62661,
    "ymax": 0.44852
  }
}

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

Uniform Residential Loan Application processing highlights

Loan amount and purpose
Property value and occupancy
Borrower and employment details
Income by source
Assets and liabilities lists
Real estate owned
Declarations checkboxes
Proposed monthly payment
Funds to close calculation
Radio buttons and checkboxes
Multi-page application packets
Bounding box for every value
FAQs

Questions, answered

Yes. Parsing writes every checkbox into the Markdown in one standard form, marked checked or unchecked beside its label. Fields for loan purpose and occupancy come back as the options ticked on the application.

Yes. Define assets and liabilities as arrays in your schema. Every listed account comes back as its own entry, with its creditor, type, balance and payment, for as many rows as the application holds.

No. A schema names the fields you want and describes them in plain language. Extraction reads the parsed application for meaning, so one schema covers the form as each loan origination system prints it.

Every extracted value carries the character range it was quoted from in the parsed Markdown. The Ground API maps that range to a page and a bounding box, so a reviewer sees each value on the line that printed it.

Start extracting uniform residential loan application data

Reliable, structured outputs with full traceability in minutes