# Anuga Exhibitor Directory Scraper (`automation-lab/anuga-exhibitor-directory-scraper`) Actor

Extract Anuga exhibitors, public contacts, locations, hall and stand, brands, and products for supplier research and B2B lead generation.

- **URL**: https://apify.com/automation-lab/anuga-exhibitor-directory-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Anuga Exhibitor Directory Scraper

Extract structured exhibitor, supplier, and public contact data from the official Anuga directory.

The Actor discovers exhibitor profiles, enriches every accepted result, and saves clean records ready for CSV, Excel, JSON, APIs, CRMs, or data warehouses.

It uses Anuga's public pages without requiring an Anuga login.

### What does Anuga Exhibitor Directory Scraper do?

The Actor turns Anuga's directory and company profile pages into structured data.

It can:

- crawl the official exhibitor directory;
- search by a company, brand, or product keyword;
- enrich one or more known exhibitor profile URLs;
- filter accepted companies by country;
- follow pagination automatically;
- deduplicate companies by canonical profile URL;
- extract public company and contact details;
- capture brands, products, hall, and stand;
- stop at a user-defined result limit.

The default dataset contains one record per exhibitor.

### Who is this Anuga data for?

This Actor is designed for:

- food and beverage manufacturers finding partners;
- distributors building supplier shortlists;
- procurement teams comparing event vendors;
- event sales teams preparing outreach lists;
- exhibitors researching nearby companies;
- market researchers studying event participation;
- agencies enriching food-industry prospect databases;
- analysts tracking changes between Anuga cycles.

Use only public data in ways consistent with applicable law and the source's terms.

### Why use this Actor?

Anuga profiles spread useful fields across listing cards, structured metadata, and profile sections.

The Actor combines them into one stable record.

Compared with manually copying the directory, it provides:

- repeatable exports;
- normalized fields;
- automatic detail enrichment;
- consistent filters for directory and direct-profile inputs;
- bounded concurrency and retry handling;
- partial tolerance when one profile is incomplete;
- no browser or residential proxy cost in the current version.

This Actor is intentionally focused on Anuga rather than claiming support for unrelated event platforms.

### What Anuga exhibitor data can I extract?

| Field | Description |
| --- | --- |
| `name` | Exhibitor or company name |
| `profileUrl` | Canonical official Anuga profile URL |
| `sourceUrl` | Directory page or profile URL used to produce the record |
| `address` | Structured street, postal code, locality, and country |
| `country` | Normalized country when published |
| `hall` | Anuga hall number |
| `stand` | Stand identifier |
| `website` | Public company website |
| `email` | Public email published in profile metadata |
| `phone` | Public telephone number |
| `fax` | Public fax number when present |
| `brands` | Brand names listed by the exhibitor |
| `products` | Product names shown on the profile |
| `logoUrl` | Published company logo URL |
| `sponsored` | Whether the directory card is marked sponsored |
| `event` | Anuga name, organizer, dates, and location |
| `scrapedAt` | ISO timestamp for the extraction |

Missing optional values are omitted rather than invented.

### How to scrape Anuga exhibitors

1. Open the Actor in Apify Console.
2. Leave **Anuga directory or profile URLs** empty to use the full directory.
3. Optionally enter a keyword such as `honey`.
4. Optionally enter an exact country such as `Germany`.
5. Set **Maximum exhibitors** to the number of matching records needed.
6. Click **Start**.
7. Open the Dataset tab.
8. Export the results as JSON, CSV, Excel, XML, or RSS.

For one-company enrichment, provide an official URL such as `https://www.anuga.com/exhibitor/buram/`.

### Input parameters

#### `startUrls`

Optional array of official Anuga directory or `/exhibitor/` profile URLs.

Omit this field to crawl `https://www.anuga.com/anuga-exhibitors/list-of-exhibitors/`.

Only HTTPS URLs on `anuga.com` are accepted.

#### `query`

Optional company, brand, or product keyword.

The directory uses the keyword during discovery, and the Actor applies the same filter to enriched records and explicit profile URLs.

#### `country`

Optional exact country filter, case-insensitive.

Examples include `Germany`, `Italy`, and `Türkiye`, using the spelling published by Anuga.

#### `maxItems`

Maximum matching records to save.

The default is `100`; supported values are `1` through `10000`.

The limit counts accepted dataset records, not skipped or incomplete profiles.

### Input examples

Search for honey suppliers:

```json
{
  "query": "honey",
  "maxItems": 25
}
```

Enrich one company:

```json
{
  "startUrls": [
    { "url": "https://www.anuga.com/exhibitor/buram/" }
  ],
  "maxItems": 1
}
```

Build a German exhibitor list:

