# Trade Show Exhibitors Scraper — Expos & Salon Lists (MCP) (`amygraphics/trade-show-exhibitors-scraper`) Actor

Any trade show, expo, fair or salon: paste the URL, get the exhibitor list — name, booth/stand, hall, category, description, website, country, emails & socials. Auto-discovers exhibitor pages AND official PDF lists. Monitor mode = only NEW exhibitors each edition. No API key. MCP-ready.

- **URL**: https://apify.com/amygraphics/trade-show-exhibitors-scraper.md
- **Developed by:** [Zakaria el bouami](https://apify.com/amygraphics) (community)
- **Categories:** Lead generation, Automation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 📇 Trade Show Exhibitors Scraper — Expos, Fairs & Salons (MCP)

> Paste **any** trade show, expo, fair or salon URL — get the **full exhibitor list**: name, booth/stand, hall, category, country, description, website, emails & socials. Auto-discovers the exhibitor pages *and* the official PDF lists by itself. Monitor mode returns only **new exhibitors** every edition. No API key. MCP-ready.

***

### ✨ Why this one

| Ingredient | What it means for you |
|---|---|
| 🔒 **Hard-to-get data** | Exhibitor directories are platform-locked, JS-heavy or PDF-only. Competitors charge a **$0.50 minimum per run** and support ~20 predefined platforms. We read **any self-hosted directory + PDFs**, with **no run minimum** — pay per row only. |
| 🛠️ **Hardest problems, solved** | Auto-discovery (nav links, sitemap, 17 common paths), booth extraction from noisy card fragments (`Stand A1.23`, `Hall 3`, `Booth 5B21`, `Padiglione 4`…), multi-strategy extraction (JSON-LD → profile links → cards → suffix fallback), plus **the killer nobody has: direct PDF exhibitor lists**. |
| ⚙️ **Automation** | `onlyNew` mode + a schedule = *"warn me when the exhibitor list of the next edition drops"*. Contact enrichment on click. MCP-ready from day one. |
| 🧠 **SEO built for AI agents** | Every row is a structured `exhibitor-extracted` event — LLM agents can call us via MCP and only pay for what they use. |

***

### 🚀 Quick start (3 clicks)

1. Open the actor → **Try for free**
2. Paste a trade show URL (homepage is fine, we find the list):
   - `https://www.global-industrie.com` → 1 100+ exhibitors (official PDF auto-detected)
   - or the direct exhibitor list page → `source: url`
3. 💾 Export CSV / JSON / Excel — or trigger it from n8n, Make, Zapier or your AI agent

**MCP**: `https://mcp.apify.com/?actors=amygraphics/trade-show-exhibitors-scraper` → Claude / ChatGPT / Gemini can now ask *"give me the exhibitors of Salon X"* themselves.

***

### 📦 What each row contains

| Field | Example |
|---|---|
| `exhibitorName` | BÖLLHOFF |
| `booth` | A1.23 |
| `hall` | Hall 3 |
| `category` | Home robotics |
| `country` | France (60+ countries detected, EN/FR/DE/ES/IT/NL spellings) |
| `website` | https://acme-robotics.de |
| `description` | "We build autonomous warehouse robots…" |
| `emails` / `phones` / `socials` | from profile pages (optional pass) |
| `profileUrl` | deep link to the exhibitor profile |
| `eventName` / `eventUrl` | which show this came from |
| `isNew` | true only for never-seen-before exhibitors (monitor mode) |

**No field named `type`** (platform quirk, avoided by design).

***

### 🔁 Automation recipes

#### Recipe 1 — edition watchdog (the money one)

Run weekly with `mode: onlyNew` on your 10 target shows → wake up to *"34 new exhibitors at SIAL 2027"* = 34 fresh sales targets, weeks before your competitors notice.

#### Recipe 2 — niche prospecting

`keywordFilter: robotics` on 6 industrial fairs → a curated list of exhibitors in your niche with booths + contacts when available.

#### Recipe 3 — event intel dashboard

`includeDetails: true` → description, website, email & socials per exhibitor → plug the dataset into your CRM (Pipedrive / HubSpot via Make) as "Companies at show X".

***

### 🆚 Competition — why users switch here

| Actor | Platforms | Monitor | Min. per run | Booths |
|---|---|---|---|---|
| skython/exhibitor-list-scraper (leader, 5.0★) | ~20 hardcoded (MapYourShow, messe-\*) | ❌ | **$0.50 run minimum** | ✓ |
| memo23/mapyourshow-exhibitor-scraper | MapYourShow only | ❌ | per event | ✓ |
| cleanscrape/event-exhibitor-monitor | MapYourShow only | ✓ | per event | ✓ |
| **us** | **ANY self-hosted directory + official PDF lists** | ✓ | **$0.001 + per row** | ✓ |

Fair note: actors needing MapYourShow's private JSON are deliberately *not* supported — `mapyourshow.com/robots.txt` disallows it, and this actor respects robots.txt. Everything that is legally crawlable, we take.

***

### 🧪 Input reference

| Key | Default | What it does |
|---|---|---|
| `startUrls` | \[global-industrie.com] | One or many events (auto = homepage, url = list page) |
| `source` | `auto` | auto=browse to the list ourselves · url=the page you gave IS the list |
| `mode` | `full` | `onlyNew` = differential edition monitoring |
| `maxExhibitors` | 300 | Raise to 5 000 for big halls |
| `includeDetails` | false | Enrich every profile (description, website, emails, socials) |
| `maxDetails` | 120 | Cap the enrichment pass |
| `keywordFilter` | — | e.g. `robotics`, `packaging` |
| `extractEmails` | true | Contact extraction during enrichment |
| `requestDelaySecs` / `requestTimeoutSecs` | 0 / 30 | Politeness & network tuning |
| `respectRobots` | true | Keep it on; use a proxy for bot-walled directories instead |
| `proxyConfiguration` | — | RESIDENTIAL only if the host blocks datacenter IPs |

***

### ⚖️ Fair use

- Business contact data from public pages: comply with GDPR/CCPA (B2B outreach stays legal, spam doesn't). Turn `extractEmails` off if you don't need it.
- We honor robots.txt + per-host Crawl-delay unconditionally. `respectRobots: false` exists for code the site owner explicitly allows you to crawl faster (e.g. your own directory); it never bypasses logins.

### 🏗️ Architecture

Fetcher (gzip · retries · proxy → robots parser with Crawl-delay) → discovery (links / sitemap / common paths + **PDF lists**) → extractors (JSON-LD, profile-links, cards with anti-wrapper segmentation, suffix fallback, **PDF stream decoder**) → dedupe + validation (LOW-nav filters, country/booth patterns) → optional profile enrichment + cleanup (site-wide footer contacts dropped) → monitor KV (`trade-show-exhibitors-seen`) → PPE `exhibitor-extracted` events.

***

### 💰 Pricing

- **$0.001** — actor start (1 GB)
- **$0.001** — per exhibitor extracted (`exhibitor-extracted`)
- Monitor runs charge **only NEW exhibitors** — 0 new = only the start event.

| Rows | Cost |
|---|---|
| 100 exhibitors | ~$0.10 |
| 1 100 (big salon, PDF) | ~$1.10 |
| Edition delta (34 new) | ~$0.04 |

*Compare: the leader's $0.50 minimum charges you $0.50 even for 12 exhibitors.*

***

### 🌍 Built to search worldwide

exhibitor list · exhibitor scraper · trade show exhibitors · expo exhibitors · exhibitor contacts · exhibitor database · salon exposants · liste des exposants · aussteller scraper · espositori · trade show leads · booth numbers · fair exhibitors · messe aussteller

**Part of the AmyGraphics data empire** — 20 public actors: jobs, real estate, tenders, conferences, federal awards & trade intelligence. Contact: morocco.uiux@gmail.com · apify.com/amygraphics

# Actor input Schema

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

One or many events. Give the homepage (source=auto, we find the exhibitor pages & PDF lists ourselves) or the direct exhibitor list page (source=url).

## `source` (type: `string`):

auto = discover exhibitor pages from the homepage · url = the page you gave IS the exhibitor list.

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

full = return everything · onlyNew = return ONLY exhibitors never seen before (monitor editions / weekly deltas).

## `maxExhibitors` (type: `integer`):

Global cap across all URLs. Raise it for full directories (a big salon = 1 000–5 000).

## `includeDetails` (type: `boolean`):

Also open each exhibitor profile page to collect description, website, emails, phones & socials. Slower and needs profile URLs.

## `maxDetails` (type: `integer`):

Cap for the enrichment pass (protects rate limits and cost).

## `keywordFilter` (type: `string`):

Keep only exhibitors whose name / category / description contains this word (e.g. robotics, robotics-en).

## `extractEmails` (type: `boolean`):

Collect emails / phones during enrichment. Personal data: see the README fair-use section.

## `requestDelaySecs` (type: `number`):

Extra politeness delay per host. robots.txt Crawl-delay is always honored.

## `requestTimeoutSecs` (type: `integer`):

Request timeout (s)

## `respectRobots` (type: `boolean`):

Leave it ON. Some directories block bots; for those, enable a proxy below instead.

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

Datacenter is enough for self-hosted exhibitor pages & official PDFs. Use RESIDENTIAL only for bot-protected directories.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.global-industrie.com"
    }
  ],
  "source": "auto",
  "mode": "full",
  "maxExhibitors": 300,
  "includeDetails": false,
  "maxDetails": 120,
  "keywordFilter": "",
  "extractEmails": true,
  "requestDelaySecs": 0,
  "requestTimeoutSecs": 30,
  "respectRobots": true
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.global-industrie.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("amygraphics/trade-show-exhibitors-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 = { "startUrls": [{ "url": "https://www.global-industrie.com" }] }

# Run the Actor and wait for it to finish
run = client.actor("amygraphics/trade-show-exhibitors-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 '{
  "startUrls": [
    {
      "url": "https://www.global-industrie.com"
    }
  ]
}' |
apify call amygraphics/trade-show-exhibitors-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,amygraphics/trade-show-exhibitors-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/gE2csiSmJhSZ9xKgR/builds/btFCagUaka7veeWGn/openapi.json
