# US Business Data API - Business Listings and Firmographics (`nabeelbaghoor/us-business-data-api`) Actor

Search millions of US and Canada business listings by NAICS or SIC code, state, city, postal code, radius, employee count, sales volume and credit score. Returns name, address, phone, email, size, sales, credit and executive contacts as flat rows. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/us-business-data-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 results

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/platform/actors/running/actors-in-store#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

## US Business Data API

Search millions of US and Canada business listings by industry code, location, radius, size, sales volume and credit, and get name, address, phone, email, executives and corporate linkage as flat rows.

This is local business data with an industry code on every record. If your target is defined by what a business does and where it is, rather than by what its website says, this is the shape of data you want: a NAICS or SIC code, a verified address, an employee count, an estimated sales volume, and a date it was last verified.

### Three modes

| Mode | What it does | What you give it |
| --- | --- | --- |
| `business-search` | Finds business listings by filter, free text, or both | Industry codes, location, size, radius |
| `business-lookup` | Reads records you already hold identifiers for | A list of record ids |
| `people-search` | Runs the same filter language against the consumer index | Location and name criteria |

### Filters that matter

Industry is the backbone. `primaryNaicsCodes` and `primarySicCodes` match the main line of business; the any-code variants match a secondary line too. The provider extends the standard codes with extra digits, so a longer code is narrower: `551103` is used car dealers rather than motor vehicle dealers in general.

Location works three ways: exact states, cities and postal codes; a radius from a latitude and longitude; or a radius from a list of postal codes. Set `geoDistance` to something like `7km` or `5mi` and give it a centre.

Size comes in four flavours. `estimatedLocationEmployeeCount` carries the actual figure when one exists and an estimate otherwise, so it has the highest fill rate and is usually the better filter. `locationEmployeeCount` is the reported figure only. The corporate variants count everyone across the whole corporate family rather than at one site.

Freshness is a filter, not an afterthought. `inBusiness` defaults to yes, which is verified operating, and `verifiedAfter` restricts to records the provider re-checked since a date you choose.

### What comes back

Rows carry the provider's record id; business name, alternative name and legal names; place type; street, suite, city, state, postal code, ZIP, ZIP+4 and country; latitude, longitude and the precision level of that geocode; phone, additional phone, toll-free number, fax and email; primary and secondary NAICS and SIC codes; location, estimated location, corporate and estimated corporate employee counts; location sales volume; credit grade, credit score, credit limit and a bankruptcy count; operational status, last verified date, record created date, and opening and closing dates; corporate linkage as a direct headquarters id, an ultimate headquarters id and the full ancestor chain; and the primary contact's name, email, job titles and management level plus a count of all known contacts.

Every row carries `raw`, the untouched provider record, so nothing is lost by the flattening.

### Example output

```json
{
  "recordType": "business",
  "matched": true,
  "infogroupId": "830123091",
  "name": "Brooklyn Pizza",
  "placeType": "independent",
  "street": "15511 Edwards St",
  "city": "Huntington Beach",
  "state": "CA",
  "postalCode": "92648",
  "countryCode": "US",
  "latitude": 33.7085,
  "longitude": -118.0059,
  "phone": "7145550142",
  "primaryNaicsCode": "722511",
  "primarySicCode": "581208",
  "estimatedLocationEmployeeCount": 14,
  "locationSalesVolume": 1240000,
  "creditGrade": "B",
  "creditScore": 68,
  "inBusiness": "yes",
  "verifiedOn": "2026-04-27",
  "primaryContactLastName": "Alvarez",
  "primaryContactManagementLevel": "Owner",
  "contactCount": 3
}
```

### Pricing

Pay per result. You are charged once per record saved to the dataset. Duplicates are removed before charging, and an identifier that resolves to nothing is stored with `matched: false` free of charge, so a list of dead ids costs you nothing. Apify platform usage is included in the per-result price. Your own provider plan is billed separately by the provider.

### Bring your own API key

This actor does not include data access. You use your own API token from Data Axle, which is the provider whose API this actor calls. The token is sent as the `X-AUTH-TOKEN` request header rather than as a URL parameter, so it never appears in a log line or a redirect. If your account holds more than one contract, set the contract id as well so the provider knows which entitlement to bill.

### FAQ

#### What is a business data API?

A business data API returns structured records for physical businesses: name, verified address, phone, industry classification, employee count, estimated sales and operational status. It differs from a web-scraped company database in that records are verified against phone calls, filings and field research and carry a last-verified date. This actor wraps one and turns its results into a dataset you can export as CSV, JSON or Excel, or pull from another tool.

