# TradeFairDates Scraper (`normdata/tradefairdates-scraper`) Actor

Scrape TradeFairDates: 9,000+ upcoming trade fairs in 110+ countries with dates, venue, city, audience, sector, organizer with phone and address, e-mails, website, exhibitor and visitor counts, past editions. Filter by country, sector, city, dates, keywords. Monitoring.

- **URL**: https://apify.com/normdata/tradefairdates-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 2 total users, 1 monthly users, 83.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.50 / 1,000 trade fairs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🎪 TradeFairDates Scraper - Trade Fairs, Organizers & E-mails

Extract upcoming trade fairs worldwide from **TradeFairDates.com**, an exhibition calendar with **9,000+ upcoming trade shows in 110+ countries**. For each fair you get the **name, subtitle, start and end dates (or the expected month), venue, city, country, audience (trade only or public), main sector, logo and whether it was cancelled**. Turn on **fair details** to also get **the organizer with phone, fax, address and website, the fair website, full description, product groups, every sector, cycle, year founded, admission, opening hours, street address, exhibitor and visitor counts and past editions**. Turn on **e-mails** for **the fair and organizer e-mail addresses**. Filter by **country, sector, city, dates, audience and keywords**, paste links, or run it on a schedule to get **only new fairs**.

### 🎯 Who uses it?

#### 🤝 B2B sales serving exhibitors

Stand builders, booth designers, freight forwarders, hotels, printers and event staffing firms get every fair in their sector and region with the organizer's e-mail and phone, plus the exhibitor count to size each lead.

#### 📣 Marketing and event teams

Plan which shows to exhibit at or visit: compare exhibitors, visitors, cycle and past editions across countries and sectors.

#### 🏢 Exhibitors and sales teams

Find the fairs where your buyers go: trade-only shows in your industry, in the countries you sell to, in the next 12 months.

#### 📊 Market researchers and fair organizers

Track the global trade show calendar, new and cancelled fairs, competing events in the same city and the growth of each fair edition by edition.

### ✨ What it does

- **The whole calendar.** Every upcoming fair in 110+ countries, about 1,000 fairs in under 10 seconds (list fields).
- **Filters.** Countries, 400+ sectors, cities, date range, only confirmed dates, audience (trade only or public) and keywords.
- **Fair details add-on:** reads each fair page for organizer contacts, website, description, exhibitor and visitor figures and past editions.
- **E-mails add-on:** gets the fair and organizer e-mail addresses that the site shows on request.
- **Or paste links.** Country, sector, city and fair pages from tradefairdates.com. Filters are ignored with links.
- **Monitoring:** run it on a schedule with **Only new fairs**, and each run saves only the fairs you haven't received yet.

### 🏆 Why this scraper

- **The only TradeFairDates scraper on the Apify Store** (October 2026).
- **E-mails for almost every fair.** In our tests, nearly every fair had a fair and an organizer e-mail address.
- **One row per fair.** The site lists each fair once per upcoming edition; you get it once, with its next edition (or the one in your date range).
- **Clean, flat, typed data.** ISO dates, sortable expected months (2027-11), counts as numbers, cancelled as true or false. 45 fields.
- **Nothing to set up.** No proxy, no login.

### 📦 What data you get

