# Premium Enriched B2B Leads (129M Companies/522M Employees) (`ecommerce_leads/premium-enriched-b2b-leads`) Actor

Apollo, ZoomInfo, Crunchbase and People Data Labs alternative. Search B2B companies by industry, category, location, technology and size, then pull verified employee contacts: name, title, email, LinkedIn, phone. Pay per result. Stable pagination for scheduled runs.

- **URL**: https://apify.com/ecommerce\_leads/premium-enriched-b2b-leads.md
- **Developed by:** [Monster Leads](https://apify.com/ecommerce_leads) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.80 / 1,000 company records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

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

## Premium Enriched B2B Leads — 129M Companies, 522M Employees

**B2B lead generation, company data enrichment and email finder in one Actor.** Search enriched company records by industry, category, location, technology stack and company size — then pull the verified employee contacts behind each one: full name, job title, work email, LinkedIn profile and phone.

Built for sales prospecting, cold email campaigns, CRM enrichment, market research, TAM analysis and recruitment sourcing.

***

### Why this Actor

| | |
|---|---|
| 🔎 **One search box** | Query name, description, industry and category together |
| 👥 **Employee contacts** | Name, title, email, LinkedIn, phone — per company |
| 📊 **Real availability counts** | See how many contacts exist *before* you pay for them |
| 🔁 **Resumable pagination** | Page 3 next week = page 3 today. Never re-pull, never skip |
| 💸 **Pay per result** | Charged per record delivered, not per request |
| ⚡ **Fast** | 1,000 companies per request |

***

### What you can do with it

#### Find companies by industry and location

Software companies in Germany. Roofing contractors in Texas. Solar installers across the US with a verified email address. Any combination of industry, category, country, state and city.

#### Find decision makers

Turn on **Include employees** and every company arrives with its people — CEOs, founders, marketing managers, engineers — each with a job title, work email and LinkedIn URL.

#### Enrich a list you already have

Switch to **Look up by company ID** and pass IDs you stored from an earlier run. You get the full company profile plus every employee, without re-running a search.

#### Build a technology-based prospect list

Filter to companies using a specific technology stack — Shopify, HubSpot, WordPress, Salesforce and thousands more.

#### Run it weekly and never see the same lead twice

Ordering is frozen. Set `startPage` to where you finished and every run returns genuinely new companies. The Actor writes `nextPage` to the key-value store so a schedule can pick it up automatically.

***

### Every company has an ID — use it to fetch that company's employees

Each company record includes a permanent **`company_id`**:

```json
{
  "company_id": 2343920628,
  "company_name": "PT Gunanusa Utama Fabricators",
  "employeesAvailable": 181
}
```

That ID is the key to a **two-step workflow** that keeps your costs down:

**Step 1 — search cheaply.** Run a search *without* employees. You pay only the company rate and get back IDs plus `employeesAvailable`, which tells you exactly how many people exist for each company.

```
searchTerm: solar     country: United States     hasEmail: true
includeContacts: false        ← employees NOT fetched
```

**Step 2 — enrich only what you want.** Review the results, pick the companies worth pursuing, and run the Actor again in **Look up by company ID** mode with just those IDs:

```
mode: by_id
companyIds: ["2343920628", "2340821595", "2349344667"]
includeContacts: true
```

You get each company's full profile plus its employee list — names, job titles, work emails, LinkedIn URLs, phone numbers.

#### Why do it in two steps

Fetching employees for every result is billed per contact. A broad search where most companies aren't a fit means paying for contacts you never use. Searching first, then enriching a shortlist, means you only pay for people at companies you actually chose.

`employeesAvailable` makes that decision precise — it is exactly the number of contact events you'd be charged if you enriched that company.

#### IDs are permanent

A `company_id` is assigned once and never reused or reassigned. Store them in your CRM, spreadsheet or database and look them up weeks later — the same ID always returns the same company. IDs beginning `234` have a website; `240` are name-only records.

***

### Search filters

**Text** — `searchTerm` covers company name, description, industry and categories at once.

**Location** — country, state/region, city.

**Classification** — industry (exact or partial), category.

**Presence** — has email (35M), has phone (52M), has website (106M), has LinkedIn (68M), has country, has city, has employee contacts (44M).

**Size** — minimum and maximum estimated headcount; minimum employee contacts available.

All filters combine. Leave any blank to ignore it.

***

### Output

#### Company record

```json
{
  "company_id": 2343920628,
  "company_name": "PT Gunanusa Utama Fabricators",
  "domain": "gunanusautama.com",
  "website": "https://gunanusautama.com",
  "emails_all": ["info@gunanusautama.com"],
  "phones_all": ["+62215551234"],
  "street": "Jl. Raya Serang KM 9",
  "city": "Jakarta",
  "state": "Jakarta",
  "postal_code": "15710",
  "country": "Indonesia",
  "region": "Asia",
  "industry": "Oil & Energy, Construction",
  "categories": ["Offshore Platforms", "Fabrication", "Engineering"],
  "employeesAvailable": 181,
  "employeesEstimated": "200+",
  "revenue_usd": 45000000,
  "founded_year": 1977,
  "linkedin_url": "https://linkedin.com/company/gunanusa",
  "technologies": ["WordPress", "Google Analytics"],
  "description": "Offshore platform fabrication and engineering services."
}
```

#### Employee record

```json
{
  "type": "contact",
  "companyId": 2343920628,
  "companyName": "PT Gunanusa Utama Fabricators",
  "fullName": "Adam Pierce",
  "title": "Commissioning Manager",
  "email": "apierce@gunanusautama.com",
  "linkedinUrl": "https://linkedin.com/in/adampierce",
  "phones": ["+62215551234"],
  "city": "Jakarta",
  "country": "Indonesia"
}
```

#### Two size fields, and why

- **`employeesAvailable`** — how many employee records we hold. This is exactly what you'd be billed for if you fetched them.
- **`employeesEstimated`** — realistic company size as a band (`"200+"`).

Self-reported headcounts are unreliable, so `employeesEstimated` is derived from the contacts actually on file and always rounds **down** — a company shown as `"50+"` is never one we believe is smaller.

Filter with **Minimum company size (estimated)** rather than a raw headcount field to avoid discarding companies whose stated size is missing or wrong.

***

### Pricing

| Event | Price | Charged |
|---|---|---|
| Company lead | **$0.006** | per company returned |
| Employee contact | **$0.001** | per employee returned |

You pay for records delivered — not per request, not per run. Page size affects speed, never cost.

| Example | Cost |
|---|---|
| 1,000 companies | $6.00 |
| 1,000 companies + 5 employees each | $11.00 |
| 100 companies, no employees | $0.60 |

**Control your spend:** `maxContactsPerCompany` (default 25) caps employees per company so a single large company can't consume a run's budget. `maxItems` sets a hard stop. Apify's own **Max total charge** limit applies on top.

***

### Quick start

1. Set **Search term** to your niche, e.g. `solar`
2. Set **Country**, e.g. `United States`
3. Tick **Has email**
4. Set **Pages to fetch** to `1` and **Results per page** to `100`
5. Run it

That's 100 companies for $0.60.

**Then get the decision makers:** copy the `company_id` values of the companies you want, run the Actor again with **What to fetch** set to *Look up by company ID*, paste them into **Company IDs**, and tick **Include employees**. You get every employee at those companies — and pay only for those.

***

### Resuming across runs

Ordering never changes, so paging is stable across days:

```
Run 1  → startPage 1,  maxPages 10   → companies 1–1,000
Run 2  → startPage 11, maxPages 10   → companies 1,001–2,000
```

Each run saves `nextPage` to the key-value store. New companies are appended at the end, so existing pages never shift and you never receive a duplicate.

***

### FAQ

**Are the emails verified?**
Emails come from verified sources and business records. As with any B2B database some addresses go stale — validate before a large send.

**Does every employee have a job title?**
About 62% do. Name, email and company are present far more consistently; `title` is blank where the source did not carry one.

**Can I get contacts for a specific company?**
Yes. Use **Look up by company ID**, or filter a search down to the company you want and enable **Include employees**.

**How do I avoid paying for companies with no contacts?**
Tick **Has employee contacts**. Only companies with at least one employee on file are returned.

**Is the company ID stable?**
Yes — assigned once and never reused. Store them in your CRM and look them up weeks later; the same ID always returns the same company.

**How do I get employees for a company I already found?**
Take its `company_id` from the earlier run and use **Look up by company ID** mode with **Include employees** turned on. No need to repeat the search.

**Can I look up several companies at once?**
Yes. **Company IDs** accepts a list, so one run can enrich as many as you like.

**Why not just fetch employees during the search?**
You can — tick **Include employees**. But employees are billed per contact, so on a broad search you pay for people at companies you may not want. Searching first, then enriching a shortlist by ID, is usually cheaper.

**What if I only want companies with a website?**
Tick **Has website**, or leave the default scope, which already excludes name-only records.

**Can I export to CSV / Excel / JSON?**
Yes. Every Apify dataset exports to CSV, JSON, XML, Excel or HTML, and is available via API.

**Does it work on a schedule?**
Yes. Use Apify Schedules with `startPage` advancing each run for a continuous stream of new leads.

***

### Legal

Data is aggregated from publicly available business sources. You are responsible for complying with GDPR, CCPA, CAN-SPAM and any other regulation that applies to your use, including lawful basis for processing and honouring opt-outs.

***

#### Keywords

b2b leads · lead generation · company database · email finder · contact finder · sales prospecting · b2b data · company enrichment · lead scraper · business leads · decision maker contacts · linkedin leads · cold email list · crm enrichment · sales intelligence · firmographic data · technographic data · market research · tam analysis · recruitment sourcing · apollo alternative · zoominfo alternative · b2b contact database

# Actor input Schema

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

Search companies by filters, or look up specific companies by ID. Every search result includes a permanent company\_id — save those, then use "Look up by company ID" later to pull that company's employees without re-searching.

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

Company IDs to fetch, taken from company\_id in an earlier run's results. Each returns the full company profile plus its employees (turn on "Include employees"). IDs are permanent: store them and reuse them any time. They start with 234 (has a website) or 240 (name only).

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

Searches company name, description, industry and categories at once. Example: "solar" finds solar installers, manufacturers and consultants.

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

Full country name as stored, e.g. "United States", "Germany", "United Kingdom".

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

Filter by state or region, e.g. "California", "Bavaria", "Ontario". Exact match.

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

Filter by city, e.g. "London", "Berlin", "New York". Exact match.

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

Exact industry match, e.g. "Software", "Construction".

## `category` (type: `string`):

Exact category match. A company usually has several.

## `hasEmail` (type: `boolean`):

Only return companies that have at least one email address on file (35M companies).

## `hasPhone` (type: `boolean`):

Only return companies that have at least one phone number on file (52M companies).

## `hasWebsite` (type: `boolean`):

Only return companies that have a website URL (106M companies).

## `hasLinkedin` (type: `boolean`):

Only return companies with a LinkedIn company page (68M companies).

## `hasCountry` (type: `boolean`):

Only return companies where the country is known (90M companies).

## `hasCity` (type: `boolean`):

Only return companies where the city is known (59M companies).

## `hasContacts` (type: `boolean`):

Only companies we hold at least one employee for (44M companies). Use this with "Include employees" so you never pay for a company that returns nobody.

## `employeesEstimatedMin` (type: `integer`):

Filters on our ESTIMATED headcount, not just the self-reported figure. 19M companies list 0 employees despite us holding their staff, so this finds companies a plain size filter misses — a "50+" search returns 5.8M companies instead of 3.6M.

## `employeesAvailableMin` (type: `integer`):

Only companies where we hold at least this many employee records.

## `empMin` (type: `integer`):

The vendor's stated headcount only. Often 0 or missing — prefer "Minimum company size (estimated)" above.

## `empMax` (type: `integer`):

Maximum estimated company size. Combine with the minimum to target a size range, e.g. 10-200 for SMBs.

## `includeContacts` (type: `boolean`):

Fetch each company's employees — name, title, work email, LinkedIn, phone. Billed per contact. Cheaper alternative: search without this, then re-run in "Look up by company ID" mode for just the companies you picked. Some companies have thousands — set a cap below.

## `maxContactsPerCompany` (type: `integer`):

Caps how many employees are pulled per company, so one large company cannot consume your whole budget. 0 means no cap.

## `pageSize` (type: `string`):

How many companies each request fetches. Does not change the price - you pay per company returned either way. Larger pages are faster.

## `startPage` (type: `integer`):

Page ordering is frozen: page 3 returns the same companies next week as it does today, so you can resume where you stopped and never re-pull the same leads.

## `maxPages` (type: `integer`):

How many pages to pull in this run. With 1000 per page, 10 pages = 10,000 companies.

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

Stops the run once this many companies have been returned, whatever the page settings say. 0 means no limit.

## `scope` (type: `string`):

21M companies are known by name only — no domain, and no website/LinkedIn/employee data. Useful for local businesses.

## Actor input object example

```json
{
  "mode": "search",
  "companyIds": [
    "2343920628"
  ],
  "hasEmail": false,
  "hasPhone": false,
  "hasWebsite": false,
  "hasLinkedin": false,
  "hasCountry": false,
  "hasCity": false,
  "hasContacts": false,
  "includeContacts": false,
  "maxContactsPerCompany": 25,
  "pageSize": "100",
  "startPage": 1,
  "maxPages": 1,
  "maxItems": 0,
  "scope": "company"
}
```

# Actor output Schema

## `companies` (type: `string`):

Every record from this run. Company rows carry type=company; employee rows carry type=contact and a companyId linking them to their employer.

## `companiesOnly` (type: `string`):

Just the company records, without the employee rows.

## `contactsOnly` (type: `string`):

Just the employee records - name, job title, work email, LinkedIn and phone.

## `runSummary` (type: `string`):

Counts of companies and contacts returned, why the run stopped, and nextPage - the page to start from next time so a scheduled run never re-pulls the same leads.

# 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 = {
    "companyIds": [
        "2343920628"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ecommerce_leads/premium-enriched-b2b-leads").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 = { "companyIds": ["2343920628"] }

# Run the Actor and wait for it to finish
run = client.actor("ecommerce_leads/premium-enriched-b2b-leads").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 '{
  "companyIds": [
    "2343920628"
  ]
}' |
apify call ecommerce_leads/premium-enriched-b2b-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ecommerce_leads/premium-enriched-b2b-leads"
        }
    }
}

```

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/kG5osEEexGcCRxijB/builds/TO3dnnRffYze3prgc/openapi.json
