# USSB Directory Business Listings Scraper (`automation-lab/ussb-directory-business-listings`) Actor

Search and export public USSB Directory business listings, unique result counts, contact details, classifications, and profile URLs.

- **URL**: https://apify.com/automation-lab/ussb-directory-business-listings.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.44 / 1,000 item extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## USSB Directory Business Listings Scraper

Search and export **USSB Directory businesses** as clean, structured records for small-business prospecting, directory analysis, enrichment, and recurring list refreshes.

The Actor reads the public USSB Directory listing pages, reports the source's unique result count, follows pagination, and optionally opens each business profile for classifications, descriptions, addresses, phone numbers, public emails, websites, and contact names.

Use a business-name query, an industry, a US state or territory, a supplied `/listings` URL, or an individual `/listing/...` profile URL.

### What can this USSB Directory scraper do?

- Search the public directory by partial business name.
- Filter by one top-level industry classification.
- Filter by US state, District of Columbia, or Puerto Rico.
- Accept existing filtered USSB Directory search URLs.
- Extract a single public business profile by URL.
- Traverse result pages until the requested limit is reached.
- Deduplicate records by canonical listing URL.
- Report the source-displayed `totalAvailable` result count.
- Export lightweight listing cards without opening profiles.
- Enrich cards with all supported public profile fields.
- Decode public email addresses protected by Cloudflare's page markup.
- Retry transient blocks and timeouts with bounded fresh proxy sessions.
- Save one normalized business per default-dataset row.

The Actor does not log in, bypass private records, or infer contact data that USSB does not display.

### Who is it for?

#### Sales and lead-generation teams

Build a regional or industry-specific list of public small businesses, then send the dataset to a CRM or enrichment workflow.

#### Market researchers

Measure directory coverage by state or industry, inspect classifications, and compare scheduled dataset snapshots.

#### Agencies

Refresh public local-business prospect lists without maintaining a custom Drupal scraper and proxy retry layer.

#### Data engineers

Use stable JSON fields and canonical URLs in ETL, data-quality, spreadsheet, and warehouse pipelines.

#### Business owners

Verify how a company profile is represented in the public USSB Directory.

### Why use this Actor?

USSB Directory currently exposes hundreds of thousands of listing cards and detailed public profiles. Direct server requests can receive a Cloudflare challenge even though the records are public.

This Actor provides:

- a tested HTTP-first route through Apify Proxy;
- source-specific selectors for Drupal listing cards and profiles;
- server-side filters plus record-level filter verification;
- stable deduplication and typed output;
- bounded retries instead of endless challenge loops;
- cheaper card-only exports when details are unnecessary;
- spreadsheet-ready JSON, CSV, Excel, XML, and RSS exports through Apify datasets.

It uses 256 MB of memory and does not launch a browser for ordinary runs.

### What data is extracted?

| Field | Description |
| --- | --- |
| `listingId` | Stable node ID or listing slug |
| `name` | Public business name |
| `listingUrl` | Canonical USSB Directory profile URL |
| `state` | State or territory shown by USSB |
| `city` | City shown by USSB |
| `yearEstablished` | Displayed establishment year |
| `imageUrl` | Listing image or source placeholder URL |
| `totalAvailable` | Total records reported for the current search |
| `resultPosition` | One-based position in traversed results |
| `summary` | Short public profile summary |
| `industries` | Top-level industry labels |
| `classifications` | Detailed linked classifications |
| `description` | Full public business description |
| `specialDetails` | Services or special details shown on the profile |
| `incorporatedIn` | Displayed incorporation state |
| `branchType` | Main or branch designation |
| `address` | Public street address |
| `zipCode` | Public postal code |
| `phone` | Public business phone |
| `email` | Public business email when displayed |
| `website` | Public business website |
| `contactPerson` | Public contact person or role |
| `detailsIncluded` | Whether the profile page was opened |
| `scrapedAt` | ISO 8601 extraction timestamp |

Profile-only fields are `null` or empty arrays when `includeDetails` is disabled or when the source does not provide them.

### How to get started

1. Open the Actor input page.
2. Leave **USSB Directory URLs** empty for a directory search.
3. Optionally enter a business name, state, or industry.
4. Keep **Include business details** enabled for contact and profile fields.
5. Set **Maximum listings** to the number of records you need.
6. Keep Apify Proxy enabled.
7. Click **Start**.
8. Open the **Business listings** dataset view.
9. Export the results as JSON, CSV, Excel, XML, or RSS.

