US Building Permits - Contractor Leads with Delta Mode
Pricing
from $4.50 / 1,000 permit records
US Building Permits - Contractor Leads with Delta Mode
Call the contractor the week the permit is issued. Permits from 17 US city registers via official open-data APIs: contractor, license and phone, job value, GPS, trade and a lead score. New York and Mesa: is the license still active? Delta mode charges only new permits.
Pricing
from $4.50 / 1,000 permit records
Rating
0.0
(0)
Developer
Carlos Escanez
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
US Building Permits — contractor leads from 17 registers, only the new ones
Every building permit a city issues is a job that just got funded, with the contractor doing it printed on the record. This actor reads those records straight from the official open-data APIs of seventeen US registers, normalises them into one schema, tags the trade (roofing, solar, HVAC, electrical, plumbing, remodel...), scores the lead, and, in delta mode, delivers only the permits you have not received before, so a daily schedule becomes a feed of fresh leads you pay for once.
No website scraping, no proxies, no login: the data comes from Socrata APIs the cities maintain themselves, so it does not break when a portal changes its layout.
See it run
Default input, no changes: permits issued in the last 7 days across all seventeen registers that have a contractor on file. Around 21,000 rows at the volumes measured in September 2026, of which some 14,000 are New York street and sidewalk work — pick the cities you want instead of taking the lot.
Delta feed for a roofing sales team in Texas and Florida:
{"cities": ["austin", "orlando"],"trades": ["roofing", "solar"],"onlyNew": true,"stateStoreName": "roofing-tx-fl"}
Run it every morning. The first run returns the last 7 days; every run after that returns only permits issued since the previous run, and charges only for those.
Two modes
Window mode (default): every permit issued in a date range, lastNDays or dateFrom/dateTo. Newest first. Use it for a one-off pull or a market study.
Delta mode (onlyNew: true): the actor keeps, per city, the highest issue date delivered and the ids delivered in the three days before it, in a key-value store on your account named stateStoreName. Next run it asks the city only for permits from that date on, drops the ones already delivered, and advances the mark. Cities publish with a lag of one to three days, which is why the three-day grace window exists. Different store names give you independent feeds (one per client, one per trade). resetState: true starts a feed over.
One thing to know about delta mode: a permit that your filters skip is not remembered, so widening trades, minValuation or keyword later will not bring back permits older than the feed's current position. Keep the filters stable while a feed runs, and use a new store name for a new set of filters.
The earlier lead: permit applications
stage: "applied" switches from issued permits to permit applications, filtered by application date. An application that has not been issued yet is a job that starts in 4 to 10 weeks, and nobody else in the Store separates it out. By default only pending applications are delivered (onlyPending: true); the ones already issued show up in the normal stage.
Measured on 18 September 2026, applications filed in the previous 60 days and still not issued: Orlando 2,400, New Orleans 1,738, New York electrical 1,853, Cincinnati 671, Seattle 764, Somerville 581, Everett 560, Mesa 441, New York elevators 349, Marin County 115. Austin, Baton Rouge, Chicago, NYC DOB NOW and NYC street works publish issued permits only, so the applications stage returns nothing new for them. Rows carry appliedDate, daysSinceApplied and isIssued. In delta mode, give each stage its own stateStoreName.
The later lead: completed work
stage: "completed" switches to permits whose work has passed the final inspection, filtered by completion date. A job that closed this week is a house that is being lived in again: the lead for furniture, home insurance, alarms, cleaning and solar, and a signal that no other Actor in the Store sells (one rival, one user, measured 18 September 2026).
Measured on 19 September 2026, permits with a completion date in the previous 60 days: New York electrical 64,437, Austin 8,496, Orlando 4,828, New Orleans 4,153, Seattle 3,743, Mesa 2,053, Cincinnati 1,527, Delaware wells 501. Baton Rouge, Chicago, Marin County, Somerville, Everett, NYC DOB NOW, NYC BIS, NYC elevators and NYC street works publish no completion date, so this stage returns nothing for them and the log says so. Rows carry completedDate and daysSinceCompleted, plus the contractor, trade and job value of the original permit (Austin: 279 of 300 sampled completions with a contractor). In delta mode, give each stage its own stateStoreName.
Any other Socrata city, discovered on the fly
The seventeen cities above are mapped by hand and measured. For any other US city with a Socrata open-data portal, put its name or its portal domain in Other cities (Socrata auto-discovery):
{ "discover": ["Los Angeles, CA", "data.cincinnati-oh.gov"], "lastNDays": 7 }
The run searches the Socrata catalog for that city's permit register, recognises its columns by name (permit number, issue date, address, valuation, status, contractor, phone, coordinates) and reads it exactly like the verified cities. The run log and the RUN_SUMMARY say which dataset it picked and which columns it recognised; rows from these cities carry discovered: true.
Said plainly, because this is guessed from column names and not measured:
- A dataset with no recognisable issue date or permit number is refused with the reason, never guessed at. Fort Worth's "Development Permits" is refused today: it has a file date, not an issue date.
- Contractor and phone come only when the city publishes them under a recognisable column name. Los Angeles publishes neither; Orlando publishes both and the discovery finds them. For a city with no contractor column, set
onlyWithContractorto false or the default filter drops every row (the run warns when that happens). - A city that is not on Socrata (Nashville, Boise, Chattanooga) comes back as "no Socrata dataset found", not as an empty run that looks like a quiet week.
- Measured on 21 September 2026: Los Angeles 200 of 200 sample rows usable, 186 with a value, 200 with coordinates; Cincinnati 200 of 200, 179 with a value; Orlando (rediscovered from its domain) 195 of 200 with a contractor, 110 with a phone.
With "Other cities" set and "Cities" empty, only the discovered cities run.
What every row carries, normalised across cities
- Permit:
permitNumber,permitType,workClass,description,status,appliedDate,issuedDate(YYYY-MM-DD),valuation(USD, absent when the city has none),squareFootage. - Site:
address,city,state,zip,latitude,longitude. - Contractor:
contractorName,contractorLicense,contractorPhone(E.164,+1...),contractorPhoneRaw,contractorAddress,contractorTrade(what the city calls it). - Trade:
trade, one ofroofing,solar,hvac,electrical,plumbing,remodel,new_construction,demolition,pool,fence,well_water,elevator,street_work,other. Classified from permit type, work class and description; measured 60–100 % of rows land in a named trade depending on the register, the rest areother. The last three are single-register labels, not keyword guesses: everything in the Delaware well register iswell_water, everything in the New York elevator register iselevator, and everything in the New York street-work register isstreet_work. They are tagged that way on purpose, because "REPAIR SEWER" on a New York street permit is municipal sewer work, not a plumbing job for a plumber to bid on. - Lead score
leadScore0–100: contractor on file +30, phone +15, licence +10, job value over 10k +10 / over 50k +20, issued in the last 7 days +15. - Lead grade
leadGrade: A (80+), B (60–79), C (40–59), D. Same score, easier to filter on. - Lead window: a permit is issued and the work usually starts 2 to 6 weeks later, which is the gap a sales call still fits in.
daysSinceIssued,isFreshLead(7 days or less),leadWindow(hotup to 14 days,openup to 42,lateup to 90,closedafter),leadWindowDaysLeftandleadWindowEndsOn. Rule-of-thumb thresholds, not measured per city: treat them as a sort order, not a start date. isResidential: true or false when the city says so in the permit class or description, absent when it does not.- Google Maps on the contractor (
enrichWithGoogleMaps, off by default, charged per contractor found):googlePhone,googleWebsite,googleRating,googleReviewCount,googleCategory,googleAddress,googleMapsUrl,googlePlaceId, andgoogleNamewithgoogleNameMatch(exactorclose): a result whose name does not match the contractor is thrown away, not delivered. Where the permit has no phone,contractorPhoneis filled from Google Maps andcontractorPhoneSourceisgoogle_maps; the lead score is recomputed. One search per distinct contractor, contractors without a phone first, capped byenrichMaxContractors(200 by default). See "Phone from Google Maps" below for what was measured. - Email from the contractor's website (
enrichEmailFromWebsite, off by default, charged per email found, needs the Google Maps step):email,hasEmail,emailSource(website) andemailFoundOn, the exact page the address was read from. Home page and the usual contact pages, one read per distinct website; template, hosting and placeholder addresses are dropped, and an address on the company's own domain wins over a personal one. - GPS and ZIP filled in (
geocodeMissing, on by default): where the city publishes an address without coordinates or without a ZIP, the row goes through the free US Census batch geocoder. Rows it resolves carrygeocodedBy: "census"; rows it cannot are delivered as the city publishes them. Measured on Orlando: 14 of 25 addresses resolved. contractorPermitsInCity: how many permits in the same run and city carry the same contractor name. One permit is a job; seven is an active company.- License status (New York City and Mesa only):
licenseStatusandlicenseRegister, what the official license register says today about the license on the permit. See "Contractor license status" below. - Flags to filter on:
hasContractor,hasPhone,hasLicense,isIssued. - Provenance:
source(the agency),sourceCode,sourceUrl(the permit's own page where the city offers one, otherwise the dataset),scrapedAt.
No owner names. Owners are private individuals; contractors are licensed businesses whose details the city publishes on purpose.
Example row (Austin):
{"id": "AUSTIN-2026-115314PP","city": "Austin", "state": "TX","permitNumber": "2026-115314 PP","permitType": "Plumbing Permit", "workClass": "Repair", "trade": "plumbing","description": "Replacing angle stop supply water valve with new compression valves x6","status": "Active", "appliedDate": "2026-09-02", "issuedDate": "2026-09-12","address": "2704 Acopio Bnd", "zip": "78745","latitude": 30.19335061, "longitude": -97.82913434,"contractorName": "Lugo's Plumbing Service","contractorPhone": "+15125074677","contractorAddress": "Elgin 78621","contractorTrade": "Plumbing Contractor","hasContractor": true, "hasPhone": true, "hasLicense": false,"leadScore": 80,"sourceUrl": "https://abc.austintexas.gov/web/permit/public-search-other?t_detail=1&t_selected_folderrsn=13766025"}
Contractor license status (New York City and Mesa)
Where the permit carries the contractor's license number and the license register is public, every permit says what the register says about that license today:
| City | Register | licenseStatus |
|---|---|---|
| New York City (DOB permits, the older DOB feed with phones, electrical permits) | NYC Department of Buildings License Info, about 100,000 licenses | active, or the register's own word for it (expired, on_hold, inactive, surrendered...), or not_in_register |
| Mesa, AZ | Arizona Registrar of Contractors, daily list of active licenses | active or not_in_active_list |
Measured on 2026-10-17 over 60 days of permits. New York: 25,168 DOB permits; of those with a contractor license, 24,720 active, 183 expired, 13 on hold and 19 not in the register. Mesa: 425 permits, 380 active and 12 not in the active list.
Turn on Only permits pulled with a license that is not active to get only those rows.
Said plainly:
- The status is today's, not the one on the day the permit was issued. A license that expired last week may have been valid when the permit was pulled.
- Arizona publishes only its active licenses, so "not in the active list" means expired, suspended, revoked or never issued, without saying which. Mesa's permit field also carries engineers', architects', mobile-home installers' and fire-equipment numbers, which belong to other boards: those rows are left without a status instead of being judged.
- New York permits signed by engineers or architects (PE, RA) carry a state license, not a DOB one, and are left without a status.
- No other city gets a status: New Orleans publishes its own city license numbers with no public register behind them, and Marin County's permits carry the number on about 10 % of rows.
Who runs this on a loop
- Roofing, solar and HVAC companies calling the contractor who just pulled a permit next door, or the neighbourhood around a fresh re-roof.
- Suppliers and distributors (materials, equipment, financing, insurance) who sell to contractors and want to know who is active this week and where.
- Lead-gen agencies reselling fresh permit feeds by metro and trade.
- PropTech and analytics teams tracking construction activity by zip code.
- AI agents: the input is flat and the output is one row per permit, so it works as a tool without glue code.
Coverage, said plainly
Orlando, measured on 17 October 2026: the city has published no permit issued after 23 September 2026, although its open-data register was updated on 16 October. Until Orlando catches up, a run returns its permits up to that date and nothing newer; the figures in the table below are from September.
Measured on 17 September 2026. "Permits / month" is the count of permits issued in the previous 30 days; the percentages come from the rows the release test reads (the last 14 days, up to 300 per dataset). "Contractor" means a contractor name is on the record.
| Register | Permits / month | Contractor | Phone | Licence | Job value | GPS |
|---|---|---|---|---|---|---|
| New York City street & sidewalk work (DOT) | 59,239 | 100 % | 0 % | 0 % | 0 % | 0 % |
| New York City (DOB NOW) | 13,976 | 100 % | 0 % | 100 % | 87 % | 100 % |
| Austin, TX | 4,666 | 92 % | 90 % | 0 % | 7 % | 56 % |
| New York City electrical (DOB NOW) | 4,101 | 100 % | 0 % | 100 % | 0 % | 100 % |
| Chicago, IL | 3,031 | 96 % | 0 % | 0 % | 81 % | 99 % |
| Orlando, FL | 2,544 | 100 % | 45 % | 0 % | 89 % | 0 % |
| Seattle, WA | 1,847 | 58 % | 0 % | 0 % | 98 % | 100 % |
| New Orleans, LA | 1,492 | 80 % | 0 % | 77 % | 60 % | 0 % |
| Cincinnati, OH | 793 | 98 % | 0 % | 0 % | 91 % | 98 % |
| Somerville, MA | 612 | 78 % | 0 % | 0 % | 56 % | 100 % |
| Everett, WA | 601 | 91 % | 0 % | 0 % | 95 % | 98 % |
| Baton Rouge, LA | 558 | 64 % | 0 % | 0 % | 75 % | 100 % |
| New York City legacy register (BIS) | 449 | 100 % | 100 % | 100 % | 0 % | 100 % |
| Mesa, AZ | 446 | 43 % | 26 % | 43 % | 79 % | 99 % |
| New York City elevators (DOB NOW) | 420 | 100 % | 0 % | 100 % | 100 % | 100 % |
| Marin County, CA | 386 | 87 % | 0 % | 7 % | 99 % | 97 % |
| Delaware water wells (statewide) | 221 | 100 % | 0 % | 100 % | 0 % | 96 % |
| Total | 95,382 |
What that table does not hide:
- Phone is the exception, not the rule. Four registers publish the contractor's phone: Austin, Orlando, New York's legacy BIS register (every row) and Mesa (26 % of rows). The other thirteen do not have a phone column at all. Everywhere else you get the business name, and in seven registers the licence number too, which is enough to look the company up.
- Job value is missing from five registers. New York's electrical, legacy and street-work registers and the Delaware well register publish no cost of work whatsoever, and Austin declares one on only 7 % of permits. The
valuationfield is simply absent on those rows, never zero-filled. - New York street work is not building work. The 59,239 rows a month from the DOT register are utilities, paving, sidewalks, sewers, skips, scaffolding and fences on the public way. A quarter of them belong to Con Edison, National Grid and the city's own DOT, and 46 % are renewals or re-issues of a job already permitted. There are zero roofing, solar or HVAC permits in it. It is tagged
street_workso it never lands in a roofer's feed by accident. - Mesa's contractor column is mostly commercial. The 43 % that carry a contractor concentrate in tenant improvements, commercial and sign permits; residential plumbing and single-family permits are nearly empty. Mesa's 55 solar permits a month only carry 15 contractors between them.
- Delaware is wells, not buildings. Well drilling and boreholes statewide, with contractor and licence on every row, but no cost of work and no overlap with the six building trades. Only about a third are domestic wells; the rest are agricultural, monitoring and soil borings.
- New York's legacy register is small and has no description. 449 permits a month against DOB NOW's 13,976, and it publishes neither cost of work nor a description of the job. It is here for one reason: it is the only New York register with the permit holder's phone number.
- Somerville's contractor column is only filled on building, electrical, sheet-metal and demolition permits; on plumbing and gas fitting the company is in the applicant column, and the actor uses it. On food-truck, block-party and business licences that same column holds the applicant, who is not a contractor, so the actor leaves it empty there. That is why Somerville reads 78 % and not the 95 % the raw column would suggest.
- Everett marks owner-pulled permits as "OWNER-…"; the actor drops those names rather than selling a homeowner as a contractor. Neither Everett nor Somerville publishes a licence number.
- Seattle's building permits rarely name the contractor; its trade permits (electrical, plumbing, mechanical) do, and both are included.
onlyWithContractor(on by default) drops the rest at no cost. - Chicago records list up to 15 contacts per permit; the actor picks the first one typed as a contractor and ignores owners, architects and "owner acting as general contractor".
- Orlando and New Orleans do not geocode their records; Chicago does not publish the site zip; the New York street-work register publishes neither coordinates nor zip, and gives a house number on only a third of rows (the location is usually a stretch between two cross streets).
- Trade classification is keyword based on the building registers. Fire sprinklers, signs and scaffolding land in
other. Roofing and solar have no code of their own in Somerville, Everett or New York, so they are found through the description, and Everett issued no solar permits at all in the month measured.
Reliability, said plainly
- Sources are government APIs with stable schemas. The actor is tested against all seventeen live before every release, including a floor on the monthly volume of each one; a register that renames a column, empties out or stops publishing fails the test, not your run.
- A city that is down is reported in
failedCitiesin the run summary and skipped; the other cities still deliver. In delta mode nothing is delivered from a city that failed mid-read, so its watermark never advances on a partial read. - Socrata's public rate limit is shared. For very large pulls (tens of thousands of rows) pass a free
socrataAppTokenand you get your own quota. - The run summary (
RUN_SUMMARYin the key-value store) lists rows read and delivered per city and the delta watermark, so you can audit every run.
Phone from Google Maps, measured
Thirteen of the seventeen registers publish no contractor phone. With enrichWithGoogleMaps on, every distinct contractor in the run is searched once on Google Maps, and the result is kept only when its name matches the contractor's: on 22 September 2026 the search for "Haynes Heating Systems" came back with "Hayes Mechanical", and that kind of answer is dropped rather than sold. Measured on 22 September 2026 on the largest contractors of the last 45 days: Seattle, 33 contractors searched, 19 found, 16 kept after the name check, which put a phone on 55 of 80 permit rows that had none; Chicago, 40 searched, 14 found, 7 kept (small general contractors there mostly have no Google listing). A run with enrichWithGoogleMaps on takes about one second more per contractor.
Google limits how fast it answers. The run stops asking after three blocked requests in a row and says so; the permits are still delivered, without the Google Maps fields.
Email from the website. With enrichEmailFromWebsite on, each website Google Maps returned is read once (home page, then /contact, /contact-us, /about), stopping at the first page with an address. Measured on 23 September 2026 in Seattle: 19 websites read, 11 with an address, which put an email on 30 of 80 permit rows. Every row says where the address was read from, so you can check it before you write.
Neighbourhood income and home value by ZIP (free)
With enrichWithCensus on, every row also carries the Census ACS 5-year figures for its ZIP code: zipMedianHouseholdIncome, zipMedianHomeValue, zipOwnerOccupiedShare (percent) and zipPopulation, with zipDataYear. One request per run fetches the whole ZIP table, so it costs nothing extra and adds no time worth noticing. It needs a free Census API key (censusApiKey in the input, or the Actor's own); without a valid key the run says so in the log and delivers the rows without these fields, never with a guessed number. Rows whose register publishes no ZIP stay without them.
Pricing
Pay per permit delivered. Filtered-out rows cost nothing, and in delta mode rows you already received cost nothing. A daily roofing-and-solar feed for Austin and Orlando is a few dozen rows a day.
Google Maps enrichment is a separate event, enrich_contractor, charged once per contractor found and name-verified, never per permit and never for a search that finds nothing or finds the wrong company. Email from the website is another, email_found, charged once per email found; a website with no address costs nothing.
Data source
Official open-data portals of the City of Orlando, City of Austin, City of New Orleans, City of Seattle, City of Cincinnati, City of Baton Rouge / East Baton Rouge Parish, County of Marin, City of Chicago, City of Somerville, City of Everett, City of Mesa, the Delaware DNREC Division of Water, the NYC Department of Transportation and the NYC Department of Buildings (DOB NOW building, electrical and elevator registers, plus the legacy BIS issuance register), all published under open-data terms. Building permits are public records in every one of these jurisdictions.