Exhibitor List Scraper: Trade Show & Messe Aussteller Leads
Devansh Tiwari · @devanshtiwari365
Scrape trade show and Messe exhibitor lists: company, website, email, phone, booth and contacts. 148 shows, 30 platforms, one format. Excel, CSV, JSON.
About
Exhibitor List Scraper: trade show exhibitor lists with emails, phones and booths
Pick a trade show and get every exhibitor as one clean row: company, website, email, phone, stand, hall, categories and the named contacts a fair publishes. It reads 30 fair platforms and has 148 shows ready to tick, including German Messe Aussteller directories.
Start a 7-day free trial, tick the fairs you work, and have a lead list in the time it takes to make coffee. No card is needed for the trial.
🎁 What you get
- One format for every fair. A Messe Frankfurt list, a Reed Expo directory and a Map Your Show floor plan all come back with the same columns, so your CRM import works the first time.
- Fairs by name or by link. Tick shows from 23 industries, or paste the exhibitor list link of any supported fair. Several fairs in one run are fine.
- Named contacts and emails. Contact persons with title, email and phone where the fair lists them. When it lists none, the Actor reads the exhibitor's own website for a named person's email and the general inbox, and labels which is which.
- Booth details. Stand, hall and, for fairs that publish them, stand width, height and area.
- Filters that cut the list down. Keywords, product categories and countries. Keep only exhibitors with a website, an email or a named contact.
- Only what is new. Watchlist mode saves a baseline and returns new, changed or removed exhibitors on every later run. Schedule it weekly and you hear about each new sign-up.
- Your format. Download Excel, CSV or JSON, or pull the data into your CRM through the API.
👥 Who it is for
- SDRs and business development: "I need every exhibitor at this fair with a website and email before the show starts, so I can book meetings instead of copying names into a sheet."
- Event sponsorship managers: "I want to see who exhibits at the fairs my competitors attend, and get told when a new company signs up."
- AV, stand-building and booth vendors: "I want exhibitors by country and product category, with hall and stand, so I can pitch the companies that have the most to build."
- Market researchers: "I compare exhibitor lists across several fairs to see which companies show up everywhere and which are new this year."
🚀 How it works
- Pick shows or paste links. Tick fairs from the list, or add any fair's exhibitor list link.
- Set your filters. Choose countries, categories, or only exhibitors with an email.
- Run it and download. Export to Excel, CSV or JSON.
📊 Output
Each row is one exhibitor. Fields a fair does not publish are left out, never filled with placeholders.
| Field | What it holds |
|---|---|
companyName, eventName | The exhibitor and the fair it belongs to |
website, email, phone | Published contact details |
personalEmail, roleEmail | A named person's address and the general inbox, kept apart |
emailType | personal or role |
emailDomainAcceptsMail | Whether the email's domain can receive mail (with website email lookup) |
address, city, country, countryCode | Where the company is based |
stand, hall, booths | Stand and hall as the fair shows them |
categories, products, brands | What the exhibitor sells |
linkedin, facebook, twitter, instagram, youtube, xing | Social profiles when published |
contactPersons | Name, job title, email, phone and LinkedIn of published contacts |
clusterId | The same value for the same company across fairs |
changeType | NEW, UPDATED or REMOVED in watchlist mode |
detailUrl | The exhibitor's page at the fair |
💰 Pricing
$19 a month after a 7-day free trial. Compute is billed from your prepaid credits during the trial and after it. [NEED: what a typical run costs in Bytewells credits; measure one run on Bytewells and add the figure here]
💡 Good to know
- Only public exhibitor pages are read. You never log in anywhere.
- The Actor is independent and not affiliated with any fair or organiser.
FAQ
- Does it work for German trade fairs (Messe Aussteller)?
- Yes. Most large German fair organisers are supported, including Messe Frankfurt, Düsseldorf, München, Stuttgart, Berlin, Essen, Deutsche Messe, NürnbergMesse, Koelnmesse, AFAG and Schall Messen. Paste the Ausstellerverzeichnis link or pick the show by name.
- Do I get a person's email or only info@?
- Both, when the fair or the exhibitor's website shows both. A named person's address goes in `personalEmail` and the general inbox in `roleEmail`, so you can tell them apart before you write. Many companies publish only a general inbox, so a personal address is not always there to find.
- Where do the emails come from?
- From the fair's own directory. If you turn on "Find emails on exhibitor websites", the Actor also reads the exhibitor's own contact, team and imprint pages and returns only addresses printed there. It never guesses an address, and nothing comes from purchased lists.
- Can I get only the new exhibitors each week?
- Yes. Turn on watchlist mode, give it a name, and schedule the run. The first run saves a baseline. Every later run with the same name returns only new exhibitors, or new, changed and removed ones if you pick that option.
- My trade show is not on the list. Can I still use it?
- Paste its exhibitor list link. If the fair runs on one of the 30 platforms the Actor reads, it works even when the show is not in the pick list. If it does not, the run ends with a message that names the platforms it supports. [NEED: where Bytewells customers should send a request for a new fair]
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
Paste the exhibitor list link of each trade show, or pick shows from the built-in list below. The platform behind each link is detected for you.
startUrlsOne or more trade show exhibitor list links. Paste the fair's exhibitor directory or search page; for some fairs the event home page also works. Many fairs can be read in one run, and every link is checked on its own: a link that is not supported gets a clear message in the run summary and the other links still run. Fairs using the same platform (for example Messe Frankfurt, Messe Duesseldorf, RX or Map Your Show) are detected automatically.
showsTick the fairs you want from the built-in list instead of looking up their links. Each picked show is read from its current edition and its rows carry showId and showName. Picked shows and pasted links are combined in one run. When you pick shows, the example link that is pre-filled above is not read on top of them (Ambiente can be picked from this list). Use Maximum rows per fair below to share the row limit across several shows.
industriesAdds every show of these industries from the list above, for example all medical fairs. Combine it with Maximum rows per fair so each show gets its share of rows.
Narrow the list. Filters the fair cannot apply itself are applied here after reading each exhibitor, so rows are only counted toward your limit when they match.
searchQueryKeep only exhibitors that match these words. Where the fair's own search supports it the fair does the matching; for the other platforms every word must appear in the company name, description, categories, products or brands after the profile is read. Leave empty for all exhibitors.
categoriesKeep exhibitors whose categories, products or brands contain any of these words (not case sensitive). Applied after reading each exhibitor.
countriesKeep exhibitors based in these countries. Use English names or two letter codes, for example Germany or DE. Applied after reading each exhibitor.
hasWebsiteSkip exhibitors that publish no website.
hasEmailSkip exhibitors without an email address. When website email lookup is on, an address found on the exhibitor's website also counts.
hasContactsSkip exhibitors that publish no named contact person. Turns on contact person collection.
Optional extras. They are off by default so a first run stays fast.
includeContactPersonsAdd the named contacts an exhibitor publishes (name, job title, email, phone, LinkedIn) where the fair lists them. Some fairs need one extra request per exhibitor for this, so runs take longer.
includeBoothSizesAdd stand width, height and area for fairs that publish them. Fairs without booth size data return the row without it and say so in the run summary.
enrichEmailsWhen the fair lists no email for an exhibitor, open the exhibitor's own website (home, contact, team and imprint pages) and return addresses that are published there: a named person's email when the site shows one, and the general inbox. Each email is labelled personal or role, and the run checks that the email's domain can receive mail. Only publicly shown addresses are returned, never a guessed one or anything from a purchased database. Slows the run down.
emailLookupScopeOnly used when website email lookup is on. Missing email only: visit the website when the fair lists no email (fastest). Also when only a general inbox is listed: visit the website too when the fair lists only addresses such as info@ or sales@, to find a named person.
How many rows to return and how they are shaped.
outputShapeSingle row: one row per exhibitor with all contacts inside. Flattened: one row per contact person, so you can load contacts straight into a spreadsheet or CRM (turns on contact person collection, each row counts toward the item limit). Compact: one short row per company across all fairs, with the same company kept once.
maxItemsStop after this many rows in total across all links. Free plan runs are capped at 25.
maxItemsPerEventOptional cap for each link, useful in bulk runs so one big fair does not use up the whole total. Leave empty for no per-fair cap (the total above still applies).
duplicateHandlingKeep all: every listing is returned and carries a clusterId so you can group them. Mark duplicates: also adds clusterSize and isCanonical (the richest listing) to each row, held back until the end of the run for up to 5,000 rows. Keep one: only the first listing of each company is returned.
Schedule the run and receive only what is new since last time.
monitorModeOff: every run returns everything. New only: after the first run (which returns all and saves the baseline) only exhibitors that were not listed before are returned. New and changed: also returns exhibitors whose listing changed (the changes field says what) and exhibitors that disappeared (changeType REMOVED, reported after two complete runs in a row without them). Rows that did not change are not returned.
watchlistNameName that identifies your saved baseline. Use the same name on every scheduled run of one watchlist and a different name for each separate watchlist. Changing filters starts a fresh baseline. Leave empty to share one default baseline.
Connection settings. The defaults work for normal runs.
proxyConfigurationOptional. By default the Actor connects directly and only switches to Apify Proxy when a fair refuses the connection. Set this to force your own proxy settings for every request.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is devanshtiwari365/exhibitor-list-scraper (or devanshtiwari365~exhibitor-list-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"startUrls": [
{
"url": "https://ambiente.messefrankfurt.com/frankfurt/en/exhibitor-search.html"
}
],
"shows": [],
"industries": [],
"hasWebsite": false,
"hasEmail": false,
"hasContacts": false,
"includeContactPersons": false,
"includeBoothSizes": false,
"enrichEmails": false,
"emailLookupScope": "missingOnly",
"outputShape": "singleRow",
"maxItems": 20,
"duplicateHandling": "keep",
"monitorMode": "off"
};
const run = await client.actor('devanshtiwari365/exhibitor-list-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"startUrls": [
{
"url": "https://ambiente.messefrankfurt.com/frankfurt/en/exhibitor-search.html"
}
],
"shows": [],
"industries": [],
"hasWebsite": False,
"hasEmail": False,
"hasContacts": False,
"includeContactPersons": False,
"includeBoothSizes": False,
"enrichEmails": False,
"emailLookupScope": "missingOnly",
"outputShape": "singleRow",
"maxItems": 20,
"duplicateHandling": "keep",
"monitorMode": "off"
}
run = client.actor("devanshtiwari365/exhibitor-list-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/devanshtiwari365~exhibitor-list-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://ambiente.messefrankfurt.com/frankfurt/en/exhibitor-search.html"}],"shows":[],"industries":[],"hasWebsite":false,"hasEmail":false,"hasContacts":false,"includeContactPersons":false,"includeBoothSizes":false,"enrichEmails":false,"emailLookupScope":"missingOnly","outputShape":"singleRow","maxItems":20,"duplicateHandling":"keep","monitorMode":"off"}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.