# B2B Company Enrichment API - Firmographics and Intent (`nabeelbaghoor/b2b-company-enrichment-api`) Actor

Enrich company domains and names into full B2B profiles, or prospect for new companies by size, revenue, industry, SIC and NAICS codes, technologies and buyer intent topics. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/b2b-company-enrichment-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

$15.00 / 1,000 company 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

## B2B Company Enrichment API - Firmographics and Intent

Turn company domains and names into complete B2B profiles, or describe an ideal customer profile and let the provider find the companies for you. Each result carries firmographics, industry classification with SIC and NAICS codes, headquarters and office locations, the technology stack, funding rounds and investors, buyer intent topics and social links. You pay only for the companies you actually receive.

This actor is built for enriching a CRM or signup list, building a target account list from an ideal customer profile, and scoring accounts by the technology they run and the topics they are actively researching.

### What you can do with it

- Enrich a list of domains or work email addresses into full company records.
- Prospect for new accounts by employee size, revenue band, industry, SIC or NAICS code.
- Find companies running a specific technology and build a competitive displacement list.
- Surface accounts showing buyer intent on the topics that matter to your product.
- Fill in missing industry codes, headcount and headquarters address on a CRM export.
- Export everything as JSON, CSV or Excel, or push it into your CRM or warehouse.

### Features

- Two modes in one actor: lookup by identifier, or prospecting by filters.
- Lookup accepts domains, company names and provider ids together, and reduces full URLs and work email addresses down to the bare domain.
- Prospecting exposes every documented company filter: names, locations, sizes, revenues, SIC codes, NAICS codes, industry labels, technologies and buyer intent topics.
- A `rawFilters` passthrough covers exclusions and any filter shape not modelled as a simple list, so a new filter never needs a code change.
- Full profiles are revealed in batches of 100, which keeps provider credit use efficient.
- Turn `enrichCompanies` off to keep only the lightweight preview when you just need names and ids.
- Duplicate companies are removed across pages and batches before anything is charged.
- The complete raw provider payload is kept on every record, so nothing is lost.
- Rate limits are handled with retry-after aware backoff, and a run that hits a limit keeps everything already collected.
- Pay-per-result pricing with a hard result cap so a run can never surprise you.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `searchMode` | string | `lookup` for companies you know, `prospecting` to find new ones. |
| `domains` | array | Lookup: company domains, one per line. |
| `companyNames` | array | Lookup: company names, one per line. |
| `companyIds` | array | Lookup: provider company ids. |
| `names` | array | Prospecting: name fragments, 2 to 256 characters each. |
| `locations` | array | Prospecting: locations, 2 to 256 characters each. |
| `sizes` | array | Prospecting: employee count bands. |
| `revenues` | array | Prospecting: annual revenue bands. |
| `industriesLabels` | array | Prospecting: industry labels. |
| `sics` / `naics` | array | Prospecting: SIC and NAICS codes. |
| `technologies` | array | Prospecting: technologies in use. |
| `intentTopics` | array | Prospecting: buyer intent topics. |
| `rawFilters` | object | Advanced filter object, merged last. |
| `enrichCompanies` | boolean | Reveal full profiles. On by default. |
| `maxResults` | integer | Stop after this many companies (1 to 20,000). |
| `apiKey` | string | Your API key. Required, stored securely. |

Either at least one lookup identifier or at least one prospecting filter is required, depending on the mode.

### Example output

Each dataset item is one company. Fields are populated where the provider has data, and the complete provider payload is kept under `raw`:

