How-to
How to run Alabama Commercial Contractor Directory & Leads (LBGC)
Step-by-step: the exact input, what each field does, and the rows that come back from AL LBGC.
You sell to commercial contractors in Alabama and you want a call list for one county and one classification: every Building Construction (BC) licensee in Jefferson County, say, with a phone number. The Alabama Licensing Board for General Contractors (LBGC) already gives its whole roster away as a free CSV, 8,917 licensees on 2026-10-06. That file has no county column, though, so getting to “Jefferson County” means building your own list of Birmingham-area ZIPs. It also carries 4,729 firms with an out-of-state mailing address, and its Specialty column packs every classification into one comma-separated cell. This actor reads that same file and does the filtering, so one run returns the county and classification you asked for.
What you’ll need
Nothing but an Apify account. The actor talks to AL LBGC directly.
No API key, no proxy and no CAPTCHA. LBGC serves its roster as a single public download from licensesearch.alabama.gov, and the actor fetches it with one GET per run. You pay $0.002 per contractor returned, plus Apify’s own platform usage.
Step 1 — Open the actor
Open Alabama Commercial Contractor Directory & Leads (LBGC) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2 — Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
listOptionsOnly | boolean | no | If true, skip the search and return the 67 Alabama counties plus every classification code on the Alabama Licensing Board for General Contractors (LBGC) roster, with how many… |
trade | string | no | An LBGC classification code, e.g. ‘BC’ (Building Construction), ‘MU’ (Municipal and Utility), ‘HS’ (Highways and Streets), ‘BC-S’ or ‘SUBCONTRACTOR’ — a code matches exactly,… |
trades | array | no | Several classifications in ONE run, e.g. BC and MU and electrical. Combined with ‘Classification / trade’ if you fill both. A contractor matching two of them is returned (and… (default []) |
county | string | no | Alabama county, e.g. ‘Jefferson’, ‘Mobile County’, ‘saint clair’. LBGC publishes no county, so this matches the county derived from each contractor’s MAILING ZIP or city. If it… |
counties | array | no | Several counties in ONE run, e.g. Jefferson and Shelby. Combined with ‘County’ if you fill both. (default []) |
includeOutOfState | boolean | no | LBGC licenses firms from every state: 4,729 of its 8,917 licensees (53%, 2026-10-06) have a mailing address outside Alabama. Off by default. Only applies when no county is set… |
maxResults | integer | no | Cap on the contractors returned PER county + classification search, not per run, so adding counties can never silently truncate the ones later in the list. Leave empty to… |
Two fields decide the list. trade takes an LBGC code or a word. A code matches exactly, so “BC” returns Building Construction licensees and not the BC-S subclassification holders; a word such as “paving” or “electrical” matches every classification whose description contains it. If you do not know the codes, switch on listOptionsOnly once: it returns the 67 counties and every code with its licensee count, free. county is the other one, and it is a derived value. LBGC records no county, so the actor works it out from the mailing ZIP or city, which means a firm is found under the county it gets its mail in, not every county it builds in.
A working input:
{
"county": "Jefferson",
"trade": "BC"
}
Step 3 — Run it
Press Start. Rows are pushed to the dataset as they’re found, so the run log fills in as it works.
The input above returned 123 contractors when we ran it on 2026-10-06. Jefferson and Shelby together, still on BC, returned 164 (123 plus 41). Locally those runs took between 5.9 and 20.4 seconds end to end, nearly all of it the roster download; that was timed outside Apify, and a platform run adds container start-up. Madison County with trade set to “MU” returned 14, which is a reminder that some classifications are thin in some counties. If a run returns only county and classification names, the actor did not recognise one of your inputs and the log says which; those option rows are free. If LBGC does not answer, you get one free row with a notice instead of an empty dataset.
Step 4 — Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this — a real row from a real run:
{
"business_name": "A G GASTON CONSTRUCTION CO INC",
"phone": "(205) 328-0376",
"fax": "(205) 876-1138",
"address": "1820 3RD AVE N SUITE 400",
"is_po_box": false,
"city": "BIRMINGHAM",
"zip_code": "35203",
"county": "Jefferson",
"county_method": "zip",
"address_state": "AL",
"state": "AL",
"license_number": "14788",
"status": "Active",
"expiration_date": "8/31/2027",
"extension_date": null,
"classifications": "BC: BUILDING CONSTRUCTION, HS: HIGHWAYS AND STREETS, MU: MUNICIPAL AND UTILITY",
"classification_codes": [
"BC",
"HS",
"MU"
],
"bid_limit": "Unlimited",
"requested_county": "Jefferson",
"requested_trade": "BC",
"source_url": "https://licensesearch.alabama.gov/genconbd"
}
| Field | Example value | Meaning |
|---|---|---|
business_name | A G GASTON CONSTRUCTION CO INC | Licensee name as LBGC lists it |
phone | (205) 328-0376 | Phone number on file with LBGC |
fax | (205) 876-1138 | Fax number, when listed |
address | 1820 3RD AVE N SUITE 400 | Mailing street address as filed (may be a PO box) |
is_po_box | False | True when the mailing address is a PO box or drawer |
city | BIRMINGHAM | Mailing city |
zip_code | 35203 | Mailing ZIP code |
county | Jefferson | Alabama county derived from the mailing ZIP or city — LBGC publishes none; null when it cannot be told |
Most people come for phone, and it is the reliable column: all 164 rows in the Jefferson and Shelby BC run had one. There is no email field at all, because LBGC’s roster does not carry one. Fax is patchier, present on 83 of those 164. Read county_method before trusting a county on the edge of a metro: “zip” means the ZIP lies at least 90% in that county, while “zip_majority” (28 of the 164) means the ZIP straddles a county line and the actor picked the larger side. Statewide, 169 Alabama licensees (4%) get no county at all, mostly PO-box ZIPs in cities like Huntsville and Decatur. is_po_box was true on 16 of the 164, and bid_limit was “Unlimited” on 141; the other 23 carried a cap between $100,000 and $3,000,000.
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.002 per contractor returned, plus Apify’s own platform usage. Jefferson BC is 123 rows, so $0.246. Jefferson and Shelby BC is 164 rows, so $0.328. Every licensee in Jefferson County, all classifications, was 545 on 2026-10-06, which would be $1.09. Discovery Mode, unrecognised inputs and notice rows cost nothing, and a contractor matching two of your searches is charged once.
Where the data comes from
This reads AL LBGC directly: the full roster CSV the board maintains itself (8,917 licences on 2026-10-06, fetched with one GET), with address, ZIP, phone, fax, bid limit and expiry in one file.
Every night a canary runs this actor against that live source and checks that it still returns at least 40 Jefferson County BC licensees, each with a phone, ZIP and licence number — what “verified” means.
The roster is free, and if you want the whole state once you should simply download it from LBGC’s License Verification List page. What takes time is everything after the download. The Specialty cell joins classifications with commas while the descriptions contain commas too (“SUBCONTRACTOR: ABATEMENT, DEMOLITION”), so a spreadsheet split breaks 1,890 rows. The county has to come from somewhere, and the actor uses U.S. Census 2020 ZIP-to-county and place-to-county tables for it. Residential home builders are not in this file: they are licensed by the Alabama Home Builders Licensure Board, which this actor does not cover.
See it used
Build a Birmingham-Area Building Contractor Call List runs Jefferson and Shelby together for a commercial subcontractor working its way onto GC bid lists, 164 rows for $0.328.
If you already have one contractor’s name or licence number and only need to check that licence, Alabama Contractor License Lookup & Verify is the smaller tool. For the same county-by-trade list in Arkansas, with email included, use Arkansas Contractor Directory & Leads Scraper.
Last updated 2026-10-06