# Business Firmographics API - US Company Data, SIC and NAICS (`nabeelbaghoor/business-firmographics-api`) Actor

Look up US business firmographics by web address, phone, stock ticker or company address. Returns standardized company name, address, phone, employee count, sales volume, EIN, SIC and NAICS codes with descriptions, location type, geocode and contacts. Pay per result. Bring your own API key.

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

## Pricing

$15.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

## Business Firmographics API - US Company Data, SIC and NAICS

Turn a list of web addresses, phone numbers, stock tickers or company addresses into structured US business records: standardized company name, verified postal address, phone, employee count, sales volume, EIN, SIC and NAICS codes with descriptions, location type, geocode and named contacts, one flat row per business.

### What this actor does

- **Looks up a business from whichever identifier you actually have.** A web address, a 10 digit phone number, a stock ticker or a freeform address string is each a complete lookup on its own, so a messy list still enriches without being cleaned up first.
- **Looks up a business by company name and address**, with a search pivot you can point at whichever field your data is strongest on.
- **Sends up to 100 records per request.** The provider has a real batch protocol, so a 5,000 row list is 50 requests rather than 5,000, and the actor paces itself to the records-per-second ceiling of your plan.
- **Returns the data groups you ask for**: employee count, sales volume, EIN with up to three NAICS and SIC codes and their descriptions, location type, ZIP+4 and address keys, latitude and longitude, county and census geography, and named contacts with titles and emails.
- **Reads the provider's own result codes.** A row is only counted as a match when the response reports one, and a miss carries the documented reason, so you can tell a genuine no-match from an input that never met the minimum requirements.
- **Pairs every answer back to the right input** by the record ID that travels with each record, not by array position, so a reordered or short batch still lands each row against the query that produced it.
- **Never charges for a miss.** Only rows whose result codes report a matched business are billed.

### Input

| Field | What it does |
| --- | --- |
| `domains` | Company web addresses. A pasted URL is reduced to the bare hostname. |
| `phones` | 10 digit business phone numbers. |
| `stockTickers` | Stock exchange ticker symbols, for example `MSFT`. |
| `freeformQueries` | Whole addresses or other minimum inputs as single unsplit strings. |
| `businessRecords` | JSON records using `comp`, `a1`, `city`, `state`, `postal`, `phone`, `web`, `stock`. |
| `columns` | Which extra data groups to return on top of the defaults. |
| `centricHint` | Which input the search centres on: address, company or phone. |
| `maxContacts` | Upper limit on contacts returned per business. |
| `returnDominantBusiness` | Whether to return the dominant business at an address when the name does not match. |
| `sicNaicsConfidence` | Loose returns any industry code; strict returns only high confidence codes. |
| `batchSize` | Records per request, up to the provider's maximum of 100. |
| `recordsPerSecond` | Pace the run to your plan's documented throughput. |
| `skipUnmatched` | Leave unresolved inputs out of the dataset. |
| `maxResults` | Hard cap on rows, and therefore on spend and run time. |
| `apiKey` | Your own licence key. Stored as a secret. |

### Example output

```json
{
  "matched": true,
  "query": "example.com",
  "companyName": "Example Labs Inc",
  "enterpriseKey": "323318841",
  "addressLine1": "500 Market St",
  "suite": "Ste 300",
  "city": "Rancho Santa Margarita",
  "state": "CA",
  "postalCode": "92688-2112",
  "plus4": "2112",
  "countryCode": "US",
  "phone": "9497654321",
  "webAddress": "example.com",
  "stockTicker": "",
  "employeesEstimate": "320",
  "salesEstimate": "48000000",
  "locationType": "Headquarters",
  "locationTypeCode": "1",
  "ein": "954321098",
  "naicsCodes": ["541511", "541512"],
  "naicsDescriptions": ["Custom Computer Programming Services", "Computer Systems Design Services"],
  "sicCodes": ["7372"],
  "sicDescriptions": ["Prepackaged Software"],
  "latitude": "33.640",
  "longitude": "-117.601",
  "countyName": "Orange",
  "totalContacts": "8",
  "contacts": [
    { "NameFirst": "Jane", "NameLast": "Doe", "Title": "Chief Executive Officer", "Email": "jane@example.com" }
  ],
  "resultCodes": ["AS01", "FS01", "FS07", "GS05"],
  "raw": { }
}
```

