Trade Show Exhibitor Leads Scraper avatar

Trade Show Exhibitor Leads Scraper

Pricing

Pay per usage

Go to Apify Store
Trade Show Exhibitor Leads Scraper

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 Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

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:

  • eventName
  • eventUrl
  • eventStartDate
  • eventEndDate
  • eventLocation
  • eventCountry
  • provider
  • sourceUrl
  • exhibitorName
  • boothNumber
  • exhibitorProfileUrl
  • website
  • description
  • categories
  • fingerprint
  • isNew
  • scrapedAt
  • enrichmentStatus
  • enrichmentPagesVisited
  • emails
  • phones
  • socialLinks
  • leadScore
  • leadScoreReasons

Conditional enrichment fields:

  • email
  • phone
  • linkedinUrl
  • twitterUrl
  • facebookUrl
  • instagramUrl
  • youtubeUrl

Debug field:

  • rawData, only when includeRawData=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

FieldTypeDescription
eventNamestringEvent name from page metadata, page text, or URL fallback.
eventUrlstringInput event directory URL associated with the record.
eventStartDatestring or nullISO-like event start date when detected.
eventEndDatestring or nullISO-like event end date when detected.
eventLocationstring or nullEvent city, venue, region, or other detected location text.
eventCountrystring or nullEvent country when detected or inferred.
providerstringExtractor path used for the record: mapyourshow, a2z, or generic.
sourceUrlstringPage URL where the exhibitor record was found or normalized from.
exhibitorNamestringCompany or organization name.
boothNumberstring or nullBooth, stand, table, or exhibit number when present.
exhibitorProfileUrlstring or nullPublic exhibitor profile URL when found.
websitestring or nullPublic company website URL when found.
descriptionstring or nullShort public exhibitor description when found.
categoriesstring[]Public categories, product groups, or tags.
fingerprintstringStable hash built from event URL, event name, exhibitor name, and booth number.
isNewbooleanWhether this fingerprint was new for the selected stateKey when emitted.
scrapedAtstringISO timestamp for when the record was produced.
enrichmentStatusstringnot_requested, success, no_website, no_contacts_found, or failed.
enrichmentPagesVisitednumberNumber of public company website pages visited for enrichment.
emailsstring[]Public email addresses found during enrichment.
phonesstring[]Public phone numbers found during enrichment.
socialLinksstring[]Public social profile URLs found during enrichment.
emailstring or nullFirst public email from emails, present when enrichment finds one.
phonestring or nullFirst public phone from phones, present when enrichment finds one.
linkedinUrlstring or nullFirst public LinkedIn URL found during enrichment.
twitterUrlstring or nullFirst public X/Twitter URL found during enrichment.
facebookUrlstring or nullFirst public Facebook URL found during enrichment.
instagramUrlstring or nullFirst public Instagram URL found during enrichment.
youtubeUrlstring or nullFirst public YouTube URL found during enrichment.
leadScorenumberSimple additive score based on available lead-quality signals.
leadScoreReasonsstring[]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:

FieldTypeDescription
startedAtstringISO timestamp when the Actor started processing.
finishedAtstring or nullISO timestamp when the Actor finished processing.
modestringCurrent run mode. V1 supports eventUrls.
eventsProcessednumberNumber of event URLs processed by a provider extractor.
exhibitorsFoundnumberNumber of normalized exhibitors extracted before incremental filtering.
newExhibitorsnumberNumber of exhibitors considered new for the selected stateKey.
recordsPushednumberNumber of records written to the Dataset.
datasetIdstring or nullDefault Dataset ID when available.
keyValueStoreIdstring or nullDefault Key-Value Store ID when available.
providersobjectCount of processed events by provider: mapyourshow, a2z, and generic.
warningsstring[]Deduplicated run-level warnings.
errorsstring[]Run-level errors.
perEventDiagnosticsobject[]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.

ReasonMeaning
website_found:+25A public company website was found.
email_found:+25Company enrichment found at least one public email.
phone_found:+15Company enrichment found at least one public phone number.
business_social_found:+15Company enrichment found at least one public social link.
booth_number_found:+10A booth or stand number was found.
categories_found:+10One 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 eventUrls mode only.
  • Discovery is not included in V1.
  • 10times is 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.