# Trade Show Exhibitor Leads Scraper (`scraping_scrap/trade-show-exhibitor-leads-scraper`) Actor

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.

- **URL**: https://apify.com/scraping\_scrap/trade-show-exhibitor-leads-scraper.md
- **Developed by:** [Вадим Захаров](https://apify.com/scraping_scrap) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Trade Show Exhibitor Leads Scraper

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:

```json
{
  "mode": "eventUrls",
  "eventUrls": ["https://example.com/trade-show/exhibitors"]
}
````

Store V1 smoke run:

```json
{
  "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:

```json
{
  "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

```json
{
  "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 `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.

# Actor input Schema

## `mode` (type: `string`):

Use eventUrls to process supplied public event or exhibitor directory URLs.

## `eventUrls` (type: `array`):

Public event or exhibitor directory URLs to process.

## `sources` (type: `array`):

Enabled directory providers: Map Your Show, A2Z / a2zinc, and generic public exhibitor or sponsor pages.

## `includeCompanyEnrichment` (type: `boolean`):

When enabled, visits up to three public company websites pages per exhibitor to extract emails, phone numbers, and common social links.

## `onlyNewSinceLastRun` (type: `boolean`):

When enabled, emits only exhibitors whose stable fingerprints are new for the selected state key.

## `stateKey` (type: `string`):

Namespace for saved exhibitor fingerprints in the Actor's named persistent fingerprint Key-Value Store.

## `maxEvents` (type: `integer`):

Maximum event URLs to consider.

## `maxExhibitorsPerEvent` (type: `integer`):

Maximum exhibitors to process per event URL.

## `maxPagesPerEvent` (type: `integer`):

Maximum listing pages to fetch per event URL when same-origin pagination is detected.

## `includeExhibitorProfiles` (type: `boolean`):

When enabled, fetch same-origin exhibitor profile pages discovered from listing records and merge missing fields.

## `maxProfilePagesPerEvent` (type: `integer`):

Maximum same-origin exhibitor profile pages to fetch per event URL when profile crawling is enabled.

## `includeRawData` (type: `boolean`):

Include normalized event and exhibitor source payloads in each output record for debugging.

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

Optional Apify proxy configuration used by the crawler.

## Actor input object example

```json
{
  "mode": "eventUrls",
  "eventUrls": [
    "https://example.com/trade-show/exhibitors"
  ],
  "sources": [
    "mapyourshow",
    "a2z",
    "generic"
  ],
  "includeCompanyEnrichment": false,
  "onlyNewSinceLastRun": false,
  "stateKey": "default",
  "maxEvents": 10,
  "maxExhibitorsPerEvent": 500,
  "maxPagesPerEvent": 1,
  "includeExhibitorProfiles": false,
  "maxProfilePagesPerEvent": 50,
  "includeRawData": false
}
```

# 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 = {
    "eventUrls": [
        "https://example.com/trade-show/exhibitors"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraping_scrap/trade-show-exhibitor-leads-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 = { "eventUrls": ["https://example.com/trade-show/exhibitors"] }

# Run the Actor and wait for it to finish
run = client.actor("scraping_scrap/trade-show-exhibitor-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "eventUrls": [
    "https://example.com/trade-show/exhibitors"
  ]
}' |
apify call scraping_scrap/trade-show-exhibitor-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scraping_scrap/trade-show-exhibitor-leads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Trade Show Exhibitor Leads Scraper",
        "description": "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.",
        "version": "0.1",
        "x-build-id": "QicueiF8EGOoLnF22"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scraping_scrap~trade-show-exhibitor-leads-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scraping_scrap-trade-show-exhibitor-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scraping_scrap~trade-show-exhibitor-leads-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scraping_scrap-trade-show-exhibitor-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scraping_scrap~trade-show-exhibitor-leads-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scraping_scrap-trade-show-exhibitor-leads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode",
                    "eventUrls"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "eventUrls"
                        ],
                        "type": "string",
                        "description": "Use eventUrls to process supplied public event or exhibitor directory URLs.",
                        "default": "eventUrls"
                    },
                    "eventUrls": {
                        "title": "Event URLs",
                        "type": "array",
                        "description": "Public event or exhibitor directory URLs to process.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Enabled directory providers: Map Your Show, A2Z / a2zinc, and generic public exhibitor or sponsor pages.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "mapyourshow",
                                "a2z",
                                "generic"
                            ]
                        },
                        "default": [
                            "mapyourshow",
                            "a2z",
                            "generic"
                        ]
                    },
                    "includeCompanyEnrichment": {
                        "title": "Include Company Enrichment",
                        "type": "boolean",
                        "description": "When enabled, visits up to three public company websites pages per exhibitor to extract emails, phone numbers, and common social links.",
                        "default": false
                    },
                    "onlyNewSinceLastRun": {
                        "title": "Only New Since Last Run",
                        "type": "boolean",
                        "description": "When enabled, emits only exhibitors whose stable fingerprints are new for the selected state key.",
                        "default": false
                    },
                    "stateKey": {
                        "title": "State Key",
                        "type": "string",
                        "description": "Namespace for saved exhibitor fingerprints in the Actor's named persistent fingerprint Key-Value Store.",
                        "default": "default"
                    },
                    "maxEvents": {
                        "title": "Max Events",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum event URLs to consider.",
                        "default": 10
                    },
                    "maxExhibitorsPerEvent": {
                        "title": "Max Exhibitors Per Event",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum exhibitors to process per event URL.",
                        "default": 500
                    },
                    "maxPagesPerEvent": {
                        "title": "Max Pages Per Event",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum listing pages to fetch per event URL when same-origin pagination is detected.",
                        "default": 1
                    },
                    "includeExhibitorProfiles": {
                        "title": "Include Exhibitor Profiles",
                        "type": "boolean",
                        "description": "When enabled, fetch same-origin exhibitor profile pages discovered from listing records and merge missing fields.",
                        "default": false
                    },
                    "maxProfilePagesPerEvent": {
                        "title": "Max Profile Pages Per Event",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum same-origin exhibitor profile pages to fetch per event URL when profile crawling is enabled.",
                        "default": 50
                    },
                    "includeRawData": {
                        "title": "Include Raw Data",
                        "type": "boolean",
                        "description": "Include normalized event and exhibitor source payloads in each output record for debugging.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Optional Apify proxy configuration used by the crawler."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
