Products API & Data Search Coverage Property History Alerts For Contractors Data Exports
Solutions Solar & Energy Roofing HVAC Real Estate Insurance Lenders & CRE Contractors
Pricing Refer & Earn API Docs Sign In Get Started
Lenders & CRE

Building permit data for lenders and underwriters

Look up the permitted construction history of the collateral by address or parcel, see what is being built around it, and track pipeline by submarket. Every answer carries the date its source runs through, so a quiet history is never confused with missing data.

No credit card required. 100 free requests/day.

collateral_by_parcel.sh
# Every permit on a commercial parcel, with roof, HVAC and solar dates
curl "https://api.permit-stack.com/v1/property/by-parcel?parcel=172713000011\
&state=CO" \
  -H "X-API-Key: pk_your_key_here"

# found: true, 52 permits since 1992,
# last roofing permit 2011-03-21,
# Boulder data through 2026-09-27 (current)

The short answer

PermitStack normalizes 115M+ building permits from 871 active data sources in 8,000+ cities across 48 states and DC into one REST API. For a lending workflow that means permit history for the collateral (/v1/property/history, /v1/property/by-parcel), nearby and pipeline construction (/v1/permits/search with radius, property_type and min_value), monthly trend series (/v1/metrics), and delivery by CSV or a cursor-based change feed.

Business ($149/mo) adds the /v1/permits/sync feed and the property-owner mailing address where the county publishes it. Start free, and check your market before you pay.

115M+

Permits on file

From 871 active data sources in 8,000+ cities across 48 states and DC, plus 75 historical-archive jurisdictions for back-history.

Daily

Source polling

The main ingest runs every day at 03:00 UTC. Each source reports the newest permit we hold, so you see how current it is, not when we last checked.

$0

To evaluate

100 free requests per day, no card. Free keys see the last 30 days of permits; paid plans remove the date limit.

What lending and CRE teams do with permit data

Each example below is a real request and a trimmed copy of the response it returned. Swap in your own addresses, parcels and markets.

Paid plans (free keys see the last 30 days)

Permit history for the collateral

Look a property up by street address with /v1/property/history or by APN with /v1/property/by-parcel (formatting is ignored, so the appraiser's APN matches the permit feed's). You get every matched permit plus a derived profile: first and last permit dates, a category breakdown, contractors of record, and the most recent roofing, HVAC, solar and pool permit dates.

Two fields exist for underwriting specifically. data_currency says how current each source behind the answer is. distinct_addresses and fan_out_warning tell you when a parcel number spans more than one building, so a campus or a subdivision is never silently treated as one property.

request
# A Boulder, CO commercial parcel
curl "https://api.permit-stack.com/v1/property/by-parcel?parcel=172713000011\
&state=CO" \
  -H "X-API-Key: pk_your_key_here"
response (truncated)
{
  "found": true,
  "total_matches": 52,
  "distinct_addresses": 3,
  "fan_out_warning": null,
  "summary": {
    "first_permit_date": "1992-12-23",
    "last_permit_date": "2026-07-17",
    "years_of_history": 34,
    "categories": {"ROOFING": 4, "SOLAR": 6, "RENOVATION": 5,
                   "INTERIOR_REMODEL": 3, "OTHER": 24, ...},
    "signals": {
      "last_roofing_date": "2011-03-21",
      "last_hvac_date": "2022-02-10",
      "last_solar_date": "2023-08-14",
      ...
    }
  },
  "data_currency": [
    {"jurisdiction": "Boulder", "data_through": "2026-09-27",
     "status": "current", ...}
  ],
  "permits": [
    ...,
    {"permit_number": "BLD-NRE2026-00091", "status": "FILED",
     "category": "INTERIOR_REMODEL", "property_type": "COMMERCIAL",
     "description_raw": "Tenant Finish",
     "estimated_value": 17620353.0, "date_filed": "2026-06-26",
     "contractor_name": "BNBUILDERS INC", ...}
  ]
}
Indie and above (radius search)

What is being built around it

A radius query with property_type=commercial and min_value shows the significant projects filed near a property: new supply, tenant build-outs, additions. Results come newest first, with the contractor of record where the source names one.

