# Prospect Database API - B2B Email Search and Verifier (`nabeelbaghoor/prospect-database-search-api`) Actor

Search a B2B prospect database by job title, management level, department, industry, location, company size and revenue. Find every email at a domain, work out an address from a name, verify deliverability, and enrich addresses and profiles. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/prospect-database-search-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

## Prospect Database API - B2B Email Search and Verifier

Search a B2B prospect database by job title, management level, department, industry, location, company size and revenue. Pull every person or every email address at a company domain, work out an address from a name and an employer, verify a list you already have, and turn an address, a profile URL or a company name into a full record. One flat row per prospect, address or company.

### What this actor does

- **Prospects a segment rather than a single company.** The database search filters people on job titles with an exclusion list, management level, department, skills, name and location, and filters their employers on name, industry, location, specialities, headcount, revenue range and founding year, all in one query.
- **Walks a company end to end.** Domain search returns the people at a company with their job titles and source pages. Domain emails returns every address the provider holds there. Generic contacts returns the role mailboxes separately, which is what you want for support and billing routing rather than outreach.
- **Finds an address from a name.** Give the finder a list of names and a list of domains and it pairs them up, returning the address with its deliverability verdict and the format, disposable, webmail and gibberish checks behind it.
- **Verifies a list you already have.** The verifier returns the same checks for addresses you supply, including the provider's own reason when it cannot reach a verdict.
- **Enriches three starting points.** An email address, a profile URL or a company name all resolve into the same flat row shape, so lists that started in different systems end up in one table.
- **Handles a two step API properly.** Nearly every route here accepts work and answers with a task reference, then serves the data from a second route once it is ready. The actor owns that waiting, polling with a widening gap and an overall deadline you control, so a stuck task never holds a run open.
- **Follows the provider's own paging.** The domain routes hand back a next pointer rather than a page number, and the actor follows it, which is the only way to page these routes without silently re-reading the first page.
- **Refreshes its own token.** Credentials are exchanged for a short lived token which is renewed before it expires rather than after a request has already failed on it.
- **Never charges for a miss.** Only rows carrying a resolved result are billed.

### Input

| Field | What it does |
| --- | --- |
| `mode` | Prospect search, company search, the three domain modes, finder, verifier, or one of the three enrichment modes. |
| `jobTitles` | Job titles to match, and the per company filter in domain search. |
| `excludeJobTitles` | Job titles to leave out. |
| `managementLevels` | C level, VP, director, manager or staff. |
| `departments` | Department the person sits in. |
| `skills` | Skills listed on the profile. |
| `firstName`, `lastName` | Narrow a search to one name. |
| `personLocations` | Where the person is. |
| `companies` | Company names, as a filter or as lookups. |
| `excludeCompanies` | Companies to leave out. |
| `domains` | Company domains for the domain modes and the finder. |
| `fullNames` | Names to find addresses for. |
| `emails` | Addresses to verify or enrich. |
| `profileUrls` | Profile URLs to enrich. |
| `industries` | Industries the company should be in. |
| `companyLocations` | Where the company should be. |
| `specialities` | Specialities the company lists about itself. |
| `companySize` | Headcount band. |
| `minRevenue`, `maxRevenue` | Company revenue range. |
| `foundedFrom`, `foundedTo` | Company founding year range. |
| `taskTimeoutMinutes` | How long to wait for one asynchronous request. |
| `requestsPerMinute` | Pace the run under the provider's ceiling of 60. |
| `skipNotFound` | Leave unresolved inputs out of the dataset. |
| `maxResults` | Hard cap on rows, and therefore on spend and run time. |
| `clientId` | Your own API user id. Stored as a secret. |
| `apiKey` | Your own API secret. Stored as a secret. |

### Example output

```json
{
  "found": true,
  "mode": "databaseSearch",
  "query": "prospect database search",
  "firstName": "Jane",
  "lastName": "Doe",
  "fullName": "Jane Doe",
  "position": "Head of Engineering",
  "email": "jane.doe@example.com",
  "smtpStatus": "valid",
  "allEmails": [
    { "email": "jane.doe@example.com", "smtpStatus": "valid" }
  ],
  "linkedinUrl": "https://www.linkedin.com/in/janedoe",
  "location": "San Francisco, California",
  "industry": "Financial Services",
  "organization": "Example Labs",
  "companyDomain": "example.com",
  "companyLocation": "San Francisco, California",
  "companyIndustry": "Financial Services",
  "companySize": "51-200",
  "companyRevenueMin": 10000000,
  "companyRevenueMax": 50000000,
  "companyLogoUrl": "https://logo.example.com/example.png",
  "sourcePage": "https://example.com/team",
  "error": null,
  "raw": { }
}
```

