# Wholesalers Contact Scraper (`scrapido/wholesalers-contact-scraper`) Actor

🏢 Wholesalers Contact Scraper gathers wholesaler and bulk supplier listings from Google Maps with full address, ZIP, phone & place ID. 📧 Emails and social links from every site. 📈 Ideal for retail buyers & B2B procurement outreach.

- **URL**: https://apify.com/scrapido/wholesalers-contact-scraper.md
- **Developed by:** [Scrapido](https://apify.com/scrapido) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Wholesalers Contact Scraper

**Wholesalers Contact Scraper** helps you automate wholesaler lead list building by scraping publicly available business contact details—then extracting emails, phone numbers, and social media profiles into a structured dataset. It’s ideal for B2B outreach, supplier database research, and CRM import automation using a wholesalers contact scraper.

***

### What Does Wholesalers Contact Scraper Do? 🤖

Wholesalers Contact Scraper searches for wholesaler-related businesses using your provided search term and target locations. During the run, it scrapes businesses and collects their contact details, including websites, phone numbers, and social media profiles, then extracts publicly listed email addresses from the businesses it finds. It filters results by city boundaries and supports domain-focused lead generation by collecting emails found during website scraping. In short, it **extract emails from wholesalers directories**, **build targeted outreach lists**, and **automate email and phone extractor workflows**—so you can move faster than manual research.

***

### What Can Wholesalers Contact Scraper Extract? 📊

Wholesalers Contact Scraper captures business identity and contact data, plus the specific outreach fields most teams need. It outputs a dataset row per business with lists of discovered emails, phones, and social media links, along with basic place metadata and scraping status.

| Data Type | Field Name | Description |
|---|---|---|
| Contact | `scraped_emails` | List of extracted email addresses found for the business during website scraping |
| Identity | `name` | Business name scraped from the directory result |
| Context | `website` | The business website URL used as the starting point for extracting additional contact info |
| Discovery | `scrape_status` | Overall scraping status for the business (for example, success or no website) |
| Navigation | `place_id` | Place identifier associated with the scraped listing |

#### Key Features of Wholesalers Contact Scraper ⚡

- ✅ **Keyword-Driven Search**: Use `googleMapsSearchTerm` to target a specific wholesalers niche for business contact scraper results
- 🌍 **Location Targeting**: Provide one or more `googleMapsLocation` values to focus on the geography you care about
- 📧 **Email and Phone Extractor Output**: Produces `scraped_emails` and `scraped_phones` lists for B2B lead generation scraping
- 🔗 **Social Media Collection**: Includes `scraped_social_media` links alongside email and phone data for richer lead lists
- 🛡️ **Proxy Configuration Support**: Includes `proxyConfiguration` (Apify Proxy recommended) for reliable large-scale scraping
- 📊 **Structured Dataset for Easy Export**: Ready for analysis and CRM import automation using a clean, labeled dataset schema
- ⏱️ **Configurable Limits**: Use `maxBusinesses` to cap how many businesses you target (helps control cost and runtime)
- 🔄 **Per-Location vs Global Limits**: Toggle `scrapeMaxBusinessesPerLocation` to decide whether you want results capped per location or globally

***

### How to Use Wholesalers Contact Scraper 🚀

1. **Find the Actor** — Search **Wholesalers Contact Scraper** on [Apify Store](https://apify.com/store)
2. **Open Input Tab** — In Apify Console, click the **Input** tab for the actor run
3. **Set Search Term** — Enter a wholesaler niche in `googleMapsSearchTerm` (example: Wholesalers)
4. **Add Locations** — Choose one or more cities in `googleMapsLocation`
5. **Set a Safety Limit** — Use `maxBusinesses` to control volume
6. **(Optional) Enable Proxies** — Configure `proxyConfiguration` if you plan larger runs
7. **Run + Monitor** — Check logs and open the **Dataset** tab when finished

*No coding required—just configure your inputs and export your leads.*

***

### Wholesalers Contact Scraper Output Format 📦

The actor saves results to your Apify dataset in JSON format with the fields defined by the dataset schema below.

#### ⬇️ Input Example

```json
{
  "googleMapsSearchTerm": "Wholesalers",
  "googleMapsLocation": [
    "New York"
  ],
  "maxBusinesses": 5,
  "scrapeMaxBusinessesPerLocation": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

#### ⬆️ Output Example

```json
{
  "name": "Acme Wholesale Supply LLC",
  "website": "https://www.acmewholesalesupply.com",
  "phone": "+1-212-555-0198",
  "full_address": "1234 Broadway New York NY 10001 US",
  "city": "New York",
  "state": "NY",
  "zip": "10001",
  "country_code": "US",
  "scraped_emails": [
    "sales@acmewholesalesupply.com",
    "support@acmewholesalesupply.com"
  ],
  "scraped_phones": [
    "+1-212-555-0198"
  ],
  "scraped_social_media": [
    "https://www.linkedin.com/company/acme-wholesale-supply/"
  ],
  "emails_found": 2,
  "pages_scraped": 6,
  "avg_rating": 4.4,
  "total_reviews": 128,
  "lat": "40.712776",
  "long": "-74.005974",
  "place_id": "ChIJu46xVQbawokRk4lZ0Gv8H5Y",
  "scrape_status": "success"
}
```

#### Output Fields

| Field | Label | Format | Description |
|---|---|---|---|
| name | Business Name | text | Business name scraped for the listing |
| website | Website | link | Business website URL (used to extract contact details) |
| phone | Phone | text | Primary phone number associated with the listing |
| full\_address | Address | text | Combined address string (street, city, state, zip, country code) |
| city | City | text | City of the business |
| state | State | text | State of the business |
| zip | zip | text | Postal code |
| country\_code | country\_code | text | Country code (e.g., US) |
| scraped\_emails | Emails Found | array | Emails extracted from publicly available sources during website scraping |
| scraped\_phones | Phone Numbers | array | Additional phone numbers found during website scraping |
| scraped\_social\_media | Social Media | array | Social media profile links collected during website scraping |
| emails\_found | # Emails | number | Count of extracted emails in `scraped_emails` |
| pages\_scraped | Pages Scraped | number | Number of pages processed for email discovery |
| avg\_rating | Rating | number | Average rating from the scraped listing data |
| total\_reviews | Reviews | number | Total review count from the scraped listing data |
| lat | lat | text | Latitude coordinate |
| long | long | text | Longitude coordinate |
| place\_id | place\_id | text | Listing place identifier |
| scrape\_status | Status | text | Scraping outcome status (for example, success or no\_website) |

***

### 🎯 Use Cases of Wholesalers Contact Scraper

**B2B Lead Generation:** Build targeted outreach lists by collecting business contact data, including emails and phone numbers, from wholesaler-related results.\
**Email and Phone Extractor Output for CRM Enrichment:** Use the structured dataset to automate CRM import automation with supplier database scraper-style contact fields.\
**Supplier Database Research:** Compare locations and contact availability to prioritize which wholesalers to contact first.\
**Data Enrichment for Targeted Outreach:** Add website, phone, social media, and extracted emails to improve lead quality for follow-up.\
**Web Scraping for Wholesalers:** Turn publicly available wholesaler directory data into actionable contact datasets without manual copying.

***

### How Much Will Wholesalers Contact Scraper Cost You? 💰

Apify pricing is typically **pay-per-result** based on the items your run produces in the dataset. To keep spend predictable, set `maxBusinesses` to the number you want to target and consider using `scrapeMaxBusinessesPerLocation` if you run multiple `googleMapsLocation` values. Use the Apify Console to monitor progress during the run.

***

### Is It Legal to Scrape Wholesalers? ⚖️

Wholesalers Contact Scraper works with **publicly available data** and extracts contact details like emails and phone numbers from business websites and publicly listed sources. Even when data is public, you’re responsible for following applicable laws and platform policies (for example, GDPR/CCPA and local anti-spam rules). For questions or concerns related to scraped data, contact <scrapidocontact@gmail.com>.

***

### Wholesalers Contact Scraper Input Parameters 📋

Before running, configure your input in Apify Console. Use the example below as a starting point.

```json
{
  "googleMapsSearchTerm": "Wholesalers",
  "googleMapsLocation": [
    "New York"
  ],
  "maxBusinesses": 5,
  "scrapeMaxBusinessesPerLocation": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `googleMapsSearchTerm` | string | ✅ Yes | `Wholesalers` | Business type or niche to search for (e.g., “coffee shops”, “dentists”) |
| `googleMapsLocation` | array of string | ✅ Yes | `[ "New York" ]` | Target geographic locations to search in (e.g., “Miami, Florida” → use city/state formatting as you prefer) |
| `maxBusinesses` | integer | No | `5` | Maximum number of businesses to find (range: 1–1000). The scraper stops when this target is reached |
| `scrapeMaxBusinessesPerLocation` | boolean | No | `false` | If enabled, collect up to `maxBusinesses` results per location. If disabled, combine locations up to a single total limit |
| `proxyConfiguration` | object | No | `{"proxy support": true}` | Proxy settings for scraping. Recommended for larger-scale runs to help avoid IP blocks and rate limits |

***

### During the Actor Run ⏱️

You’ll see real-time logs in the Apify Console showing progress as businesses are collected and then scraped for contact details. Since results are written into the dataset as the run progresses, you can monitor output quality and stop early if you already hit your target. Runtime depends on the number of businesses, page availability, and network conditions.

***

### Final Note ✉️

Start building targeted outreach lists for wholesalers today with **Wholesalers Contact Scraper**. Configure your search term and locations, set `maxBusinesses`, and export your dataset for analysis or CRM import automation. Questions? Email <scrapidocontact@gmail.com>.

***

### FAQ — Wholesalers Contact Scraper ❓

#### How does the Wholesalers Contact Scraper find emails?

Wholesalers Contact Scraper uses your `googleMapsSearchTerm` and `googleMapsLocation` to identify businesses, then extracts email addresses and other contact details from publicly available sources associated with those businesses (including their websites). It doesn’t generate emails—it collects what’s publicly listed.

#### What types of Wholesalers profiles can I scrape?

You can scrape publicly listed business profiles returned for your chosen `googleMapsSearchTerm` and `googleMapsLocation` values. Businesses without a usable website (or without publicly available contact info on their site) may result in empty contact fields and a non-success `scrape_status`.

#### What did your tests show about the Wholesalers Contact Scraper?

In practice, results vary by niche and how consistently businesses publish contact emails and contact pages on their websites. Businesses with a clear public “contact” presence tend to yield more extracted emails, while others may produce fewer results even when scraped successfully.

#### Why scrape Wholesalers for emails?

Wholesalers is a strong source for finding supplier and business contacts in bulk. Instead of spending hours manually copying contact info, Wholesalers Contact Scraper automates data extraction into a structured dataset for faster outreach and supplier database research.

#### How much does it cost to use the Wholesalers Contact Scraper?

Cost is driven by output volume (pay-per-result style). To manage spend, set `maxBusinesses` to control how many businesses you target. You can also use `scrapeMaxBusinessesPerLocation` to control scaling across multiple locations.

#### How does the Wholesalers Contact Scraper help my business?

It helps you generate targeted outreach lists by combining business identity, website, phone, social media, and extracted emails into one clean dataset. This makes it easier to run lead list building, data enrichment, and CRM import automation.

#### What are the challenges of using a wholesalers contact scraper?

Not every business publishes an email address publicly, and some websites may have limited or no accessible contact info. That means your yield can vary significantly depending on location, niche, and website structure, even with the same `maxBusinesses`.

#### How do I choose the right Wholesalers Contact Scraper?

Use a plan that supports: location targeting, configurable result limits, structured dataset output, and proxy configuration for reliable scraping at scale. Wholesalers Contact Scraper includes those controls so you can tune both quality and volume, with help available at <scrapidocontact@gmail.com>.

***

### 🆘 Support & Feedback

Found a bug or need a custom enhancement for the Wholesalers Contact Scraper?

If you have questions about dataset content or need assistance with data removal, contact <scrapidocontact@gmail.com>.

### Multiple Email Type

**Email Types** keeps only the kinds of mailbox you want. Every row records what
it was classified as in `emailType`.

| Type | What it matches |
| --- | --- |
| Personal | Free webmail (Gmail, Outlook, Yahoo, iCloud, ...) |
| Business | Company domains — free webmail and institutions excluded |
| Education | `.edu`, `.ac.uk`, `.edu.au` and other academic suffixes |
| Government | `.gov`, `.mil`, `.gov.uk`, `.gc.ca`, ... |
| Non-profit | `.org`, `.ngo`, `.org.uk`, ... |

A business found with no email at all is unaffected — whether those rows are
wanted is already governed by the existing email-only setting.

### Multiple Phone Type

**Phone Types** does the same for numbers, checked against the line's *real*
type rather than a guess. Numbers on ranges where mobile and landline cannot be
told apart are kept rather than dropped, since discarding them would lose good
leads.

### Outreach links

| Field | Meaning |
| --- | --- |
| `telLink` | A clickable `tel:` link for the primary number |
| `whatsappLink` | A `wa.me` chat link, or empty for a landline or an invalid number |
| `whatsappCapable` | Whether the line could support WhatsApp |
| `phoneContacts` | Every kept number with its own type, links and validity |

`whatsappCapable` never claims the person uses WhatsApp — only that the number
is of a kind that could. Turn the links off with **Include WhatsApp links**; the
capability flag is still reported.

# Actor input Schema

## `googleMapsSearchTerm` (type: `string`):

Enter the business type or niche for email scraper (e.g., 'coffee shops', 'dentists').

## `googleMapsLocation` (type: `array`):

Target geographic location for the email scraper (e.g., 'Miami, Florida').

## `maxBusinesses` (type: `integer`):

Target number of businesses to find (1-1000). The scraper will stop when this target is reached.

## `scrapeMaxBusinessesPerLocation` (type: `boolean`):

If enabled, the scraper will collect up to `maxBusinesses` results per location. If disabled, it combines all locations up to a single total limit.

## `validateEmails` (type: `boolean`):

Run DNS/MX validation and confidence scoring on every email found, and include the results (confidence score, validation status, role-based/catch-all flags) in the output.

## `minRating` (type: `integer`):

Skip businesses rated below this (1-5 stars). Leave at 0 for no filter.

## `minReviews` (type: `integer`):

Skip businesses with fewer than this many Google reviews. Leave at 0 for no filter.

## `requireWebsite` (type: `boolean`):

Skip businesses with no website listed on Google Maps (they can't be crawled for contact info anyway).

## `leadMode` (type: `string`):

Business Contacts (default) returns the business's generic contact info (info@, main phone, socials). Decision-Maker Finder instead looks for a named person with a job title (e.g. "Jane Smith, Owner") on the business's team/about pages — a best-effort heuristic, not guaranteed on every site.

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

Proxy settings for scraping. Recommended for large-scale scraping.

## `emailTypes` (type: `array`):

Which kinds of mailbox to keep. Pick as many as you like; leave empty for every type. A business with no email at all is unaffected by this - whether those rows are wanted is governed by the existing email-only setting.

## `phoneTypes` (type: `array`):

Which kinds of line to keep. Leave empty for every type. Numbers on ranges where mobile and landline cannot be told apart are always kept rather than silently dropped.

## `includeWhatsappLinks` (type: `boolean`):

Add a ready-made wa.me chat link for numbers on a line WhatsApp can run on. The link means the number is in a form WhatsApp accepts - not proof that an account exists.

## Actor input object example

```json
{
  "googleMapsSearchTerm": "Wholesalers",
  "googleMapsLocation": [
    "New York"
  ],
  "maxBusinesses": 5,
  "scrapeMaxBusinessesPerLocation": false,
  "validateEmails": false,
  "minRating": 0,
  "minReviews": 0,
  "requireWebsite": false,
  "leadMode": "Business Contacts",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "emailTypes": [
    "Business"
  ],
  "phoneTypes": [
    "Mobile",
    "Landline"
  ],
  "includeWhatsappLinks": true
}
```

# Actor output Schema

## `dataset` (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 = {
    "googleMapsSearchTerm": "Wholesalers",
    "googleMapsLocation": [
        "New York"
    ],
    "maxBusinesses": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "emailTypes": [
        "Business"
    ],
    "phoneTypes": [
        "Mobile",
        "Landline"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapido/wholesalers-contact-scraper").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 = {
    "googleMapsSearchTerm": "Wholesalers",
    "googleMapsLocation": ["New York"],
    "maxBusinesses": 5,
    "proxyConfiguration": { "useApifyProxy": True },
    "emailTypes": ["Business"],
    "phoneTypes": [
        "Mobile",
        "Landline",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapido/wholesalers-contact-scraper").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 '{
  "googleMapsSearchTerm": "Wholesalers",
  "googleMapsLocation": [
    "New York"
  ],
  "maxBusinesses": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "emailTypes": [
    "Business"
  ],
  "phoneTypes": [
    "Mobile",
    "Landline"
  ]
}' |
apify call scrapido/wholesalers-contact-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapido/wholesalers-contact-scraper"
        }
    }
}

```

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/VAahibed40USZzAB8/builds/OPY0FJc592YH8RPtH/openapi.json