```json
{
  "id": "5f7a1c2b9d3e4a0012ab34cd",
  "name": "Example Robotics",
  "domain": "example.com",
  "website": "https://www.example.com",
  "description": "Example Robotics builds warehouse picking robots for third-party logistics providers.",
  "size": "201-500",
  "employees": 340,
  "revenue": "$50M-$100M",
  "yearFounded": 2014,
  "companyType": "Private",
  "primaryIndustry": "Industrial Automation",
  "subIndustry": "Robotics",
  "sicCodes": ["3559"],
  "naicsCodes": ["333249"],
  "city": "Amsterdam",
  "state": "North Holland",
  "country": "Netherlands",
  "headquarters": "Herengracht 182, Amsterdam, North Holland, 1016 BR, Netherlands",
  "officeLocations": ["Austin, Texas, United States"],
  "technologies": ["AWS", "Kubernetes", "HubSpot"],
  "fundingRounds": ["Series B"],
  "investors": ["Example Ventures"],
  "buyerIntentTopics": ["warehouse automation", "robotics as a service"],
  "linkedin": "https://www.linkedin.com/company/example-robotics",
  "linkedinFollowers": 18420,
  "twitter": null,
  "facebook": null,
  "logo": "https://cdn.example.com/logo.png",
  "enriched": true,
  "raw": { "id": "5f7a1c2b9d3e4a0012ab34cd", "name": "Example Robotics" }
}
```

### Pricing and the credit model

This actor uses pay-per-result pricing. You are charged a fixed price for each company delivered to the dataset, after duplicates are removed. A run that matches nothing costs nothing. Set `maxResults` to cap how many rows a run can collect, and set a run spending limit as a second safety net. Your own provider plan meters its own credits separately: the search step and the reveal step are billed by the provider as different actions, so turning `enrichCompanies` off is the cheaper way to run a large discovery pass first.

### Bring your own API key

This actor connects to a third-party B2B company data provider (Lusha) on your behalf and requires your own provider API key. Generate a key in the provider's dashboard and paste it into the `apiKey` input. It is stored securely and never logged, and the actor never ships with or shares credentials.

### Frequently asked questions

#### What data does this actor return?

Company name, domain and website, a description, employee size band and headcount, revenue band, founded year and company type, primary and sub industry with SIC and NAICS codes, headquarters city, state and country plus additional office locations, the technology stack, funding rounds and investors, buyer intent topics, LinkedIn with follower count, Twitter, Facebook and a logo URL. Every record also carries the untouched provider payload.

#### What is the difference between lookup and prospecting mode?

Lookup starts from companies you already know and returns their profiles, so the output size equals your input list. Prospecting starts from filters that describe an ideal customer profile and returns whatever matches, paging until it reaches your `maxResults`. Both modes end in the same enrichment step and produce the same row shape.

#### Which prospecting filters are available?

Company names, locations, employee size bands, revenue bands, SIC codes, NAICS codes, industry labels, technologies and buyer intent topics. Name and location filters need between 2 and 256 characters. For exclusions and for any filter shape that is not a simple list, use `rawFilters`.

#### How do I find the valid values for a filter?

The provider exposes a filter-values endpoint that lists the accepted values for each filter type. Query it once for the filter you care about, then paste the exact labels into that field here. Using a value the provider does not recognise simply returns no matches.

#### Can I skip enrichment to save credits?

Yes. Turn `enrichCompanies` off and the actor keeps the lightweight preview from the search step: name, domain and provider id. Store those ids, then run again later in lookup mode with `companyIds` to reveal only the companies you decided were worth it.

#### Does it accept email addresses as input?

Yes. A work email address such as `jane@example.com` is reduced to `example.com` before the lookup, so you can paste a raw signup list without cleaning it first.

#### How does the actor handle rate limits?

It throttles requests, honours the retry-after signal on a rate-limited response, and backs off exponentially. If the limit is still in force it stops early and keeps everything already collected rather than failing the whole run.

#### How am I charged?

You pay a fixed price per company returned to the dataset. Duplicates are removed before charging and empty runs cost nothing. Use `maxResults` and the run spending limit to control cost.

#### What output formats are available?

The dataset can be exported as JSON, CSV, Excel, HTML or RSS, or read through the API for pushing into a CRM or warehouse.

### Keyword map

b2b company enrichment api, company data api, firmographic enrichment, domain to company data, company prospecting api, ideal customer profile search, buyer intent data api, technographic data, sic code lookup, naics code lookup, company revenue data, employee count data, company technology stack api, account enrichment, crm data enrichment, target account list, b2b lead enrichment, company funding data, company linkedin data, bulk company lookup.

