Case study · Document data extraction

Every lease, one table

Our signed leases were PDFs. Nobody could answer simple questions like which leases allow pets or how late fees were worded without opening documents one by one. I turned every signed lease into structured, searchable terms.

RoleAnalyst and builder
WhenSep 2026
ToolsProperty-system file API, Claude, Supabase
UsersLeasing team
100%
of signed leases read into structured terms
156
distinct clause phrasings found
~24
patterns to review instead of every document
1
table anyone can query

The problem

Lease terms only existed inside PDFs. Every question about our own contracts meant opening files by hand, so most questions simply didn't get asked.

Constraints

Real contracts

Accuracy mattered more than speed. Every extracted term had to trace back to its document.

Many versions

Templates had changed across years and cities, so the same clause appeared in different wording.

Access

Files had to be pulled through the property system's API, not downloaded by hand.

Key decisions

1

Extract exact clause text, not summaries.

Each term keeps the original wording alongside the structured value, so a person can check it in seconds.

2

Group by phrasing.

Instead of reviewing every document, the team reviews about 24 recurring patterns, which surfaces outliers immediately.

The value wasn't the table. It was turning an unreviewable pile into a short list.
3

Store it with the core data.

Terms link to the same property and unit records as everything else, so they can be joined to rents, owners and renewals.

How it works

Signed PDFsvia file API
→
AI extractionterms + exact text
→
Checksagainst source
→
Lease terms tablelinked to units
→
Review~24 patterns
Every value keeps a pointer to the document and the exact clause it came from.

Outcome

What I'd do differently