# Trade Show Exhibitors Scraper - Exhibitor List, Booth, Website (`tidytools/trade-show-exhibitor-list-scraper`) Actor

Exhibitor lists from trade show and expo directories: company, booth, hall, categories, country, website, description, logo. a2z (Personify) and ExpoFP natively; other sites via AI. Company data only.

- **URL**: https://apify.com/tidytools/trade-show-exhibitor-list-scraper.md
- **Developed by:** [Yukai Lin](https://apify.com/tidytools) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 3 total users, 3 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Trade Show Exhibitor List Scraper do?

It turns **trade show exhibitor directories into a clean company list**: one row per exhibiting company with **name, booth, hall, categories, country, city, website, description, logo and profile link**, plus the event name and dates. Paste the directory URL, or just the event's own website: the Actor finds the directory platform behind it and reads the **public data the directory page itself loads**. No login, no browser for the supported platforms, and **company-level data only**.

- 🏛️ **Two directory platforms read natively**: **a2z / Personify** (FABTECH, KBIS, CEDIA, HD Expo, RAPID + TCT…, i.e. `*.a2zinc.net` directories) and **ExpoFP** floor plans (SLAS, POWERGEN, Wine Paris…)
- 🔎 **Platform auto-detection**: give it the event's own website and it follows the organiser's link or embed to the a2z or ExpoFP directory (checked one level deep)
- 🤖 **AI extraction for everything else**: exhibitor lists on organiser websites and other platforms are read with AI into the **same columns** (`source: "ai"`). Company names are checked against the page text, so the AI cannot invent exhibitors
- 🧾 **One schema for every event**: `name`, `booth` (+ `booths` when a company has several), `hall`, `categories`, `website`, `description`, `country`, `city`, `state`, `postalCode`, `address`, `logoUrl`, `profileUrl`, `eventName`, `eventStartDate`, `eventEndDate`, `platform`
- 🎯 **Filters**: keywords (name, description, categories), category and country (US / USA / United States are the same). Filtered-out exhibitors are free
- 🔗 **Ready for enrichment**: the `website` column feeds straight into **Company Website Enrichment** (industry, description, contacts per company) — see Integrations
- 🧩 **Maps back to your input**: every row has `input` and `inputIndex`; directories that cannot be read get an error row saying why (not charged)
- 💵 **$3 per 1,000 exhibitors** with details, **$0.50 per 1,000** for name-and-booth-only rows. No start fee

### Supported directories

| Platform | Paste any of these | What is read | Fields you get |
|---|---|---|---|
| **ExpoFP** | `https://<event>.expofp.com`, or an event site that embeds it | the floor plan's own data file (`/data/data.js`) | name, booth(s), categories, website, description, country, city, state, postal code, address, company phone, generic company e-mail, social links, logo, event name and dates |
| **a2z / Personify** | `…/Public/Exhibitors.aspx?Index=All` (a category view like `?SubCatID=…` is kept as given), any other a2z page of the event, or an event site linking it | the exhibitor list page, then each exhibitor's public profile page (`eBooth.aspx`) | name, booth, website, country, city, state, postal code, address, company phone, categories, social links from the company block |
| **Other sites (AI)** | any exhibitor list page, e.g. `…/exhibitor_list.cfm`, an organiser's "Exhibitors" page | the page (plain HTTP, a real browser for JavaScript pages), then AI extraction | whatever the page shows: name, booth, hall, country, city, website, description, categories, profile link |

**Not supported on purpose: Map Your Show, Swapcard and Cvent.** Their terms or bot protection do not allow automated collection: Map Your Show's terms of use prohibit robots, Swapcard protects event content against automated collection, and Cvent's website terms forbid robots and page scraping. These platforms are not read at all, not even with AI extraction. Their URLs (including Map Your Show directories on a show's own domain) and event websites that only link them get a free `unsupported` row. Many large US shows run their exhibitor directory on Map Your Show (for example SEMA, CES and CONEXPO-CON/AGG), so this Actor cannot list their exhibitors.

### Ready-to-use exhibitor list URLs

Checked on 1 October 2026 (exhibitor counts as the directories listed them that day). Paste any of these as they are; the a2z events exhibitor list pages use `Exhibitors.aspx?Index=All`.

| Trade show | Platform | Exhibitor list URL | Exhibitors |
|---|---|---|---:|
| FABTECH 2026 | a2z | `https://s36.a2zinc.net/clients/SME/FABTECH2026/Public/Exhibitors.aspx?Index=All` | 1,452 |
| KBIS 2026 | a2z | `https://kbis.a2zinc.net/kbis2026/Public/Exhibitors.aspx?Index=All` | 609 |
| HD Expo 2026 | a2z | `https://hd.a2zinc.net/HDExpo2026/Public/Exhibitors.aspx?Index=All` | 556 |
| CEDIA Expo 2026 | a2z | `https://cedia.a2zinc.net/CEDIA2026/Public/Exhibitors.aspx?Index=All` | 327 |
| Wine Paris 2026 | ExpoFP | `https://wineparis2026.expofp.com/` | 6,390 |
| POWERGEN 2026 | ExpoFP | `https://powergen2026.expofp.com/` | 555 |
| SLAS 2026 | ExpoFP | `https://slas2026.expofp.com/` | 423 |

For a show that is not in this table, paste the event's own website: the Actor looks for its a2z or ExpoFP directory, and otherwise reads the exhibitor list page with AI.

### Who is it for?

- **Sales and business development teams** building a prospect list before a show: who exhibits, where the booth is, what they sell
- **Exhibitors** checking competitors and neighbours on the floor plan
- **Event organisers and marketers** benchmarking other shows in their industry
- **Market researchers** mapping an industry through its trade shows (countries, categories)

### How much does it cost?

Price per 1,000 rows by Apify plan:

| Event | Free | Starter | Scale | Business and higher |
|---|---|---|---|---|
| Exhibitor (with details: website, description, location or categories) | **$3.00** | **$3.00** | **$2.70** | **$2.40** |
| Exhibitor, name and booth only | $0.50 | $0.50 | $0.45 | $0.40 |
| Exhibitor read with AI (other sites) | $3.00 | $3.00 | $2.70 | $2.40 |

**No start fee.** Not charged: exhibitors removed by your filters, directories that cannot be read, unsupported platforms, pages where the AI finds no exhibitor, invalid input lines.

Which price applies is decided per row: an ExpoFP or a2z row with a website, description, location or categories is a detailed row ($0.003); a row with only name and booth (for example an a2z list read with **Read exhibitor profiles** off) is a name-and-booth row ($0.0005). The row's `chargedEvent` tells you which.

For comparison (checked September 2026, Apify Store prices on the Free plan): skython's exhibitor list scrapers charge $0.005 per exhibitor plus a $0.01 start fee; mochiboo/trade-show-directory-scraper $0.004. Those tools also return contact persons, which this Actor deliberately does not (see Responsible use).

### Control your cost

- **What is charged:** each exhibitor row returned, at the price of its type (details, name-and-booth only, or AI).
- **Max exhibitors per directory** and **Max exhibitors (whole run)** cap the run (API default 10,000 rows: at most $30 on the Free plan).
- **Filters are applied before charging**: keywords, category and country reduce what you pay.
- At the start, the run logs its worst case (e.g. `Plan: 125 exhibitors × $0.003 = at most $0.375`) and warns when that is more than your **maximum charge per run**.
- When the maximum charge per run is reached, the run stops, keeps everything found so far, and says so. The `SUMMARY` record then has `status: "LIMIT_REACHED"` and `notProcessed` (up to 100 directories not processed or not finished).

**Worked example (real runs, 30 September 2026, Free plan prices):**

| Run | Directories | Rows | Cost |
|---|---|---|---|
| a2z + ExpoFP, max 5 per directory | `semashow.com` (links Map Your Show: free `unsupported` row), FABTECH 2026 (a2z, profiles read), SLAS 2026 (ExpoFP) | 10 with details + 1 free `unsupported` row | **$0.03** (7.1 s) |
| a2z + AI, max 25 per directory | FABTECH 2026 and HD Expo 2026 (a2z, profiles read), IMX 2026 (`goeshow.com` list) and NACUBO 2026 (AI), one Swapcard URL (free error row) | 50 with details + 50 AI | **$0.30** (43 s) |

A whole directory costs about what its size says: FABTECH 2026 has 1,451 exhibitors with profiles (about $4.35); the IMX 2026 list read with AI has 253 exhibitors (about $0.76).

### How to use it

1. Paste one or more **exhibitor directories or event websites**, one per line.
2. Optional: set **Keywords**, **Category** or **Country** filters and **Max exhibitors per directory**.
3. Click **Start**. Export as CSV, Excel or JSON, or call it from the API. The **Exhibitors (overview)** table has the columns most people need; **Exhibitors (all fields)** has everything.

#### Input example

```json
{
    "urls": [
        "https://slas2026.expofp.com/",
        "https://kbis.a2zinc.net/kbis2026/Public/Exhibitors.aspx?Index=All",
        "https://s4.goeshow.com/ime/annual/2026/exhibitor_list.cfm"
    ],
    "countries": ["Italy", "Germany"],
    "maxExhibitorsPerDirectory": 200
}
```

#### Output example (a2z, profile read)

```json
{
    "input": "https://s36.a2zinc.net/clients/SME/FABTECH2026/Public/Exhibitors.aspx?Index=All",
    "success": true,
    "source": "platform",
    "platform": "a2z (Personify)",
    "eventName": "FABTECH 2026",
    "name": "1960 SERAVESI",
    "booth": "C8119",
    "categories": ["Bending/Forming", "Flanging Machines", "Plate & Structural Fabricating", "Angle Bending Rolls"],
    "website": "https://www.1960seravesi.com/",
    "country": "Italy",
    "city": "Calcinato",
    "postalCode": "25011",
    "address": "Via Statale 10T",
    "companyPhone": "+39030-6091301",
    "profileUrl": "https://s36.a2zinc.net/clients/SME/FABTECH2026/Public/eBooth.aspx?BoothID=539883&EventID=128",
    "detailLevel": "full",
    "charged": true,
    "chargedEvent": "exhibitor"
}
```

#### Output example (ExpoFP)

```json
{
    "platform": "ExpoFP",
    "eventName": "SLAS 2026",
    "eventStartDate": "2026-02-07",
    "eventEndDate": "2026-02-11",
    "name": "10x Genomics",
    "booth": "849",
    "categories": ["Genomics", "Fluorescence Assays", "Drug Development", "Reagents"],
    "website": "http://www.10xgenomics.com/",
    "country": "United States",
    "city": "Pleasanton",
    "companyEmail": "support@10xgenomics.com",
    "companyPhone": "(925) 401-7300",
    "logoUrl": "https://slas2026.expofp.com/data/exhibitors/13691468/media/10x-genomics.webp?v=16444565",
    "chargedEvent": "exhibitor"
}
```

#### A directory that cannot be read

```json
{
    "input": "https://app.swapcard.com/event/example",
    "success": false,
    "errorType": "unsupported",
    "error": "Swapcard is not supported: Swapcard protects event content against automated collection (bot management, terms of use) (not charged)",
    "charged": false
}
```

An event website that links Map Your Show gets the same free row, e.g. for `https://www.semashow.com/`: `"error": "this event uses Map Your Show, which is not supported (its terms or bot protection do not allow automated collection) (not charged)"`.

Other `errorType` values: `invalid_input`, `not_found` (no directory at that address or the domain does not exist, e.g. an old show code), `no_results` (the directory was read but none of its exhibitors matches your filters), `no_items` (the directory or page lists no exhibitors), `blocked` (the site refused the request), `blocked_by_robots` (robots.txt does not allow the page), `timeout`.

### Integrations

- **Company enrichment**: run **Google Maps Lead Enrichment** (tidytools/company-website-enrichment) on this run's dataset with `datasetId` = the dataset ID and `datasetField` = `website`, and `datasetKeepFields` = `["name", "booth", "eventName"]` to keep the booth next to each company's industry, description and public contact channels.
- **API and webhooks**: start runs and read the dataset from any language; use a webhook when a run finishes.
- **Exports**: CSV, Excel, JSON, XML and HTML from the dataset (the overview view gives a flat table).
- **Apify integrations**: send results to Google Sheets, HubSpot, Slack, Zapier, Make, n8n and others from the Integrations tab.

### Use with AI agents (MCP)

Connect Apify's MCP server (https://mcp.apify.com?tools=tidytools/trade-show-exhibitor-list-scraper) to Claude, Cursor or any MCP client, then ask e.g. "Which German and Italian companies exhibit at FABTECH 2026, and at which booth?"

```json
{ "urls": ["https://s36.a2zinc.net/clients/SME/FABTECH2026/Public/Exhibitors.aspx?Index=All"], "countries": ["Germany", "Italy"] }
```

Failed directories are not charged and carry an `errorType`; the `SUMMARY` record has `status` (`SUCCESS`, `PARTIAL_RESULTS`, `LIMIT_REACHED`, `FAILED`, `NO_RESULTS`) and one line per directory in `perDirectory`. Each line reconciles the directory with what you got: `declaredTotal` (the exhibitors the directory itself lists: the lines of an a2z list page, the entries of an ExpoFP floor plan; `null` for AI-read pages), `exhibitorsFound`, `matched` (after filters), `returned`, and `complete` (`true` when every listed exhibitor was read and every matching one returned) with `incompleteReason` when it is `false`.

### Tips and limitations

- **Map Your Show, Swapcard and Cvent are not read** (see Supported directories). An event website or exhibitor page that links or embeds one of them, and no a2z or ExpoFP directory, gets a free `unsupported` row instead of AI extraction.
- **Filters need the field**: a directory that publishes no country or category (some AI-read lists) matches nothing on those filters; the `SUMMARY` says so in `filterWarning`. Keyword filters work on names, descriptions and categories.
- **a2z profiles** cost one extra request per exhibitor (three at a time, with a pause between requests): a 1,500-exhibitor show takes a few minutes. Turn **Read exhibitor profiles** off for a quick name-and-booth list ($0.50 per 1,000). Country and category filters need the profiles.
- **ExpoFP** returns the richest rows in one request. A few events keep their floor plan private (HTTP 403): those get a `blocked` row. An event name that does not exist (`typo.expofp.com`) gets a free `not_found` row.
- **One directory per address**: an a2z address of any page of an event (including a single `eBooth.aspx` profile link) returns that event's whole exhibitor list, not just that one booth. The vendors' own websites (`www.expofp.com`, `www.a2zinc.net`) are not events and get a free `invalid_input` row; the vendors' demo floor plans linked from event sites are ignored.
- **Private and local addresses** (`localhost`, `10.x.x.x`, `192.168.x.x`, `[::1]` ...) are never requested: a free `invalid_input` row. An event website that is down or refuses us gets a row with the real reason (`HTTP 500`, `blocked`, `timeout`) when AI extraction is off.
- **AI extraction on a page that is not an exhibitor list** (an article, a Wikipedia entry, a news page): the Actor checks the page before charging (encyclopedia/social hosts and pages of running text without a table or exhibitor wording are rejected, and so is a page the AI itself labels "not an exhibitor list"). You get one free `no_items` row saying the page does not look like an exhibitor list; paste the event's exhibitor directory page instead. A page whose address or title says "exhibitors" or that has a company/booth table is never rejected by this check.
- **AI extraction reads one page.** Paginated lists need one URL per page, and lists that only load while you scroll may be incomplete. Booths and websites are returned only when the page shows them.
- **German trade fairs (tested 3 October 2026)**: of seven German organiser pages we tried with AI extraction, one returned exhibitors (Spielwarenmesse: 25 company names, no booth or website), three returned nothing because the list is loaded by search forms (Messe Frankfurt, Messe Stuttgart, Hinte Messe), two URLs we guessed do not exist (Anuga, Hannover Messe), and one was skipped because the organiser's robots.txt disallows its search path (Medica). All failed directories are free. For German shows, check first whether the event's exhibitor list is an a2z or ExpoFP page; the Actor cannot read search forms that need clicks.
- **Past shows**: directories are usually kept online for a while after the event; old show codes return `not_found`.
- Directory platforms change from time to time; if one stops working, open an issue with the URL.

### Responsible use

This Actor collects **company-level exhibitor information that organisers publish** so visitors can find exhibitors: company name, booth, hall, categories, website, description, location and logo.

- **No personal data is collected.** Contact persons, staff names, personal e-mail addresses and personal phone numbers are never extracted. A company e-mail is kept only when it is a generic company mailbox shown on the public profile (`info@`, `sales@`, `support@`…); any other address is dropped. The company phone is the number shown in the company's own profile block. The AI is instructed not to return people, and e-mail addresses and phone numbers are removed from AI descriptions.
- **Public directories only.** No login, no bypassing of bot checks or paywalls. Platforms whose terms or bot protection do not allow automated collection (Map Your Show, Swapcard, Cvent) are not read, and robots.txt is respected for every request (a disallowed page gets a free `blocked_by_robots` row).
- **Gentle by default.** One request per directory for ExpoFP; a2z profiles at most three at a time with a pause between requests to the same site.
- Some directory providers' terms restrict automated access to their websites. You are responsible for how you use the data: check the event's and platform's terms, and follow anti-spam and data-protection laws (GDPR, CAN-SPAM, CASL) when you contact companies.

### FAQ

**Does the Actor collect usage data?** The Actor sends one anonymous usage counter per run (input type, item count range, outcome) to improve the tool; no URLs, content or account data.

**Can I paste just the event's website?** Yes. The Actor looks for a link or embed to a2z or ExpoFP on the page (and on its "Exhibitors" page). If there is none, the exhibitor list page is read with AI; if the page links Map Your Show, Swapcard or Cvent instead, you get a free `unsupported` row.

**Why is my Map Your Show event (SEMA, CES…) not supported?** Map Your Show's terms of use prohibit robots, so this Actor does not read it in any way, including with AI extraction. The row says so and is not charged.

**Why did I get fewer exhibitors than the show claims?** Check your filters, **Max exhibitors per directory** and **Max exhibitors**, and `SUMMARY.perDirectory[]`: `declaredTotal` against `returned`, and `incompleteReason` when `complete` is `false`. Exhibitors listed under several booths are one row with all booths in `booths`. A show's marketing number ("1,000+ exhibitors") often counts co-exhibitors and pavilion members that its directory does not list.

**Why are there no contact persons?** On purpose: see Responsible use. Use the `website` column with a company enrichment tool for generic company contact channels.

**My event's platform is not supported.** Turn on **AI extraction for other sites** (default) and paste the exhibitor list page. If you need a platform read natively, open an issue with an example URL.

**Which trade shows and expos are supported?** Events whose exhibitor directory runs on **a2z / Personify** (e.g. FABTECH, KBIS, CEDIA) or **ExpoFP** (e.g. SLAS, POWERGEN, Wine Paris) are read natively; exhibitor lists on other sites are read with AI extraction (results vary: static lists work well, search forms that need clicks do not). Map Your Show, Swapcard and Cvent are not supported.

**What if I give no URL, or only invalid lines?** The run ends normally (it does not fail): every bad line (not a web address, a private or local address, or a platform vendor's own website) gets a free `invalid_input` row (or one row if the input is empty), `SUMMARY.status` is `NO_RESULTS` and nothing is charged. If a directory is read but your filters match none of its exhibitors, you get one free `no_results` row for it.

Found this useful? A short review on the Store helps other trade show researchers find it.

### Related Actors

More tools by TidyTools that work well with this one:

- [Google Maps Lead Enrichment](https://apify.com/tidytools/company-website-enrichment): add company details to a list of domains
- [Website Email Extractor](https://apify.com/tidytools/website-contact-extractor): find company emails, phones and social profiles on websites
- [Email List Cleaner](https://apify.com/tidytools/bulk-email-validator): clean an email list with MX, disposable and typo checks
- [Website Tech Stack Detector](https://apify.com/tidytools/website-tech-stack-detector): find the CMS, shop platform and tools a site uses

# Actor input Schema

## `urls` (type: `array`):

One URL per line: an exhibitor directory (a2z / Personify, ExpoFP) or the event's own website (the directory it links is detected). Other exhibitor list pages are read with AI extraction. Map Your Show, Swapcard and Cvent directories are not read (their terms or bot protection do not allow automated collection): they get a free "unsupported" row. Bare domains are fine. Invalid lines and directories that cannot be read get a free error row.

## `maxExhibitorsPerDirectory` (type: `integer`):

Stop taking exhibitors from one directory after this many (after filters). 0 = all exhibitors.

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

Stop after this many exhibitor rows in total. You pay only for rows returned.

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

a2z lists show only name and booth: with this on, each exhibitor's public profile page is read for website, address, country, company phone and categories (one extra request per exhibitor, slower). ExpoFP includes these fields anyway.

## `aiFallback` (type: `boolean`):

Directories on other platforms (organiser websites, custom lists) are read with AI into the same columns (rows have source "ai" and cost more, see pricing). Off = such URLs get a free "unsupported" error row.

## `keywords` (type: `array`):

Keep exhibitors whose name, description or categories contain one of these words (case-insensitive), e.g. robot, packaging. Filtered-out exhibitors are free.

## `categories` (type: `array`):

Keep exhibitors with a product category containing one of these, e.g. Software, Bakery. Directories that publish no categories match nothing.

## `countries` (type: `array`):

Keep exhibitors from these countries, e.g. United States, Germany, UK (US/USA/United States and similar names are treated as the same). Directories that publish no country match nothing.

## `httpVia` (type: `string`):

Where requests to the directory come from. AI-read pages also use our backend and a real browser when needed.

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

How many directories are read at the same time.

## `requestDelayMs` (type: `integer`):

Keeps the load on each event site low. Profile pages are read at most 3 at a time per run.

## `directoryTimeoutSecs` (type: `integer`):

A directory that takes longer stops with a timeout error row (rows already returned stay).

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

Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account. Not needed for the supported platforms.

## Actor input object example

```json
{
  "urls": [
    "https://slas2026.expofp.com/",
    "https://kbis.a2zinc.net/kbis2026/Public/Exhibitors.aspx?Index=All"
  ],
  "maxExhibitorsPerDirectory": 10,
  "maxExhibitors": 10000,
  "includeDetails": true,
  "aiFallback": true,
  "httpVia": "auto",
  "maxConcurrency": 2,
  "requestDelayMs": 300,
  "directoryTimeoutSecs": 1800
}
```

# Actor output Schema

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

No description

## `full` (type: `string`):

No description

## `summary` (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 = {
    "urls": [
        "https://slas2026.expofp.com/",
        "https://kbis.a2zinc.net/kbis2026/Public/Exhibitors.aspx?Index=All"
    ],
    "maxExhibitorsPerDirectory": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidytools/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 = {
    "urls": [
        "https://slas2026.expofp.com/",
        "https://kbis.a2zinc.net/kbis2026/Public/Exhibitors.aspx?Index=All",
    ],
    "maxExhibitorsPerDirectory": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tidytools/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 '{
  "urls": [
    "https://slas2026.expofp.com/",
    "https://kbis.a2zinc.net/kbis2026/Public/Exhibitors.aspx?Index=All"
  ],
  "maxExhibitorsPerDirectory": 10
}' |
apify call tidytools/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,tidytools/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/kF9CLDGcwUS4BehnG/builds/ihvxs0xY2877U0U8b/openapi.json