#### How do I find every business of one type in a city?

Set `primaryNaicsCodes` or `primarySicCodes` to the industry, `cities` to the city, and leave `inBusiness` on yes. Run `business-search`. The run logs the total match count before the first row is written, so you know straight away whether the filter is too wide or too narrow.

#### Can I search within a radius rather than by city?

Yes. Set `geoDistance` to a value like `7km`, `5mi`, `1500m` or `3000ft`, then give it a centre: either `geoLatitude` and `geoLongitude`, or one or more `geoPostalCodes`. You can also sort by distance from that centre.

#### What is the difference between location and corporate employee counts?

Location counts include only the people at that site. Corporate counts include everyone across the corporate family the site belongs to, so a headquarters can carry both. The estimated variants fall back to the actual value when the provider holds one, which makes them the more usable filter.

#### How do I find all the branches of one company?

Take the `ultimateHeadquartersId` from any row in the corporate family, then filter on it with the advanced filter: `{"relation":"equals","attribute":"ancestor_headquarters_ids","value":"959792284"}`. Every branch and subsidiary in the family carries its ancestors in that list.

#### Can I get executive names and emails?

Yes. Rows carry the primary contact's first and last name, email, job titles and management level, and the full contact list is preserved under `raw`. Contacts are ordered by seniority, so the first entries are the most senior known people at the location.

#### Why does paging stop before I reach my result limit?

The provider caps the paging offset at 4,000 records per filter set. Beyond that its own bulk endpoint is the intended route. The practical fix is to split the run: one run per state, per postal code group, or per industry code, each of which stays inside the ceiling. The actor logs a clear message when it hits the cap rather than looping.

#### How many results can one run return?

Up to 25,000 per run, paged at up to 400 records per request, subject to the provider's 4,000 offset ceiling per filter set.

#### Do I need my own API key?

Yes. This actor is bring your own key, and your usage is billed on your own provider plan. The actor charges separately for each result it returns.

### Keyword map

US business data API, business listings API, local business data API, business search API, NAICS code search API, SIC code lookup API, firmographics API, company data API, business database API, employee count data, sales volume data, business credit score API, corporate linkage data, business email and phone data, radius search API, geo search business data, consumer data API, B2B prospecting data

# Actor input Schema

## `mode` (type: `string`):

What this run does. Business search finds business listings by industry, location, size, sales and credit. Business lookup reads records you already hold the identifiers for. Consumer search runs the same filter language against the provider's consumer index.

## `query` (type: `string`):

Searches business name, address and phone. Results are scored by how well they match and the best come first. Can be used on its own or alongside the filters below.

## `nameContains` (type: `string`):

Fuzzy match against the business name only, unlike the free-text query which also searches address and phone.

## `recordIds` (type: `array`):

The record identifiers to read. These are the infogroupId values the business search returns. Lookup mode only.

## `primaryNaicsCodes` (type: `array`):

Match the business's main line of business by NAICS code. The provider extends the standard six digit NAICS with extra digits, so a longer code is more specific.

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

Match a business carrying any of these NAICS codes, whether or not it is the primary one.

## `primarySicCodes` (type: `array`):

Match the business's main line of business by SIC code. The provider extends the government four digit SIC with a two digit suffix, so 551103 is used cars specifically rather than motor vehicle dealers generally.

## `sicCodes` (type: `array`):

Match a business carrying any of these SIC codes.

## `placeTypes` (type: `array`):

The role the location plays in its organisation. Headquarters and branches belong to a corporate family; independents do not.

## `states` (type: `array`):

Two letter state or province codes, for example CA, NY, ON.

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

City names to restrict the search to.

## `postalCodes` (type: `array`):

Exact postal codes to restrict the search to.

## `countryCodes` (type: `array`):

Country codes, for the provider's US and Canada coverage.

## `geoDistance` (type: `string`):

Search within a radius of a point, for example 7km, 5mi, 1500m or 3000ft. Needs either a latitude and longitude below, or a list of postal codes to measure from.

## `geoLatitude` (type: `string`):

Latitude of the centre of the radius, for example 47.60.

## `geoLongitude` (type: `string`):

Longitude of the centre of the radius, for example -122.33.

## `geoPostalCodes` (type: `array`):

Measure the radius from these postal codes instead of from coordinates.

## `employeeCountFrom` (type: `integer`):

Lower bound on the reported number of employees at the location itself.

