# SBA Dynamic Small Business Search Scraper (`automation-lab/sba-dsbs-small-business-search`) Actor

Search the official SBA Dynamic Small Business Search and export normalized public supplier profiles for government-contracting outreach.

- **URL**: https://apify.com/automation-lab/sba-dsbs-small-business-search.md
- **Developed by:** [Automation Lab](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 $0.96 / 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?

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

## SBA Dynamic Small Business Search Scraper

Build focused federal supplier lists from the official **SBA Dynamic Small Business Search** (DSBS), now called SBA Small Business Search. Search public profiles by company or capability, state, NAICS industry, active SBA certification, and SAM.gov status, then export normalized records to JSON, CSV, Excel, or your data pipeline.

The Actor is designed for repeatable government-contracting outreach rather than a one-off copy-and-paste workflow. Every result preserves stable public identifiers and a link back to the official SBA profile.

### What does this SBA supplier search Actor do?

The Actor sends the same structured filters used by the public SBA search application to its official anonymous JSON endpoint. It then:

1. validates your search filters;
2. retrieves matching public supplier profiles;
3. deduplicates suppliers by UEI, CAGE code, and SBA entity ID;
4. optionally requests each supplier's public detail endpoint;
5. normalizes useful identity, contact, location, industry, certification, capability, and SAM fields;
6. saves up to your requested limit in the default Apify dataset.

No SBA login is required. The Actor does not bypass private pages or expose non-public account data.

### Who is it for?

- **Government business-development teams** building segmented outreach lists.
- **Prime contractors** looking for certified teaming and subcontracting partners.
- **Procurement analysts** comparing supplier coverage by state, NAICS, or certification.
- **Supplier-diversity teams** sourcing 8(a), HUBZone, WOSB, EDWOSB, VOSB, or SDVOSB firms.
- **Data teams** refreshing a structured SBA supplier table on a schedule.
- **Researchers** performing reproducible analysis with source URLs and retrieval timestamps.

### Why use this Actor instead of manual DSBS search?

Manual search is useful for inspecting a few profiles, but recurring supplier discovery needs consistent filters and reusable output. This Actor provides:

- combined company, capability, geography, NAICS, certification, and SAM filters;
- user-friendly certification names instead of undocumented source codes;
- typed records that work directly in spreadsheets and databases;
- bounded output through `maxItems`;
- optional profile-detail enrichment;
- deterministic retries for temporary upstream failures;
- graceful fallback to search data if one detail request fails;
- no automatic paid proxy or browser fallback.

### What SBA DSBS data can I extract?

| Group | Output fields |
| --- | --- |
| Business identity | `legalBusinessName`, `dbaName`, `entityDetailId` |
| Federal identifiers | `uei`, `cageCode` |
| Public contacts | `contactPerson`, `email`, `phone`, `fax` |
| Web presence | `website`, `additionalWebsite`, `capabilitiesLink` |
| Location | `address1`, `address2`, `city`, `state`, `zipcode`, `county`, `congressionalDistrict` |
| Industry | `naicsPrimary`, `naicsAllCodes` |
| Qualifications | `certifications`, `businessTypes`, `activeSamRegistration`, `samExtractCode` |
| Capabilities | `keywords`, `capabilitiesNarrative` |
| Provenance | `profileUrl`, `sourceUrl`, `lastUpdateDate`, `scrapedAt` |

Fields can be `null` when a business has not published them in its SBA profile.

### How to run the SBA Dynamic Small Business Search

1. Open the Actor and click **Try for free**.
2. Enter at least one filter: a search term, state, NAICS code, certification, capability keyword, or active SAM requirement.
3. Choose the maximum number of supplier profiles.
4. Turn on profile enrichment only when you need detail-endpoint data.
5. Click **Start**.
6. Open the **Dataset** tab to preview or export JSON, CSV, XML, RSS, or Excel.

A useful first run is:

```json
{
  "searchTerm": "cybersecurity",
  "stateCodes": ["VA"],
  "maxItems": 20
}
```

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `searchTerm` | string | — | Company, DBA, product, service, or capability text. |
| `stateCodes` | string\[] | — | Two-letter U.S. state or territory codes, such as `VA` or `PR`. |
| `naicsCodes` | string\[] | — | Two-to-six-digit NAICS codes, such as `541511`. |
| `primaryNaicsOnly` | boolean | `false` | Require a supplied NAICS code to be the profile's primary NAICS. |
| `certifications` | string\[] | — | Any of `8(a)`, `HUBZone`, `WOSB`, `EDWOSB`, `VOSB`, or `SDVOSB`. |
| `keywords` | string\[] | — | Capability keywords interpreted by the official source. |
| `activeSamOnly` | boolean | `false` | Require the source to mark the supplier's SAM.gov registration active. |
| `includeProfileDetails` | boolean | `false` | Request the official detail endpoint for each accepted supplier. |
| `maxItems` | integer | `100` | Save 1–1,000 supplier profiles. |

At least one search filter is required. Invalid state codes, malformed NAICS codes, unsupported certifications, and out-of-range limits fail early with a clear error.

### Search examples

#### Find suppliers by company or capability

```json
{
  "searchTerm": "cybersecurity",
  "maxItems": 100
}
```

#### Find Virginia 8(a) software contractors

```json
{
  "stateCodes": ["VA"],
  "naicsCodes": ["541511"],
  "certifications": ["8(a)"],
  "maxItems": 100
}
```

#### Build an active-SAM HUBZone construction list

```json
{
  "searchTerm": "construction",
  "certifications": ["HUBZone"],
  "activeSamOnly": true,
  "includeProfileDetails": true,
  "maxItems": 100
}
```

### Output example

The following shape is based on a real current local run; contact values are shortened here for readability.

```json
{
  "legalBusinessName": "INFONET TECHNOLOGIES LLC",
  "dbaName": "INFONET TECHNOLOGIES LIMITED LIABILITY CO",
  "uei": "KQFDMBNFLX23",
  "cageCode": "84JG5",
  "entityDetailId": 410061,
  "contactPerson": "SAMPATH PATURI",
  "email": "spaturi@infonetllc.com",
  "phone": "2484269080",
  "city": "WIXOM",
  "state": "Michigan",
  "zipcode": "48393",
  "naicsPrimary": "541511",
  "naicsAllCodes": ["541511", "541512", "541513", "541519", "611420"],
  "keywords": ["Software Consulting", "Computer Programming", "Data Analytics"],
  "capabilitiesNarrative": "Custom Software Development IT Consulting Cybersecurity Solutions...",
  "certifications": [],
  "businessTypes": ["Small business"],
  "activeSamRegistration": false,
  "lastUpdateDate": "2024-02-02T00:00:00.000Z",
  "profileUrl": "https://search.certifications.sba.gov/profile/KQFDMBNFLX23/84JG5",
  "sourceUrl": "https://search.certifications.sba.gov",
  "scrapedAt": "2026-09-17T06:10:06.969Z"
}
```

### How much does it cost to export SBA supplier profiles?

The Actor uses pay-per-event pricing:

- **Start:** $0.005 once per run.
- **Supplier profile:** the active tier price per saved dataset row. The current configuration ranges from $0.00184 on FREE to $0.00096 on GOLD, PLATINUM, and DIAMOND tiers.

At the current FREE-tier price, 20 profiles cost about **$0.0418** ($0.005 + 20 × $0.00184), while 100 profiles cost about **$0.189**. Final charges appear in the Apify run record. Failed, duplicate, and rejected source rows are not emitted as supplier profiles.

Profile-detail enrichment has no separate event charge; it is included in the supplier-profile event. Its additional requests can increase runtime platform usage.

### Scheduling recurring supplier-list refreshes

Create an Apify schedule to run the same filters daily, weekly, or monthly. Send the resulting dataset to a webhook, Make, Zapier, Google Sheets, a database, or your internal procurement system.

For change monitoring, keep stable keys such as `uei`, `cageCode`, or `entityDetailId` in your destination and compare each new run with your previous snapshot. The Actor exports current source records; it does not itself maintain history or send change alerts.

### Exporting and integrating the results

The default dataset supports:

- JSON for application pipelines;
- CSV and Excel for outreach operations;
- XML and RSS for legacy integrations;
- dataset API access for ETL tools;
- Apify webhooks for run-completion automation.

Use `uei` as the preferred organization key when present. A CAGE code can also be useful, but organizations may expose multiple records or update profile data over time.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~sba-dsbs-small-business-search/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "stateCodes": ["VA"],
    "naicsCodes": ["541511"],
    "certifications": ["8(a)"],
    "maxItems": 100
  }'
