# Trade Show Exhibitor List Scraper (ExpoFP, a2z, Swapcard) (`morehavoc/trade-show-exhibitor-list-scraper`) Actor

Exhibitor lists from ExpoFP floor plans, a2z (Personify) event maps and Swapcard events: company, booth, website, description, categories, location and social links. Company data only. $0.004 per exhibitor.

- **URL**: https://apify.com/morehavoc/trade-show-exhibitor-list-scraper.md
- **Developed by:** [Christopher Moravec](https://apify.com/morehavoc) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 exhibitors

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 Exhibitor List Scraper (ExpoFP, a2z, Swapcard)

Turn a trade show's online exhibitor directory into a clean spreadsheet of exhibiting companies: name, booth, website,
description, categories, location, social links and logo. Paste the directory URL; the platform is detected for you.

Built for the directory platforms that US and UK conferences use and that the big exhibitor scrapers skip:
**ExpoFP** floor plans, **a2z / Personify Conference Harvester** directories, and public **Swapcard** event apps.

### Who it's for

- **Sales teams** prospecting the companies exhibiting at a show in their market, before the show, while there is time
  to book meetings.
- **Event marketers and organisers** benchmarking a competing show's exhibitor base, or checking who exhibits where.
- **Sponsors and agencies** sizing a show and building target lists of exhibitors to pitch.

### Supported platforms

| Platform | What the URL looks like | Live examples (checked 2026-10-26) | How it is read |
|---|---|---|---|
| ExpoFP | `https://<event>.expofp.com/` | [Tech Show Madrid 2026](https://techshowmadrid2026.expofp.com/) (504 exhibitors), [Piscine Global 2026](https://piscineglobal2026.expofp.com/) (564), [Trading Card Summit Melbourne 2026](https://thetradingcardsummit2026.expofp.com/) (262) | The public data file the floor plan itself loads. One request per show. |
| a2z / Personify | `https://<host>.a2zinc.net/.../<Event>/Public/EventMap.aspx` (or `Exhibitors.aspx`, `eBooth.aspx`) | [TPIE 2027](https://s15.a2zinc.net/clients/FNGLA/tpie2027/Public/EventMap.aspx) (426), [PowerXchange & TechAdvantage 2027](https://s23.a2zinc.net/clients/Kenworthy/TA2027/Public/Eventmap.aspx?shmode=E) (349), [Western Hunting & Conservation Expo 2027](https://s15.a2zinc.net/clients/WHCE/whce2027/Public/EventMap.aspx) (548) | The public exhibitor list, then each exhibitor's public profile page (see *Read exhibitor profile pages*). |
| Swapcard | `https://app.swapcard.com/event/<slug>/exhibitors/<viewId>`, a branded `https://<org>.app.swapcard.com/...`, or the organiser's own domain | [Pittcon 2027](https://app.swapcard.com/event/pittcon-2027) (133), [WEFTEC 2026](https://wefevents.app.swapcard.com/event/weftec-2026/exhibitors/RXZlbnRWaWV3XzEyNzc1MjY=) (1,054), [Counter Fraud Conference 2027](https://app.swapcard.com/event/counter-fraud-conference-2027) (18) | The same public data the event page loads for anonymous visitors, 50 exhibitors per request. Public events only. |

You can also paste an organiser's own page that embeds one of these (an ExpoFP floor plan, a link to an a2z
directory, a Swapcard widget); the actor finds the directory in the page.

### Input

| Field | Meaning |
|---|---|
| `startUrls` | One directory URL per show. Mix platforms freely. |
| `maxItems` | Stop after this many exhibitors across all URLs (default 1,000). Each exhibitor is one charge. |
| `includeDetails` | Default on. a2z lists show only name and booth, so the actor opens each exhibitor's public profile for website, city, country, address, description, categories and logo: one extra request per exhibitor, about 3 minutes for a 400-exhibitor show. ExpoFP and Swapcard return every field in the list itself; the setting changes nothing there. Turn it off for a fast name-and-booth list from a2z. |
| `proxy` | Optional. These directories are public and answer without one. |

Example:

```json
{
  "startUrls": [
    { "url": "https://techshowmadrid2026.expofp.com/" },
    { "url": "https://s15.a2zinc.net/clients/FNGLA/tpie2027/Public/EventMap.aspx" },
    { "url": "https://app.swapcard.com/event/pittcon-2027" }
  ],
  "maxItems": 2000,
  "includeDetails": true
}
```

### Output

One row per exhibiting company. **A field the show did not publish is `null`, never guessed.** How full a row is
depends on what the organiser and the exhibitor filled in: one show publishes addresses and social links for every
company, another only names and booths.

| Field | Description |
|---|---|
| `platform` | `expofp`, `a2z` or `swapcard` |
| `event_name` | Show name as the directory gives it |
| `event_url` | The directory the row came from |
| `exhibitor_name` | Company name |
| `booth` | Booth number(s), comma-separated when a company has several |
| `hall` | Hall or area, when the platform gives one separately from the booth |
| `website` | Company website |
| `description` | Company description, plain text |
| `categories` | Product or exhibitor categories (array) |
| `country`, `city` | Company location |
| `address` | One-line postal address, when a street or postcode is published |
| `phone` | Company phone, when published on the company profile |
| `email` | Company email, only when published on the public profile |
| `linkedin`, `twitter`, `facebook`, `instagram` | Company social links |
| `logo_url` | Company logo |
| `profile_url` | The exhibitor's page in the directory |
| `scraped_at` | When the row was collected (ISO 8601) |

**Company data only.** The actor does not collect individual people: no contact names, job titles or personal
profiles. On a2z, a phone number printed under a named contact person is that person's line and is left out.

Typical fill on the examples above: ExpoFP Tech Show Madrid has LinkedIn for 58% of companies and a description for 67%;
a2z TPIE 2027 (with profiles) has website for 94%, city and country for 100%, categories for 68%; Swapcard Pittcon 2027
has website for 64% and categories for 17%.

### Pricing

Pay per result: **$0.004 per exhibitor** returned (`exhibitor` event), so a 500-exhibitor show costs $2.00. You are
never charged for a show that returns nothing. Set `maxItems` (or a maximum charge per run) to cap spend.

### Not supported

- **Map Your Show** (`*.mapyourshow.com`, used by many large US shows): not covered here; other Store actors cover it.
- **Large German and European fairs on their own portals** (Messe Frankfurt, Messe München, Koelnmesse and similar):
  not covered; other Store actors cover them.
- **Swapcard events that need a login** (events not marked public, or exhibitor lists shown only to registered
  attendees). The actor never logs in and says so in the run log.
- **ExpoFP plans that publish booths but no exhibitor list** (some shows, such as Big 5 Global 2026 on 2026-10-26,
  have not attached exhibitors to the plan yet). The run returns no rows for that URL and logs why.
- Other platforms (Cvent, Grip, Bizzabo, eShow, vFairs, MapDynamics and organiser-built sites) are not supported yet.
- CAPTCHAs and bot walls are never bypassed: if a directory stops answering anonymously, that URL fails with a reason.

### How it collects

Public pages only: no logins, no CAPTCHA solving, no copied session tokens. It reads the same public data a visitor's
browser loads when opening the directory, at low concurrency with pauses between requests.

# Actor input Schema

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

One URL per event. Supported: ExpoFP floor plans (https://<event>.expofp.com/), a2z directories (https://<host>.a2zinc.net/.../<Event>/Public/EventMap.aspx or Exhibitors.aspx) and public Swapcard events (https://app.swapcard.com/event/<slug>/exhibitors/<viewId>, branded \*.app.swapcard.com or the organiser's own domain). An organiser page that embeds one of these also works. The platform is detected from the URL or page.

## `maxItems` (type: `integer`):

Stop after this many exhibitors across all URLs (each exhibitor is one charge).

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

a2z lists show only name and booth; with this on, each exhibitor's public profile page is read for website, city, country, address, description, categories and logo (one extra request per exhibitor, a few minutes for a large show). ExpoFP and Swapcard return every field from the list itself, so this setting changes nothing there.

## `proxy` (type: `object`):

Optional. The supported directories are public and answer without a proxy; use one only if your runs are being rate-limited.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://techshowmadrid2026.expofp.com/"
    },
    {
      "url": "https://s15.a2zinc.net/clients/FNGLA/tpie2027/Public/EventMap.aspx"
    },
    {
      "url": "https://app.swapcard.com/event/pittcon-2027"
    }
  ],
  "maxItems": 1000,
  "includeDetails": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `exhibitors` (type: `string`):

One row per exhibiting company: name, booth, website, description, categories, location, social links, logo and profile link.

# 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://techshowmadrid2026.expofp.com/"
        },
        {
            "url": "https://s15.a2zinc.net/clients/FNGLA/tpie2027/Public/EventMap.aspx"
        },
        {
            "url": "https://app.swapcard.com/event/pittcon-2027"
        }
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("morehavoc/trade-show-exhibitor-list-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://techshowmadrid2026.expofp.com/" },
        { "url": "https://s15.a2zinc.net/clients/FNGLA/tpie2027/Public/EventMap.aspx" },
        { "url": "https://app.swapcard.com/event/pittcon-2027" },
    ],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("morehavoc/trade-show-exhibitor-list-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://techshowmadrid2026.expofp.com/"
    },
    {
      "url": "https://s15.a2zinc.net/clients/FNGLA/tpie2027/Public/EventMap.aspx"
    },
    {
      "url": "https://app.swapcard.com/event/pittcon-2027"
    }
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call morehavoc/trade-show-exhibitor-list-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,morehavoc/trade-show-exhibitor-list-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/JdVapFa1wG3uaJ3qT/builds/c4UoqBpHHRn8rXjAm/openapi.json
