# South Carolina Contractor Directory & Leads Scraper (LLR) (`scrapebench/south-carolina-contractor-directory-leads-scraper`) Actor

Every South Carolina commercial contractor licensed by SC LLR, with phone, street address, classification and owner. Filter by city, ZIP, classification and status.

- **URL**: https://apify.com/scrapebench/south-carolina-contractor-directory-leads-scraper.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.002 / contractor record

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## South Carolina Contractor Directory & Leads Scraper (LLR)

### Pain points

- SC LLR's contractor search returns one name or city at a time, and every search sits behind a reCAPTCHA, so a statewide list means hundreds of solved searches.
- The phone, street address and owner are only on each licence's detail page, one click per contractor. The search results list just the name, city and status.
- Most of the roster is not useful for outreach: of 45,025 licences counted on 2026-10-24, only 20,556 are Active, and 9,080 of those Active licences belong to firms outside South Carolina.

### What we solve

- Returns every matching licence in one run, with the detail-page fields already filled: phone, street address, ZIP, classifications with their licence limit, issue and expiry dates, officers and qualifiers.
- Defaults to Active licences with a South Carolina address, which is 11,476 contractors. One switch adds out-of-state firms and the empty status list returns every status.
- Filters by city, ZIP, classification (code or word, e.g. 'BD' or 'roofing') and licence type. Each filter takes a list, and a contractor found by two searches is returned and billed once.

### Summary

Build a South Carolina commercial contractor prospect list in one run. Pick a city, a ZIP, a classification such as Building (BD), Electrical (EL), Plumbing (PB) or Air Conditioning (AC), or ask for the whole state. Each row is a contractor licensed by the SC Department of Labor, Licensing and Regulation (LLR), Contractor's Licensing Board, and carries the business name, phone, street address, city, ZIP, licence number and type, status, issue and expiry dates, every classification held with its licence-limit group, the officers on file and the qualifying party. On the 2026-10-24 roster, 99.1% of the 11,476 Active South Carolina contractors have a phone and 100% have a street address. LLR publishes no email. The data comes from a monthly sweep of LLR's licence lookup, including every detail page; each row says when its detail page was read. Pay only per contractor returned.

### Who it's for

- Building-material suppliers and equipment dealers prospecting South Carolina commercial contractors by city or trade
- Subcontractors and general contractors building bid lists for a project in one city or ZIP
- Insurance and surety agents looking for contractors by licence-limit group and expiry date
- Market researchers sizing licensed contractor coverage across South Carolina

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "city": "Columbia",
  "classification": "BD",
  "maxResults": 200
}
```

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `business_name` | Licensed business name, with any DBA after it |
| `phone` | Phone number on the licence's LLR detail page |
| `address` | Street address on file with LLR |
| `city` | City of that address |
| `address_state` | State of that address (SC unless you turn off 'South Carolina addresses only') |
| `zip_code` | ZIP or ZIP+4 |
| `license_number` | SC LLR licence number |
| `license_type` | General Contractor, Mechanical Contractor, or a Construction Manager type |
| `status` | Licence status as LLR shows it (Active, Lapsed, Suspended, ...) |
| `classifications` | Every classification held, with its licence-limit group, e.g. 'Building-BD5' |
| `issue_date` | Date the licence was first issued (MM/DD/YYYY) |
| `expiration_date` | Licence expiry date (MM/DD/YYYY) |
| `officers` | Officers on file, each with role and name (e.g. President / Owner) |
| `qualifiers` | Qualifying party or parties for the licence |
| `qualified_by` | How the licence is qualified (Financial Statement or Surety Bond) |
| `person_name` | Licence holder's name when the licence is held by a person |
| `detail_as_of` | When the monthly sweep read this licence's detail page |
| `data_as_of` | When the monthly sweep started |
| `source_url` | SC LLR's contractor licence lookup |

Sample:

```json
{
  "business_name": "RUMSEY CONSTRUCTION & RENOVATION LLC \u2014 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",
  "detail_as_of": "2026-10-24T22:27:33Z",
  "data_as_of": "2026-10-24T21:45:44Z",
  "source_url": "https://verify.llronline.com/LicLookup/Contractors/Contractor.aspx?div=69"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `listOptionsOnly` | no | boolean | `false` | If true, return every city and every classification (with its code) on the roster, each with its count of licences. Free, not charged. |
| `city` | no | string | `"Columbia"` | 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 row saying so. |
| `cities` | no | array | `[]` | Several cities in ONE run, each searched separately. Combined with 'City' if you fill both. |
| `zip` | no | string | — | A 5-digit ZIP code, matched against the licence's address ZIP, e.g. '29209'. |
| `zips` | no | array | `[]` | Several ZIP codes in ONE run, each searched separately. |
| `classification` | no | string | `"Building"` | 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 classification. Discovery Mode lists them all. |
| `classifications` | no | array | `[]` | Several classifications in ONE run. A contractor holding two of them is returned (and billed) once. |
| `licenseType` | no | string | — | Filter by licence type, e.g. 'General Contractor', 'Mechanical Contractor', 'Construction Manager'. A word from the type is enough. |
| `licenseTypes` | no | array | `[]` | Several licence types; a licence matching any of them is kept. |
| `statuses` | no | array | `["Active"]` | 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 45% are Active). |
| `statewide` | no | boolean | `false` | 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 type returns the free Discovery lists instead. |
| `inSouthCarolinaOnly` | no | boolean | `true` | 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. |
| `maxResults` | no | integer | — | Cap on the contractors returned PER city/ZIP + classification search, not per run. Leave empty to return every match. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **500 contractor records** at *$0.002/result* ≈ **$1.00**.