```

To wait for completion and receive dataset items directly, use the synchronous dataset-items endpoint documented in the Apify API.

### 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/sba-dsbs-small-business-search').call({
    searchTerm: 'cybersecurity',
    stateCodes: ['VA'],
    maxItems: 100,
});
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/sba-dsbs-small-business-search').call(run_input={
    'searchTerm': 'cybersecurity',
    'stateCodes': ['VA'],
    'maxItems': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use the Actor through MCP

Add this Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/sba-dsbs-small-business-search"
```

#### Claude Desktop, Cursor, and VS Code setup

Use the following equivalent JSON configuration in Claude Desktop, Cursor, or VS Code clients that support remote MCP servers:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/sba-dsbs-small-business-search"
    }
  }
}
```

Example prompts:

- “Find 50 public Virginia SBA supplier profiles matching cybersecurity.”
- “Export active-SAM HUBZone construction suppliers and summarize their primary NAICS codes.”
- “Build a CSV-ready list of 8(a) custom software contractors with public contact fields.”

### Reliability and failure behavior

The Actor uses the official public structured search route rather than browser automation. Search and detail requests have a 45-second timeout. Temporary network errors, HTTP 429, and HTTP 5xx responses receive up to three bounded attempts with backoff. Deterministic client errors are not retried blindly.

If optional detail enrichment fails for one supplier, the Actor keeps that supplier's useful search result and logs a warning. If the main search response is invalid or unavailable after retries, the run fails rather than silently returning misleading data.

### Limits and data quality

- A run saves at most 1,000 profiles.
- The official source can return many more candidates than the requested limit; the Actor stops normalizing after reaching `maxItems`.
- Public fields vary by supplier and may be empty or stale.
- Certification and SAM flags reflect what the SBA source reported at retrieval time.
- Search relevance and source-side filter behavior are controlled by SBA.
- The Actor does not verify emails, phone numbers, certifications, or contract eligibility independently.
- Source changes can temporarily affect availability or field coverage.

### Responsible use and legality

The Actor accesses anonymous public supplier-profile data from the official SBA search. Use results in accordance with applicable laws, SBA terms, Apify policies, and your organization's procurement and privacy requirements.

Public availability does not remove your obligations. Keep outreach relevant, identify your organization, honor opt-outs, secure exported contact data, and avoid spam or discriminatory decision-making. Consult qualified counsel for your specific use case.

### FAQ and troubleshooting

#### Why did the Actor reject my input?

At least one supported filter is required. State values must be recognized two-letter postal codes, NAICS values must contain two to six digits, and `maxItems` must be from 1 to 1,000.

#### Why did I receive fewer profiles than `maxItems`?

`maxItems` is a ceiling, not a guarantee. Your filter combination may have fewer public matches, duplicate records may be removed, or a malformed source row may be rejected.

#### Why are some contact or capability fields null?

Businesses choose which public fields to maintain. The Actor preserves missing fields as `null` instead of inventing values. Try `includeProfileDetails: true`, but the detail endpoint cannot supply data that the source does not publish.

#### Does the Actor need a proxy or SBA account?

No. The current implementation uses an anonymous official JSON endpoint and does not enable an automatic proxy fallback. If SBA changes access requirements, the Actor will fail clearly rather than requesting private credentials.

#### Can it monitor changed suppliers?

Use an Apify schedule and compare stable identifiers between run datasets in your own storage. This Actor returns current snapshots; it does not claim a historical change feed.

### Related automation-lab Actors

Combine supplier discovery with other public procurement workflows from the `automation-lab` portfolio when appropriate:

- **SAM.gov Contract Awards Scraper** for award and vendor research.
- **Cal eProcure Solicitations Scraper** for California opportunity monitoring.
- **USSB Directory Business Listings Scraper** for broader U.S. small-business discovery.

Each Actor has its own source coverage and data contract; this Actor remains focused on official SBA Small Business Search profiles.

This Actor is an independent tool and is not affiliated with, endorsed by, or operated by the U.S. Small Business Administration.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/sba-dsbs-small-business-search/changelog.md

# Actor input Schema

## `searchTerm` (type: `string`):

Company name, DBA, product, service, or capability text. Example: cybersecurity.

## `stateCodes` (type: `array`):

Optional two-letter U.S. postal codes, such as VA, TX, or PR.

## `naicsCodes` (type: `array`):

Optional 2-to-6-digit NAICS industry codes. Example: 541511 for custom computer programming.

## `primaryNaicsOnly` (type: `boolean`):

Match supplied NAICS codes only when they are the supplier's primary NAICS code.

## `certifications` (type: `array`):

Return suppliers with any selected active SBA certification.

## `keywords` (type: `array`):

Optional capability keywords used by the official SBA search.

## `activeSamOnly` (type: `boolean`):

Return only supplier profiles marked active in SAM.gov.

## `includeProfileDetails` (type: `boolean`):

Request each emitted supplier's official public detail endpoint. This is slower and gracefully keeps search data if one detail request fails.

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

Maximum number of normalized public supplier profiles saved to the dataset.

## Actor input object example

```json
{
  "searchTerm": "cybersecurity",
  "stateCodes": [
    "VA"
  ],
  "primaryNaicsOnly": false,
  "activeSamOnly": false,
  "includeProfileDetails": false,
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset containing all normalized supplier profiles 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 = {
    "searchTerm": "cybersecurity",
    "stateCodes": [
        "VA"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/sba-dsbs-small-business-search").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 = {
    "searchTerm": "cybersecurity",
    "stateCodes": ["VA"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/sba-dsbs-small-business-search").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 '{
  "searchTerm": "cybersecurity",
  "stateCodes": [
    "VA"
  ],
  "maxItems": 20
}' |
apify call automation-lab/sba-dsbs-small-business-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/sba-dsbs-small-business-search"
        }
    }
}
```

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/pUzM6vJdzH4Nzdgga/builds/jXL55Py1K8mUsV0jl/openapi.json