For a fast source count and card export, disable `includeDetails`. Every saved row includes the source-reported search total.

### Input parameters

#### `startUrls`

Optional array of public USSB Directory URLs.

Supported paths:

- `https://www.ussbdirectory.com/listings`
- filtered `/listings?...` URLs
- `https://www.ussbdirectory.com/listing/<slug>`

Other hosts and paths fail validation instead of being fetched.

#### `businessName`

Optional case-insensitive partial business-name filter, from 1 to 128 characters.

Example: `Solar`.

#### `industryClassification`

Optional top-level USSB industry classification selected from the input dropdown.

Example: `Professional, Scientific, and Technical Services`.

#### `state`

Optional state or territory selected from the input dropdown.

Example: `Texas`.

#### `includeDetails`

Defaults to `true`.

- `true`: open every accepted profile and extract detail/contact fields.
- `false`: export listing cards and totals without profile requests.

#### `maxItems`

Maximum unique records to save.

- Default: `50`
- Minimum: `1`
- Maximum: `10000`

#### `maxConcurrency`

Maximum simultaneous detail requests.

- Default: `5`
- Minimum: `1`
- Maximum: `20`

Use a lower value if the source becomes unstable.

#### `proxyConfiguration`

Apify Proxy is enabled by default because direct requests can be challenged. The tested default datacenter pool works for ordinary extraction.

You can explicitly select a US residential group when your account supports it. The Actor never silently switches to residential traffic, so expensive fallback behavior remains under your control.

### Example input: find solar businesses

```json
{
  "businessName": "Solar",
  "includeDetails": true,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

A current local verification returned 10 enriched rows from 379 source-reported matches.

### Example input: export Texas prospects

```json
{
  "state": "Texas",
  "includeDetails": true,
  "maxItems": 25,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

A current local verification returned 25 Texas profiles with public contact data and a source-reported total of 29,263 matches.

### Example output

```json
{
  "listingId": "331114",
  "name": "Switch to Solar",
  "listingUrl": "https://www.ussbdirectory.com/listing/switch-solar",
  "state": "Utah",
  "city": "Midvale",
  "yearEstablished": 2026,
  "totalAvailable": 379,
  "resultPosition": 1,
  "summary": "Switch to Solar helps homeowners and businesses explore reliable renewable energy solutions.",
  "industries": [
    "Professional, Scientific, and Technical Services"
  ],
  "classifications": [
    "Electrical Contractors and Other Wiring Installation Contractors"
  ],
  "address": "6975 Union Park Avenue",
  "zipCode": "84047",
  "phone": "2027346631",
  "email": null,
  "website": "https://switchtosolar.net/",
  "contactPerson": "Switch to Solar",
  "detailsIncluded": true,
  "scrapedAt": "2026-09-01T12:00:00.000Z"
}
```

The exact fields depend on what a listing publicly displays. Do not assume every business has an email, website, address, contact person, or establishment year.

### How much does it cost to extract USSB Directory businesses?

This Actor uses pay per event:

- **$0.005** one-time start fee per run.
- One `item` event for each unique business record saved.
- Failed, duplicate, or filtered-out records are not item events.
- Profile details do not create a separate charge event.

The item price decreases by Apify pricing tier:

| Tier | Price per saved business |
| --- | ---: |
| FREE | $0.002760 |
| BRONZE | $0.002400 |
| SILVER | $0.001872 |
| GOLD | $0.001440 |
| PLATINUM | $0.000960 |
| DIAMOND | $0.000672 |

Examples on the FREE tier:

- 1 business: about **$0.00776**.
- 10 businesses: about **$0.03260**.
- 100 businesses: about **$0.28100**.

Examples on the BRONZE tier:

- 10 businesses: about **$0.02900**.
- 100 businesses: about **$0.24500**.
- 1,000 businesses: about **$2.40500**.

Your active Apify tier determines the item price. An optional residential proxy configuration can add platform proxy usage to the run under Apify's platform billing rules.

### Export and integration workflows

#### Spreadsheet prospecting

Run a state or industry filter, open the dataset, and export Excel or CSV. Use `listingId` or `listingUrl` as the durable deduplication key.

#### CRM enrichment

Send `name`, address, phone, email, website, classification, and source URL into HubSpot, Salesforce, Airtable, or another CRM through Make, Zapier, n8n, or a webhook step.

#### Recurring list refreshes

Create a scheduled Apify Task with the same input. Compare datasets downstream by `listingId` to detect additions, removals, or changed public fields.

The Actor produces current snapshots. It does not itself keep history, send alerts, or label changes.

#### Directory coverage analysis

Disable details, request a small sample, and use `totalAvailable` to record the source's current search count. Increase `maxItems` when you need the actual rows.

#### Targeted profile lookup

Supply one or more `/listing/<slug>` URLs to normalize known profiles without traversing search pages.

### Run through the Apify API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~ussb-directory-business-listings/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "state": "Texas",
    "includeDetails": true,
    "maxItems": 25,
    "proxyConfiguration": { "useApifyProxy": true }
  }'
