← Guides

How-to

How to run West Virginia Contractor License Lookup & Leads Scraper (WVCLB)

Step-by-step: the exact input, what each field does, and the rows that come back from the West Virginia Contractor Licensing Board's search.

You want West Virginia contractors from the Contractor Licensing Board (WVCLB), either a few licence numbers you need to check or a list of firms you need to call. The board’s search at wvclboard.wv.gov/verify/ is free and shows a phone number on every result, but it pages 20 contractors at a time and has no export: Kanawha County alone was 802 licences on 2026-10-12, which is 41 pages to copy by hand. Its classification menu also offers 17 classes while the licences carry 63, so there is no way to ask it for the 1,224 roofers. This actor reads the same search and hands back the rows as a table.

What you’ll need

Nothing but an Apify account. The actor talks to the board’s search directly.

No API key, no CAPTCHA and no proxy. On 2026-10-12 the search answered the same 17,495 licences from a home connection, from an Apify container, and through both of Apify’s proxy pools, so the plain container IP is the default and the proxy input is there only for the day that changes.

Step 1: Open the actor

Open West Virginia Contractor License Lookup & Leads Scraper (WVCLB) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.

The West Virginia Contractor License Lookup & Leads Scraper (WVCLB) listing on the Apify Store
The listing on the Apify Store. Pricing and the nightly health record are both public.

Step 2: Fill in the input

