Permit Data API

Every permit.
One clean API.

Government permit data is trapped in thousands of incompatible portals. Threshmoor pulls it all into one normalized schema and serves it through a single REST endpoint.

Read the docs
GET /permits

Request

curl -H "X-API-Key: thresh_live_..." \\n  "https://api.threshmoor.com/permits?limit=3&permit_type=Building"

Response

{
  "jurisdiction": "Austin, TX",
  "count": 3,
  "permits": [
    {
      "permit_number":  "2026-076303 BP",
      "permit_type":    "Building Permit",
      "work_class":     "Demolition",
      "status":         "Active",
      "description":    "Total demo of sfr 1299 sqft",
      "issued_date":    "2026-06-16T00:00:00.000",
      "applied_date":   "2026-06-04T00:00:00.000",
      "address":        "2817 E 22ND ST",
      "city":           "AUSTIN",
      "zip":            "78722",
      "valuation":      "0",
      "contractor":     "Joseph Design Build",
      "latitude":       "30.28405859",
      "longitude":      "-97.71079459",
      "jurisdiction":   "Austin, TX"
    }
  ]
}

The problem

Permit data is everywhere. Getting it shouldn’t be.

Thousands

of jurisdictions, each with its own portal, format, and quirks

No standard

field names, date formats, or response shapes — every city is different

Manual work

logging into portals, scraping pages, parsing PDFs — for every single city

The solution

One schema.
Every city.

Every permit record — regardless of which jurisdiction it came from or how it was sourced — is normalized into 15 consistent fields. Build your integration once and it works everywhere, for every city we add.

The jurisdiction field is always present. Every other field returns null rather than crashing if the source doesn’t provide it.

Permit — 15 fields
permit_numberstring | null
permit_typestring | null
work_classstring | null
statusstring | null
descriptionstring | null
issued_datestring | null
applied_datestring | null
addressstring | null
citystring | null
zipstring | null
valuationstring | null
contractorstring | null
latitudestring | null
longitudestring | null
jurisdictionstring

Built for

Anyone who needs permit data at scale

Solar installers

Track new residential permits to find homeowners actively building — the best time to sell solar.

Multi-market contractors

Pull permits from every jurisdiction through one API instead of logging into a different portal for each city.

Proptech developers

Build permit-aware features into your platform with clean, structured data you can trust.

Permit expediters

Monitor permit status changes across jurisdictions without manually checking each portal.

Sales teams

Use new permits as a lead signal — know about construction activity before your competitors do.

Coverage

Starting where the data is clean. Going where it’s not.

The API launches with cities that publish open data and expands from there — including jurisdictions that have no clean API at all, the ones that require pulling data straight from portals and documents. That hard-to-reach data is the long-term moat.

Austin, TX

Live now — serving real permit data through the API.

Chicago, IL

Live now — serving real permit data through the API.

San Francisco, CA

Live now — serving real permit data through the API.

Seattle, WA

Live now — serving real permit data through the API.

Raleigh, NC

Live now — serving real permit data through the API.

More jurisdictions

Expanding to additional cities — including the ones without clean APIs. Same schema, no integration changes.

Try it right now

See real permit data from five jurisdictions, served through a single normalized schema. Sign up free for your own key.

Read the docs