request
# Commercial permits over $1M within 1 mile, last 12 months
curl "https://api.permit-stack.com/v1/permits/search?lat=40.0210\
&lng=-105.2183\
&radius_miles=1\
&property_type=commercial\
&min_value=1000000\
&date_after=2025-10-01" \
  -H "X-API-Key: pk_your_key_here"
response (truncated)
{
  "total": 7,
  "results": [
    ...,
    {"permit_number": "BLD-NRE2026-00101", "status": "FILED",
     "category": "ADDITION", "property_type": "COMMERCIAL",
     "address_street": "6007 OREG AVE", "address_city": "Boulder",
     "description_raw": "Addition and Alteration",
     "estimated_value": 1574209.0, "date_filed": "2026-07-06",
     "contractor_name": "CALCON CONSTRUCTORS INC", ...}
  ],
  "coverage": [{"jurisdiction": "Boulder", "data_through": "2026-09-27",
                "status": "current", ...}],
  "total_capped": false
}
Developer and above

New-construction pipeline for a submarket

/v1/metrics/monthly returns permit counts and total valuation (the sum of the values sources publish) per month for a city, state and category, served from a nightly rollup so it answers in milliseconds. /v1/metrics/cities ranks the busiest cities in a state. Use them for supply trend lines in a credit memo or a market-monitoring dashboard.

The newest month is partial until it closes, and undated counts permits whose source published no date, so they are never silently dropped.

request
# Six months of new-construction permits in Nashville
curl "https://api.permit-stack.com/v1/metrics/monthly?city=Nashville\
&state=TN\
&category=NEW_CONSTRUCTION\
&months=6" \
  -H "X-API-Key: pk_your_key_here"
response (truncated)
{
  "filters": {"state": "TN", "city": "NASHVILLE",
              "category": "NEW_CONSTRUCTION", "months": 6, ...},
  "series": [
    {"month": "2026-04", "permits": 402, "total_value": 155896771.0},
    {"month": "2026-05", "permits": 363, "total_value": 166259163.0},
    {"month": "2026-06", "permits": 383, "total_value": 138421329.0},
    {"month": "2026-07", "permits": 402, "total_value": 135193031.0},
    {"month": "2026-08", "permits": 393, "total_value": 161414333.0},
    {"month": "2026-09", "permits": 383, "total_value": 132528280.0}
  ],
  "undated": 0,
  "as_of": "2026-09-29T10:10:00Z", ...
}
Every paid plan

Large projects and who is building them

Filter a metro for large commercial new construction to track construction-lending opportunities, sponsor activity and general contractors. status, date_filed and date_issued show where each project sits, where the source publishes them. When a source's status is not available, as in the Nashville example, the API says UNKNOWN rather than guessing.

request
# Commercial new construction over $5M in Nashville since April
curl "https://api.permit-stack.com/v1/permits/search?city=Nashville\
&state=TN\
&property_type=commercial\
&category=new_construction\
&min_value=5000000\
&date_after=2026-04-01" \
  -H "X-API-Key: pk_your_key_here"
response (truncated)
{
  "total": 12,
  "results": [
    ...,
    {"permit_number": "2026014558", "status": "UNKNOWN",
     "category": "NEW_CONSTRUCTION", "property_type": "COMMERCIAL",
     "address_street": "2791 COUCHVILLE PIKE", "address_city": "Nashville",
     "description_raw": "Warehouse, Storage S-1",
     "estimated_value": 17314870.0,
     "date_filed": "2026-02-19", "date_issued": "2026-08-28",
     "contractor_name": "ARCO/Murray", ...}
  ],
  "coverage": [{"jurisdiction": "Nashville (ArcGIS)",
                "data_through": "2026-09-26", "status": "current", ...}]
}
CSV on every paid plan; sync on Business

Bulk delivery into your warehouse

/v1/permits/export streams the same filters as search to CSV (up to 50,000 rows per request on Developer, 200,000 on Business and Scale). For a standing copy, /v1/permits/sync pages the dataset by a cursor: one initial load, then only new and changed permits after each nightly ingest, optionally scoped by state or category.

request
# Boulder commercial permits over $1M in 2026, as CSV
curl "https://api.permit-stack.com/v1/permits/export?city=Boulder\
&state=CO\
&property_type=commercial\
&min_value=1000000\
&date_after=2026-01-01\
&limit=50000" \
  -H "X-API-Key: pk_your_key_here" \
  -o boulder_commercial.csv