A statewide run with the default filters (Active, South Carolina addresses) returned 11,476 contractors on the 2026-10-24 roster, about $22.95. Discovery lists and notices are free. Apify platform usage is billed separately per your plan.

### Use cases

- Outbound lead generation: pull every Active Building (BD) contractor in Columbia (228 on 2026-10-24) with phone and street address, and load it into your CRM.
- Bid lists: list every Electrical, Plumbing or Air Conditioning contractor in a project's ZIP before you send an invitation to bid.
- Renewal and surety prospecting: sort the statewide export by expiry date or by licence-limit group (BD1 to BD5) to find accounts worth a call.
- Market sizing: count licensed contractors per city and classification with the free Discovery lists, then export only the cities you need.

### Why this actor

- Phone on 99.1% and street address on 100% of Active South Carolina contractors, read from each licence's own LLR detail page.
- Officers and qualifiers included: 9,736 of the 11,476 Active South Carolina contractors list at least one officer, usually the owner.
- Every classification with its licence-limit group, so a 'BD5' firm and a 'BD1' firm are told apart.
- Out-of-state licence holders and LLR's own test records are filtered out by default.
- Pay per contractor; Discovery lists and notices are free.

### Limitations & updates

Covers SC LLR commercial contractor licences only (General, Mechanical and Construction Manager). Residential builders are not included. Data is from a monthly sweep, so it can be up to about a month old; each row says when it was read. No email is published. City is the city on the licence's address and is an exact match.

### FAQ

**Where does the data come from?**

SC LLR's public contractor licence lookup (Contractor's Licensing Board, commercial contractors). We sweep it once a month: every search plus every licence's detail page, which is where the phone, street address and officers are. Each row carries data_as_of (when the sweep started) and detail_as_of (when its detail page was read).

**How current is it?**

Up to about a month old. The current roster was read on 2026-10-24. A licence issued or renewed since the last sweep shows its state as of that sweep. To confirm one contractor's live status, check it on LLR's site.

**Does it include email addresses?**

No. LLR does not publish an email for contractors. Phone and street address are on almost every row.

**Does it cover residential builders and specialty trades?**

No. This is LLR's commercial contractor licence (General and Mechanical Contractors and Construction Managers). Residential builders and residential specialty contractors are licensed by a different LLR board and are not in this roster.

**How do I search by trade?**

Use 'classification' with a code (BD Building, EL Electrical, PB Plumbing, AC Air Conditioning, RF Roofing, GD Grading, WL Water & Sewer Lines, ...) or a word from its name ('roofing', 'plumb'). Run once with Discovery Mode on to get every classification with its code and count, free.

**Why are there fewer rows than LLR's search shows?**

