# B2B Lead Enrichment Suite (`ayeeyee/b2b-lead-enrichment-suite`) Actor

Multi-source B2B lead enrichment: Google Maps business data with verified contact info. LinkedIn decision-maker enrichment coming soon.

- **URL**: https://apify.com/ayeeyee/b2b-lead-enrichment-suite.md
- **Developed by:** [Virtual Footprint LLC](https://apify.com/ayeeyee) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 37.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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

<p align="center">
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjMyMCIgdmlld0JveD0iMCAwIDEyMDAgMzIwIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+QjJCIExlYWQgRW5yaWNobWVudCBTdWl0ZTwvdGl0bGU+CiAgPGRlc2MgaWQ9ImRlc2MiPkdvb2dsZSBNYXBzIHNlYXJjaCB0byBzY29yZWQgbGVhZDogY29udGFjdHMsIHRlY2ggc3RhY2ssIGFuZCBhbiBBLUQgZ3JhZGU8L2Rlc2M+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImVkZ2UiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjM2NkYxIiBzdG9wLW9wYWNpdHk9IjAuMTgiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjM2NkYxIiBzdG9wLW9wYWNpdHk9IjAiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjMyMCIgcng9IjI2IiBmaWxsPSIjMGEwZDEyIi8+CiAgPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iMzIwIiByeD0iMjYiIGZpbGw9InVybCgjZWRnZSkiLz4KICA8cmVjdCB4PSIwLjUiIHk9IjAuNSIgd2lkdGg9IjExOTkiIGhlaWdodD0iMzE5IiByeD0iMjUuNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMyMTI5IiBzdHJva2Utd2lkdGg9IjEiLz4KICA8ZyBpZD0idGl0bGUtYmxvY2siIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU2IDY0KSI+CiAgICA8cmVjdCB4PSIwIiB5PSItMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgcng9IjIiIGZpbGw9IiM2MzY2RjEiLz4KICAgIDx0ZXh0IHg9IjIwIiB5PSItMjAiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgbW9ub3NwYWNlIiBmb250LXNpemU9IjEyIiBmaWxsPSIjNjM2NkYxIj5MRUFEIEVOUklDSE1FTlQgJiMxODM7IFJFQUwgREFUQSwgTk8gRkFCUklDQVRJT048L3RleHQ+CiAgICA8dGV4dCB4PSIwIiB5PSIyNiIgZm9udC1mYW1pbHk9Ii1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNDAiIGZvbnQtd2VpZ2h0PSI4MDAiIGZpbGw9IiNmZmZmZmYiPkIyQiBMZWFkIEVucmljaG1lbnQgU3VpdGU8L3RleHQ+CiAgICA8dGV4dCB4PSIwIiB5PSI2MCIgZm9udC1mYW1pbHk9Ii1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIGZpbGw9IiNjOWQxZDkiPkdvb2dsZSBNYXBzIHNlYXJjaCB0byBzY29yZWQgbGVhZDogY29udGFjdHMsIHRlY2ggc3RhY2ssIGFuZCBhbiBBLUQgZ3JhZGU8L3RleHQ+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDEwMCkiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSI+CiAgICAgIDx0ZXh0IHg9IjAiIHk9IjAiIGZvbnQtZmFtaWx5PSItYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmZmZmZmIj4kMC4wMDM8L3RleHQ+CiAgICAgIDx0ZXh0IHg9IjAiIHk9IjIwIiBmb250LWZhbWlseT0iLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgZmlsbD0iIzhiOTQ5ZSI+cGVyIFZlcmlmaWVkIExlYWQ8L3RleHQ+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDAgMCkiPgogICAgICA8dGV4dCB4PSIwIiB5PSIwIiBmb250LWZhbWlseT0iLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2ZmZmZmZiI+QS1EPC90ZXh0PgogICAgICA8dGV4dCB4PSIwIiB5PSIyMCIgZm9udC1mYW1pbHk9Ii1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiM4Yjk0OWUiPkxlYWQgR3JhZGUgU2NhbGU8L3RleHQ+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjAgMCkiPgogICAgICA8dGV4dCB4PSIwIiB5PSIwIiBmb250LWZhbWlseT0iLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2ZmZmZmZiI+MzwvdGV4dD4KICAgICAgPHRleHQgeD0iMCIgeT0iMjAiIGZvbnQtZmFtaWx5PSItYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBmaWxsPSIjOGI5NDllIj5UZWNoIFNpZ25hbHMgRm91bmQ8L3RleHQ+CiAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgogIDxnIGlkPSJwcm9qZWN0LXByb29mIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MDAgNzYpIj4KICAgIDxyZWN0IHg9Ii0yNCIgeT0iLTQwIiB3aWR0aD0iNDcwIiBoZWlnaHQ9IjIyMCIgcng9IjE0IiBmaWxsPSIjMGQxMTE3IiBzdHJva2U9IiMxYzIxMjkiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPHRleHQgeD0iMCIgeT0iLTE0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzhiOTQ5ZSI+JCBhcGlmeSBjYWxsIGIyYi1sZWFkLWVucmljaG1lbnQtc3VpdGU8L3RleHQ+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2KSI+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDApIj4KICAgICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiByeD0iMiIgZmlsbD0iIzYzNjZmMSIvPgogICAgICA8dGV4dCB4PSIxOCIgeT0iOSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNjOWQxZDkiPlBpZWRtb250IENhZmUgIFNlYXR0bGUsIFdBPC90ZXh0PgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyNikiPgogICAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHJ4PSIyIiBmaWxsPSIjNTFjZjY2Ii8+CiAgICAgIDx0ZXh0IHg9IjE4IiB5PSI5IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2M5ZDFkOSI+ZWJlbkBleWVieXRlcy5jb20gIHZlcmlmaWVkPC90ZXh0PgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA1MikiPgogICAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHJ4PSIyIiBmaWxsPSIjZmZkNDNiIi8+CiAgICAgIDx0ZXh0IHg9IjE4IiB5PSI5IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2M5ZDFkOSI+QW5ndWxhciwgR29vZ2xlIEFuYWx5dGljcywgTWFnZW50bzwvdGV4dD4KICAgIDwvZz4KICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgNzgpIj4KICAgICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiByeD0iMiIgZmlsbD0iIzUxY2Y2NiIvPgogICAgICA8dGV4dCB4PSIxOCIgeT0iOSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNjOWQxZDkiPmxlYWRfc2NvcmU6IDMwICYjMTgzOyBzb3VyY2U6IHYyPC90ZXh0PgogICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+" width="100%" alt="b2b-lead-enrichment-suite hero banner">
</p>

<div align="center">

#### Turn a Google Maps search into a scored B2B lead list

Search by business type and location, get back verified contact details, detected tech stack, and a lead score per business -- ready to hand to sales instead of a raw map listing.

![Input](https://img.shields.io/badge/input-search%20queries-blue)
![Output](https://img.shields.io/badge/output-scored%20leads-blue)
![Pricing](https://img.shields.io/badge/pricing-pay%20per%20lead-blue)

</div>

### Why use this Actor?

A Google Maps search gives you a business name and a star rating -- not a usable sales lead. Getting from there to a contact-ready record normally means manually visiting each business's website to find an email, checking their tech stack by hand, and judging which ones are worth prioritizing.

This Actor automates that: it runs the search, visits each business's website, extracts emails and phone numbers, detects the technologies the site runs on, and computes a lead score so you can sort by priority instead of reading every row.

### What you get

<table>
<tr>
<td width="50%">

#### 📍 Business data

Name, address, rating, review count, and Google Maps link per result.

</td>
<td width="50%">

#### 📧 Contact extraction

Emails and phone numbers pulled from the business's own website when available.

</td>
</tr>
<tr>
<td width="50%">

#### 🧰 Tech stack detection

Technologies detected on the business website (e.g. Cloudflare, Angular, Magento).

</td>
<td width="50%">

#### 🎯 Lead score

A 0-100 score per lead based on whether decision-maker enrichment and emails are present.

</td>
</tr>
</table>

### How it works

```text
Search queries
   |
Google Maps Email Extractor Pro (called internally)
   |
Business listings + website emails/phones/tech stack
   |
Decision-maker enrichment (currently disabled -- see below)
   |
Lead scoring + deduplication
   |
Dataset rows
```

This Actor is a thin orchestration layer: the actual Google Maps search, website visit, and extraction work is done by calling `google-maps-email-extractor-pro` directly through the Apify SDK (`Actor.call()`, resolved by actor id). A cost guard estimates the run's cost before any paid calls are made and aborts if it would exceed `maxCostPerRun`.

### A note on LinkedIn enrichment

An earlier version of this Actor attempted to enrich leads with LinkedIn decision-maker profiles. That enrichment is **currently disabled** -- during testing, the LinkedIn-search Actor it depended on returned the identical placeholder result ("Satya Nadella, CEO at Microsoft") for every distinct query, meaning it wasn't actually searching. Shipping that would have attached a fabricated executive name to every lead, which is worse than shipping no enrichment at all. `linkedin_profiles` is currently always empty and `has_decision_maker` is always `false` until a real LinkedIn-search source is verified to return query-relevant results.

### Use cases

- Build a targeted local-business prospect list by category and city
- Prioritize outreach using the lead score instead of contacting every result
- Identify which prospects already use a specific technology (for tools that integrate with it)
- Feed a CRM or outreach tool with pre-verified contact emails instead of guessed addresses

### Input

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `queries` | array of strings | Yes | `["restaurants in New York"]` | Business search queries, e.g. `"plumbers in Chicago"`. |
| `maxResults` | integer | Yes | `25` | Maximum businesses per query (1-1000). |
| `webhookUrl` | string | No | -- | Optional URL notified on run completion. |

### Input example

```json
{
  "queries": ["coffee shops in Seattle", "marketing agencies in Austin"],
  "maxResults": 25
}
```

### Output

One dataset row per business found. Fields come from the underlying Google Maps extraction plus this Actor's own scoring:

| Field | Type | Description |
| --- | --- | --- |
| `name` | string | Business name. |
| `address` | string | Street address. |
| `rating` / `reviewCount` | string | Google rating and review count. |
| `googleMapsUrl` | string | Direct Google Maps link. |
| `website` | string | Business website, if found. |
| `emails` / `phones` | array | Contact details extracted from the website. |
| `techStack` | array | Technologies detected on the business website. |
| `confidenceScore` | number | 0-1 confidence in the extracted data. |
| `linkedin_profiles` | array | Currently always empty -- see note above. |
| `has_decision_maker` | boolean | Currently always `false` -- see note above. |
| `lead_score` | number | 0-100; higher when contact/decision-maker data is present. |
| `source` | string | `"b2b_lead_enrichment_suite_v2"`. |

#### Sample output

Real result from a live run:

```json
{
  "query": "coffee shops in Seattle",
  "name": "Piedmont Café",
  "address": "1215 Seneca St Ste 100, Seattle, WA 98101",
  "rating": "4.8",
  "reviewCount": "290",
  "website": "https://piedmontseattle.com/",
  "emails": ["eben@eyebytes.com"],
  "phones": ["(206) 659-9899"],
  "techStack": ["Angular", "Google Analytics", "Bootstrap", "Magento"],
  "confidenceScore": 1,
  "linkedin_profiles": [],
  "has_decision_maker": false,
  "lead_score": 30,
  "source": "b2b_lead_enrichment_suite_v2"
}
```

### Pricing

Pay-per-event: a small one-time actor-start charge, plus **$0.003 per verified business lead** returned.

### Notes and limitations

- LinkedIn decision-maker enrichment is disabled (see above) until a real, verified data source is available -- `lead_score` currently reflects only whether an email was found, not decision-maker presence.
- Contact extraction depends on the business having a public website with visible contact information; not every business will have emails or a full tech stack detected.
- A cost guard aborts the run before any paid calls if the estimated cost exceeds `maxCostPerRun` (default $5).

### Frequently asked questions

**Does this include LinkedIn contacts?**
Not currently -- see the LinkedIn enrichment note above. `linkedin_profiles` will be empty on every result until this is re-enabled with a verified data source.

**What happens if a business has no website?**
It's still returned with Google Maps data (name, address, rating), just without `emails`/`phones`/`techStack`.

**Are failed queries charged?**
Only successfully returned leads trigger the per-result charge; the cost guard also prevents the run from starting if the estimated cost exceeds your budget.

### Start building your lead list

Add your search queries and city, set a result cap, and run the Actor. Sort the resulting dataset by `lead_score` to prioritize outreach.

### Related Actors

Calls [Google Maps Email Extractor Pro](https://apify.com/ayeeyee/google-maps-email-extractor-pro) internally for the underlying business search and contact extraction. Part of the same lead-gen catalog: [ATS Hiring-Intent Lead Finder](https://apify.com/ayeeyee/ats-hiring-intent-lead-finder), [Website Contact & Company Extractor](https://apify.com/ayeeyee/website-contact-company-extractor).

# Actor input Schema

## `queries` (type: `array`):

Business search queries

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

Max businesses per query

## `webhookUrl` (type: `string`):

Optional webhook URL for result delivery

## Actor input object example

```json
{
  "queries": [
    "restaurants in New York"
  ],
  "maxResults": 25,
  "webhookUrl": ""
}
```

# Actor output Schema

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

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ayeeyee/b2b-lead-enrichment-suite").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("ayeeyee/b2b-lead-enrichment-suite").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 '{}' |
apify call ayeeyee/b2b-lead-enrichment-suite --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/F6DcQibGEMTM6sVdl/builds/1QDftJtXMnxqPcXnw/openapi.json