boulder_commercial.csv (header and first row)
permit_number,jurisdiction,status,category,address_street,address_city,address_state,address_zip,description,estimated_value,date_filed,date_issued,date_completed,permit_id,solar_kw,enriched_scope,contractor_name,owner_name,contractor_id,contractor_license
BLD-NRE2026-00138,Boulder,FILED,ADDITION,3280 AIRPORT RD,Boulder,CO,80301,Addition and Alteration,8300000.0,2026-09-08,,,38337e7d-...,,,BOULDER COUNTY BUILDING SERVICES,,74828f56-...,
...

What permit data can and cannot tell an underwriter

Underwriting leans on negatives: no re-roof, no additions, no open permits. A negative is only as good as the source behind it, so the API tells you how good that source is on every answer.

Check your market before you pay

The coverage check is free and needs no account. It answers with the permits we hold for a city over the last 12 months, the date each source's data runs through, and whether that source is current or lagging. The same box sits in the pricing section of the homepage.

coverage_check.sh
curl "https://api.permit-stack.com/v1/coverage/check?city=Austin&state=TX"

Which plan fits

Most lending and CRE teams run on Business: the change feed keeps a local copy current and the request budget covers portfolio lookups. Developer is enough for a pilot; Scale is for national, portfolio-wide pulls.

Developer

$79/mo
or $790/year, two months free
  • 10,000 requests/day, 60/min
  • Webhooks (up to 10 per key)
  • /v1/metrics monthly series and city rankings
  • CSV export up to 50,000 rows per request
  • fields=full on search
Best fit for most teams

Business

$149/mo
or $1,490/year, two months free
  • 100,000 requests/day, 200/min
  • /v1/permits/sync change feed (cursor-based)
  • Property-owner mailing address, where the county publishes it
  • CSV export up to 200,000 rows per request
  • Priority support

Scale

$499/mo
or $4,990/year, two months free
  • 500,000 requests/day, 500/min
  • Everything in Business
  • 500 saved searches
  • Same-business-day support
  • Up to 2 prioritised coverage requests per quarter (best effort)

Every plan is self-serve through Stripe and you can start on the free tier (100 requests/day, last 30 days of permits). For licensing or redistribution, email support@permit-stack.com.

Questions we get from lending teams

Can permit data verify the age of a roof or HVAC system on collateral?

It can date the most recent permitted roof, HVAC, solar or pool work at an address or parcel: /v1/property/history and /v1/property/by-parcel return last_roofing_date, last_hvac_date and similar signals from every matched permit. It cannot see work that was never permitted, and a permit records that work was authorized rather than finished. The status field shows FINAL, EXPIRED or CANCELLED where the source publishes status.

What does it mean when a property has no permits?

It depends on whether we cover the city. A found: false answer carries a coverage block. In a covered, current jurisdiction it reads covered: true with a data-through date, and no record most likely means no permit exists. Where we do not cover the city, the note tells you to treat the result as unknown.

How current is the data?

Sources are polled daily, with the main ingest at 03:00 UTC. Every jurisdiction reports data_through, the newest permit we actually hold, and a label: current under 45 days, lagging under a year, stale beyond that. Some cities publish weeks after the fact, so we show the date rather than promise a lag.

Do you include property-owner information?

Owner name is returned where the source publishes it. The property-owner mailing address is on Business ($149/mo) and Scale ($499/mo), and only where the county publishes it: near-complete in counties whose assessor roll we hold and absent elsewhere. Check owner_coverage_label per jurisdiction in /v1/jurisdictions before relying on it.

Which plan fits a lending or CRE team?

Developer ($79/mo) covers pilots: property lookups, radius search, the metrics endpoints and 50,000-row CSV exports. Business ($149/mo) adds the /v1/permits/sync change feed, owner mailing address where published and 100,000 requests a day. Scale ($499/mo) is for portfolio-wide pulls at 500,000 requests a day with same-business-day support. For licensing or redistribution, email support@permit-stack.com.

Is my market covered?

Check before you pay. GET https://api.permit-stack.com/v1/coverage/check?city=Austin&state=TX needs no key and returns the permits we hold for that city over the last 12 months and how current each source is. The same check is in the pricing section of the homepage.

Underwrite with the permit record

115M+ permits · 871 active data sources · 48 states and DC · data-through date on every answer

Get Free API Key See pricing