```json
{
  "country": "Germany",
  "maxItems": 100
}
```

### Output example

This abbreviated record comes from the current Buram profile:

```json
{
  "name": "Buram GmbH",
  "profileUrl": "https://www.anuga.com/exhibitor/buram/",
  "address": {
    "street": "Fabrikstr. 9a",
    "postalCode": "16761",
    "locality": "Hennigsdorf , Germany",
    "country": "Germany"
  },
  "country": "Germany",
  "hall": "03.2",
  "stand": "A030",
  "website": "https://www.buram.de",
  "email": "mustafa.sen@buram.de",
  "phone": "+49 (33) 22033819",
  "brands": ["Balim Honey", "bee garden", "BIQ Honey", "Buram Honey"],
  "products": ["Buram Black Forest Honey"],
  "sponsored": false,
  "event": {
    "name": "Anuga",
    "organizer": "Koelnmesse GmbH",
    "startDate": "2027-10-09",
    "endDate": "2027-10-13",
    "location": "Cologne, Germany"
  }
}
```

The complete record also includes source, logo, optional fax, and extraction timestamp fields.

### How much does it cost to extract Anuga exhibitors?

The Actor uses pay-per-event pricing.

There is a **$0.005 start fee** per run and a charge for each saved exhibitor.

On the FREE tier, each saved exhibitor costs **$0.000041071**.

Approximate FREE-tier totals are:

| Saved exhibitors | Approximate total |
| ---: | ---: |
| 1 | $0.00504 |
| 25 | $0.00603 |
| 100 | $0.00911 |
| 1,000 | $0.04607 |

Higher Apify pricing tiers receive lower per-item prices.

Failed, duplicate, filtered-out, and incomplete profiles are not charged as items.

Compute usage is included in the pay-per-event model; actual platform billing follows the active price shown before a run starts.

### Pagination, limits, and performance

The Actor requests directory pages in 20-record offsets.

It enriches profiles in conservative batches of five.

It stops scheduling accepted output when `maxItems` is reached.

Keyword discovery can reduce unnecessary profile requests.

Country filtering requires profile enrichment because country is normalized from the published profile data.

Large country-filtered exports may therefore inspect more profiles than the final item count.

### Reliability and failure behavior

Transient network errors, HTTP 429 responses, and temporary server errors are retried up to three times with backoff.

Stable malformed inputs and unsupported domains fail immediately.

When a discovered profile cannot be enriched, the Actor saves the useful name, country, hall, stand, logo, and sponsored fields already present on its directory card. An unavailable explicit profile with no discovery card is logged and skipped.

If no attempted profile can be parsed, the run fails instead of silently returning a misleading empty success.

A valid keyword or country with no current matches returns an empty dataset successfully.

### Data quality and limitations

The Actor extracts what Anuga currently publishes.

Keep these limitations in mind:

- not every exhibitor publishes every contact field;
- emails and phone numbers may be company-level rather than person-level;
- product and brand coverage differs by company;
- event dates reflect the structured metadata available at run time;
- sponsored status describes the listing card observed during discovery;
- explicit profile URLs do not carry listing-card sponsored context;
- a profile can be unavailable from a particular network region even when directory discovery still works; use a precise `query` with the directory URL as the fallback;
- the directory's HTML structure can change;
- this Actor does not bypass login-only or private information.

Validate high-stakes outreach and procurement decisions against the source profile.

### Export and integration workflows

Common workflows include:

1. Export country-specific companies to CSV for territory planning.
2. Send new suppliers to Google Sheets through Make or Zapier.
3. Load structured records into HubSpot, Salesforce, or another CRM.
4. Compare datasets from two runs to identify exhibitor changes.
5. Join websites and brands with an internal supplier master database.
6. Feed product names into classification or market-mapping pipelines.
7. Schedule a refresh before an Anuga event cycle.

Use `profileUrl` as the durable source reference for deduplication.

### Run from the Apify API with cURL

Replace `YOUR_APIFY_TOKEN` with your token:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~anuga-exhibitor-directory-scraper/runs?token=YOUR_APIFY_TOKEN&waitForFinish=300" \
  -H "Content-Type: application/json" \
  -d '{"query":"honey","maxItems":25}'
```

Retrieve dataset items using the `defaultDatasetId` returned by the run.

Do not commit tokens to source control.

### Run from JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/anuga-exhibitor-directory-scraper').call({
  country: 'Germany',
  maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run from Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/anuga-exhibitor-directory-scraper').call(
    run_input={'query': 'honey', 'maxItems': 25}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with Apify MCP

Add this Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/anuga-exhibitor-directory-scraper"
```

#### Claude Desktop setup

