# Company Enrichment API - Search, Firmographics, Tech Stack (`nabeelbaghoor/company-enrichment-firmographics-api`) Actor

Search companies by country, state, city, industry, employee size, founded year, funding and revenue, or enrich a list of domains, company names and profile URLs. Returns name, domain, industry, employee count, company type, founded year, address and social profiles. Bring your own API key.

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

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

## Company Enrichment API - Search, Firmographics, Tech Stack

Build a company list from filters, or fill in the firmographics for a list you already have. Returns the company name, domain, website, industry, description, employee count and band, company type, founded year, full address, social profiles and follower count, one flat row per company, with optional tech stack, revenue estimate, fundraising history and office locations.

### What this actor does

- **Two ways to get companies, one output shape.** Search builds a new list from the provider's filters; enrich takes domains, company names or profile URLs you already have. Both write the same columns, so the two can be appended to the same table without any reshaping.
- **Filters on the server, not after the fact.** Country, state, city, industry, name fragment, employee band, founding window, funding range, revenue range and social follower range are all sent to the provider, so you pay for the companies you asked for rather than filtering a broad pull down afterwards.
- **Enriches from whatever identifier you have.** A domain, a bare company name or a company profile URL is each a complete lookup on its own. A pasted browser URL is reduced to the hostname or the profile path before the request, so a messy list still resolves.
- **Adds the deeper data only when you ask.** Tech stack, revenue estimate, fundraising history and office locations are separate endpoints and separate credits, so they are opt-in per run rather than always on.
- **Paces itself to the documented rate limit** of 100 requests per minute per key, so a long enrichment pass does not trip the limiter and waste credits redoing work.
- **Writes each page as it lands.** A run stopped halfway still leaves a usable dataset rather than nothing.
- **Never charges for a miss.** Only rows carrying a resolved company are billed.

### Input

| Field | What it does |
| --- | --- |
| `mode` | Search for companies by filter, or enrich a list you already have. |
| `country` | Country to search in. Required in search mode. |
| `state`, `city` | Narrow the search to a region or a city. |
| `industry` | Industry to filter on. |
| `companyNameContains` | Return only companies whose name contains this text. |
| `employeeSize` | Headcount band, using the provider's own bands. |
| `foundedAfterYear`, `foundedBeforeYear` | Search a founding window. |
| `annualRevenueMin`, `annualRevenueMax` | Revenue range, in millions of US dollars. |
| `fundingAmountMin`, `fundingAmountMax` | Total funding raised, in US dollars. |
| `followersCountMin`, `followersCountMax` | Social follower range. |
| `productsServices` | Products or services the company should offer. |
| `isSchool`, `excludeSchools` | Keep only, or leave out, educational institutions. |
| `companyDomains`, `companyNames`, `linkedinUrls` | The list to enrich. |
| `addOns` | Extra endpoints: tech stack, revenue, fundraising, locations. |
| `requestsPerMinute` | Pace the run under the provider's per-key ceiling. |
| `skipNotFound` | Leave unresolved inputs out of the dataset. |
| `maxResults` | Hard cap on rows, and therefore on spend and run time. |
| `apiKey` | Your own API key. Stored as a secret. |

### Example output

```json
{
  "found": true,
  "source": "enrich",
  "query": "stripe.com",
  "confidence": 96,
  "name": "Stripe",
  "domain": "stripe.com",
  "website": "https://stripe.com",
  "industry": "software development",
  "description": "Financial infrastructure for the internet.",
  "companyType": "privately held",
  "foundedYear": "2010",
  "employeeCount": 8000,
  "employeeRange": "5,001-10,000",
  "followersCount": 1000000,
  "country": "united states",
  "state": "california",
  "city": "south san francisco",
  "address": "354 oyster point blvd, south san francisco, 94080, us",
  "linkedinUrl": "linkedin.com/company/stripe",
  "facebookUrl": null,
  "twitterUrl": null,
  "raw": { }
}
```

### Frequently asked questions

#### What data does the Company Enrichment API return?

Every resolved company returns the name, the domain, the website, the industry, the description, the company type, the founded year, the employee count and the headcount band, the social follower count, the logo URL, the country, state, city and full address, and the social profile URLs. Turning on the add-ons layers the technologies the company uses, its revenue estimate, its fundraising history and its office locations onto the same row.

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

Yes. This actor does not include data access. You use your own API key from CUFinder, which is the provider whose company data API this actor calls, created on their dashboard. 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 a request header rather than a URL parameter, so it never appears in a log line or a redirect.

#### Should I use search mode or enrich mode?

Use search when you want companies you do not have yet and can describe them by filter: a country plus an industry, a headcount band and a founding window is enough to build a territory list from nothing. Use enrich when you already have a list, from a CRM export or a form fill, and what you are missing is the firmographics. Enrich is also the mode that resolves a bare company name into a domain.

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

A country. The provider requires it on every company search, so a run without one stops immediately with that message rather than pulling the whole database. Every other filter is optional and narrows from there.

#### How do I find companies in a funding or revenue band?

Set `fundingAmountMin` and `fundingAmountMax` in US dollars for total raised, or `annualRevenueMin` and `annualRevenueMax` in millions of US dollars for revenue. Both are server side filters, so a search for companies that have raised between one and ten million returns only those and costs credits only for those. Pair either with a founding window to isolate a cohort rather than a size band.

