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.
# 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)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.
From 871 active data sources in 8,000+ cities across 48 states and DC, plus 75 historical-archive jurisdictions for back-history.
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.
100 free requests per day, no card. Free keys see the last 30 days of permits; paid plans remove the date limit.
Each example below is a real request and a trimmed copy of the response it returned. Swap in your own addresses, parcels and markets.
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.
# 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"{
"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", ...}
]
}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.
# 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"{
"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
}/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.
# 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"{
"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", ...
}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.
# 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"{
"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", ...}]
}/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.
# 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.csvpermit_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-...,
...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.
FINAL, EXPIRED or CANCELLED; where it does not, status is UNKNOWN. Work that was never permitted cannot appear./v1/property/history returns found: false with a coverage block: covered: true and a data-through date for a city we hold, or a note telling you to treat the result as unknown when we do not cover that city.data_through is the newest permit we actually hold, never the time we last polled. Sources are labelled current (under 45 days), lagging (under a year) or stale, and a source that is refusing our requests says so.estimated_value is the job valuation the source publishes. It is not an appraisal and some sources publish none./v1/jurisdictions states it per jurisdiction.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.
curl "https://api.permit-stack.com/v1/coverage/check?city=Austin&state=TX"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.
/v1/metrics monthly series and city rankingsfields=full on search/v1/permits/sync change feed (cursor-based)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.
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.
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.
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.
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.
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.
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.
115M+ permits · 871 active data sources · 48 states and DC · data-through date on every answer