Contractor License Leads — Licensed Contractors WA, CA, TX
Pricing
from $80.00 / 1,000 lead returneds
Contractor License Leads — Licensed Contractors WA, CA, TX
Export licensed contractors from Washington, California and Texas license searches: trade, license number, status, city, ZIP. About USD 100 per 1,000.
Pricing
from $80.00 / 1,000 lead returneds
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Contractor License Leads exports licensed contractor records from state licensing sources in Washington, California and Texas: business name, trade or classification, license number, license status, city, ZIP and county, plus phone, address, entity type and license dates where the state publishes them. It is built for building-supply, insurance, software and staffing teams that sell to licensed contractors, and it costs about USD 100 per 1,000 leads on the FREE tier (USD 80 per 1,000 on GOLD).
What data does Contractor License Leads return?
Each lead is one dataset row with the same shape for every state:
| Field | What it contains |
|---|---|
business_name | Licensed business or contractor name |
business_type | Entity type, for example Limited Liability Company, Corporation or Sole Owner (Washington and California) |
principal_name | First owner, partner or member on the Washington license, when listed |
specialty, license_type | Trade, classification or program text from the state, for example Electrical Contractor |
license_number | State license number |
status | Active, Expired, Suspended, Revoked, Canceled, Inactive or the source text |
phone, address | Business phone and address (Washington and California; Texas only when the license page lists them, which is rare) |
city, zip, state | City and ZIP as published; two-letter state code |
region | County, as the state writes it |
effective_date, expiration_date | Issue and expiration dates as YYYY-MM-DD |
detected_at, source_url | Collection time and the state's page for that license |
raw | The source record before normalization, only with Include raw record on |
Fields a state does not publish are null. The run summary is saved as OUTPUT with the total, the count per state, records removed by filters, the stop reason, any source errors and the charged events.
Which states are covered, and what does each include?
| State | Source | Fields filled | Evidence |
|---|---|---|---|
| WA | Washington L&I "Verify a Contractor" search, then each license's detail record | Name, entity type, owner or partner, phone, address, city, county, ZIP, specialty, license type, status, issue and expiration dates | Cloud run 2026-10-27: 50 of 50 rows had phone, address and dates |
| CA | CSLB Public Data Portal list of currently renewed licenses, read one county at a time | Name, entity type, phone, address, city, county, ZIP, classifications, status, issue and expiration dates | Cloud run 2026-10-27: Fresno electrical contractors with phone and address |
| TX | TDLR license search for A/C, elevator, electrician, water well, mold and EV charging programs, then each license page | Name (with business name in brackets), county, license number and description, status, issue and expiration dates | Cloud run 2026-10-27: 3 active A/C contractor licenses |
Texas pages rarely list a phone, street address, city or ZIP, so those Texas fields are usually null. Texas status comes from the license page or, when the page shows none, from the expiration date. California has no owner name in the source, so principal_name is null there. If a Washington detail record cannot be read, that row keeps the search fields only (name, license type, city, ZIP, status).
How do I get a list of licensed contractors by state, city or trade?
Set the states, optional filters and a per-state limit.
| Input | Example | How it works |
|---|---|---|
states | ["WA"] | Two-letter codes from WA, CA, TX. An empty list runs all three. Unknown codes alone fail the run with the supported list |
active_only | true | Keeps only records whose status is Active (default on) |
cities | ["Seattle", "Spokane"] | Exact city match, any capitalization. Washington filters on the source |
specialties | ["electrical", "plumbing"] | Keyword match inside specialty or license_type, using the state's own words. California also downloads only classifications whose name contains the keyword |
max_per_state | 50 | Leads delivered per state (default 1,000; the Console example uses 50) |
include_raw | false | Adds the source record as raw |
Filtered records are free and do not count toward the limit. Each state stops after delivering max_per_state leads. To keep narrow filters bounded, Washington stops after reading 300 + 20 × max_per_state search rows, California after 120 list downloads, and every run stops about a minute before its timeout and saves what it found. A narrow city or trade filter can therefore return fewer leads than the limit; set a maximum cost per run to bound spend.
Fifty Washington licenses (the Console example):
{ "states": ["WA"], "max_per_state": 50 }
Texas air-conditioning licenses, including expired ones:
{ "states": ["TX"], "specialties": ["air conditioning"], "active_only": false, "max_per_state": 200 }
Trade words must match how the state writes them. Washington uses labels such as Construction Contractor, Electrical Contractor and Plumbing Contractor, so HVAC matches nothing there.
Is this a contractor license lookup for one license number?
No. There is no license-number input; the Actor lists licenses in bulk. For single checks, use the state's own lookup or a state-specific Actor such as TDLR License Scraper or California CSLB Scraper.
When should I use it, and when not?
Use it when you want one dataset of licensed contractors across Washington, California and Texas, filtered by status, city or trade, for prospecting or market sizing.
Use another Actor when:
- You need Washington only: Washington Contractor Directory & Leads Scraper.
- You need Oregon: Oregon CCB Contractor License Scraper. For Florida: Florida Contractor Directory & Leads Scraper.
- You want contractor phones and websites from Google Maps instead of license data: Contractor Leads Scraper.
How do I run it from code?
JavaScript with apify-client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/contractor-license-leads').call({states: ['WA'],specialties: ['electrical'],max_per_state: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const lead of items) console.log(lead.business_name, lead.license_number, lead.city);
Python with apify-client:
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/contractor-license-leads").call(run_input={"states": ["CA"],"cities": ["Fresno"],"max_per_state": 100,})for lead in client.dataset(run.default_dataset_id).iterate_items():print(lead["business_name"], lead["status"], lead.get("phone"))
Use it from an AI assistant
Contractor License Leads works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add the single-tool URL https://mcp.apify.com/?tools=muhammadafzal/contractor-license-leads and ask, for example: "Get 50 active electrical contractor licenses in Washington with license numbers and cities." Each lead costs about USD 0.10, so include a limit.
What does the output look like?
One Washington and one California record from the 2026-10-27 cloud runs:
[{"business_name": "A & A CONST & DEVELOPMENT INC","business_type": "Corporation","principal_name": "WILLIAM LAWSON","phone": "(509) 624-1170","address": "621 W Mallon Avenue Suite 601, SPOKANE, WA 99201","city": "SPOKANE","region": "SPOKANE","state": "WA","zip": "99201","specialty": "GENERAL","license_number": "AACONDI134LE","license_type": "Construction Contractor","status": "Active","effective_date": "1987-06-05","expiration_date": "2028-10-22","detected_at": "2026-10-27T08:03:50.093Z","source_url": "https://secure.lni.wa.gov/verify/Detail.aspx?UBI=601009376&LIC=AACONDI134LE&SAW=","raw": null},{"business_name": "JORGENSEN COMPANY","business_type": "Corporation","principal_name": null,"phone": "(559) 268-6241","address": "2467 FOUNDRY PARK AVE, FRESNO, CA 93706","city": "FRESNO","region": "Fresno","state": "CA","zip": "93706","specialty": "Electrical Contractor, Fire Protection Contractor","license_number": "262995","license_type": "C10, C16","status": "Active","effective_date": "1970-05-12","expiration_date": "2028-03-31","detected_at": "2026-10-27T07:45:47.904Z","source_url": "https://www.cslb.ca.gov/OnlineServices/DataPortal/ListByCounty","raw": null}]
California rows point to the CSLB data portal they came from, because CSLB has no public per-license link outside its protected search.
Pricing: how much does a licensed contractor list cost?
The Actor uses pay-per-event pricing, and platform usage is included in the event prices.
| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM / DIAMOND |
|---|---|---|---|---|---|
| Lead returned (one dataset row) | USD 0.100001 | USD 0.0975 | USD 0.095 | USD 0.08 | USD 0.08 |
| Actor start (listed) | USD 0.200001 | USD 0.195 | USD 0.19 | USD 0.16 | USD 0.16 |
The start event is charged once per started GB of run memory; the default 512 MB is one event. Leads are charged after they are saved, and only leads that pass your filters are charged. The 2026-10-27 default run charged 1 start event and 50 lead events for 50 rows.
Worked totals on the FREE tier at the default memory:
- 50 leads: USD 0.200001 + 50 × USD 0.100001 = USD 5.200051
- 1,000 leads: USD 0.200001 + 1,000 × USD 0.100001 = USD 100.201001
Apify requires a maximum cost per run of at least about USD 0.30 for this Actor.
Limits and reliability
- Default run timeout is 600 seconds. 50 Washington leads took about 2 minutes, because each Washington license needs a paced detail request. The run stops about a minute before its timeout and saves what it found, so raise the timeout for large or multi-state runs.
- Deduplication: within a state, by license number.
- Status comes from the state's record (Washington detail record, California list, Texas license page or expiration date); confirm standing with the state before relying on it.
- Failures: if one state's source fails, the run logs the error in
OUTPUTand continues with the next state. A run where every requested state fails ends as failed. - Status message: every run ends with the delivered count per state, records removed by filters, the stop reason and the charged events.
FAQ
Does it include contractor phone numbers?
Yes for Washington and California, when the state lists one. Texas pages rarely list a phone.
Can I get every licensed contractor in a state?
Set a high max_per_state and a longer run timeout. Washington is read through letter and trade-word searches, so coverage is broad but not a guaranteed complete roster.
Why did I get fewer leads than max_per_state?
Filtered records do not count, but narrow filters stop at the per-state scan limit or about a minute before the run timeout. The stop reason is in the status message and OUTPUT.
Does it return expired or suspended licenses?
Yes, when you turn Active licenses only off and the state lists them.
Which other states are supported?
Only WA, CA and TX. For other states, see the state-specific Actors under Related Actors.
Is the start fee charged?
Yes, once per started GB of run memory (one event at the default 512 MB). Lead events are charged per record delivered.
Related Actors
- Contractor Leads Scraper: contractor businesses from Google Maps by trade and city
- Dumpster Rental Prices Scraper: local dumpster prices and sizes by ZIP code
- TDLR License Scraper and California CSLB Scraper: single-state license data
- Building Permits Scraper: contractors linked to new permits
Legal and compliance
The Actor reads public state license sources (the Washington L&I search, the California CSLB public data portal and the Texas TDLR search). It does not use the reCAPTCHA-protected CSLB search. It does not log in or bypass access controls. Some licenses belong to individuals, so names, phones and addresses can be personal data: use them lawfully and follow CAN-SPAM, TCPA, Do Not Call and anti-spam rules. Verify a license with the issuing agency before hiring or compliance decisions. This tool is not affiliated with any state agency, and this is not legal advice.
Last verified: 2026-10-27