Contractor License Leads — Licensed Contractors WA, CA, TX avatar

Contractor License Leads — Licensed Contractors WA, CA, TX

Pricing

from $80.00 / 1,000 lead returneds

Go to Apify Store
Contractor License Leads — Licensed Contractors WA, CA, TX

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

Muhammad Afzal

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

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:

FieldWhat it contains
business_nameLicensed business or contractor name
business_typeEntity type, for example Limited Liability Company, Corporation or Sole Owner (Washington and California)
principal_nameFirst owner, partner or member on the Washington license, when listed
specialty, license_typeTrade, classification or program text from the state, for example Electrical Contractor
license_numberState license number
statusActive, Expired, Suspended, Revoked, Canceled, Inactive or the source text
phone, addressBusiness phone and address (Washington and California; Texas only when the license page lists them, which is rare)
city, zip, stateCity and ZIP as published; two-letter state code
regionCounty, as the state writes it
effective_date, expiration_dateIssue and expiration dates as YYYY-MM-DD
detected_at, source_urlCollection time and the state's page for that license
rawThe 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?

StateSourceFields filledEvidence
WAWashington L&I "Verify a Contractor" search, then each license's detail recordName, entity type, owner or partner, phone, address, city, county, ZIP, specialty, license type, status, issue and expiration datesCloud run 2026-10-27: 50 of 50 rows had phone, address and dates
CACSLB Public Data Portal list of currently renewed licenses, read one county at a timeName, entity type, phone, address, city, county, ZIP, classifications, status, issue and expiration datesCloud run 2026-10-27: Fresno electrical contractors with phone and address
TXTDLR license search for A/C, elevator, electrician, water well, mold and EV charging programs, then each license pageName (with business name in brackets), county, license number and description, status, issue and expiration datesCloud 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.

InputExampleHow 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_onlytrueKeeps 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_state50Leads delivered per state (default 1,000; the Console example uses 50)
include_rawfalseAdds 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:

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 os
from apify_client import ApifyClient
client = 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.

EventFREEBRONZESILVERGOLDPLATINUM / DIAMOND
Lead returned (one dataset row)USD 0.100001USD 0.0975USD 0.095USD 0.08USD 0.08
Actor start (listed)USD 0.200001USD 0.195USD 0.19USD 0.16USD 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 OUTPUT and 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.

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