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

Extracting data from rate locks

A lender fixes a mortgage rate for a set number of days and confirms it in writing, on whatever form the investor or housing agency uses. A correspondent lender locks every loan it sells on, and the confirmation is what the file is checked against. Large sellers handle thousands a month, arriving as portal downloads.

A secondary marketing desk needs the locked rate, the lock period, the expiry date and the program the loan was priced under. A loan origination system holds the loan to those terms, and a pipeline report counts what expires this week.

Page 1 of a sample Rate Lock, with extracted values outlined
3,314Markdown characters
126parse blocks
34fields extracted
The problem

What makes rate locks hard

The terms fit one wide row

Program, amount, rate, price, lock date, period and expiry are set in eight narrow columns across a single line.

Inputs sit apart from the price

The credit score, the ratios and the occupancy that produced a rate are printed in a summary well below the rate itself.

Adjustments carry their reasons

Each price adjustment names what triggered it, so a final price is a base plus a list of separately labeled moves.

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 rate lock, end to end

About this document: WHEDA's own sample rate lock confirmation for its correspondent channel. One legal-size page: the lock itself in a single wide row, then pricing adjustments, the loan officer, and a two-column summary of borrower, property, loan, underwriting and mortgage insurance. Page 1 is featured. The borrower and property are placeholders.

Processing objective: The objective is to read the terms a desk holds the loan to, and the inputs that produced them. The rate sits in a row of eight narrow columns, and the credit score that priced it sits in the summary further down the page.

Demonstration fields: Reference number, Loan program, Locked rate, Lock expiration date, Middle credit score

The document

1 page
  • Page 1 of the sample Rate LockPage 1shown below

Where each value came from

Page 1 of the sample Rate Lock, with every featured field outlined
Reference numberreference_number
800203
The region of the sample Rate Lock containing Reference number, with the extracted value outlined
extraction_metadata["reference_number"]
{
  "value": "800203",
  "page": 1,
  "range": {
    "end": 143,
    "start": 123
  },
  "box": {
    "xmin": 0.73165,
    "ymin": 0.22396,
    "xmax": 0.88156,
    "ymax": 0.23279
  }
}
Loan programrate_lock.loan_program
HFA Preferred with MI Correspondent 30 year
The region of the sample Rate Lock containing Loan program, with the extracted value outlined
extraction_metadata["rate_lock.loan_program"]
{
  "value": "HFA Preferred with MI Correspondent 30 year",
  "page": 1,
  "range": {
    "end": 372,
    "start": 329
  },
  "box": {
    "xmin": 0.07216,
    "ymin": 0.27766,
    "xmax": 0.27638,
    "ymax": 0.29996
  }
}
Locked raterate_lock.interest_rate_percent
4.625
The region of the sample Rate Lock containing Locked rate, with the extracted value outlined
extraction_metadata["rate_lock.interest_rate_percent"]
{
  "value": 4.625,
  "page": 1,
  "range": {
    "end": 452,
    "start": 409
  },
  "box": {
    "xmin": 0.36008,
    "ymin": 0.27766,
    "xmax": 0.71952,
    "ymax": 0.29995
  }
}
Lock expiration daterate_lock.expiration_date
2014-04-10
The region of the sample Rate Lock containing Lock expiration date, with the extracted value outlined

Printed on the page as 4/10/2014, normalized on extraction.

extraction_metadata["rate_lock.expiration_date"]
{
  "value": "2014-04-10",
  "page": 1,
  "range": {
    "end": 470,
    "start": 461
  },
  "box": {
    "xmin": 0.71941,
    "ymin": 0.27766,
    "xmax": 0.80505,
    "ymax": 0.29994
  }
}
Middle credit scoreborrower.middle_credit_score
715
The region of the sample Rate Lock containing Middle credit score, with the extracted value outlined
extraction_metadata["borrower.middle_credit_score"]
{
  "value": 715,
  "page": 1,
  "range": {
    "end": 1056,
    "start": 1051
  },
  "box": {
    "xmin": 0.34702,
    "ymin": 0.47723,
    "xmax": 0.50595,
    "ymax": 0.48903
  }
}

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

Rate Lock processing highlights

Every investor's confirmation form
Locked rate and price
Lock date, period and expiry
Loan program and payment type
Price adjustments by reason
Credit score and ratios
Borrower and property summary
Automated underwriting results
Mortgage insurance details
Dates normalized to ISO
Bounding box for every value
Legal and letter page sizes
FAQs

Questions, answered

Yes. Define the adjustments as an array and each comes back with its reason and its value, so a final price can be rebuilt from the base and the moves that were applied to it.

Yes. The rate and the credit score sit in different parts of the page, and both come back under the names you gave them, so a desk can check one against the other.

No. A schema names the fields you want. Where they sit on the confirmation is not part of it, so one schema reads an investor's form it has never seen.

Every value comes back with its page, a bounding box and the character range in the parsed Markdown. A date returned in ISO form still points at the date the lock printed, so a reviewer sees both.

A rate lock carries a borrower, a property address and the credit and ratio inputs behind the price. A schema can ask for the lock terms alone. Accounts are available with zero data retention, alongside SOC 2 Type II, GDPR and HIPAA compliance.

Start extracting rate lock data

Reliable, structured outputs with full traceability in minutes