# Actor input Schema

## `searchMode` (type: `string`):

`Lookup` enriches companies you already know, by domain, name or provider id. `Prospecting` finds new companies that match an ideal customer profile you describe with filters.

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

Lookup mode. Company domains to enrich, one per line, for example `example.com`. Full URLs and work email addresses are accepted and reduced to their domain.

## `companyNames` (type: `array`):

Company names to look up, one per line. Use a domain instead where you have one, since names are less precise.

## `companyIds` (type: `array`):

Company ids from the data provider, one per line. Use these when you stored ids from a previous run and want the profiles again without a fresh search.

## `names` (type: `array`):

Prospecting mode. Name fragments to match, one per line. Each needs 2 to 256 characters.

## `locations` (type: `array`):

Locations to match, one per line, for example `United States` or `London, United Kingdom`. Each needs 2 to 256 characters.

## `sizes` (type: `array`):

Employee count bands to match, one per line, using the provider's own band labels such as `11-50` or `201-500`.

## `revenues` (type: `array`):

Annual revenue bands to match, one per line, using the provider's own band labels.

## `industriesLabels` (type: `array`):

Industry labels to match, one per line, for example `Software Development`.

## `sics` (type: `array`):

Standard Industrial Classification codes to match, one per line.

## `naics` (type: `array`):

North American Industry Classification System codes to match, one per line.

## `technologies` (type: `array`):

Technologies the company runs, one per line, for example `Salesforce` or `HubSpot`.

## `intentTopics` (type: `array`):

Buyer intent topics the company is showing activity on, one per line. Requires an intent entitlement on your provider plan.

## `rawFilters` (type: `object`):

Advanced. A JSON object merged into the `companies` filter object, for example `{"include": {"sizes": [{"min": 50, "max": 200}]}, "exclude": {"locations": ["India"]}}`. Merged last, so it also overrides the fields above. Use this for exclusions and for any filter shape not covered by the simple lists.

## `enrichCompanies` (type: `boolean`):

When enabled, every matched company is revealed into a full profile with firmographics, industry codes, technologies, funding and social links. Turn this off to keep only the lightweight preview, which costs fewer provider credits.

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

Stop after this many companies (1-20,000). One row is one company.

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

Your own API key for the data provider. Required. It is generated in the provider's dashboard. Stored securely here and never logged.

## Actor input object example

```json
{
  "searchMode": "lookup",
  "domains": [
    "microsoft.com"
  ],
  "companyNames": [],
  "companyIds": [],
  "names": [],
  "locations": [],
  "sizes": [],
  "revenues": [],
  "industriesLabels": [],
  "sics": [],
  "naics": [],
  "technologies": [],
  "intentTopics": [],
  "rawFilters": {},
  "enrichCompanies": true,
  "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": [
        "microsoft.com"
    ],
    "companyNames": [],
    "companyIds": [],
    "names": [],
    "locations": [],
    "sizes": [],
    "revenues": [],
    "industriesLabels": [],
    "sics": [],
    "naics": [],
    "technologies": [],
    "intentTopics": [],
    "rawFilters": {},
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/b2b-company-enrichment-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": ["microsoft.com"],
    "companyNames": [],
    "companyIds": [],
    "names": [],
    "locations": [],
    "sizes": [],
    "revenues": [],
    "industriesLabels": [],
    "sics": [],
    "naics": [],
    "technologies": [],
    "intentTopics": [],
    "rawFilters": {},
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/b2b-company-enrichment-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "microsoft.com"
  ],
  "companyNames": [],
  "companyIds": [],
  "names": [],
  "locations": [],
  "sizes": [],
  "revenues": [],
  "industriesLabels": [],
  "sics": [],
  "naics": [],
  "technologies": [],
  "intentTopics": [],
  "rawFilters": {},
  "maxResults": 100
}' |
apify call nabeelbaghoor/b2b-company-enrichment-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nabeelbaghoor/b2b-company-enrichment-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8xJpN403HbfIidKpj/builds/if1qpaJEBWC62qQYW/openapi.json