Add the following remote MCP server configuration in Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/anuga-exhibitor-directory-scraper"
    }
  }
}
```

#### Cursor setup

Add the same `apify` remote server URL in **Cursor Settings → MCP**, then enable the server for your workspace.

#### VS Code setup

Add the same `apify` remote server URL to your VS Code MCP configuration and start the server from the MCP panel.

Example prompts:

- "Find 25 Anuga exhibitors matching honey and summarize their brands."
- "Extract the Buram Anuga profile and format its public contacts for my CRM."
- "Build a German Anuga exhibitor supplier table with hall and stand columns."

### Responsible use and legality

This Actor accesses publicly available Anuga pages.

You are responsible for your use of the output.

Before collecting or contacting companies:

- review applicable laws and contractual requirements;
- respect the source website and reasonable request volumes;
- collect only fields needed for a legitimate purpose;
- follow GDPR, ePrivacy, anti-spam, and marketing rules where applicable;
- provide required notices and opt-out mechanisms;
- secure exported contact data;
- delete data when it is no longer needed.

The Actor is not legal advice and does not grant rights to reuse trademarks, logos, or personal data.

### Troubleshooting

#### Why did the run return fewer items than `maxItems`?

The source may have fewer matches, some profiles may be incomplete, or your keyword and country filters may exclude discovered companies.

Review the run log for skipped profiles and try a broader filter.

#### Why did an explicit profile return zero records?

When `query` or `country` is supplied, it is applied to direct profile URLs too.

Remove the filter or use the spelling published on the profile.

#### Why did my input fail immediately?

Only official HTTPS Anuga directory and `/exhibitor/` URLs are supported.

Use the full URL copied from `www.anuga.com`.

#### Why is a contact field missing?

Anuga does not publish identical fields for every exhibitor.

The Actor omits absent values rather than guessing.

### FAQ

#### Does this Actor need an Anuga account?

No. The current version extracts only anonymously accessible public data.

#### Does it use a browser or residential proxy?

No. It uses direct HTTP requests to the public server-rendered pages.

#### Can it scrape every Koelnmesse event?

No. This Actor is specifically designed and documented for Anuga.

#### Can I provide multiple profile URLs?

Yes. Add multiple official `/exhibitor/` URLs to `startUrls`; the Actor deduplicates them.

#### Can I schedule recurring exports?

Yes. Use Apify schedules and compare datasets by `profileUrl` in your downstream workflow.

#### Are filtered-out records charged?

No item event is charged for duplicate, filtered-out, incomplete, or failed records.

### Related automation-lab Actors

For multi-event supplier and lead research, combine this Actor with:

- [Messe Berlin Exhibitor List Scraper](https://apify.com/automation-lab/messe-berlin-exhibitor-list-scraper)
- [Messe Frankfurt Exhibitor List Scraper](https://apify.com/automation-lab/messe-frankfurt-exhibitor-list-scraper)
- [Messe Munich Exhibitor Scraper](https://apify.com/automation-lab/messe-munich-exhibitor-scraper)
- [Deutsche Messe Exhibitor List Scraper](https://apify.com/automation-lab/deutsche-messe-exhibitor-list-scraper)
- [Nürnberg Messe Exhibitor List Scraper](https://apify.com/automation-lab/nuernberg-messe-exhibitor-list-scraper)

Each Actor has its own source-specific input and output contract.

### Support

If Anuga changes its public pages or a supported profile fails, open an issue from the Actor page.

Include the run URL, redacted input, expected result, and one affected public profile URL.

Do not include Apify tokens or private customer data.

# Actor input Schema

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

Optional official Anuga exhibitor directory or individual /exhibitor/ profile URLs. Omit to crawl the full directory.

## `query` (type: `string`):

Optional company, brand, or product keyword. Applied consistently to directory and profile URL inputs.

## `country` (type: `string`):

Optional exact country filter, for example Germany or Italy.

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

Maximum number of matching enriched exhibitor records to save.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.anuga.com/anuga-exhibitors/list-of-exhibitors/"
    }
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the default dataset table containing enriched exhibitor contacts, locations, brands, products, and source links.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.anuga.com/anuga-exhibitors/list-of-exhibitors/"
        }
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/anuga-exhibitor-directory-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 = {
    "startUrls": [{ "url": "https://www.anuga.com/anuga-exhibitors/list-of-exhibitors/" }],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/anuga-exhibitor-directory-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 '{
  "startUrls": [
    {
      "url": "https://www.anuga.com/anuga-exhibitors/list-of-exhibitors/"
    }
  ],
  "maxItems": 10
}' |
apify call automation-lab/anuga-exhibitor-directory-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/mAAdolVN6FvtH6Re9/builds/wiGaW277hIkPcQIaZ/openapi.json