### Frequently asked questions

#### What data does the Business Firmographics API return?

Every matched business returns the standardized company name, the current company name on file at that address, a unique enterprise key, the verified postal address with suite and ZIP+4, and the result codes for the match. Requesting the optional data groups adds the employee count estimate, the sales volume estimate, the phone, the web address, the stock ticker, the location type, the EIN with up to three NAICS and SIC codes and their descriptions, address keys and country, latitude and longitude, county, FIPS, census tract and block, and named contacts with first name, last name, gender, job title, phone and email.

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

Yes. This actor does not include data access. You use your own licence key from Melissa, which is the provider whose Business Coder API this actor calls, created on their developer portal. Your own plan, credit balance and terms apply. Paste the key into the `apiKey` field, where it is stored as an Apify secret and sent in the request body rather than a URL parameter, so it never appears in a log line or a redirect.

#### What is the minimum input for a lookup?

Any one of five combinations: an address with city and state or postal code, a freeform string containing one of the others, a phone number, a stock ticker, or a web address. A company name alone is not enough, which is why company records need an address or a phone alongside the name. When a record falls short the provider says so with code FE02 and the actor writes that reason into the row.

#### How fast can a large list run?

The provider accepts up to 100 records per request, so throughput is set by your plan rather than by request count: roughly 5 records per second on pay-as-you-go, 12 on self-service, 50 on business and 100 on enterprise. Set `recordsPerSecond` to match your plan and the actor paces to it. The default of 5 is safe on every plan.

#### How do I get decision-grade industry codes?

Set `sicNaicsConfidence` to `strict`. The provider then returns only the SIC and NAICS codes it is confident are correct and returns nothing where it is not, instead of returning any loosely associated code. That is the setting you want when the codes drive lead routing, scoring or territory assignment, because a null is more useful than a wrong code.

#### Can I get contact names at each business?

Yes. Add `Contacts` to the data groups and each matched business returns an array of people with first name, last name, gender, job title, phone and email. Use `maxContacts` to raise or lower the number returned per business; the provider defaults to five.

#### What is the difference between a match and a dominant business?

A match means the provider found the specific business you asked about. A dominant business is the main occupant of an address, returned when the company name is missing or does not match what is on file there. That behaviour is on by default and is usually what you want when enriching addresses. Turn `returnDominantBusiness` off when you only want exact company matches and would rather see a miss than a neighbour.

#### What happens when an input matches no business?

The row is written with `matched: false`, the provider's result codes, and an `error` giving the documented reason: no match, minimum input not met, or multiple matches with no way to choose. The run continues to the next record. Misses are not charged for. Set `skipUnmatched` to true to leave them out of the dataset entirely.

#### How much does a run cost?

Pricing is pay per result: you are charged for each matched business returned to the dataset, and never for misses or duplicates. Apify platform usage is included in the per-result price. Your own API provider's credits are separate and billed by them.

### Keyword map

business firmographics API, US company data API, company lookup by phone, domain to company data, SIC code lookup, NAICS code lookup, EIN lookup API, employee count data, company revenue estimate, business address verification, B2B data append, CRM enrichment API, business contact data, stock ticker to company, company geocoding, headquarters vs branch data, batch company enrichment

# Actor input Schema

## `domains` (type: `array`):

Company web addresses to look up, one per line. A full URL works too: it is reduced to the bare hostname before the request. A web address on its own is a complete lookup.

## `phones` (type: `array`):

Business phone numbers to look up, one per line. A 10 digit US number on its own is a complete lookup, which makes this the fastest way to enrich a call list.

## `stockTickers` (type: `array`):

Stock exchange ticker symbols to look up, one per line, for example MSFT. A ticker on its own is a complete lookup.

## `freeformQueries` (type: `array`):

Freeform strings to look up, one per line, where each string carries one of the accepted minimum inputs, for example a whole company address on one line. Use this when your source data is not split into fields.

## `businessRecords` (type: `string`):

