How-to
How to run South Carolina Contractor Directory & Leads Scraper (LLR)
Step-by-step: the exact input, what each field does, and the rows that come back from SC LLR.
You want a list of South Carolina commercial contractors with phone numbers: every Building (BD) contractor in Columbia, or every electrician in one ZIP, or the whole state. The South Carolina Department of Labor, Licensing and Regulation (LLR) has the data, but its contractor lookup answers one name or city at a time, puts a reCAPTCHA in front of every search, and shows the phone and street address only on each licence’s own detail page. Columbia’s Building contractors alone are 228 Active licences, so that is 228 detail pages to open after the search. This actor returns those rows, detail fields included, from one run.
What you’ll need
Nothing but an Apify account. You don’t need an API key, a proxy or a CAPTCHA solver. We solve LLR’s reCAPTCHA once a month, in our own sweep of every search and every detail page (693 solves for the 2026-10-24 roster), and your run only filters that statewide snapshot. You pay $0.002 per contractor returned, plus Apify’s own platform usage.
Step 1 — Open the actor
Open South Carolina Contractor Directory & Leads Scraper (LLR) 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, return every city and every classification (with its code) on the roster, each with its count of licences. Free, not charged. |
city | string | no | The city on the licence’s address, e.g. ‘Columbia’, ‘Greenville’, ‘Myrtle Beach’. Exact match; case and punctuation are ignored. A city with no matching licence returns a free… |
cities | array | no | Several cities in ONE run, each searched separately. Combined with ‘City’ if you fill both. (default []) |
zip | string | no | A 5-digit ZIP code, matched against the licence’s address ZIP, e.g. ‘29209’. |
zips | array | no | Several ZIP codes in ONE run, each searched separately. (default []) |
classification | string | no | An SC LLR classification, by code (‘BD’, ‘AC’, ‘EL’, ‘PB’) or by a word from its name (‘Building’, ‘Air Conditioning’, ‘Electrical’, ‘plumb’). Leave empty for every… |
classifications | array | no | Several classifications in ONE run. A contractor holding two of them is returned (and billed) once. (default []) |
licenseType | string | no | Filter by licence type, e.g. ‘General Contractor’, ‘Mechanical Contractor’, ‘Construction Manager’. A word from the type is enough. |
licenseTypes | array | no | Several licence types; a licence matching any of them is kept. (default []) |
statuses | array | no | Licence statuses to include, e.g. Active, Lapsed, Suspended, Closed. Default: Active only. Empty list = every status (the roster keeps every licence ever issued, and only about… (default ['Active']) |
statewide | boolean | no | Return every licence that passes the status, licence-type and state filters, with no city, ZIP or classification. Without it, a run with no city, ZIP, classification or licence… |
inSouthCarolinaOnly | boolean | no | Keep only licences with a South Carolina address. Many commercial licences are held by out-of-state firms (most often North Carolina and Georgia); turn this off to include them. (default True) |
maxResults | integer | no | Cap on the contractors returned PER city/ZIP + classification search, not per run. Leave empty to return every match. |
Two fields trip people up. city is an exact match on the city in the licence’s address, so “Columbia” does not include West Columbia, Irmo or Lexington; list them in cities if you want the metro (those five together were 408 Building contractors). A misspelt city returns one free row saying so, and Discovery Mode (listOptionsOnly) lists all 424 cities and 152 classifications on the roster. The other is statuses. It defaults to Active, because the roster keeps every licence LLR ever issued: 45,025 in all, 20,556 of them Active. Clear the list to get every status: Columbia BD goes from 228 to 497.
A working input:
{
"city": "Columbia",
"classification": "BD",
"maxResults": 200
}
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.
Most of a run is downloading the snapshot. Filtering it took about a second locally for Columbia BD, which returned all 228 matches. With maxResults: 200 you get the first 200, and the log says “228 match(es); returning 200”. The default statewide export, Active licences with a South Carolina address, was 11,476 rows on the 2026-10-24 roster. If a run returns only city and classification names, nothing you entered was a search filter, and those rows are free. If the monthly snapshot cannot be loaded you get one free row with a notice, never a silent 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": "RUMSEY CONSTRUCTION & RENOVATION LLC — DBA: RUMSEY CONSTRUCTION & RESTORATION",
"phone": "(803) 764-0222",
"address": "2630 SHOP RD",
"city": "COLUMBIA",
"address_state": "SC",
"zip_code": "29209-4600",
"license_number": "100101",
"license_type": "GENERAL CONTRACTOR",
"status": "ACTIVE",
"classifications": [
"Building-BD5"
],
"issue_date": "09/15/1999",
"expiration_date": "10/31/2028",
"officers": [
{
"role": "President / Owner",
"name": "BRENDON RUMSEY"
},
{
"role": "Vice President",
"name": "TONY RUMSEY"
}
],
"qualifiers": [
"RUMSEY TONY (CQG)"
],
"qualified_by": "Financial Statement",
"source_url": "https://verify.llronline.com/LicLookup/Contractors/Contractor.aspx?div=69"
}
| Field | Example value | Meaning |
|---|---|---|
business_name | RUMSEY CONSTRUCTION & RENOVATION LLC — DBA: RUMSEY CONSTRUCTION & RESTORATION | Licensed business name, with any DBA after it |
phone | (803) 764-0222 | Phone number on the licence’s LLR detail page |
address | 2630 SHOP RD | Street address on file with LLR |
city | COLUMBIA | City of that address |
address_state | SC | State of that address (SC unless you turn off ‘South Carolina addresses only’) |
zip_code | 29209-4600 | ZIP or ZIP+4 |
license_number | 100101 | SC LLR licence number |
license_type | GENERAL CONTRACTOR | General Contractor, Mechanical Contractor, or a Construction Manager type |
phone is why most people come, and it is filled on 99.1% of Active South Carolina licences (226 of the 228 Columbia BD rows). There is no email column, because LLR publishes none. Phone formats are as LLR shows them, so you will see both “(803) 764-0222” and “843-856-4477”. The digit after a classification code is its licence-limit group, so “Building-BD5” and “Building-BD2” are different sizes of firm. One firm can hold two licences: a General Contractor licence and a General Construction Manager licence have different numbers and come back as two rows. That is why Columbia BD is 228 rows but 172 distinct business names. officers lists the people on file, and on 151 of those 228 rows one of them is the President / Owner.
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. Columbia BD is 228 rows, so $0.456. The five-city Columbia metro on BD is 408 rows, $0.816. The default statewide export was 11,476 rows on the 2026-10-24 roster, about $22.95. Discovery lists, unknown-city notices and the unavailable notice are free, and a contractor found by two of your searches is charged once.
Where the data comes from
This reads SC LLR. The target is ASP.NET WebForms (__VIEWSTATE / __EVENTVALIDATION), swept once a month into a statewide snapshot; runs filter the snapshot and never touch the portal. Twice a day our checks run this actor against the latest snapshot and fail if Columbia BD stops returning 50 rows with addresses and phones — what “verified” means.
LLR’s lookup has no export and no bulk file. Every search needs a solved reCAPTCHA, the result list stops at name, city and status, and a search’s detail links expire about two minutes after it runs. Reading all 45,025 licences with their detail pages took our sweep about three hours. The run log states the date of the sweep, so you always know how old the data is. Residential builders are licensed by a separate LLR board and are not in this roster.
See it used
Columbia, SC Building Contractor List with Phone Numbers runs the Columbia BD search for a supplier building a call list, 228 rows for $0.456.
For the same commercial-contractor list with phone in Alabama, use Alabama Commercial Contractor Directory & Leads (LBGC).
Last updated 2026-10-24