

Tesse
Search 380 million public property records in one place, and ask an assistant questions about them
The problem
Commercial real estate teams need comprehensive property intelligence: ownership, transfers, violations, permits. Licensed data feeds are expensive and fragmented. The public records exist, but county by county, agency by agency, in incompatible formats. Nobody had aggregated them into one canonical schema at national scale.
What I built
Tesse is a go-to-market platform for commercial real estate with AI agents layered over a unified data foundation. Brokers ask business questions in plain English, enrich lead lists on demand, monitor signals across jurisdictions, and upload their own spreadsheets. Every answer is grounded in real database rows rather than model recall.

The data pipeline
The core engineering story is ingestion. 240+ automated collectors pull from county assessors, city open-data portals, state registries, and federal sources: REST APIs, ArcGIS endpoints, Socrata feeds, HTML scrapers, and bulk ZIP downloads. Each collector owns its own pagination, throttling, auth, and incremental fetch strategy.
Raw records pass through 305 YAML field-map files that translate every source's columns into one canonical schema: type coercion, money normalised to cents, dates to ISO-8601, addresses geocoded, geometries normalised to PostGIS.
Idempotent bulk loaders write into PostgreSQL 17 with PostGIS, partitioned per jurisdiction. Re-runs never duplicate. The output today is roughly 380M records: 62M properties, 27M ownership transfers, 26M code violations, 14M companies, and 12M permits, all from free public sources at $0 per record.
The dedupe engine
The same building appears in multiple sources under different IDs, spellings, and partial addresses. A four-tier engine collapses them into one canonical record:
- Exact parcel ID match, where jurisdictions share stable identifiers
- Fingerprinted address match on normalised street, number and unit
- Geographic proximity using PostGIS distance thresholds for near-miss addresses
- Cross-source linkage rules for the domain-specific edge cases
A daily orchestrator handles retries, drift detection when agencies silently change their schemas, and per-jurisdiction coverage monitoring.
AI agents on top
Five LangGraph agents on Gemini sit above the data layer:
- Chat answers natural-language questions from real rows through schema-bound tools
- Leads enriches property tables with custom columns, fanning out to the internal database, web search, and vendor APIs in parallel
- Signals monitors permits, court dockets, filings and local news, clustering them into deduped stories tied to properties
- My Data ingests spreadsheet uploads with model-inferred column mapping and confidence scores
- Inbox parses broker email, extracts deals, and fuzzy-matches them to properties

A 50ms embedding router skips the language model entirely for routine questions, cutting both cost and latency.

Why it matters
The platform replaces per-record licensing costs with a data asset nobody else has assembled. The same pipeline produces the training data for the ML layer: 27M historical sales and 133K labelled foreclosures. Owner deduplication, distress scoring and automated valuation all feed off point-in-time features that only exist because the ingestion was built this way.
Building something in this territory? Start a conversation →
