# B2B Sales Lead Database API - Company and Contact Search (`nabeelbaghoor/b2b-sales-lead-database-api`) Actor

Search a B2B company and contact database by domain, job title, seniority, location, industry, SIC code, technology stack, employee size, revenue, hiring activity and news events. Returns contacts with emails, direct dials and LinkedIn profiles. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/b2b-sales-lead-database-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

$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

## B2B Sales Lead Database API - Company and Contact Search

Search a B2B company and contact database and export the results as flat rows: company name, domain, industry, SIC code, employee count and revenue alongside contact first and last name, job title, seniority, email, direct dial and LinkedIn profile.

### What this actor does

- **Searches by who you want to reach**, using job title keywords and seniority levels from executive down to manager.
- **Searches by where they are**, using country, state or province, postal codes with a radius in miles, and telephone area codes.
- **Searches by what the company is**, using industry codes, four digit SIC codes, employee size ranges, revenue ranges and free text keywords matched against the company description.
- **Searches by what the company uses**, filtering on detected technology products so you can target the accounts running a specific stack.
- **Searches by what the company just did.** Filter on news and press event categories inside a date window, or on the job titles a company is currently hiring for, so a list is built from buying signals rather than static firmographics.
- **Narrows to reachable contacts only**, keeping just the records that carry an email, a LinkedIn profile or a direct dial, and dropping anyone on your suppression list or already exported from your account.
- **Attaches company news, job openings and technology stack** as optional extras, fetched once per unique company rather than once per contact, so a search returning forty people at one account makes one extra call and not forty.
- **Pages through results to your cap.** The result cap is the ceiling on both spend and run time and is checked before every page and every row.

### Input

| Field | What it does |
| --- | --- |
| `domains` | Company domains to search for. A pasted URL is reduced to the bare hostname. |
| `companyIds` | Provider company IDs, when you already have them from an earlier run. |
| `titleKeywords` | Job title keywords to match. |
| `seniorityLevels` | Executive, VP, director or manager level. |
| `countryCode`, `states`, `postalCodes`, `postalRangeMiles`, `areaCodes` | Where the company is. |
| `industryCodes`, `sicCodes`, `companyDescription` | What the company does. |
| `technologies`, `technologyKeywords` | What the company runs. |
| `employeeSizeIds`, `revenueRangeIds` | How big the company is. |
| `hiringTitles`, `hiringSince` | What the company is hiring for, and since when. |
| `newsCategories`, `newsDateFrom`, `newsDateTo` | What happened at the company, and when. |
| `emailsOnly`, `linkedinOnly`, `directDialOnly` | Keep only reachable contacts. |
| `excludeSuppressed`, `excludeExported` | Respect your suppression list and export history. |
| `includeCompanyNews`, `includeCompanyJobs`, `includeCompanyTech`, `extrasLimit` | Optional per-company extras. |
| `sortBy`, `pageSize`, `maxResults`, `subAccountEmail` | Ordering, paging and limits. |
| `apiKey` | An access token. Stored as a secret. |
| `accountEmail`, `accountPassword` | Your own account credentials, used only to request a token. Stored as secrets. |

### Example output

```json
{
  "recordType": "lead",
  "companyId": "1743",
  "companyName": "Example Networks",
  "domain": "example.com",
  "industry": "Computer Networking",
  "sicCode": "7372",
  "employees": "4200",
  "revenue": "980000000",
  "city": "San Jose",
  "state": "CA",
  "country": "US",
  "employeeId": "376",
  "firstName": "Jane",
  "lastName": "Doe",
  "jobTitle": "Chief Financial Officer",
  "seniority": "Executive Level",
  "email": "jane.doe@example.com",
  "directPhone": "+1 408 555 0142",
  "linkedinUrl": "https://www.linkedin.com/in/example",
  "companyExtras": {
    "news": [{ "title": "Example Networks raises Series D", "date": "2026-07-14" }],
    "jobs": [{ "title": "Enterprise Account Executive", "posted": "2026-07-28" }],
    "technologies": [{ "name": "Salesforce" }]
  },
  "raw": { }
}
```

