# Niche B2B Lead Finder (`prooflio/niche-b2b-lead-finder`) Actor

Finds niche local B2B leads from Google Places and enriches each business with website emails, phones, social links, tech stack signals, and a confidence score.
The Actor discovers businesses through Google Places Text Search, then enriches each website for contact and buying signals.

- **URL**: https://apify.com/prooflio/niche-b2b-lead-finder.md
- **Developed by:** [Prooflio AI](https://apify.com/prooflio) (community)
- **Categories:** AI, Lead generation, Automation
- **Stats:** 2 total users, 2 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.00 / 1,000 b2b leads

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Niche B2B Lead Finder

Find vertical B2B leads that are easier to sell than generic map exports: dentists, med spas, law firms, roofing companies, clinics, recruiters, SaaS agencies, and other niche local business categories.

The Actor discovers businesses through Google Places Text Search, then enriches each website for contact and buying signals:

- Google Places profile: name, address, phone, website, Maps URL, rating, reviews, categories, business status
- Website contacts: emails discovered on the business website, source URLs, role/person/risky classification, MX-domain verification
- Social links: Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, Yelp
- Tech stack signals: WordPress, Shopify, Wix, Squarespace, Webflow, HubSpot, analytics pixels, booking tools, chat widgets, vertical SaaS signals
- Confidence score: 0-100 lead quality score with reasons

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `googlePlacesApiKey` | string | - | Google Places API key. You can also set `GOOGLE_PLACES_API_KEY` as an environment variable. |
| `niches` | string[] | - | Business categories, e.g. `dentists`, `roofing companies`, `med spas`. |
| `locations` | string[] | - | Cities, states, regions, or countries. Each niche is combined with each location. |
| `customQueries` | string[] | - | Optional full searches like `pediatric dental clinics in Orange County CA`. |
| `maxResultsPerQuery` | number | `50` | Google Places results per query, capped at 60. |
| `maxTotalLeads` | number | `500` | Run-level cap after deduplication. |
| `includeWebsiteEnrichment` | boolean | `true` | Crawl business websites for emails, social links, tech stack, and contact pages. |
| `maxWebsitePages` | number | `4` | Homepage plus contact/about/booking/team pages. |
| `verifyEmailDomains` | boolean | `true` | Verify discovered email domains with MX records. |
| `minConfidenceScore` | number | `0` | Only output leads at or above this score. |

Example:

```json
{
    "googlePlacesApiKey": "YOUR_API_KEY",
    "niches": ["dentists", "med spas"],
    "locations": ["Austin, TX", "Phoenix, AZ"],
    "maxResultsPerQuery": 25,
    "maxTotalLeads": 100,
    "includeWebsiteEnrichment": true,
    "verifyEmailDomains": true
}
````

### Output

One dataset item is produced per business:

```json
{
    "niche": "dentists",
    "location": "Austin, TX",
    "query": "dentists in Austin, TX",
    "source": "google_places_text_search",
    "name": "Austin Dental Studio",
    "address": "123 Example St, Austin, TX 78701, USA",
    "phone": "(512) 555-0100",
    "websiteUrl": "https://example-dental.com/",
    "googleMapsUrl": "https://maps.google.com/...",
    "primaryEmail": "info@example-dental.com",
    "emails": [
        {
            "email": "info@example-dental.com",
            "sourceUrls": ["https://example-dental.com/contact"],
            "type": "role",
            "domainMatchesWebsite": true,
            "mxRecordsFound": true,
            "verificationStatus": "verified_on_site",
            "confidence": 90
        }
    ],
    "socialLinks": { "facebook": ["https://facebook.com/example"] },
    "techStack": [{ "name": "WordPress", "category": "CMS", "evidence": "wp-content or WordPress generator tag" }],
    "confidenceScore": 92,
    "confidenceReasons": ["Google Places business profile found", "Website available", "Email found on website and MX domain verified"]
}
```

### Email verification meaning

`verified_on_site` means the email was found on the business website and the email domain has MX records. This is strong source-level verification for lead-gen exports, but it is not paid mailbox-level verification. A future paid tier can add a mailbox validation provider such as ZeroBounce, NeverBounce, or Hunter.

### Legal and acceptable use

This Actor uses the Google Places API and publicly available business websites. You are responsible for complying with Google API terms, website terms, privacy laws, data protection rules, and anti-spam laws. Do not use the exported contacts for harassment, unlawful targeting, or non-compliant outreach.

# Actor input Schema

## `googlePlacesApiKey` (type: `string`):

API key for the Google Places API Text Search endpoint. You can also set GOOGLE\_PLACES\_API\_KEY as an Actor environment variable.

## `niches` (type: `array`):

Verticals to search for. Each niche is combined with each location, e.g. 'dentists in Austin, TX'.

## `locations` (type: `array`):

Cities, states, regions, or countries to combine with the niche list.

## `customQueries` (type: `array`):

Optional full Google Places Text Search queries. Useful for hyper-specific offers like 'pediatric dental clinics in Orange County CA'.

## `maxResultsPerQuery` (type: `integer`):

Maximum Google Places results to request for each generated or custom query. Google Places Text Search supports up to about 60 per query.

## `maxTotalLeads` (type: `integer`):

Run-level cap across all queries after deduplication.

## `maxConcurrency` (type: `integer`):

Number of business websites to enrich in parallel.

## `includeWebsiteEnrichment` (type: `boolean`):

Crawl each business website for emails, social links, contact pages, and tech stack signals.

## `maxWebsitePages` (type: `integer`):

Homepage plus contact/about/booking/team pages discovered from the site.

## `websiteTimeoutSecs` (type: `integer`):

Request timeout for each website page.

## `verifyEmailDomains` (type: `boolean`):

Check whether discovered email domains have MX records. This is domain-level verification, not paid mailbox validation.

## `minConfidenceScore` (type: `integer`):

Only output leads at or above this score. Use 0 to keep every lead.

## `includeServiceAreaBusinesses` (type: `boolean`):

Include businesses that serve an area but may not expose a storefront address.

## `languageCode` (type: `string`):

Preferred result language, e.g. en, de, fr.

## `regionCode` (type: `string`):

Optional two-letter CLDR region code to bias Google Places results, e.g. US, GB, CH.

## `proxyConfiguration` (type: `object`):

Optional proxy configuration used for business website enrichment requests.

## Actor input object example

```json
{
  "niches": [
    "dentists",
    "med spas",
    "roofing companies"
  ],
  "locations": [
    "Austin, TX",
    "Phoenix, AZ"
  ],
  "maxResultsPerQuery": 50,
  "maxTotalLeads": 500,
  "maxConcurrency": 5,
  "includeWebsiteEnrichment": true,
  "maxWebsitePages": 4,
  "websiteTimeoutSecs": 15,
  "verifyEmailDomains": true,
  "minConfidenceScore": 0,
  "includeServiceAreaBusinesses": true,
  "languageCode": "en",
  "regionCode": "US"
}
```

# Actor output Schema

## `leads` (type: `string`):

All enriched leads in the default dataset (Lead Overview view).

# 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 = {
    "niches": [
        "dentists",
        "med spas",
        "roofing companies"
    ],
    "locations": [
        "Austin, TX",
        "Phoenix, AZ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("prooflio/niche-b2b-lead-finder").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 = {
    "niches": [
        "dentists",
        "med spas",
        "roofing companies",
    ],
    "locations": [
        "Austin, TX",
        "Phoenix, AZ",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("prooflio/niche-b2b-lead-finder").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 '{
  "niches": [
    "dentists",
    "med spas",
    "roofing companies"
  ],
  "locations": [
    "Austin, TX",
    "Phoenix, AZ"
  ]
}' |
apify call prooflio/niche-b2b-lead-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Niche B2B Lead Finder",
        "description": "Finds niche local B2B leads from Google Places and enriches each business with website emails, phones, social links, tech stack signals, and a confidence score.\nThe Actor discovers businesses through Google Places Text Search, then enriches each website for contact and buying signals.",
        "version": "0.1",
        "x-build-id": "UYslW79bL59SNWt70"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/prooflio~niche-b2b-lead-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-prooflio-niche-b2b-lead-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/prooflio~niche-b2b-lead-finder/runs": {
            "post": {
                "operationId": "runs-sync-prooflio-niche-b2b-lead-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/prooflio~niche-b2b-lead-finder/run-sync": {
            "post": {
                "operationId": "run-sync-prooflio-niche-b2b-lead-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "googlePlacesApiKey"
                ],
                "properties": {
                    "googlePlacesApiKey": {
                        "title": "Google Places API key",
                        "type": "string",
                        "description": "API key for the Google Places API Text Search endpoint. You can also set GOOGLE_PLACES_API_KEY as an Actor environment variable."
                    },
                    "niches": {
                        "title": "Business niches",
                        "type": "array",
                        "description": "Verticals to search for. Each niche is combined with each location, e.g. 'dentists in Austin, TX'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Cities, states, regions, or countries to combine with the niche list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "customQueries": {
                        "title": "Custom search queries",
                        "type": "array",
                        "description": "Optional full Google Places Text Search queries. Useful for hyper-specific offers like 'pediatric dental clinics in Orange County CA'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResultsPerQuery": {
                        "title": "Max results per query",
                        "minimum": 1,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Maximum Google Places results to request for each generated or custom query. Google Places Text Search supports up to about 60 per query.",
                        "default": 50
                    },
                    "maxTotalLeads": {
                        "title": "Max total leads",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Run-level cap across all queries after deduplication.",
                        "default": 500
                    },
                    "maxConcurrency": {
                        "title": "Website enrichment concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of business websites to enrich in parallel.",
                        "default": 5
                    },
                    "includeWebsiteEnrichment": {
                        "title": "Enrich business websites",
                        "type": "boolean",
                        "description": "Crawl each business website for emails, social links, contact pages, and tech stack signals.",
                        "default": true
                    },
                    "maxWebsitePages": {
                        "title": "Max website pages per business",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Homepage plus contact/about/booking/team pages discovered from the site.",
                        "default": 4
                    },
                    "websiteTimeoutSecs": {
                        "title": "Website timeout seconds",
                        "minimum": 3,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Request timeout for each website page.",
                        "default": 15
                    },
                    "verifyEmailDomains": {
                        "title": "Verify email domains with MX",
                        "type": "boolean",
                        "description": "Check whether discovered email domains have MX records. This is domain-level verification, not paid mailbox validation.",
                        "default": true
                    },
                    "minConfidenceScore": {
                        "title": "Minimum confidence score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only output leads at or above this score. Use 0 to keep every lead.",
                        "default": 0
                    },
                    "includeServiceAreaBusinesses": {
                        "title": "Include service-area businesses",
                        "type": "boolean",
                        "description": "Include businesses that serve an area but may not expose a storefront address.",
                        "default": true
                    },
                    "languageCode": {
                        "title": "Language code",
                        "type": "string",
                        "description": "Preferred result language, e.g. en, de, fr.",
                        "default": "en"
                    },
                    "regionCode": {
                        "title": "Region code",
                        "type": "string",
                        "description": "Optional two-letter CLDR region code to bias Google Places results, e.g. US, GB, CH.",
                        "default": "US"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy configuration used for business website enrichment requests."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
