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

Extracting data from roof certifications

Licensed inspectors, roofers and engineers complete a roof certification when a property insurer, most often in Florida, asks for proof of an older roof's condition. Citizens Property Insurance publishes one form, and inspection software prints its own versions. Underwriters receive thousands at binding and renewal, uploaded by agents as PDFs or scans.

Underwriting needs the covering material, the roof age, the last permit date, the overall condition and any visible damage. The underwriting system checks those against the carrier's roof age and remaining life rules, and decides whether to bind, renew or require replacement.

Page 1 of a sample Roof Inspection or Certification, with extracted values outlined
5,670Markdown characters
37parse blocks
24fields extracted
The problem

What makes roof certifications hard

The answers are checkboxes

The condition rating and the damage and leak questions are marked boxes, with Satisfactory and Unsatisfactory printed side by side.

Two roof columns, one often empty

The form gives the predominant and secondary roofs a column each, and on a single-roof home the second column holds only printed labels.

Roof age is stated three ways

The form records roof age in years, the last permit date and any update date, and each can point to a different install year.

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 roof certification, end to end

About this document: A completed roof inspection form for a Florida home, produced with an inspection software vendor's Citizens roof form library. Three scanned portrait pages: the property header and roof section, the comments and the inspector's certification, then four roof photographs. Page 1 is featured. Every identifying detail was replaced with stand-ins.

Processing objective: The objective is to read the predominant roof the way an underwriter does, checking its age and condition against the carrier's rules. The condition and damage answers are checked boxes. Each value grounds to its own line of the form.

Demonstration fields: Roof covering material, Roof age in years, Date of last roofing permit, Overall condition, Visible damage checked

The document

3 of 3 pages
  • Page 1 of the sample Roof Inspection or CertificationPage 1shown below
  • Page 2 of the sample Roof Inspection or CertificationPage 2
  • Page 3 of the sample Roof Inspection or CertificationPage 3

Where each value came from

Page 1 of the sample Roof Inspection or Certification, with every featured field outlined
Roof covering materialpredominant_roof.covering_material
Asphalt shingles
The region of the sample Roof Inspection or Certification containing Roof covering material, with the extracted value outlined
extraction_metadata["predominant_roof.covering_material"]
{
  "value": "Asphalt shingles",
  "page": 1,
  "range": {
    "end": 1138,
    "start": 1103
  },
  "box": {
    "xmin": 0.06426,
    "ymin": 0.41342,
    "xmax": 0.32737,
    "ymax": 0.43004
  }
}
Roof age in yearspredominant_roof.roof_age_years
30
The region of the sample Roof Inspection or Certification containing Roof age in years, with the extracted value outlined
extraction_metadata["predominant_roof.roof_age_years"]
{
  "value": 30,
  "page": 1,
  "range": {
    "end": 1165,
    "start": 1139
  },
  "box": {
    "xmin": 0.06448,
    "ymin": 0.43404,
    "xmax": 0.25645,
    "ymax": 0.45002
  }
}
Date of last roofing permitpredominant_roof.last_permit_date
2011
The region of the sample Roof Inspection or Certification containing Date of last roofing permit, with the extracted value outlined
extraction_metadata["predominant_roof.last_permit_date"]
{
  "value": "2011",
  "page": 1,
  "range": {
    "end": 1237,
    "start": 1204
  },
  "box": {
    "xmin": 0.06475,
    "ymin": 0.47063,
    "xmax": 0.30136,
    "ymax": 0.48848
  }
}
Overall conditionpredominant_roof.overall_condition
Satisfactory
The region of the sample Roof Inspection or Certification containing Overall condition, with the extracted value outlined
extraction_metadata["predominant_roof.overall_condition"]
{
  "value": "Satisfactory",
  "page": 1,
  "range": {
    "end": 1388,
    "start": 1372
  },
  "box": {
    "xmin": 0.0779,
    "ymin": 0.60735,
    "xmax": 0.17168,
    "ymax": 0.62236
  }
}
Visible damage checkedpredominant_roof.visible_damage[0]
Visible hail damage
The region of the sample Roof Inspection or Certification containing Visible damage checked, with the extracted value outlined
extraction_metadata["predominant_roof.visible_damage[0]"]
{
  "value": "Visible hail damage",
  "page": 1,
  "range": {
    "end": 1696,
    "start": 1673
  },
  "box": {
    "xmin": 0.0786,
    "ymin": 0.7926,
    "xmax": 0.21738,
    "ymax": 0.80618
  }
}

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. VPC and on-prem deployment require an Enterprise plan.

Compare plans
Capabilities

Roof Certification processing highlights

Roof covering material
Roof age and remaining life
Last permit and update dates
Overall condition checkboxes
Visible damage checkboxes
Leak and interior damage answers
Predominant and secondary roofs
Inspector certification block
Photo page descriptions
Scanned page images
No per-insurer templates
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. A condition field comes back as the option checked, and a damage field lists every box marked.

Yes. Parsing works from the page image, so a scan or a phone photo of a signed form reads the same way as a digital PDF. Each value is grounded to the line of the form that prints it.

Describe the secondary roof as its own object in your schema, with a field for whether one is present. When the column holds only printed labels, extraction reports the secondary roof as absent.

No. A schema names the fields you want and describes them in plain language. Extraction reads the parsed form for meaning, so one schema covers the Citizens form and each carrier's or vendor's version.

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 roof certification data

Reliable, structured outputs with full traceability in minutes