### Frequently asked questions

#### What data does the B2B Sales Lead Database API return?

Each row carries the company side and the contact side together: company name, domain, LinkedIn page, industry, SIC code, employee count, revenue, headquarters city, state, postal code and country, plus the contact's first and last name, job title, seniority level, work email, direct dial phone and LinkedIn profile URL. Switching on the optional sections adds recent news and press events, current job openings and the detected technology stack for each company.

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

Yes. This actor does not include data access. You use your own account with Lead411, which is the provider whose API this actor calls. Your own plan, unlock credits and terms apply. Supply either an access token in `apiKey`, or your account email and password so the actor can request a token from the provider's documented authentication endpoint. Every one of those fields is stored as an Apify secret.

#### Should I use an access token or my account password?

Use the access token when you can: paste it into `apiKey` and the run never sees your password at all. The catch is that the provider's tokens are short lived, so a long or scheduled run can outlive one. Supplying `accountEmail` and `accountPassword` lets the actor request a fresh token at the start of the run and mint another if one expires mid-list, which is what you want for anything unattended.

#### How do I build a list from buying signals rather than firmographics?

Two filters do this. `hiringTitles` with `hiringSince` returns companies actively hiring for a role, which is how you find a function that is growing and has budget. `newsCategories` with `newsDateFrom` and `newsDateTo` returns companies that triggered a press event such as a funding round or a senior hire inside your window. Combine either with `seniorityLevels` to get the decision maker at each of those accounts in one run.

#### Can I target companies by the software they use?

Yes. Put product names into `technologies`, for example `Salesforce` or `Hubspot`, and the search returns only accounts where that technology was detected. Use `technologyKeywords` for a free text sweep across the stack when a product is not in the provider's product list.

#### How do I avoid paying for contacts I already have?

Set `excludeExported` to drop contacts you have already exported from your account, and `excludeSuppressed` to drop anyone on your suppression list. A repeat run of the same search then returns only what is new. Duplicates within a single run are removed and never charged for twice.

#### What are the employee size and revenue range IDs?

They are the provider's own bracket identifiers rather than raw headcounts or dollar amounts, which is why the fields take IDs and not numbers. The provider's documented options endpoints list the current brackets and their IDs for your account, and the word `all` is accepted to mean every bracket.

#### How many requests does a run make?

One per page of results, up to 100 records a page, so a 1,000 row run is about 10 search requests. Each optional per-company section adds one request per unique company, cached for the run, so switching all three on for a search spanning 20 accounts adds 60 requests rather than one per row.

#### How much does a run cost?

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

### Keyword map

B2B lead database API, sales lead API, company and contact search, B2B contact data API, email finder API, direct dial phone data, technographic search, intent and buying signals, hiring signal data, company news API, SIC code company search, employee size filter, revenue range filter, seniority level search, account based marketing list, CRM lead enrichment, sales prospecting API

# Actor input Schema

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

Company domains to search for, one per line. A full URL works too: it is reduced to the bare hostname. This is the usual way to pull the contacts at a named list of target accounts.

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

Provider company IDs to search within, one per line. Use these when you already have IDs from an earlier run and want to go straight to those accounts.

## `titleKeywords` (type: `array`):

Job title keywords to match, one per line, for example ceo, cfo or marketing. Any match is enough, so a few broad words return more than one long exact title.

## `seniorityLevels` (type: `array`):

Restrict contacts to these seniority levels. Leave empty to return every level.

## `countryCode` (type: `string`):

Two character country code to restrict the search to, for example US or GB. Leave empty to search every country.

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

State or province abbreviations for the US and Canada, one per line, for example CA or ON.

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

Postal codes to search around, one per line. Pair with the radius below to cover a metro area rather than a single code.

## `postalRangeMiles` (type: `integer`):

How far around each postal code to search, in miles. Only has an effect when postal codes are given.

## `areaCodes` (type: `array`):

Telephone area codes of the company headquarters, one per line, for example 415.

## `industryCodes` (type: `array`):

Provider industry codes to filter on, one per line. These are the provider's own numeric codes, not NAICS.

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