#### Can I get the technologies a company uses?

Yes. Add `techStack` to the add-ons and each company row carries the technologies the provider has detected for that domain. Revenue, fundraising and locations work the same way. Each add-on is a separate request and separate provider credits per company, so turn on only what you will actually use.

#### What happens when a company cannot be resolved?

The row is written with `found: false` and an `error` giving the provider's own reason, and the run continues to the next entry. Misses are not charged for. Set `skipNotFound` to true to leave them out of the dataset entirely.

#### How does this handle the provider's rate limit?

The documented limit is 100 requests per minute per key, in a fixed window. The actor spaces its requests to stay under that rather than sprinting into the limiter, and `requestsPerMinute` lets you lower the pace further when the same key is being used by another job at the same time.

#### How much does a run cost?

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

### Keyword map

company enrichment API, company search API, B2B company data API, firmographics API, domain to company data, company lookup by domain, company technographics API, tech stack lookup API, company revenue data, company funding data, employee count data, industry filter company search, CRM enrichment API, lead list building, account intelligence, company profile enrichment, bulk company enrichment, company name to domain

# Actor input Schema

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

Search builds a new list from the provider's own company filters. Enrich takes a list you already have and fills in the firmographics for each entry. The filters below apply to search, the lists apply to enrich.

## `country` (type: `string`):

Country to search in, for example germany or united states. The provider requires a country on every search, so this is the one filter search mode cannot run without. Ignored in enrich mode.

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

State or region to narrow the search to, for example california or hamburg. Leave empty to search the whole country.

## `city` (type: `string`):

City to narrow the search to, for example berlin. Leave empty to search the whole country or region.

## `industry` (type: `string`):

Industry to filter on, for example software development or hospital and health care. The provider matches this against its own industry list, so a term from that list returns more than a freeform description.

## `companyNameContains` (type: `string`):

Return only companies whose name contains this text. Useful for pulling every entity in a group that shares a naming pattern rather than searching for one company.

## `employeeSize` (type: `string`):

Headcount band to filter on. These are the exact bands the provider indexes, so a band here filters server side rather than being applied after the fact.

## `foundedAfterYear` (type: `integer`):

Return only companies founded after this year. Pair it with the field below to search a founding window, which is the usual way to isolate a startup cohort.

## `foundedBeforeYear` (type: `integer`):

Return only companies founded before this year.

## `annualRevenueMin` (type: `integer`):

Lower bound on annual revenue, expressed in millions of US dollars, so 5 means five million.

## `annualRevenueMax` (type: `integer`):

Upper bound on annual revenue, expressed in millions of US dollars.

## `fundingAmountMin` (type: `integer`):

Lower bound on total funding raised, in US dollars. Use it to keep the list to companies that have actually raised.

## `fundingAmountMax` (type: `integer`):

Upper bound on total funding raised, in US dollars.

## `followersCountMin` (type: `integer`):

Lower bound on the company's social follower count. A rough but effective proxy for how established a company is when headcount is missing.

## `followersCountMax` (type: `integer`):

Upper bound on the company's social follower count.

## `productsServices` (type: `array`):

Products or services the company should offer, one per line. Use this when the industry label is too broad to isolate the companies you actually want.

## `isSchool` (type: `boolean`):

Return only educational institutions. Off by default, which searches everything.

## `excludeSchools` (type: `boolean`):

Leave educational institutions out of the results. Only has an effect when the option above is off.

## `companyDomains` (type: `array`):

Company domains to enrich, one per line. A pasted URL is reduced to the bare hostname before the request, so a whole browser URL works too. Used in enrich mode.

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

Company names to enrich, one per line. Use this when you have a name but no domain. A domain resolves more reliably, so prefer the field above where you have one.

## `linkedinUrls` (type: `array`):

Company profile URLs to enrich, one per line. The URL is reduced to the profile path before the request, so tracking parameters and trailing slashes are fine.

## `addOns` (type: `array`):

Extra endpoints to call for each company on top of the firmographics. Each one costs an additional request and additional provider credits per company, which is why none are on by default. Tech stack returns the technologies in use, revenue returns the revenue estimate, fundraising returns the funding history and locations returns the company's offices.

## `requestsPerMinute` (type: `integer`):

Pace the run under the provider's documented per-key ceiling of 100 requests per minute. Lower it if you are sharing the key with other jobs, so this actor does not use the whole window on its own.

## `skipNotFound` (type: `boolean`):

Leave inputs that resolved to no company out of the dataset. Off by default, because keeping the misses is what lets you see which entries 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 API key for the company data API, sent in the request header rather than a URL parameter, so it never appears in a log line or a redirect. Required for every lookup. Stored as a secret.

## Actor input object example

```json
{
  "mode": "search",
  "country": "united states",
  "isSchool": false,
  "excludeSchools": false,
  "addOns": [],
  "requestsPerMinute": 100,
  "skipNotFound": 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 = {
    "country": "united states"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/company-enrichment-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 = { "country": "united states" }

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/company-enrichment-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 '{
  "country": "united states"
}' |
apify call nabeelbaghoor/company-enrichment-firmographics-api --silent --output-dataset

```

## MCP server setup

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