Full company records for lookups by name and address. Paste a JSON array of objects, or one JSON object per line, using the field names comp (company name), a1 (address line 1), a2, suite, city, state, postal, ctry, phone, stock, web, mak and mek. A record needs an address with city and state or postal code, or a phone, or a ticker, or a web address.

## `columns` (type: `array`):

Data groups to return on top of the default columns. Contacts returns names, titles and emails of people at the business. GrpBusinessCodes returns the EIN with up to three NAICS and SIC codes, and GrpBusinessDescription returns their descriptions. GrpAddressDetails, GrpGeoCode and GrpCensus return address keys, latitude and longitude, and county and census geography.

## `centricHint` (type: `string`):

Which input the search should centre on when a record carries several. Leave on the provider default unless you know your data is strongest on one of them.

## `maxContacts` (type: `integer`):

Upper limit on the number of contacts returned per business. Only has an effect when the Contacts data group is selected. The provider defaults to 5.

## `returnDominantBusiness` (type: `boolean`):

When the company name is missing or does not match, still return the dominant business at that location. On by default, which matches the provider. Turn it off when you only want exact company matches.

## `sicNaicsConfidence` (type: `string`):

How strictly to return SIC and NAICS codes. Loose returns any associated code. Strict returns only codes the provider is confident in, and null when none qualify, which is what you want when the codes drive routing or scoring.

## `batchSize` (type: `integer`):

How many records to send in one batch request. The provider accepts up to 100, which is the default and the fastest setting. Lower it only if you want smaller, more frequent progress updates.

## `recordsPerSecond` (type: `integer`):

Pace the run to your plan's throughput. The provider documents roughly 5 records per second on pay-as-you-go, 12 on self-service, 50 on business and 100 on enterprise. The default of 5 is safe on every plan; raise it to match yours and a large list finishes sooner.

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

Leave inputs that matched no business out of the dataset. Off by default, because keeping the misses is what lets you see which inputs resolved and why. Unmatched rows are never charged for either way.

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

Stop after this many rows. This is the cap on both spend and run time.

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

Your own licence key for the business firmographics API, sent as the request's id field. Required for every lookup. Stored as a secret, so it never appears in a log line or a URL.

## Actor input object example

```json
{
  "domains": [
    "melissa.com"
  ],
  "businessRecords": "[{\"comp\": \"Melissa\", \"a1\": \"22382 Avenida Empresa\", \"city\": \"Rancho Santa Margarita\", \"state\": \"CA\", \"postal\": \"92688\"}]",
  "columns": [
    "EmployeesEstimate",
    "SalesEstimate",
    "Phone",
    "WebAddress",
    "GrpBusinessCodes",
    "GrpBusinessDescription"
  ],
  "centricHint": "default",
  "returnDominantBusiness": true,
  "sicNaicsConfidence": "loose",
  "batchSize": 100,
  "recordsPerSecond": 5,
  "skipUnmatched": false,
  "maxResults": 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 = {
    "domains": [
        "melissa.com"
    ],
    "businessRecords": "[{\"comp\": \"Melissa\", \"a1\": \"22382 Avenida Empresa\", \"city\": \"Rancho Santa Margarita\", \"state\": \"CA\", \"postal\": \"92688\"}]"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/business-firmographics-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 = {
    "domains": ["melissa.com"],
    "businessRecords": "[{\"comp\": \"Melissa\", \"a1\": \"22382 Avenida Empresa\", \"city\": \"Rancho Santa Margarita\", \"state\": \"CA\", \"postal\": \"92688\"}]",
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/business-firmographics-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 '{
  "domains": [
    "melissa.com"
  ],
  "businessRecords": "[{\\"comp\\": \\"Melissa\\", \\"a1\\": \\"22382 Avenida Empresa\\", \\"city\\": \\"Rancho Santa Margarita\\", \\"state\\": \\"CA\\", \\"postal\\": \\"92688\\"}]"
}' |
apify call nabeelbaghoor/business-firmographics-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/business-firmographics-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/KHGSPXOdSFpbIEKbE/builds/eUe84sKdfgW5AEbjf/openapi.json