By default the actor returns Active licences with a South Carolina address. On 2026-10-24 that was 11,476 of 45,025 licences. Clear the 'Statuses' list to get every status, and turn off 'South Carolina addresses only' to include out-of-state firms.

**What happens if the monthly data cannot be loaded?**

The run returns one free notice row saying so and charges nothing. It never returns a silent empty result.

**How am I charged?**

One event per contractor returned. Discovery lists, unknown-city notices and the unavailable notice are free.

### Which actor to choose

Part of the contractor-data suite — pick the one that fits your goal:

- **North Carolina Contractor License Lookup & Verify (NCLBGC)** — You work across the state line and need North Carolina general contractor licences too.
- **Alabama Commercial Contractor Directory & Leads (LBGC)** — You need the same commercial-contractor list with phone for Alabama.
- **Florida Contractor Directory & Leads Scraper (DBPR)** — You need a contractor directory for Florida.

### Guides & use cases

Written up on **[scrapebench.dev](https://scrapebench.dev)** — the bench that runs and verifies this actor against the live source every night:

- **How-to:** [How to run South Carolina Contractor Directory & Leads Scraper (LLR)](https://scrapebench.dev/guides/how-to-south-carolina-contractor-directory-leads-scraper/)
- **Use case:** [Columbia, SC Building Contractor List with Phone Numbers](https://scrapebench.dev/use-cases/columbia-sc-building-contractors/)

More actors, coverage and nightly verification results: **[scrapebench.dev](https://scrapebench.dev)**

### Works with AI assistants (MCP)

Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the [MCP tab](https://apify.com/scrapebench/south-carolina-contractor-directory-leads-scraper/api/mcp) on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.

Then just ask:

> "List active Building (BD) contractors in Columbia, South Carolina, with their phone numbers and street addresses."

That search returned 228 contractors on the 2026-10-24 roster; set maxResults to keep a first call small. Runs started this way bill exactly like any other run.

# Actor input Schema

## `listOptionsOnly` (type: `boolean`):

If true, return every city and every classification (with its code) on the roster, each with its count of licences. Free, not charged.

## `city` (type: `string`):

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 row saying so.

## `cities` (type: `array`):

Several cities in ONE run, each searched separately. Combined with 'City' if you fill both.

## `zip` (type: `string`):

A 5-digit ZIP code, matched against the licence's address ZIP, e.g. '29209'.

## `zips` (type: `array`):

Several ZIP codes in ONE run, each searched separately.

## `classification` (type: `string`):

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 classification. Discovery Mode lists them all.

## `classifications` (type: `array`):

Several classifications in ONE run. A contractor holding two of them is returned (and billed) once.

## `licenseType` (type: `string`):

Filter by licence type, e.g. 'General Contractor', 'Mechanical Contractor', 'Construction Manager'. A word from the type is enough.

## `licenseTypes` (type: `array`):

Several licence types; a licence matching any of them is kept.

## `statuses` (type: `array`):

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 45% are Active).

## `statewide` (type: `boolean`):

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 type returns the free Discovery lists instead.

## `inSouthCarolinaOnly` (type: `boolean`):

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.

## `maxResults` (type: `integer`):

Cap on the contractors returned PER city/ZIP + classification search, not per run. Leave empty to return every match.

## Actor input object example

```json
{
  "listOptionsOnly": false,
  "city": "Columbia",
  "cities": [],
  "zips": [],
  "classification": "BD",
  "classifications": [],
  "licenseTypes": [],
  "statuses": [
    "Active"
  ],
  "statewide": false,
  "inSouthCarolinaOnly": true
}
```

# Actor output Schema

## `results` (type: `string`):

Each row is one SC LLR Commercial Contractors licence: name, phone, street address, classifications, officers, status and expiry.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "city": "Columbia",
    "classification": "Building"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/south-carolina-contractor-directory-leads-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "city": "Columbia",
    "classification": "Building",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapebench/south-carolina-contractor-directory-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "city": "Columbia",
  "classification": "Building"
}' |
apify call scrapebench/south-carolina-contractor-directory-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapebench/south-carolina-contractor-directory-leads-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/86FesttkyhXGL5WP9/builds/q8EGAQok3FZAKf5SK/openapi.json