| Field | Description |
| --- | --- |
| `logoUrl` | Fair logo. |
| `name`, `subtitle` | Fair name and subtitle. |
| `dates`, `expectedMonth` | Dates as shown, and the expected month (2027-11) when the next date is not confirmed yet. |
| `status` | *(Fair details)* Scheduled, Postponed, Cancelled... |
| `scope` | *(Fair details)* Regional, when the site marks the fair as a regional one. |
| `audience` | Who may visit (professional visitors only, general public too...). |
| `admission` | *(Fair details)* Admission note, like "Free admission". |
| `mainSector` | Main sector of the fair. |
| `productGroups` | *(Fair details)* Products and topics shown. |
| `description` | *(Fair details)* Full description of the fair. |
| `venue` | Venue (exhibition center). |
| `street`, `postalCode` | *(Fair details)* Venue street, postal code and region. |
| `city`, `region`, `country`, `countryCode` | City, region, country and 2-letter country code. |
| `email` | *(E-mails)* E-mail address of the fair and of its organizer. |
| `organizer`, `organizerEmail`, `organizerPhone`, `organizerFax`, `organizerAddress` | *(Fair details)* Organizer company with its phone, fax and address. |
| `cycle` | *(Fair details)* How often it is held (annually, every 2 years...). |
| `foundedYear` | *(Fair details)* Year of the first edition. |
| `lastExhibitors`, `lastExhibitorCountries`, `lastVisitors` | *(Fair details)* Exhibitors, exhibitor countries and visitors of the latest edition that has figures. |
| `lastFiguresYear` | *(Fair details)* Year of the edition those figures are from. |
| `parkingSpaces` | *(Fair details)* Car parking spaces at the venue. |
| `id`, `organizerId` | TradeFairDates ID of the fair and of its organizer. |
| `cancelled` | The fair was cancelled (the site strikes its dates through). |
| `url` | Fair page on TradeFairDates. |
| `website`, `organizerWebsite` | *(Fair details)* Fair website and organizer website. |
| `openingHours` | *(Fair details)* Opening hours per day. |
| `sectors` | *(Fair details)* Every sector and topic of the fair. |
| `pastEditions` | *(Fair details)* Earlier editions: dates, exhibitors, exhibitor countries, visitors, notes. |
| `startDate`, `endDate` | First and last day (empty when the date is not confirmed yet). |
| `scrapedAt` | When this row was saved. |
| `error` | Only on rows whose add-on page could not be read. |
| `error` | Only present when a row failed. The fields that loaded are still there. |

Fields marked *Fair details* or *E-mails* only appear when that add-on is on.

#### Example row (trimmed)

```json
{
  "logoUrl": "https://www.tradefairdates.com/vorschau/suedback_logo_613.png",
  "name": "südback",
  "subtitle": "Trade fair for the bakers and confectioners",
  "dates": "24. - 27. October 2026",
  "status": "Scheduled",
  "audience": "professional visitors only",
  "mainSector": "Bakery Trade Fairs",
  "productGroups": "advertising material, bakery equipment, bakery ovens, bakery products, basic materials, beverages, catering equipment, chillers, cleaning equipment, coffee, coffee machines, ...",
  "description": "südback in Stuttgart is regarded as Germany’s largest and most important trade fair for the bakery and confectionery industry, and is an essential event for the sector. Since its ...",
  "venue": "Messe Stuttgart",
  "street": "Messepiazza 1",
  "postalCode": "70629",
  "city": "Stuttgart",
  "region": "Baden-Wurttemberg",
  "country": "Germany",
  "countryCode": "DE",
  "email": "info@messe-stuttgart.de",
  "organizer": "Landesmesse Stuttgart GmbH & Co. KG",
  "organizerEmail": "info@messe-stuttgart.de",
  "organizerPhone": "+49 (0)711 185600",
  "organizerFax": "+49 (0)711 185602440",
  "organizerAddress": "Messepiazza 1, 70629 Stuttgart, Germany",
  "cycle": "biennially",
  "foundedYear": 1978,
  "lastExhibitors": 708,
  "lastVisitors": 37500,
  "lastFiguresYear": 2019,
  "parkingSpaces": 8200,
  "id": "613",
  "organizerId": "5",
  "cancelled": false,
  "url": "https://www.tradefairdates.com/s%C3%BCdback-M613/Stuttgart.html",
  "website": "http://www.messe-stuttgart.de/suedback",
  "organizerWebsite": "http://www.messe-stuttgart.de",
  "openingHours": ["Saturday, 24.10. 09:00 - 18:00 h", "Sunday, 25.10. 09:00 - 18:00 h", "Monday, 26.10. 09:00 - 18:00 h"],
  "sectors": ["Bakery", "Confectionery", "Coffee"],
  "pastEditions": [{ "dates": "26. - 29. October 2024", "startDate": "2024-10-26", "endDate": "2024-10-29", "exhibitors": null, "exhibitorCountries": null, "visitors": null, "notes": null }],
  "startDate": "2026-10-24",
  "endDate": "2026-10-27",
  "scrapedAt": "2026-10-24T14:34:29.555Z"
}
```

