Contractor Lead Finder - Live Building Permits avatar

Contractor Lead Finder - Live Building Permits

Pricing

from $32.00 / 1,000 contractor leads

Go to Apify Store
Contractor Lead Finder - Live Building Permits

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

Michael H

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Categories

Security

Limited permissions

Share

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

  1. 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.
  2. Press Start. A default run takes a few seconds.
  3. 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):

ContractorScoreTradePermitsLast permitPhone
Base Power80Electrical442026-09-18(512) 902-••••
Texas Multifamily Solution, LLC80HVAC / Mechanical382026-09-18(512) 745-••••
Precision Reconstruction Group80Roofing142026-09-17(972) 971-••••
McCullough Heating & Air80HVAC / Mechanical132026-09-18(512) 280-••••
Radiant Plumbing & AC75Plumbing72026-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

SignalMax pointsWhy
Permit volume in window40The strongest signal a trade business is real and spending. A shop pulling eight permits a month has payroll and a budget.
Reachability20 + 5A 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 value20How much money is moving through the business.
Recency15A permit from last week beats one from three months ago.
Identifiable trade5Makes it possible to write a relevant pitch.

Supported cities

CityContractor namePhoneEmailJob valueNotes
Austin, TX✅✅ yes—partialPhones 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—partialPhone 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✅——partialThe 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

FieldTypeDefaultNotes
citiesarray["austin"]Which city feeds to query
outputModestring"contractors"contractors = ranked lead list · permits = raw permit rows
tradesarray[] (all)16 trades: roofing, solar, hvac, plumbing, electrical, pool, remodel, addition, newConstruction, demolition, windowsDoors, fenceDeck, foundation, siding, signage, fireSprinkler
daysBackinteger147–30 is the useful range for outreach
minJobValueinteger0See caveat below
requireContractorbooleantruePermits with no named contractor cannot become leads
requirePhonebooleanfalseKeeps only results with a phone: Austin, Mesa, and New York contractors whose license record or filings carry one
zipCodesarray[]Restrict to specific job-site ZIPs. Mesa and Phoenix publish none, so this removes their results
maxResultsinteger50Hard cap on results and therefore on cost. 50 contractor leads cost at most $2
socrataAppTokenstring—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_SUMMARY record 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[].windowCapped is true and windowCoveredFrom gives 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).
  • phoneSource says where each phone came from. For New York it names the dataset and the contractor's DOB license: either the license record, for example NYC DOB license record (t8hj-ruu2), GC license 613861, or the older filings with the date that phone was last filed, for example NYC 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 as ACTIVE or EXPIRED. Permit rows carry the same as contractorLicense, contractorLicenseType, contractorLicenseStatus and contractorEmail.
  • Dates are ISO YYYY-MM-DD. Three different upstream date formats — ISO strings, epoch milliseconds, and MM/DD/YYYY text — 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[].licenseContacts and .phoneEnrichment record 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 tradeConfidence so 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.