The input form for West Virginia Contractor License Lookup & Leads Scraper (WVCLB) in the Apify Console
The input form, as it appears in the Apify Console.
FieldTypeRequiredWhat it does
querystringnoA WVCLB licence number (‘WV038157’, or just ‘38157’), or part of a company or DBA name (‘Almost Heaven’). Names match anywhere in the company name and in the DBA. Leave empty…
queriesarraynoSeveral lookups in ONE run, one per line. Combined with the field above if you fill both. (default [])
countystringnoA West Virginia county (‘Kanawha’, ‘Berkeley County’), or ‘Out of State’ / ‘International’ for the board’s non-WV licences. A value that is not one of these is dropped and logged.
countiesarraynoSeveral counties in ONE export. (default [])
classificationstringnoA WVCLB classification name or a word from one: ‘roofing’, ‘hvac’, ‘electrical’, ‘general building’, ‘siding’. An exact name matches only itself (‘electrical’ does not also…
classificationsarraynoSeveral classifications in ONE export, e.g. roofing and siding. (default [])
citystringnoMailing-address city, exact match ignoring case and punctuation, e.g. ‘Charleston’ (which does not include South Charleston).
citiesarraynoSeveral cities in ONE export. (default [])
westVirginiaAddressesOnlybooleannoOut-of-state contractors hold WV licences: 7,967 of 17,495 (45.5%, 2026-10-12) have a mailing address outside West Virginia. Tick to drop them.
maxResultsintegernoEXPORT: cap on licences for the WHOLE run — your spend control (17,495 licences statewide on 2026-10-12; set 100000 to take everything that matches). LOOKUP: cap per name or…

The field that decides everything is query. Fill it (or queries) and the run is a lookup: each licence number or name is searched on its own, and a name is matched anywhere in both the company name and the DBA. WV038157 returns one licence; Almost Heaven returned 10 on 2026-10-12. Leave it empty and the run is an export of current licences, filtered by the other fields. With no filters at all an export takes the whole state, up to maxResults.

The second is classification. The board files 17,377 of its 17,495 licences under SPECIALTY, and the trade you actually want sits underneath it as one of 63 sub-classes, so the actor filters on the row rather than on the board’s 17-item menu. A word matches every class containing it, while an exact name matches only itself: electrical does not also return SIGN INSTALLATION (NO ELECTRICAL). One more trap: county is the board’s county, which is not the same as the mailing state. 7,832 licences carry OUT OF STATE as their county, and 187 licences with a West Virginia county have an out-of-state mailing address. Tick westVirginiaAddressesOnly when you want local firms only.

A working input:

{
  "county": "Kanawha",
  "classification": "roofing",
  "maxResults": 500
}

Step 3: Run it

Press Start. The run log says how many licences the board reports for each county or search before anything is returned, then how many it kept after the classification filter.

That input took 20 seconds on Apify on 2026-10-12 and returned 64 Kanawha roofing licences; run again from a workstation the same day, the log read “Kanawha: WVCLB reports 802, kept 64 in 11s”. The whole state (no filters, maxResults 100000) is 18 pages of 1,000 rows and was fetched in 216 seconds. A lookup of WV038157 plus the name Almost Heaven took 6 seconds and returned 11 licences. A name that matches nothing adds no row and says so in the log, and a county or class the actor cannot recognise is dropped with a log line instead of widening the run to the whole state.

Step 4: Read the output

Each run returns a labelled table, not raw JSON:

The output fields returned by West Virginia Contractor License Lookup & Leads Scraper (WVCLB)
The output view: every field the actor returns, named and typed.

Every row looks like this, a real row from a lookup run:

{
  "license_number": "WV042229",
  "business_name": "ACME VENTURES COMPANY LLC",
  "dba_name": "ALMOST HEAVEN CUSTOM BUILDERS",
  "phone": "(304) 539-8230",
  "address": "PO BOX 217",
  "city": "PEYTONA",
  "address_state": "WV",
  "zip_code": "25154-0217",
  "county": "BOONE",
  "classification": "GENERAL BUILDING; SPECIALTY; DEMOLITION; SEPTIC & SEWER SYSTEMS; RESIDENTIAL POOLS (ABOVE GROUND)",
  "classifications": [
    "GENERAL BUILDING",
    "SPECIALTY",
    "DEMOLITION",
    "SEPTIC & SEWER SYSTEMS",
    "RESIDENTIAL POOLS (ABOVE GROUND)"
  ],
  "expiration_date": "2027-10-29",
  "matched_by": "export",
  "status": null,
  "license_type": "Contractor License",
  "state": "WV",
  "source_url": "https://wvclboard.wv.gov/verify/"
}
FieldExample valueMeaning
license_numberWV042229WVCLB licence number, e.g. WV038157
business_nameACME VENTURES COMPANY LLCLicensed company (or sole proprietor)
dba_nameALMOST HEAVEN CUSTOM BUILDERSDoing-business-as name, when filed
phone(304) 539-8230Business phone as the board lists it
addressPO BOX 217Mailing street address (can be a PO box)
cityPEYTONAMailing city
address_stateWVMailing state (out-of-state firms hold WV licences)
zip_code25154-0217Mailing ZIP or ZIP+4

Most people came for phone. Statewide on 2026-10-12 it was filled on 17,480 of the 17,495 licences, with 17,070 distinct numbers, so it is a real per-firm line rather than a board switchboard. Watch the address instead: 3,136 licences give a PO box, so a mailing address is where the paperwork goes, not a yard you can drive to. The board publishes no status, issue date, owner or email, so status is always null; a licence that is in the search is current (17,494 of the 17,495 expired after 2026-10-12).

Step 5: Export it

Open the Dataset tab and export to CSV, JSON or Excel, or pull the same rows from the API, which is what you want if this is going to run on a schedule.

What it costs

$0.004 per licence returned, plus Apify’s own platform usage. The Kanawha roofing run above is 64 rows, so $0.26. The default export with an empty input is 500 rows ($2.00), and every current licence in the state is 17,495 rows ($69.98 at maxResults 100000). A lookup costs $0.004 per licence it returns, so the 11-row batch above is $0.04. Rows explaining an outage or an unrecognised filter are free.

Where the data comes from

This reads the West Virginia Contractor Licensing Board’s public contractor search, the page in the screenshot below, live on every run. Every night a canary runs this actor against that live source and checks that Kanawha County roofing still returns at least 30 licences, each with a phone, address, county, classification and expiry: what “verified” means.

The West Virginia Contractor Licensing Board Contractor Search page
WVCLB's Contractor Search, captured 2026-10-12. The board states the site is updated in real time with its licensure database.

If you need to check two or three contractors, that page is free and fine: type the WV number, read the phone and expiry, done. It stops being reasonable at list size. The form is a wrapper around a JSON service that pages results, a single request above 1,000 rows comes back with the right number of rows and every field blank, and the trade you want is usually a sub-class the menu does not offer. The actor handles all three, and reads the county codes from the board’s own list on every run.

See it used

Export Kanawha County, West Virginia Roofing Contractors builds a call list of the 64 roofers the board files under Kanawha. Verify West Virginia Contractor Licenses runs a vendor list’s WV numbers and names and reads back each expiry date.

For the licences across the Ohio River, Ohio Contractor License Lookup & Leads Scraper (OCILB) exports Ohio’s electrical, HVAC, plumbing, hydronics and refrigeration roster with phone; 1,638 West Virginia licence holders have an Ohio mailing address.

Last updated 2026-10-12