### 💡 Use cases

**Trade-only fairs in Germany in the next 6 months, with organizer contacts and e-mails:**

```json
{
  "countries": ["DE"],
  "dateTo": "6 months",
  "audience": "trade",
  "includeEmails": true
}
```

**Food and medical fairs in India, China and the UAE in 2027:**

```json
{
  "sectors": ["Food Trade Shows", "Medical Trade Shows"],
  "countries": ["IN", "CN", "AE"],
  "dateFrom": "2027-01-01",
  "dateTo": "2027-12-31",
  "includeDetails": true
}
```

**Every fair in Las Vegas and Dubai:**

```json
{
  "cities": ["Las Vegas", "Dubai"]
}
```

**Fairs about solar or batteries worldwide:**

```json
{
  "searchTerms": ["solar", "battery", "energy storage"]
}
```

**The whole calendar, list fields only:**

```json
{}
```

**New packaging fairs every week (schedule this run):**

```json
{
  "sectors": ["Packaging Trade Shows"],
  "onlyNew": true,
  "monitorName": "packaging-weekly"
}
```

**Links (filters are ignored):**

```json
{
  "startUrls": [
    { "url": "https://www.tradefairdates.com/Fairs-Austria-Z13-S1.html" },
    { "url": "https://www.tradefairdates.com/Enlit+Europe-M8311/Vienna.html" }
  ]
}
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum results** | Always first, caps the whole run. Empty means no limit. |
| **What to scrape** | Countries, sectors, cities, fair details (organizer, phone, exhibitors, visitors) and e-mail addresses. |
| **Filters** | Taking place from, starting until, only confirmed dates, audience and keywords. |
| **Monitoring** | Only new fairs and monitor name. |
| **Links** | Links instead of the fields above. Filters are ignored with links. |

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per fair saved to your dataset. The price depends on your Apify plan tier:

| Plan | Per fair | Per 1,000 fairs |
| --- | --- | --- |
| Free | $0.007 | $7 |
| Bronze | $0.0065 | $6.50 |
| Silver | $0.006 | $6 |
| Gold | $0.0055 | $5.50 |

**Fair details add-on:** when **Fair details** is on, each fair whose page was read adds one more charge:

| Plan | Per fair | Per 1,000 fairs |
| --- | --- | --- |
| Free | $0.014 | $14 |
| Bronze | $0.0125 | $12.50 |
| Silver | $0.011 | $11 |
| Gold | $0.0095 | $9.50 |

**E-mails add-on:** when **E-mail addresses** is on, each fair saved with at least one e-mail adds one more charge:

| Plan | Per fair | Per 1,000 fairs |
| --- | --- | --- |
| Free | $0.01 | $10 |
| Bronze | $0.009 | $9 |
| Silver | $0.008 | $8 |
| Gold | $0.007 | $7 |

Fairs whose page could not be read pay only the base price, fairs without an e-mail don't pay the e-mail add-on, and fairs left out by filters are free. New Apify accounts start with $5 in free credit. On the Free plan, a run saves up to 10 fairs.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the TradeFairDates Scraper.
3. Pick countries, sectors or cities (or leave them empty for every fair), then click **Start**.
4. Export the results as CSV, Excel, JSON or XML from the Dataset tab.

### 🤖 Use with AI agents (MCP)

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client, then ask in plain words, for example: *"List every packaging trade fair in Europe next year with the organizer's e-mail and the number of exhibitors"*. The agent runs this Actor and reads the results.

### 🔧 Troubleshooting

- **Some fairs have no start or end date.** Their next date is not confirmed yet: `expectedMonth` says when it is expected (like 2027-11). Fairs marked "Date still unknown" have neither. Turn on **Only confirmed dates** to leave them out.
- **The dates differ from the fair page.** With a date range, a fair that runs every year comes with the edition in your range, while its page (and the details) describe the next edition.
- **Exhibitor or visitor numbers are empty.** Many organizers publish no figures. The numbers are those of the latest edition that has any (`lastFiguresYear`).
- **A city was skipped.** The log says which. The city is looked up with the site's search; add its country when several cities share the name.
- **A sector was skipped.** Pick sectors from the list: the site's own sector names, like "Food Trade Shows".
- **It is slower with add-ons.** Fair details read one page per fair (about 1,000 fairs in 2 to 3 minutes), and e-mails two more small requests.

### ❓ FAQ

**How many fairs are there?** About 9,500 upcoming fairs as of October 2026, around 2,900 of them in Germany.

**Which fairs count as "public"?** Fairs open to the general public (consumer shows, and trade fairs with public days). "Trade" keeps fairs for professional visitors only.

**Can I pick several countries, sectors or cities?** Yes. A fair matches any of the values you pick in a field, and every field you fill must match.

**How do keywords match?** A fair matches when its name, subtitle or main sector has a word starting with your keyword: "solar" finds "Solar Expo" and "Solartechnik".

**Do I need a proxy?** No.

### 🛡️ Limits & responsible use

This Actor collects trade fair data that TradeFairDates publishes on its website, at a polite pace. Contact details are business contacts of fair organizers as published by the site. Use the data in line with the site's terms and data protection law (GDPR), especially for e-mail outreach.

### 📧 Contact

Questions, bugs or a field you need: norm.data.scrapers@gmail.com

### 🧪 Local development

```bash
bun install
bun scripts/gen-schemas.mjs
sh test/run.sh first '{"maxItems":10}'
```

# Actor input Schema

## `maxItems` (type: `integer`):

Stop after this many fairs in total. Leave empty for no limit. The Apify Free plan is always capped at 10.

## `countries` (type: `array`):

Fairs held in these countries. Empty = all countries.

## `sectors` (type: `array`):

Fairs listed in these sectors (a fair is usually in several). Combine with countries or cities to narrow down.

## `cities` (type: `array`):

Fairs held in these cities, like "Frankfurt", "Las Vegas" or "Dubai". Each city is looked up on TradeFairDates; add a country to tell apart cities with the same name.

## `includeDetails` (type: `boolean`):

Also open each fair page for the organizer with phone, fax, address and website, the fair website, full description, product groups, all sectors, cycle, year founded, admission, opening hours, street address, exhibitor and visitor counts and past editions. One extra page per fair, charged as an add-on only for rows saved with these details.

## `includeEmails` (type: `boolean`):

Also get the fair and organizer e-mail addresses (the site shows them on request). Turns on fair details. Charged as an add-on only for rows saved with e-mails.

## `dateFrom` (type: `string`):

Only fairs still running on or after this day. A date (2027-03-01) or a time from today ("3 months").

## `dateTo` (type: `string`):

Only fairs that start on or before this day. A date (2027-12-31) or a time from today ("1 year"). Fairs without a confirmed date count by their expected month.

## `onlyConfirmedDates` (type: `boolean`):

Leave out fairs whose next date is not confirmed yet (only an expected month is known).

## `audience` (type: `string`):

Trade visitors only, or fairs open to the general public too.

## `searchTerms` (type: `array`):

Only fairs whose name, subtitle or main sector has one of these words, like "solar", "packaging" or "medical".

## `onlyNew` (type: `boolean`):

Skip fairs saved by earlier runs with the same monitor name.

## `monitorName` (type: `string`):

Runs with the same name share their history. Use a different name for each schedule.

## `startUrls` (type: `array`):

Country pages (https://www.tradefairdates.com/Fairs-Germany-Z55-S1.html), sector pages (https://www.tradefairdates.com/3D-Printing-Fairs-Y419-S1.html), city pages, or single fair pages. Fair pages always include their details.

## Actor input object example

```json
{
  "maxItems": 10,
  "countries": [
    "DE"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "maxItems": 10,
    "countries": [
        "DE"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/tradefairdates-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 = {
    "maxItems": 10,
    "countries": ["DE"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/tradefairdates-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "countries": [
    "DE"
  ]
}' |
apify call normdata/tradefairdates-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/tradefairdates-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vdhMltK554FXlUvcb/builds/uXv2VnricrPaFqj2G/openapi.json
