# Exhibitor List Scraper + Email & Phone Enrichment (`yveltal/exhibitor-leads-enricher`) Actor

Scrape trade-show exhibitor directories and enrich each company with verified emails, phone numbers, and social links. Sales-ready B2B leads, not raw names.

- **URL**: https://apify.com/yveltal/exhibitor-leads-enricher.md
- **Developed by:** [victor](https://apify.com/yveltal) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 exhibitor scrapeds

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

## Exhibitor List Scraper + Email & Phone Enrichment

Turn any trade-show exhibitor directory into **sales-ready B2B leads** — company, booth, website, **verified emails, phone numbers, and social links** — in one run.

Most exhibitor scrapers stop at raw names. This one doesn't. Trade-show platforms like Map Your Show deliberately omit exhibitor websites, which makes the raw list nearly useless for outreach. This actor **resolves each company's real website from its name**, verifies the match against the live homepage, then crawls it for contact data. You get leads you can actually email and call.

### What you get per exhibitor

| Field | Example |
|---|---|
| `company` | Aaronia AG |
| `booth` | 2947 |
| `website` | https://aaronia.com |
| `website_confidence` | 0.95 |
| `website_source` | serp / bing / guess |
| `emails` | info@..., sales@... (role + personal, junk-filtered) |
| `phones` | E.164-validated numbers |
| `socials` | LinkedIn, X, Facebook, Instagram, YouTube |
| `profile_url` | exhibitor's directory profile |
| `categories` | product tags from the directory |
| `lead_score` | 0–100 contactability score |
| `enrichment_status` | enriched / no_website / unreachable |

### Why the data is trustworthy

- **Website resolution is verified, not guessed.** Every resolved homepage is fetched and the company name must actually appear on it. Wrong-company matches are rejected and the search continues — you never get a satellite manufacturer resolved to a grocery importer.
- **Confidence scores on every resolution** (`website_confidence`) so you can filter to your own quality bar.
- **Junk-filtered contacts.** Tracking pixels, share links, placeholder emails, and malformed numbers are stripped. Phones are validated with Google's libphonenumber.
- **Lead scoring** ranks each record by contactability (website + emails + personal emails + phones + socials) so your SDRs start at the top.

### Supported directories

- **Map Your Show** (`*.mapyourshow.com`) — full native support via the platform's own data feed: fast, complete, no browser needed. Works on any MYS event (SATELLITE, NADA, InfoComm, Automate, OFC, NRF Big Show, PPAI, CONEXPO and hundreds more).
- **Generic server-rendered directories** — heuristic card detection with optional CSS selector overrides (`selectors` input) for anything that renders exhibitor lists in HTML.
- More platform adapters (A2Z, Swapcard, ExpoPlatform) ship based on demand — open an issue with your target URL.

### How to use

1. Paste an exhibitor directory URL into **Start URLs** (e.g. `https://satellite2026.mapyourshow.com/8_0/exhibitor/exhibitor-list.cfm`)
2. Leave **Enrich** and **Find websites** on (defaults)
3. Run. Export the dataset as CSV/Excel/JSON for your CRM.

Set **Max exhibitors** to cap a test run (e.g. 25) before doing a full show.

### Input options

| Option | Default | What it does |
|---|---|---|
| `enrich` | true | Crawl each company site for emails/phones/socials |
| `resolveWebsites` | true | Resolve missing websites from the company name (the directories rarely include them) |
| `maxExhibitors` | 0 (all) | Cap for test runs |
| `contactRegion` | US | Default region for phone parsing |
| `maxConcurrency` | 10 | Parallel enrichment fetches |
| `selectors` | — | CSS overrides for generic directories |
| `proxyConfiguration` | Apify proxy | Recommended on |

### Pricing

Pay-per-event — you only pay for what's produced:

- **Exhibitor scraped** — each structured exhibitor record
- **Lead enriched** — only charged when enrichment actually finds contact data (records with `enrichment_status: enriched`)

A typical 1,000-exhibitor show with ~65% enrichment yield costs about the price of one cold-email tool seat — for a contact list you own.

### Typical uses

- Pre-show outreach lists for exhibiting competitors' booths
- Post-show follow-up when the organizer's attendee list is paywalled
- Territory mapping: every vendor in a niche, with contacts, from one industry event
- Feeding CRMs / outbound tools (export CSV → import anywhere)

### Notes & limits

- Enrichment crawls each company's **own public website** (homepage + contact/about pages, max 3 pages) — it does not log into anything or bypass paywalls.
- Some companies publish no contact info on their site; those return `no_contacts_found` with the resolved website so you can route them to manual research.
- `website_confidence` below ~0.8 means the resolver had weaker evidence — filter on it if your use case demands maximum precision.

Questions or a directory that doesn't parse? Open an issue — platform adapters get added based on real demand.


### Show-specific guides

Step-by-step guides with live exhibitor counts and sample output:

- [NADA 2026 exhibitor list (661 exhibitors)](https://c7hc6rffvb-source.github.io/exhibitor-lists/nada-2026-exhibitor-list.html)
- [RSNA 2026 exhibitor list (606 exhibitors)](https://c7hc6rffvb-source.github.io/exhibitor-lists/rsna-2026-exhibitor-list.html)
- [SATELLITE 2026 exhibitor list (580 exhibitors)](https://c7hc6rffvb-source.github.io/exhibitor-lists/satellite-2026-exhibitor-list.html)
- [All shows](https://c7hc6rffvb-source.github.io/exhibitor-lists/)

# Actor input Schema

## `startUrls` (type: `array`):

One or more exhibitor/sponsor directory page URLs from a trade show or conference.
## `enrich` (type: `boolean`):

Visit each exhibitor's website and extract verified emails, phone numbers, and social links. Turn off for a raw name + booth list only.
## `resolveWebsites` (type: `boolean`):

Many directories (e.g. MapYourShow) list a company name but no website. When on, the actor resolves each missing website from the company name via search before enriching, so you still get emails and phones. Turn off to enrich only listings that already include a URL.
## `platform` (type: `string`):

Leave on Auto-detect unless the run misses cards and you know the platform.
## `maxExhibitors` (type: `integer`):

Cap the number of exhibitors processed. Useful to validate output before a full run.
## `contactRegion` (type: `string`):

Used to parse phone numbers written without a country code (e.g. US, GB, DE).
## `maxConcurrency` (type: `integer`):

Higher = faster but heavier on target sites and proxies.
## `selectors` (type: `object`):

Optional. Override auto-detection for a specific directory. Keys: card, name, profile, website, booth, next_page.
## `proxyConfiguration` (type: `object`):

Residential proxy recommended for protected directories.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example-expo.com/exhibitors"
    }
  ],
  "enrich": true,
  "resolveWebsites": true,
  "platform": "auto",
  "maxExhibitors": 0,
  "contactRegion": "US",
  "maxConcurrency": 10,
  "selectors": {},
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
````

# 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 = {
    "startUrls": [
        {
            "url": "https://example-expo.com/exhibitors"
        }
    ],
    "selectors": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("yveltal/exhibitor-leads-enricher").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 = {
    "startUrls": [{ "url": "https://example-expo.com/exhibitors" }],
    "selectors": {},
}

# Run the Actor and wait for it to finish
run = client.actor("yveltal/exhibitor-leads-enricher").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 '{
  "startUrls": [
    {
      "url": "https://example-expo.com/exhibitors"
    }
  ],
  "selectors": {}
}' |
apify call yveltal/exhibitor-leads-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=yveltal/exhibitor-leads-enricher",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Exhibitor List Scraper + Email & Phone Enrichment",
        "description": "Scrape trade-show exhibitor directories and enrich each company with verified emails, phone numbers, and social links. Sales-ready B2B leads, not raw names.",
        "version": "0.1",
        "x-build-id": "BmD3ca0TPzyxW8yTD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/yveltal~exhibitor-leads-enricher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-yveltal-exhibitor-leads-enricher",
                "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/yveltal~exhibitor-leads-enricher/runs": {
            "post": {
                "operationId": "runs-sync-yveltal-exhibitor-leads-enricher",
                "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/yveltal~exhibitor-leads-enricher/run-sync": {
            "post": {
                "operationId": "run-sync-yveltal-exhibitor-leads-enricher",
                "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": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Exhibitor directory URLs",
                        "type": "array",
                        "description": "One or more exhibitor/sponsor directory page URLs from a trade show or conference.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "enrich": {
                        "title": "Enrich with contacts (emails, phones, socials)",
                        "type": "boolean",
                        "description": "Visit each exhibitor's website and extract verified emails, phone numbers, and social links. Turn off for a raw name + booth list only.",
                        "default": true
                    },
                    "resolveWebsites": {
                        "title": "Find websites for listings that omit them",
                        "type": "boolean",
                        "description": "Many directories (e.g. MapYourShow) list a company name but no website. When on, the actor resolves each missing website from the company name via search before enriching, so you still get emails and phones. Turn off to enrich only listings that already include a URL.",
                        "default": true
                    },
                    "platform": {
                        "title": "Directory platform",
                        "enum": [
                            "auto",
                            "generic",
                            "expoplatform",
                            "swapcard",
                            "mapyourshow",
                            "a2zinc",
                            "cvent"
                        ],
                        "type": "string",
                        "description": "Leave on Auto-detect unless the run misses cards and you know the platform.",
                        "default": "auto"
                    },
                    "maxExhibitors": {
                        "title": "Max exhibitors (0 = no limit)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap the number of exhibitors processed. Useful to validate output before a full run.",
                        "default": 0
                    },
                    "contactRegion": {
                        "title": "Default phone region (ISO country code)",
                        "type": "string",
                        "description": "Used to parse phone numbers written without a country code (e.g. US, GB, DE).",
                        "default": "US"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrent requests",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Higher = faster but heavier on target sites and proxies.",
                        "default": 10
                    },
                    "selectors": {
                        "title": "Advanced: CSS selector overrides",
                        "type": "object",
                        "description": "Optional. Override auto-detection for a specific directory. Keys: card, name, profile, website, booth, next_page."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Residential proxy recommended for protected directories.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