Four digit SIC codes to filter on, one per line, for example 7372 for prepackaged software.

## `companyDescription` (type: `string`):

Keywords or phrases to match inside the company description, for example generative ai. This is how you find companies by what they do when no industry code captures it.

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

Technology products the company uses, one per line, for example Hubspot or Salesforce. This is the technographic filter.

## `technologyKeywords` (type: `string`):

Free text keyword search across the company's technology stack, for when a product is not in the technology list above.

## `employeeSizeIds` (type: `array`):

Provider employee size range IDs, one per line, or the word all. These are the provider's own bracket IDs rather than raw headcounts.

## `revenueRangeIds` (type: `array`):

Provider revenue range IDs, one per line, or the word all. These are the provider's own bracket IDs rather than raw amounts.

## `hiringTitles` (type: `array`):

Job title keywords a company is currently hiring for, one per line. Hiring is a buying signal, so this narrows a list to accounts that are actively growing a function.

## `hiringSince` (type: `string`):

Only count job postings published on or after this date, in YYYY-MM-DD form.

## `newsCategories` (type: `array`):

Provider news and press event category IDs, one per line, for example the categories for funding rounds or new hires. Use these to find accounts that just triggered an event worth calling about.

## `newsDateFrom` (type: `string`):

Start of the news event window, in YYYY-MM-DD form.

## `newsDateTo` (type: `string`):

End of the news event window, in YYYY-MM-DD form.

## `emailsOnly` (type: `boolean`):

Drop contacts that have no email address on file.

## `linkedinOnly` (type: `boolean`):

Drop contacts that have no LinkedIn profile URL on file.

## `directDialOnly` (type: `boolean`):

Drop contacts that have no direct phone number on file.

## `excludeSuppressed` (type: `boolean`):

Hide contacts and companies that are on your account's suppression list.

## `excludeExported` (type: `boolean`):

Hide contacts you have already exported from this account, so a repeat run returns only what is new.

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

Provider sort key for the result set, for example yearlyRevDesc to put the highest revenue accounts first. Leave empty for the provider default.

## `includeCompanyNews` (type: `boolean`):

Attach recent news and press events to each company. This is one extra request per unique company, not per contact.

## `includeCompanyJobs` (type: `boolean`):

Attach current job openings to each company. One extra request per unique company.

## `includeCompanyTech` (type: `boolean`):

Attach the detected technology stack to each company. One extra request per unique company.

## `extrasLimit` (type: `integer`):

How many news items, job openings or technologies to fetch per company when the sections above are switched on.

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

How many records to request per page. The provider caps this at 100, which is the default and the fewest requests.

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

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

## `subAccountEmail` (type: `string`):

Run the search as one of your sub-accounts, so that sub-account's suppression and export history applies. Leave empty to use the main account.

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

An access token for the lead database API. Provide this on its own for a run that never sees your password. Tokens are short lived, so for long or scheduled runs supply the account email and password below instead and a fresh token is requested automatically. Stored as a secret.

## `accountEmail` (type: `string`):

The email address of your own account with the data provider. Only needed when you are not supplying an access token above. Stored as a secret.

## `accountPassword` (type: `string`):

The password for your own account with the data provider, used once per run to request a short lived access token from the provider's documented authentication endpoint. Only needed when you are not supplying an access token above. Stored as a secret.

## Actor input object example

```json
{
  "domains": [
    "cisco.com"
  ],
  "emailsOnly": false,
  "linkedinOnly": false,
  "directDialOnly": false,
  "excludeSuppressed": false,
  "excludeExported": false,
  "includeCompanyNews": false,
  "includeCompanyJobs": false,
  "includeCompanyTech": false,
  "extrasLimit": 10,
  "pageSize": 100,
  "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": [
        "cisco.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/b2b-sales-lead-database-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": ["cisco.com"] }

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/b2b-sales-lead-database-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": [
    "cisco.com"
  ]
}' |
apify call nabeelbaghoor/b2b-sales-lead-database-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/b2b-sales-lead-database-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/6W4Fi9oPgbnkhPE5I/builds/UuVlIC1RaC9XXQCZK/openapi.json