```

For production code, prefer the `Authorization: Bearer` header so tokens do not appear in URLs or request logs.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('automation-lab/ussb-directory-business-listings').call({
    businessName: 'Solar',
    includeDetails: true,
    maxItems: 10,
    proxyConfiguration: { useApifyProxy: true },
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/ussb-directory-business-listings').call(
    run_input={
        'industryClassification': 'Construction',
        'includeDetails': True,
        'maxItems': 50,
        'proxyConfiguration': {'useApifyProxy': True},
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/ussb-directory-business-listings"
```

#### Claude Desktop setup

Add this MCP server JSON to Claude Desktop's configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/ussb-directory-business-listings"
    }
  }
}
```

#### Cursor setup

Add the same `mcpServers.apify` entry to your Cursor MCP configuration, then reload Cursor.

#### VS Code setup

Add the same HTTP MCP URL to your VS Code MCP server settings and start the `apify` server.

After setup, try these example prompts with the Apify MCP server:

- “Use the USSB Directory Actor to find 20 solar businesses and return name, state, website, and profile URL.”
- “Run the USSB Directory Actor through MCP and export 50 Texas businesses with public contact details.”
- “Use MCP to extract this USSB listing URL and summarize its classifications and contact fields.”

An agent should still review source terms, privacy obligations, and outreach rules before using contact data.

### Reliability, limits, and failure behavior

- USSB Directory is an independent website and can change markup without notice.
- Direct requests may receive Cloudflare challenges; keep Apify Proxy enabled.
- Each request is retried at most three times.
- Retry attempts use a fresh proxy identity after a challenge, timeout, or transient response.
- Stable invalid URLs, unsupported hosts, and unsupported paths fail without blind retries.
- Search totals are source-reported snapshots, not a completeness guarantee.
- USSB filter pages can contain stale cards; the Actor verifies filters against parsed records.
- A high `maxItems` value can require many source requests and a longer run.
- Lower `maxConcurrency` if the source begins timing out.
- Card-only runs are faster because they skip profile pages.
- Explicit profile URLs have no directory search total, so `totalAvailable` is `null`.
- Naturally missing profile fields remain `null` or empty arrays.

The Actor fails with a non-zero status when the source returns an unrecognized challenge or page shape after bounded retries. It does not turn unexpected empty pages into successful zero-row runs.

### Responsible use and legality

This Actor accesses public USSB Directory pages without credentials.

You are responsible for:

- reviewing USSB Directory's current terms and policies;
- collecting only data you have a lawful purpose to use;
- respecting applicable privacy, marketing, telemarketing, and anti-spam laws;
- honoring opt-outs and suppression lists;
- limiting retention to what your workflow needs;
- securing exported contact data;
- avoiding harassment, discrimination, or automated high-risk decisions;
- not using the Actor to train AI models where the source reserves that use.

Public availability does not remove legal or contractual obligations. This documentation is operational guidance, not legal advice.

### Troubleshooting

#### The run receives Cloudflare challenges

Keep `proxyConfiguration.useApifyProxy` enabled. Retry later or select an authorized US residential proxy group if your Apify account supports it. Do not disable retries or raise concurrency first.

#### I received fewer rows than the source total

`totalAvailable` is the number reported by the source for the search. `maxItems` controls how many rows the Actor saves. Filters are verified again after profile parsing, so stale or mismatched source cards can be excluded.

#### Some contact fields are empty

USSB profiles vary. Disable assumptions that every business has a phone, email, website, street address, or named contact. Empty fields are not extraction errors when the source omits them.

#### My start URL was rejected

Only `ussbdirectory.com/listings` and `ussbdirectory.com/listing/<slug>` paths are supported. Remove unrelated domains, account pages, and malformed URLs.

#### A large run times out

Increase the Actor timeout at the Task level, reduce `maxConcurrency`, or split the work into state or industry runs. Keep each input deterministic so datasets can be deduplicated later.

### FAQ

#### Does the Actor provide the total unique record count?

It exports the source-reported search total as `totalAvailable` on every discovered row. The unfiltered directory reported 330,957 records during implementation verification. The count changes as USSB updates its directory.

#### Can it export Excel?

Yes. Run results live in an Apify dataset, which supports Excel, CSV, JSON, XML, and RSS export.

#### Does it scrape listing cards and full profiles?

Yes. Set `includeDetails` to `false` for listing cards, or keep it `true` for profile enrichment.

#### Does it monitor changes?

It produces current snapshots. Schedule repeat runs and compare datasets downstream by `listingId`; built-in history and alerts are not included.

#### Does it require a login?

No. It processes public directory pages only.

#### Are emails guaranteed?

No. The Actor decodes an email when the public profile includes one. Missing emails remain `null`.

#### Can I search multiple states in one run?

The structured `state` field accepts one state or territory. Use separate Tasks or supply distinct filtered listing URLs for independent scopes.

#### Can I use my own proxy URLs?

Yes, through the standard Apify `proxyConfiguration` object. Reliability and platform cost depend on that proxy service.

### Related Automation Lab Actors

- [PagineGialle Italy Business Directory Scraper](https://apify.com/automation-lab/paginegialle-scraper) for Italian Yellow Pages business leads.
- [Google Maps Conversion Gap Leads](https://apify.com/automation-lab/google-maps-conversion-gap-leads) for US local-business website and conversion-gap prospecting.
- [Trade Show Exhibitor Lists Scraper](https://apify.com/automation-lab/public-exhibitor-directory-scraper) for event exhibitor and booth prospecting.

Choose this Actor when USSB Directory is the required source. Choose a related Actor only when its source and buyer workflow match your project.

### Support

If a page layout changes or a valid USSB URL fails after retries, include:

- the Actor run URL;
- a redacted copy of the input;
- the affected public listing or search URL;
- the expected field or record count;
- the log line showing the first failure.

Do not include Apify tokens, private CRM data, or unrelated personal information.

# Actor input Schema

## `startUrls` (type: `array`):

Optional USSB /listings search URLs or individual /listing/... profile URLs. Leave empty to search the directory with the filters below.

## `businessName` (type: `string`):

Return listings whose business name contains this text.

## `industryClassification` (type: `string`):

Limit results to one top-level USSB industry classification.

## `state` (type: `string`):

Limit results to one US state, the District of Columbia, or Puerto Rico.

## `includeDetails` (type: `boolean`):

Open each profile to include description, classifications, address, phone, email, website, and contact person when publicly displayed. Disable for faster listing-card exports and unique counts.

## `maxItems` (type: `integer`):

Maximum number of unique business records to save.

## `maxConcurrency` (type: `integer`):

Maximum simultaneous profile requests. Lower this if the directory becomes unstable.

## `proxyConfiguration` (type: `object`):

Proxy settings used to access USSB Directory reliably. Apify Proxy is enabled by default.

## Actor input object example

```json
{
  "startUrls": [],
  "businessName": "Solar",
  "includeDetails": true,
  "maxItems": 10,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Business cards and optional profile details saved by this run.

# 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 = {
    "startUrls": [],
    "businessName": "Solar",
    "includeDetails": true,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/ussb-directory-business-listings").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 = {
    "startUrls": [],
    "businessName": "Solar",
    "includeDetails": True,
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/ussb-directory-business-listings").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 '{
  "startUrls": [],
  "businessName": "Solar",
  "includeDetails": true,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation-lab/ussb-directory-business-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/ussb-directory-business-listings"
        }
    }
}

```

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/9Vwo80eiSZEMILpGi/builds/x8yIHX7cDSEJbMKNU/openapi.json