### Frequently asked questions

#### What can I filter a B2B prospect database on?

People are filtered on job titles, with a separate exclusion list, management level from C level down to staff, department, skills, first and last name, and location. Their employers are filtered at the same time on company name, an exclusion list, industry, location, self declared specialities, headcount band, revenue range and founding year. All of those apply in a single query, so a search for director level engineering people at financial services companies of fifty to two hundred people in the United States is one request rather than a filter applied after the fact.

#### What is the difference between the three domain modes?

Domain search returns the people at a company, with their names, job titles and the pages they were found on, optionally narrowed to up to ten job titles. Domain emails returns every address the provider holds at that domain, without attaching a person to each one. Generic contacts returns only the role mailboxes such as support, sales and billing. The last of those is worth keeping separate: role addresses are the wrong target for outreach and the right one for routing.

#### How does the email finder work?

It takes a person and a company and returns the most likely address for that pairing, along with the deliverability verdict and the checks behind it: whether the format is valid, whether the domain is disposable, whether it is a consumer webmail provider, and whether the local part looks like gibberish. Supply a list of names and a list of domains and every name is tried against every domain, so ten names at one company is exactly ten lookups. The provider takes ten at a time, and the actor batches accordingly.

#### What do the deliverability fields mean?

`smtpStatus` is the provider's verdict on the mailbox. `validFormat` is whether the address is syntactically well formed, which is a cheap check that catches typos. `disposable` flags throwaway providers, `webmail` flags consumer mailboxes rather than company ones, and `gibberish` flags local parts that look machine generated. `unknownReason` carries the provider's own explanation when it could not reach a verdict, which is what tells you whether a retry is worth it.

#### Why does the actor wait between submitting and returning results?

Because this provider is asynchronous almost everywhere. A request is accepted and answered with a task reference, and the data comes from a second route once the work is done. The actor manages that for you: it polls with a widening gap rather than continuously, treats an in progress status as a reason to keep waiting, and stops on a deadline you set with the task timeout. Nothing in the dataset is ever a half finished task.

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

Yes, and this provider issues two values rather than one. You use your own API user id and API secret from Snov.io, which is the provider whose prospect data API this actor calls, created on their dashboard. The actor exchanges the pair for a short lived token and refreshes it before it expires. Your own plan, credit balance and terms apply. Both values go into the input, where they are stored as Apify secrets and sent only to the provider's token endpoint, never in a URL.

#### How does this handle rate limits and spent credits?

The provider documents 60 requests per minute, and the actor spaces requests evenly to stay under whatever ceiling you set rather than bursting against it. A rate limit response is retried with backoff because it clears on its own. A spent credit balance is different: this provider reports it inside an otherwise successful response, the actor recognises it, and the run stops with what it has rather than burning retries on a balance that waiting will not refill.

#### What happens when a domain or an address returns nothing?

The row is written with `found: false` and an `error` giving the reason, and the run continues to the next input. Misses are not charged for. Set `skipNotFound` 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 prospect, address or company 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, which this provider spends per prospect and per revealed address, are separate and billed by them.

### Keyword map

B2B prospect database API, email finder API, bulk email verifier, domain search emails, find email by name and domain, company email lookup, decision maker search, management level filter, department filter prospecting, industry and revenue filters, company size search, LinkedIn profile enrichment, email to profile enrichment, company domain lookup, role email addresses, catch-all detection, disposable email detection, lead list building, sales prospecting data, CRM contact enrichment

# Actor input Schema

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

Prospect search queries the provider's people database by job title, seniority, department, industry, location and company size. Company search does the same for companies. The domain modes return the people or the addresses at one company. Email finder works out an address from a name and a domain, the verifier checks addresses you already have, and the enrichment modes turn an address, a profile URL or a company name into a full record.

## `jobTitles` (type: `array`):

Job titles to match, one per line. In prospect search these filter the database. In domain search they narrow the people returned at each company, where the provider accepts up to ten.