## `employeeCountTo` (type: `integer`):

Upper bound on the reported number of employees at the location itself.

## `estimatedEmployeeCountFrom` (type: `integer`):

Lower bound on the estimated location employee count. The estimated field carries the actual value when one exists, so it has a higher fill rate than the reported count and is usually the better filter.

## `estimatedEmployeeCountTo` (type: `integer`):

Upper bound on the estimated location employee count.

## `corporateEmployeeCountFrom` (type: `integer`):

Lower bound on employees across every location in the corporate family, rather than at this one site.

## `corporateEmployeeCountTo` (type: `integer`):

Upper bound on employees across the whole corporate family.

## `salesVolumeFrom` (type: `integer`):

Lower bound on estimated annual sales at this location, in USD.

## `salesVolumeTo` (type: `integer`):

Upper bound on estimated annual sales at this location, in USD.

## `creditScoreFrom` (type: `integer`):

Lower bound on the provider's numeric creditworthiness estimate. Treat it as a starting point for a credit decision rather than the decision itself.

## `creditScoreTo` (type: `integer`):

Upper bound on the provider's numeric creditworthiness estimate.

## `inBusiness` (type: `string`):

Operational status. Yes is verified operating, no is verified closed, maybe is unverified, junk is a duplicate or invalid record.

## `verifiedAfter` (type: `string`):

Only return businesses verified after this date, as an ISO date such as 2026-01-01. The single best filter for keeping an export fresh.

## `openedForBusinessAfter` (type: `string`):

Only return businesses that opened after this date, as an ISO date. Use it to find newly opened locations.

## `requireFieldsPresent` (type: `array`):

Attribute names that must be populated, for example location\_email\_address, phone or website. Names come from the provider data dictionary and an unknown name is rejected rather than ignored.

## `requireFieldsMissing` (type: `array`):

Attribute names that must be missing, for example toll\_free\_number.

## `sortBy` (type: `string`):

How to order results. Relevance uses the provider's own match scoring. Distance needs a centre latitude and longitude.

## `sortDirection` (type: `string`):

Direction for the sort field. Ignored for relevance and distance.

## `fields` (type: `array`):

Attribute names to return, from the provider data dictionary. Leave empty to use this actor's default selection, which covers identity, address, contact, industry codes, size, sales, credit, status and corporate linkage.

## `allFields` (type: `boolean`):

Ask the provider for everything your contract allows instead of a field list. Slower and much larger, but nothing is left out.

## `packages` (type: `array`):

Provider field packages to include, such as core\_v1. Packages bundle related attributes and what is available depends on your contract.

## `advancedFilter` (type: `string`):

A raw filter object in the provider's filter language, merged into the filter tree alongside the fields above. Supports relations (equals, matches, in, between, greater\_than, less\_than, present, missing, range), geo relations (geo\_distance, geo\_box, geo\_polygon), negation and nested and/or connectives. Example: {"connective":"or","propositions":\[{"relation":"equals","attribute":"state","value":"AZ"},{"relation":"equals","attribute":"state","value":"NM"}]}

## `contract` (type: `string`):

Required only if your account holds more than one contract. Sent with every request so the provider knows which entitlement to bill.

## `skipUnmatched` (type: `boolean`):

Leave unresolved identifiers out of the dataset entirely. By default they are stored with matched set to false, which is free, so you can see exactly which inputs failed to resolve.

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

Stop after this many records (1 to 25,000). You are charged per record returned. Note that the provider caps paging at an offset of 4,000 per filter set, so beyond that a run needs a narrower filter.

## `pageSize` (type: `integer`):

How many records to request per call (1 to 400, which is the provider's maximum).

## `apiKey` (type: `string`):

Your own API token for the data provider. Required. Sent as a request header and never logged or placed in a URL.

## Actor input object example

```json
{
  "mode": "business-search",
  "inBusiness": "yes",
  "sortBy": "relevance",
  "sortDirection": "desc",
  "allFields": false,
  "skipUnmatched": false,
  "maxResults": 100,
  "pageSize": 100
}
```

# 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 = {
    "maxResults": 100,
    "pageSize": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/us-business-data-api").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 = {
    "maxResults": 100,
    "pageSize": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/us-business-data-api").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 '{
  "maxResults": 100,
  "pageSize": 100
}' |
apify call nabeelbaghoor/us-business-data-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/us-business-data-api"
        }
    }
}

```

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/iR6s6YVnoWCMGRpM3/builds/itMEe6GuoyAxgpTmU/openapi.json
