Two weeks before a trade show, someone on the sales team always asks the same thing: "Can we get the exhibitor list in a spreadsheet?"
The data is right there on the show's website, in a searchable directory with booth numbers, categories and links. It is just not exportable. People end up copying names by hand, or buying a list that turns out to be last year's.
Most exhibitor directories are not custom-built. A large share of shows run on one of a handful of platforms, and two of them load their data in a way that is easy to read cleanly: a2z / Personify (FABTECH, KBIS, CEDIA, HD Expo, RAPID + TCT…) and ExpoFP floor plans (SLAS, POWERGEN, Wine Paris…). This post shows how to turn either into a CSV, and then add company data to every row.
Step 1: find the directory URL
For the shows I checked on 1 October 2026, these work as they are:
| 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 any other show, you do not need to dig: paste the event's own website, and the Trade Show Exhibitors Scraper follows the organiser's link or embed to the a2z or ExpoFP directory. A directory on some other site (an organiser's own "Exhibitors" page, for example) can be read with AI extraction into the same columns; company names are checked against the page text so the model cannot invent exhibitors.
Not supported, on purpose: Map Your Show, Swapcard and Cvent. Their terms or bot protection do not allow automated collection, so the Actor does not read them at all, and you get a free row saying so. That rules out several big US shows (SEMA, CES and CONEXPO-CON/AGG run on Map Your Show); I would rather say that up front.
Step 2: export the list
{
"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
}
Every event comes back in the same schema, so a multi-show list is one table. A real a2z row (FABTECH 2026, profile read):
{
"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",
"chargedEvent": "exhibitor"
}
And an ExpoFP row (SLAS 2026), which comes with the event dates:
{
"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"
}
Filters (keywords over name, description and categories; category; country, where "US", "USA" and "United States" are the same) are applied before charging. Export as CSV, Excel or JSON from the dataset.
What two real runs cost
From my test runs on 30 September 2026, at Free plan prices:
| Run | Directories | Rows | Cost |
|---|---|---|---|
| a2z + ExpoFP, max 5 per directory | semashow.com (links Map Your Show: free unsupported row), FABTECH 2026, SLAS 2026 |
10 with details + 1 free row | $0.03 (7.1 s) |
| a2z + AI, max 25 per directory | FABTECH 2026, HD Expo 2026, IMX 2026 and NACUBO 2026 (AI), one Swapcard URL (free row) | 50 with details + 50 AI | $0.30 (43 s) |
Costs in the table are calculated at the current price list (the two runs were done at the earlier $2 per 1,000 exhibitors and cost $0.02 and $0.25). A whole directory costs about what its size says: FABTECH 2026 with 1,451 exhibitor profiles is about $4.35.
Step 3: add company data to every row
An exhibitor list tells you who is there. Before you plan meetings, you usually want to know what each company does and how to reach it. The website column feeds straight into Google Maps Lead Enrichment (it takes any list of company websites, not only Google Maps leads), which reads each company's own site and returns an industry label, a one-line description, the contact channels the site publishes (company e-mail, phone, social profiles) and its tech stack.
Pass the exhibitor run's dataset and keep the booth next to each result:
{
"datasetId": "<dataset ID of the exhibitor run>",
"datasetField": "website",
"datasetKeepFields": ["name", "booth", "eventName"]
}
Or the whole pipeline from Python with apify-client:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
show = client.actor("tidytools/trade-show-exhibitor-list-scraper").call(run_input={
"urls": ["https://s36.a2zinc.net/clients/SME/FABTECH2026/Public/Exhibitors.aspx?Index=All"],
"countries": ["Germany", "Italy"],
})
companies = client.actor("tidytools/company-website-enrichment").call(run_input={
"datasetId": show["defaultDatasetId"],
"datasetField": "website",
"datasetKeepFields": ["name", "booth", "eventName"],
})
for row in client.dataset(companies["defaultDatasetId"]).iterate_items():
kept = row.get("source") or {} # the exhibitor fields you asked to keep
print(kept.get("booth"), kept.get("name"), row.get("industry"), row.get("description"))
Enrichment is $6 per 1,000 enriched companies (AI description included); unreachable websites are free.
What it costs
| Row type | Free / Starter | Scale | Business and higher |
|---|---|---|---|
| Exhibitor with details (website, description, location or categories) | $3.00 / 1,000 | $2.70 | $2.40 |
| Name and booth only | $0.50 / 1,000 | $0.45 | $0.40 |
| Exhibitor read with AI (other sites) | $3.00 / 1,000 | $2.70 | $2.40 |
No start fee. Filtered-out exhibitors, directories that cannot be read, unsupported platforms and invalid lines are free. Each row's chargedEvent says which price applied. For a quick name-and-booth list, turn off Read exhibitor profiles on a2z shows.
Limits worth knowing
- a2z profiles take one extra request each (three at a time, with pauses), so a 1,500-exhibitor show takes a few minutes. ExpoFP is a single request.
- AI extraction reads one page. Paginated lists need one URL per page.
-
Fewer rows than the show advertises? Marketing numbers ("1,000+ exhibitors") often count co-exhibitors the directory does not list. The run's
SUMMARYcompares the directory's own total with what you got, per directory.
Responsible use
This collects company-level information that organisers publish so visitors can find exhibitors. No contact persons, staff names, personal e-mails or personal phone numbers are extracted; a company e-mail is kept only when it is a generic mailbox (info@, sales@, support@). robots.txt is respected on every request, and platforms that do not allow automated collection are skipped. Check the event's terms, and follow GDPR, CAN-SPAM and CASL before you contact anyone.
Actor: https://apify.com/tidytools/trade-show-exhibitor-list-scraper
Disclosure: I built both Actors and earn from their usage on Apify. The shows and companies above are public examples from my test runs of 30 September and 1 October 2026 and have no connection to me.
Top comments (1)
The free unsupported row and per-directory SUMMARY make a useful distinction between "nothing matched" and "we couldn't read this source." I'd preserve that distinction through the enrichment export too. Your example keeps name, booth and eventName, but I'd also carry profileUrl, the directory URL and a source-row ID. A good fixture is two exhibitors sharing a website, plus the same exhibitor at two shows: enrichment can reuse the website result without merging the booth records. Also worth checking that an unreachable website leaves the source row visible with an enrichment status rather than disappearing from the final CSV.