Contractor Lead Finder - Live Building Permits
Pricing
from $32.00 / 1,000 contractor leads
Contractor Lead Finder - Live Building Permits
Ranked contractor leads from official building permits. Roofing, HVAC, solar, plumbing, electrical. Austin and NYC with phones, plus Seattle, Phoenix and 3 more cities.
Pricing
from $32.00 / 1,000 contractor leads
Rating
0.0
(0)
Developer
Michael H
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
Contractor Leads with Phone Numbers from Building Permits
Contractor leads from official city building permits: roofing, HVAC, solar, plumbing and electrical contractors, ranked by how busy they are right now. Phone numbers in Austin, New York City and Mesa, and business emails in New York City. Also Phoenix, Seattle, Sacramento, Denver, Louisville, New Orleans and Cincinnati.
Every day, US cities publish the building permits they issue, and most of those permits name the contractor doing the work. This Actor reads those official city feeds, works out which trade each job belongs to, and rolls thousands of individual permits up into a ranked list of businesses you can actually call. One row = one contractor business, not one permit.
You get contractors, not paperwork.
Quick start and cost
- Pick a city (Austin, New York and Mesa have phone numbers; New York also has emails) and, if you like, a trade such as roofing or HVAC.
- Press Start. A default run takes a few seconds.
- Open the Output tab and download the list as CSV or Excel.
You pay $0.04 per contractor delivered. One contractor record rolls up all of that business's recent permits, so you pay per business, not per permit row. The default run returns up to 50 contractors, which costs at most $2.00. Zero results cost nothing for results.
Example output from a run on 20 September 2026 (Austin, last 14 days; phone numbers shortened here):
| Contractor | Score | Trade | Permits | Last permit | Phone |
|---|---|---|---|---|---|
| Base Power | 80 | Electrical | 44 | 2026-09-18 | (512) 902-•••• |
| Texas Multifamily Solution, LLC | 80 | HVAC / Mechanical | 38 | 2026-09-18 | (512) 745-•••• |
| Precision Reconstruction Group | 80 | Roofing | 14 | 2026-09-17 | (972) 971-•••• |
| McCullough Heating & Air | 80 | HVAC / Mechanical | 13 | 2026-09-18 | (512) 280-•••• |
| Radiant Plumbing & AC | 75 | Plumbing | 7 | 2026-09-18 | (512) 263-•••• |
Who uses contractor leads from building permits
- Building material suppliers and distributors: find the roofers, HVAC shops, plumbers and electricians who just pulled permits in your territory.
- Dumpster, portable toilet and equipment rental companies: every permitted job needs a site, and the contractor pulling permits every week is your repeat customer.
- Insurance agents who cover contractors: busy contractors need liability, workers' comp and bonds.
- Marketing, web and software vendors selling to contractors: a permit is proof a business is real, active and spending money this month.
- Subcontractors looking for general contractors with live projects.
- AI agents doing sourcing or prospecting research: the output is clean, typed JSON with a documented schema.
What makes this different
Most permit tools hand you permit rows. A permit row is an event. If you are selling something, you don't want 4,000 events — you want the 180 businesses behind them, sorted by which ones are worth a phone call.
That is the default output here. Each contractor comes back as one record:
{"contractorName": "A-Plus Energy Management","leadScore": 82,"leadScoreReasons": ["6 permits in window (+31)","direct phone on file (+20)","$184,000 total job value (+10)","most recent permit 2 day(s) ago (+15)","identifiable trade: HVAC / Mechanical (+5)"],"phoneFormatted": "(512) 555-0142","phoneSource": "City of Austin permit record (dataset 3syk-w9eu)","primaryTradeLabel": "HVAC / Mechanical","trades": [{ "trade": "hvac", "label": "HVAC / Mechanical", "permits": 5 },{ "trade": "electrical", "label": "Electrical", "permits": 1 }],"permitCount": 6,"totalJobValue": 184000,"avgJobValue": 30667,"firstPermitDate": "2026-07-29","lastPermitDate": "2026-08-14","addressCity": "Austin","marketsActive": ["Austin"],"samplePermitNumbers": ["2026-103853 MP", "2026-101120 MP"],"sampleWork": ["Replacement of complete existing central heat and air system..."]}
New York records can also carry the business email and the license status from the contractor's Department of Buildings license record. An invented example of the extra fields:
{"contractorName": "Example Builders Corp","phoneFormatted": "(718) 555-0100","phoneSource": "NYC DOB license record (t8hj-ruu2), GC license 612345","email": "office@example.com","emailSource": "NYC DOB license record (t8hj-ruu2), GC license 612345","licenseNumber": "612345","licenseType": "GC","licenseStatus": "ACTIVE"}
The score is explained, not hidden. leadScoreReasons shows exactly how every point was earned, so you can argue with the ranking instead of trusting it blindly.
How the ranking works
| Signal | Max points | Why |
|---|---|---|
| Permit volume in window | 40 | The strongest signal a trade business is real and spending. A shop pulling eight permits a month has payroll and a budget. |
| Reachability | 20 + 5 | A phone number on file (20). A lead you cannot call is worth much less. A business email on file adds 5 (New York). |
| Total job value | 20 | How much money is moving through the business. |
| Recency | 15 | A permit from last week beats one from three months ago. |
| Identifiable trade | 5 | Makes it possible to write a relevant pitch. |
Supported cities
| City | Contractor name | Phone | Job value | Notes | |
|---|---|---|---|---|---|
| Austin, TX | ✅ | ✅ yes | — | partial | Phones on nearly every permit, published by the city |
| New York City, NY | ✅ | ✅ most licensed contractors | ✅ many | ✅ | Phone and email from the contractor's Department of Buildings license record, plus the license status; where the record has no phone, the phone from their older permit filings, which may be years old. Very high volume |
| Mesa, AZ | ✅ | ✅ yes | — | partial | Phone printed by the city on about 3 in 4 permits that name a contractor, plus the contractor's Arizona license number. No job-site ZIP. Credit to the City of Mesa travels with every record |
| New Orleans, LA | ✅ | — | — | partial | The contractor's licensed trade, and a license number on most electrical, plumbing and mechanical permits. Job value is 0 on plumbing permits |
| Cincinnati, OH | ✅ | — | — | ✅ | Coarser trade matching: the city publishes a permit category (HVAC, plumbing, alteration, signs), not a work description. Owner-builder permits are left out |
| Louisville, KY | ✅ | — | — | ✅ | Coarser trade matching (no free-text work description) |
| Sacramento, CA | ✅ | — | — | ✅ | Current year only |
| Phoenix, AZ | ✅ | — | — | — | |
| Seattle, WA | ⚠️ ~9% | — | — | ✅ | Contractor named on only about 1 permit in 11 |
| Denver, CO | ✅ | — | — | ✅ | Publishes with a multi-month lag; CC BY 3.0 credit attached to every record |
Cities deliberately not included, and why. Philadelphia and Nashville both publish excellent permit feeds, but their open-data terms bar commercial republication without written permission, so they are switched off in code. Chicago's terms are bespoke and have not yet been read. This Actor only serves data it is allowed to serve — if you need one of those cities, ask, and it will be added the day the permission exists.
Adding a city is a config change, not a code change — see src/cities.js.
Where the data comes from, and why you can use it
Official municipal open-data APIs only. No scraping. No terms-of-service grey area.
Every source is a documented, public API published by the city itself — Socrata/SODA, ArcGIS REST, or Carto SQL — and every source's actual license or terms were read before it was enabled. The read date and the source URL are recorded in the code and reported in every run summary. Three kinds of permission are accepted, in two license tiers:
- Public-domain dedications (tier
dedication) —USGOV_WORKS(Austin),PUBLIC_DOMAIN(Seattle, Cincinnati),CC0_10(New Orleans, Creative Commons CC0 1.0),PDDL(Louisville). - Attribution licenses (tier
permissive) —CC BY 3.0(Denver). The required credit line is attached to every record. - Open-data statutes and city terms that permit redistribution (tier
permissive) — NYC Administrative Code § 23-502(d) ("without any registration requirement, license requirement or restrictions on their use"), which covers all three New York datasets used here: the permit feed, the Department of Buildings license register the emails, license statuses and most phones come from, and the older permit filings that fill in the remaining phones; Sacramento and Phoenix open-data terms (explicit grant to use, reproduce and redistribute; no commercial restriction); Mesa's open-data license agreement ("no restrictions on copying, publishing, distributing, modifying or using the data for a commercial or non-commercial use", on condition that the City is listed as the source).
Sources whose terms restrict commercial use (tier restricted), or whose terms have not been read (tier unreviewed), are shipped disabled and cannot be selected, even by editing the input. The license gate is enforced in code and covered by tests, not documented as an intention.
Every record carries an _attribution array with one entry per source: the source name, link, license, the credit line the city asks for, and the retrieval time. If you republish results, carry that credit forward — for Denver, NYC, Louisville and Mesa it is a condition of the license, not a courtesy.
Accuracy disclaimer: cities do not warrant the completeness or accuracy of their permit data, and neither does this Actor. It republishes what the city published. Verify anything you intend to rely on.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
cities | array | ["austin"] | Which city feeds to query |
outputMode | string | "contractors" | contractors = ranked lead list · permits = raw permit rows |
trades | array | [] (all) | 16 trades: roofing, solar, hvac, plumbing, electrical, pool, remodel, addition, newConstruction, demolition, windowsDoors, fenceDeck, foundation, siding, signage, fireSprinkler |
daysBack | integer | 14 | 7–30 is the useful range for outreach |
minJobValue | integer | 0 | See caveat below |
requireContractor | boolean | true | Permits with no named contractor cannot become leads |
requirePhone | boolean | false | Keeps only results with a phone: Austin, Mesa, and New York contractors whose license record or filings carry one |
zipCodes | array | [] | Restrict to specific job-site ZIPs. Mesa and Phoenix publish none, so this removes their results |
maxResults | integer | 50 | Hard cap on results and therefore on cost. 50 contractor leads cost at most $2 |
socrataAppToken | string | — | Optional free token; raises rate limits |
Caveat on
minJobValue: trade permits (electrical, plumbing, mechanical) frequently carry no declared valuation (New Orleans records 0 on plumbing permits), and Phoenix publishes none at all. Setting a minimum above 0 filters those out entirely. Leave it at 0 unless you specifically want large projects.
Example — roofers and solar installers in Austin, last 3 weeks, phone required
{"cities": ["austin"],"trades": ["roofing", "solar"],"daysBack": 21,"requirePhone": true,"outputMode": "contractors","maxResults": 150}
Example — every trade across four cities, raw permit rows
{"cities": ["austin", "nyc", "louisville", "phoenix"],"daysBack": 7,"outputMode": "permits","maxResults": 1000}
Pricing
You are billed per result delivered — never per permit scanned. A run that reads 5,000 permits and finds 60 contractors bills 60 results.
maxResults is a hard ceiling on both output and cost. The default is 50, so a first run with default settings costs at most $2 for results. Raise it when you want the full list.
Zero results costs nothing for results, and neither does a run that fails — the only charge in those cases is Apify's automatic Actor-start fee, a fraction of a cent.
Fresh leads every week, on autopilot
New permits are issued every day, so last month's list goes stale. Save your input as a Task, then add an Apify Schedule (for example, every Monday at 7 am) and set daysBack to 7. Each Monday you get only the contractors who pulled permits in the past week, ranked and ready to call. Apify can email you when the run finishes.
Use it from your own tools
Everything on this page is also an API. Start a run and fetch the results from your CRM, a spreadsheet, n8n, Make or Zapier with the Apify integrations, or from code through the Apify API. AI agents can call it as a tool through Apify's MCP server. The output is typed JSON with a documented schema, so it drops straight into a pipeline.
Output notes for developers
- Every record carries
_attribution(one entry per source, with license and credit line) and_retrievedAt. - A
RUN_SUMMARYrecord is written to the key-value store with per-city row counts, timings, license tier and review date, any per-city errors, and the exact date window used. - In contractor mode every run reads every permit in your date window, newest first, up to 20,000 per city, so the ranking reflects the whole window, not just its last few days. If a window holds more than that,
RUN_SUMMARY.sources[].windowCappedistrueandwindowCoveredFromgives the earliest date that was read. - Missing values are
null, never"","N/A", or a placeholder. City junk values (" ","N/A","78727-____", a name wrapped in quote marks, a license number typed into the contractor-name field) are normalized away. - Phones are E.164 (
+15125550142) plus a display form ((512) 555-0142). phoneSourcesays where each phone came from. For New York it names the dataset and the contractor's DOB license: either the license record, for exampleNYC DOB license record (t8hj-ruu2), GC license 613861, or the older filings with the date that phone was last filed, for exampleNYC DOB permit filings (ipu4-2q9a), GC license 613861; last filed 2026-09-14.email,emailSource(New York): the business email the contractor registered with the Department of Buildings, lower-cased. Placeholders such as "N/A" are dropped.licenseNumber,licenseType: the contractor's license as the permit names it (New York DOB licenses; Mesa's Arizona ROC license; New Orleans' Louisiana license).licenseStatus(New York): the status on the DOB license record, such asACTIVEorEXPIRED. Permit rows carry the same ascontractorLicense,contractorLicenseType,contractorLicenseStatusandcontractorEmail.- Dates are ISO
YYYY-MM-DD. Three different upstream date formats — ISO strings, epoch milliseconds, andMM/DD/YYYYtext — are normalized for you. - Money is a number, never a string, despite every upstream API returning strings.
- If one city's API fails, the run continues with the others and records the failure in
RUN_SUMMARY.sources[].error. If no city can be served, the run fails cleanly with an explanation and charges nothing. - If a New York contact lookup fails or runs long, the run still finishes: New York results come back without the missing emails or phones, at the same price per result, and
RUN_SUMMARY.sources[].licenseContactsand.phoneEnrichmentrecord what happened and how many licenses were matched.
Limits and honest expectations
- Contractor phone numbers exist for Austin, New York City and Mesa only, and emails for New York only. Austin prints the contractor's phone on nearly every permit, and Mesa on about 3 in 4 permits that name a contractor. New York's permit feed has no phone column, so the phone and email come from the contractor's Department of Buildings license record, matched by license number and business name; where that record has no phone, the phone they last filed on an older permit is used, which can be years old. Only general contractors, plumbers and fire-suppression contractors are looked up; homeowners, architects and engineers never are. Every other city publishes a name, and sometimes a mailing address.
- Contact details are for business outreach, and the rules are yours to follow. Email outreach in the US falls under CAN-SPAM, and calls or texts to cell phones under the TCPA. This is not legal advice; check your own use.
- Seattle names a contractor on roughly 9% of permits. That is the city's data, not a bug here.
- Denver runs months behind. Good for market research, bad for fresh outreach.
- Trade classification is keyword-based on the text the city publishes. Where a city publishes no work description (Louisville, Denver) or only a permit category (Cincinnati), classification is coarser. Cincinnati has no roofing, solar or electrical category at all, so those trade filters find nothing there. Each record reports its own
tradeConfidenceso you can filter on it. - Owner-builders are not contractors. Cincinnati records a homeowner doing their own work as "OWNER" in the company field, and New York marks the owner as the permittee; those permits never become contractor results.
- Mesa and Phoenix publish no job-site ZIP code, so a ZIP filter removes their results.
- A permit is evidence of activity, not an endorsement. It tells you a business is working and spending. It tells you nothing about whether they want what you are selling.
FAQ
Can I use this data commercially? Every source is a city's own official open-data service, and each city's license or terms were read before it was switched on and allow reuse, including commercial reuse. The license and the credit line each city asks for travel with every record. Cities whose terms bar commercial reuse, or whose terms have not been read, are switched off. This is not legal advice; check your own use.
Which cities have phone numbers and emails? Phones: Austin, New York City and Mesa. Emails: New York City. Austin publishes the contractor's phone on nearly every permit, and Mesa on about 3 in 4 permits that name a contractor. For New York, this Actor matches each licensed general contractor, plumber and fire-suppression contractor to their Department of Buildings license record by license number and business name, which gives the business email, the license status and usually the phone; the older permit filings fill in phones the record lacks. Each record's phoneSource and emailSource say where the contact came from. The other cities publish the business name, and sometimes an address.
What does a run with no results cost? Nothing for results. The only charge is Apify's automatic start fee, a fraction of a cent.
Why $0.04 a contractor, when permit tools charge less per row? Because you pay once per business, not once per permit. Busy contractors file many permits: in the example above, the five busiest filed 116 between them, and all five cost $0.20, already sorted and scored.
How is this different from a permit scraper? It reads official city data services, not web pages, and it returns ranked businesses with the reasons for each score, not thousands of raw permit rows.
Can I get new leads every week without doing anything? Yes. See "Fresh leads every week, on autopilot" above.
Can you add my city? Ask on the Issues tab. A city is added once its open-data terms allow commercial reuse.
Questions
Open an issue on this page, or ask for a city you need. Replies within 2 business days. If the leads helped you, a rating on this page helps other buyers find it.