## `excludeJobTitles` (type: `array`):

Job titles to leave out, one per line. Useful for dropping the adjacent roles a broad title match keeps pulling in. Prospect search only.

## `managementLevels` (type: `array`):

Seniority bands to match. This is the filter to reach for when job titles vary too much between companies to list them all. Prospect search only.

## `departments` (type: `array`):

Departments to match. Prospect search only.

## `skills` (type: `array`):

Skills listed on the person's profile, one per line. Prospect search only.

## `firstName` (type: `string`):

Narrow a prospect search to one first name. Prospect search only.

## `lastName` (type: `string`):

Narrow a prospect search to one last name. Prospect search only.

## `personLocations` (type: `array`):

Where the person is, one per line. Distinct from where the company is, which is the filter below. Prospect search only.

## `companies` (type: `array`):

Company names, one per line. In prospect and company search they filter which companies count. In company domain mode each name is one lookup.

## `excludeCompanies` (type: `array`):

Company names to leave out of the results, one per line. The quickest way to keep your own customers and your own staff out of a prospecting list.

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

Company domains, one per line. Used by the domain modes and by the email finder. A pasted URL is reduced to the bare hostname and an address is reduced to the part after the at sign, so a messy list still works.

## `fullNames` (type: `array`):

Full names to find addresses for, one per line. Each name is paired with each domain above: ten names and one domain is ten lookups. Email finder only.

## `emails` (type: `array`):

Email addresses, one per line. Used by the verifier and by email enrichment. An address pasted inside a longer string, such as a mail header, is extracted before the request.

## `profileUrls` (type: `array`):

Public professional profile URLs, one per line. A bare handle is expanded to a full URL and tracking parameters are stripped. Profile enrichment only.

## `industries` (type: `array`):

Industries the company should be in, one per line. Used by prospect search and company search.

## `companyLocations` (type: `array`):

Where the company should be, one per line. Used by prospect search and company search.

## `specialities` (type: `array`):

Specialities the company lists about itself, one per line, for segments an industry label is too coarse to express. Used by prospect search and company search.

## `companySize` (type: `string`):

Headcount band the company should fall into, in the provider's own form such as 51-200. Used by prospect search and company search.

## `minRevenue` (type: `integer`):

Only return companies at or above this annual revenue. Used by prospect search and company search.

## `maxRevenue` (type: `integer`):

Only return companies at or below this annual revenue. Used by prospect search and company search.

## `foundedFrom` (type: `integer`):

Only return companies founded in or after this year. Used by prospect search and company search.

## `foundedTo` (type: `integer`):

Only return companies founded in or before this year. Used by prospect search and company search.

## `taskTimeoutMinutes` (type: `integer`):

How long to wait for one request to finish before giving up on it. Almost every route here is asynchronous: the provider accepts the work, then answers from a second route once it is ready. The actor polls with a widening gap, so a longer timeout does not mean more requests.

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

Pace the run under the provider's documented ceiling of 60 requests per minute. Lower it if your account is capped further.

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

Leave inputs the provider had nothing for out of the dataset. Off by default, because keeping the misses is what lets you see which inputs resolved and which did not. Misses are never charged for either way.

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

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

## `clientId` (type: `string`):

Your own API user id for the prospect data API. This provider issues an id and a secret rather than a single key, and exchanges the pair for a short lived token on every run. Required for every lookup. Stored as a secret.

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

Your own API secret, paired with the API user id above. Sent only to the provider's token endpoint and never in a URL, 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": "databaseSearch",
  "jobTitles": [
    "Head of Engineering"
  ],
  "managementLevels": [],
  "departments": [],
  "taskTimeoutMinutes": 5,
  "requestsPerMinute": 60,
  "skipNotFound": false,
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

Prospects, email addresses and company records, one row each.

# 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 = {
    "jobTitles": [
        "Head of Engineering"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/prospect-database-search-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 = { "jobTitles": ["Head of Engineering"] }

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/prospect-database-search-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 '{
  "jobTitles": [
    "Head of Engineering"
  ]
}' |
apify call nabeelbaghoor/prospect-database-search-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/prospect-database-search-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/LwbVpTsfrIdj8UOCg/builds/0wSzzjjQXfsOkpPE7/openapi.json
