Trade Show Exhibitor Leads Scraper
Pricing
Pay per usage
Trade Show Exhibitor Leads Scraper
Extract exhibitor leads from public trade show directories, including MapYourShow, A2Z, and generic exhibitor pages. Enrich company contacts, score leads, deduplicate new exhibitors, and export CRM-ready B2B datasets.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Вадим Захаров
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Extract exhibitor leads from public trade show and event exhibitor directories. Detect MapYourShow, A2Z, and generic exhibitor pages, normalize company records, enrich public contact data, calculate lead scores, and export CRM-ready B2B lead datasets.
This Actor is built for B2B lead generation, trade show leads research, conference exhibitor scraper workflows, expo exhibitor list collection, market mapping, and sales teams that need a practical exhibitor directory scraper without building custom extraction logic for every event site.
What this Actor does
The Actor crawls supplied eventUrls with CheerioCrawler, detects the source provider, extracts event and exhibitor data, normalizes records, optionally crawls exhibitor profile pages, optionally enriches public company website contact data, calculates lead scores, and writes one flat Dataset record per exhibitor.
It also stores run state and diagnostics:
- stable exhibitor fingerprints for incremental runs in a named persistent Key-Value Store;
RUN-SUMMARY-{stateKey}in the default Key-Value Store;- user-facing KVS
OUTPUT; - per-event extraction diagnostics with provider, confidence, method, pagination, warnings, and errors.
Supported sources/providers
Current Store V1 support:
- MapYourShow scraper support for Map Your Show-like public exhibitor directories;
- A2Z exhibitor scraper support for A2Z / a2zinc-like public directories;
- generic public exhibitor, sponsor, company, and event exhibitor list pages.
The Actor currently supports eventUrls mode only. Discovery mode and 10times are not included in V1.
What data you get
Each Dataset record combines event context, exhibitor details, enrichment data, lead score, and state metadata.
Core fields:
eventNameeventUrleventStartDateeventEndDateeventLocationeventCountryprovidersourceUrlexhibitorNameboothNumberexhibitorProfileUrlwebsitedescriptioncategoriesfingerprintisNewscrapedAtenrichmentStatusenrichmentPagesVisitedemailsphonessocialLinksleadScoreleadScoreReasons
Conditional enrichment fields:
emailphonelinkedinUrltwitterUrlfacebookUrlinstagramUrlyoutubeUrl
Debug field:
rawData, only whenincludeRawData=true.
Input examples
Minimal run:
{"mode": "eventUrls","eventUrls": ["https://example.com/trade-show/exhibitors"]}
Store V1 smoke run:
{"mode": "eventUrls","eventUrls": ["https://example.com/trade-show/exhibitors"],"sources": ["mapyourshow", "a2z", "generic"],"includeCompanyEnrichment": false,"includeExhibitorProfiles": false,"onlyNewSinceLastRun": false,"stateKey": "default","maxEvents": 1,"maxExhibitorsPerEvent": 100,"maxPagesPerEvent": 1,"includeRawData": false}
Profile and enrichment run:
{"mode": "eventUrls","eventUrls": ["https://example.com/trade-show/exhibitors"],"sources": ["mapyourshow", "a2z", "generic"],"includeCompanyEnrichment": true,"includeExhibitorProfiles": true,"onlyNewSinceLastRun": false,"stateKey": "profile-enrichment","maxEvents": 1,"maxExhibitorsPerEvent": 100,"maxPagesPerEvent": 2,"maxProfilePagesPerEvent": 25,"includeRawData": false}
Output example
{"eventName": "Example Expo","eventUrl": "https://example.com/trade-show/exhibitors","eventStartDate": null,"eventEndDate": null,"eventLocation": "Chicago, IL","eventCountry": "United States","provider": "generic","sourceUrl": "https://example.com/trade-show/exhibitors/acme","exhibitorName": "ACME Robotics","boothNumber": "A-100","exhibitorProfileUrl": "https://example.com/trade-show/exhibitors/acme","website": "https://example.com","description": "Industrial robotics supplier.","categories": ["Robotics", "Automation"],"fingerprint": "stable-sha256-hash","isNew": true,"scrapedAt": "2026-05-26T00:00:00.000Z","enrichmentStatus": "not_requested","enrichmentPagesVisited": 0,"emails": [],"phones": [],"socialLinks": [],"leadScore": 45,"leadScoreReasons": ["website_found:+25", "booth_number_found:+10", "categories_found:+10"]}
When includeCompanyEnrichment is enabled and contacts are found, records can also include email, phone, linkedinUrl, twitterUrl, facebookUrl, instagramUrl, and youtubeUrl.
Output field reference
| Field | Type | Description |
|---|---|---|
eventName | string | Event name from page metadata, page text, or URL fallback. |
eventUrl | string | Input event directory URL associated with the record. |
eventStartDate | string or null | ISO-like event start date when detected. |
eventEndDate | string or null | ISO-like event end date when detected. |
eventLocation | string or null | Event city, venue, region, or other detected location text. |
eventCountry | string or null | Event country when detected or inferred. |
provider | string | Extractor path used for the record: mapyourshow, a2z, or generic. |
sourceUrl | string | Page URL where the exhibitor record was found or normalized from. |
exhibitorName | string | Company or organization name. |
boothNumber | string or null | Booth, stand, table, or exhibit number when present. |
exhibitorProfileUrl | string or null | Public exhibitor profile URL when found. |
website | string or null | Public company website URL when found. |
description | string or null | Short public exhibitor description when found. |
categories | string[] | Public categories, product groups, or tags. |
fingerprint | string | Stable hash built from event URL, event name, exhibitor name, and booth number. |
isNew | boolean | Whether this fingerprint was new for the selected stateKey when emitted. |
scrapedAt | string | ISO timestamp for when the record was produced. |
enrichmentStatus | string | not_requested, success, no_website, no_contacts_found, or failed. |
enrichmentPagesVisited | number | Number of public company website pages visited for enrichment. |
emails | string[] | Public email addresses found during enrichment. |
phones | string[] | Public phone numbers found during enrichment. |
socialLinks | string[] | Public social profile URLs found during enrichment. |
email | string or null | First public email from emails, present when enrichment finds one. |
phone | string or null | First public phone from phones, present when enrichment finds one. |
linkedinUrl | string or null | First public LinkedIn URL found during enrichment. |
twitterUrl | string or null | First public X/Twitter URL found during enrichment. |
facebookUrl | string or null | First public Facebook URL found during enrichment. |
instagramUrl | string or null | First public Instagram URL found during enrichment. |
youtubeUrl | string or null | First public YouTube URL found during enrichment. |
leadScore | number | Simple additive score based on available lead-quality signals. |
leadScoreReasons | string[] | Machine-readable reason catalog entries that explain the score. |
Nullable field rules
Unknown scalar values are emitted as null, not empty strings. Repeated values are emitted as arrays and use an empty array when nothing was found. isNew is always a boolean, and leadScore plus enrichmentPagesVisited are always numbers.
email, phone, and social URL convenience fields are nullable mirrors of the first matching value from their array-oriented enrichment fields. They are omitted or null when includeCompanyEnrichment is disabled or no matching public value is found.
KVS OUTPUT summary
Every run writes the finalized run summary to the default Key-Value Store twice:
OUTPUT, for the Apify Console's user-facing run output;RUN-SUMMARY-{stateKey}, for state-key-specific diagnostics.
The summary object uses this schema:
| Field | Type | Description |
|---|---|---|
startedAt | string | ISO timestamp when the Actor started processing. |
finishedAt | string or null | ISO timestamp when the Actor finished processing. |
mode | string | Current run mode. V1 supports eventUrls. |
eventsProcessed | number | Number of event URLs processed by a provider extractor. |
exhibitorsFound | number | Number of normalized exhibitors extracted before incremental filtering. |
newExhibitors | number | Number of exhibitors considered new for the selected stateKey. |
recordsPushed | number | Number of records written to the Dataset. |
datasetId | string or null | Default Dataset ID when available. |
keyValueStoreId | string or null | Default Key-Value Store ID when available. |
providers | object | Count of processed events by provider: mapyourshow, a2z, and generic. |
warnings | string[] | Deduplicated run-level warnings. |
errors | string[] | Run-level errors. |
perEventDiagnostics | object[] | Per-event extraction diagnostics. |
Each perEventDiagnostics entry contains eventUrl, provider, extractorConfidence, extractionMethod, htmlBytes, cardsParsed, jsonLdObjectsFound, embeddedStateFound, profileLinksFound, pagesFetched, paginationDetected, warnings, and errors.
Pagination
maxPagesPerEvent controls bounded pagination for public event directory pages. The current V1 implementation detects same-origin next links such as rel="next", Next, Next page, >, and next-like class/title/aria-label attributes.
Pagination stops when:
- the page limit is reached;
- no same-origin next link is found;
- a page returns no exhibitors;
- a page only returns exhibitors already seen in the same event session;
- the next URL is unsafe, off-origin, or non-HTML.
Pagination is best-effort and does not execute JavaScript.
Exhibitor profile crawling
includeExhibitorProfiles=true enables bounded crawling of same-origin exhibitor profile pages discovered as exhibitorProfileUrl.
Profile crawling:
- is disabled by default;
- only follows profile URLs discovered by extractors;
- stays on the same origin as the event URL;
- rejects unsafe, private, off-origin, non-HTML, oversized, or failed profile responses;
- fills missing listing fields such as
website,description,boothNumber; - appends and dedupes
categories; - does not overwrite non-empty listing fields.
maxProfilePagesPerEvent caps profile requests per event.
Company enrichment
includeCompanyEnrichment=true enables shallow public company website enrichment. This is separate from exhibitor profile crawling.
Company enrichment can collect:
- public emails;
- public phone numbers;
- LinkedIn, X/Twitter, Facebook, Instagram, YouTube links;
- other public social links.
The enrichment crawler visits the company homepage and up to three same-origin contact-like pages such as contact, about, company, team, support, or impressum. It rejects unsafe/private/internal targets and does not log in, submit forms, or parse PDFs.
Lead score reason catalog
Lead scoring is intentionally transparent. Current reason strings use a reason:+points format so downstream users can filter or audit scores without reverse engineering the code.
| Reason | Meaning |
|---|---|
website_found:+25 | A public company website was found. |
email_found:+25 | Company enrichment found at least one public email. |
phone_found:+15 | Company enrichment found at least one public phone number. |
business_social_found:+15 | Company enrichment found at least one public social link. |
booth_number_found:+10 | A booth or stand number was found. |
categories_found:+10 | One or more exhibitor categories were found. |
Scores are capped at 100.
Incremental mode
stateKey namespaces saved fingerprints in the named persistent Key-Value Store trade-show-exhibitor-leads-scraper-fingerprint-state.
When onlyNewSinceLastRun=true, the Actor emits only exhibitors whose fingerprint has not been pushed successfully for the selected stateKey.
Fingerprints are committed after Dataset writes succeed, which avoids marking failed pushes as already processed.
Limitations
- V1 is
eventUrlsmode only. - Discovery is not included in V1.
10timesis not included in V1.- Public pages only.
- No login, CAPTCHA, private directories, paid API bypass, or access-control bypass.
- JavaScript-rendered pages may be incomplete because V1 uses
CheerioCrawler. - Pagination is best-effort and does not click JS controls.
- Company enrichment is shallow and limited to public HTML pages.
- Heuristic extractors may need selector tuning for heavily customized event directory templates.
FAQ
Is this a trade show exhibitor scraper?
Yes. It is designed as a trade show exhibitor scraper and exhibitor list scraper for public event directories.
Does it support MapYourShow?
Yes. It includes MapYourShow scraper heuristics for Map Your Show-like public pages.
Does it support A2Z?
Yes. It includes A2Z exhibitor scraper heuristics for A2Z / a2zinc-like public pages.
Does it scrape private exhibitor directories?
No. It only processes public pages. It does not log in, bypass CAPTCHA, access paid APIs, or crawl private directories.
Can it enrich contacts?
Yes, if includeCompanyEnrichment=true. It performs shallow public company website enrichment and may find public emails, phones, and social links.
Is it safe for repeated runs?
Yes. Use onlyNewSinceLastRun=true with a stable stateKey to emit only newly discovered records for that state namespace.