# HELEXPO Exhibitor Companies — Cross-Show Export (`dimweaker/helexpo-exhibitor-company-export`) Actor

Export HELEXPO exhibitors to company lists with published websites, country and keyword filters, conservative cross-show deduplication, CSV downloads and source attribution. No login or proxy needed.

- **URL**: https://apify.com/dimweaker/helexpo-exhibitor-company-export.md
- **Developed by:** [Dam Dim](https://apify.com/dimweaker) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 company exporteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## HELEXPO Exhibitor Companies — Cross-Show Export

Turn HELEXPO's openly published exhibition CSVs into a source-attributed company list. Find suppliers by country or product keyword, exclude domains you already know, and group matching company observations across shows.

**Current source:** the [HELEXPO exhibitions dataset](https://catalog.growthfund.gr/en/dataset/exhibitions) on Growthfund Open Data Hub. This is not a universal trade-show scraper. No login, paid proxy, browser or LLM API is required.

### Start with three companies

```json
{
  "mode": "companies",
  "exhibitions": ["AGROTICA 2026"],
  "maxCompanies": 3
}
```

You get:

- English and original company names, source country, normalized published website and domain.
- Each exhibition occurrence, source-scoped exhibitor ID, product text, pavilion/stand and source row.
- Reported represented entities, clearly distinguished from inferred ownership.
- A spreadsheet CSV, JSON dataset, source attribution and a coverage/error report.

A website marked `source_published` was listed by the source. It has **not** been independently visited or verified.

### Find available exhibitions first

```json
{"mode": "catalog"}
```

Catalog mode lists available **Exhibitors** CSV resources; product-only **Exhibits** files are excluded. Copy a resource ID or a name fragment including its year into `exhibitions`. Ambiguous names fail with a useful message rather than silently picking a year.

Examples checked during development include AGROTICA 2026 (agricultural equipment and suppliers), BEYOND 2025 (technology), and FRESKON 2026 (fresh produce). Availability follows the publisher's catalog, not a hard-coded promise of current events.

### Input

| Field | Default | Meaning |
|---|---|---|
| `mode` | `companies` | Export companies, or use `catalog` to discover resources. |
| `exhibitions` | `["AGROTICA 2026"]` | Up to 8 unambiguous exhibition names/fragments or resource IDs. |
| `maxCompanies` | `100` | Output limit **after** filters and company grouping, 1–10,000. |
| `requireWebsite` | `false` | Only keep companies with a usable source-published website; excludes missing, invalid and social-only URLs. Does not verify the website. |
| `countries` | `[]` | Case-insensitive exact source country names. |
| `keywords` | `[]` | Match **any** term in company names, product text or represented-entity names. |
| `excludeDomains` | `[]` | Skip known company domains, e.g. `example.com`. |
| `includeRepresentedCompanies` | `true` | Include source-reported represented entities within occurrences. |

Selected CSVs are downloaded in full before the output limit is applied. The source requests a 10-second crawl delay; this is honored. A small run usually takes tens of seconds, not milliseconds.

### What grouping means

A company is grouped across resources only when its normalized **name, country and registrable website domain** agree. Different names sharing a domain remain separate and carry a review note. Rows without a usable company domain remain source-scoped. This intentionally misses some duplicates rather than claiming uncertain legal-entity matches.

Source IDs are scoped to an exhibition resource: exhibitor `001` in two different shows is not, by itself, an identity match. Original names, website strings and source references stay in `occurrences`.

No estimated revenue, inferred contact emails, personal contacts or automatic outreach is produced.

### Output and coverage

On Apify, use the default Dataset and these key-value records:

- `COMPANIES.csv` — spreadsheet export, with formula-like cell values escaped.
- `RUN_SUMMARY` — selected resources, source/matched/output counts, errors and coverage.
- `ATTRIBUTION.txt` — provider, dataset, license and transformation attribution.

Important report fields:

- `sourceReadComplete`: every selected source was read and required record identities parsed.
- `outputCapped`: more matching companies existed than `maxCompanies` allowed.
- `complete`: no source errors and no output truncation.
- `status`: `succeeded`, `partial` or `failed`.

Partial source failures preserve usable results but fail the Actor run after saving the report. Invalid websites and malformed optional nested values are explicitly marked in record warnings. An empty **filter result** is valid; an empty source CSV or a blocked/changed source page is an error. We never invent rows to make a run look successful.

`sampledAt` is when this Actor downloaded the data. Exhibition year comes from the source record. Neither means the company profile was updated on that date. The publisher's data can be historical.

### Pricing

**$3 per 1,000 exported companies**, plus **$0.00005 per run**. Pay only for companies delivered in that run and the start event; there is no subscription. The price displayed by Apify at run time is authoritative.

| Event | Price |
|---|---:|
| Company exported (`company-exported`) | **$0.003 per company — $3 per 1,000** |
| Actor start (`apify-actor-start`) | **$0.00005 per run** at the supported memory limit of 1 GB or less |

One company grouped across several exhibitions counts once within a run. New runs may deliver and charge for the same company again. JSON, CSV and source attribution have no separate event fee. There is no additional default Dataset-item fee or platform-usage surcharge.

A company with missing optional fields is still a company result. Use `requireWebsite: true` to exclude records without a usable published website **before billing**. This does not buy a verified website, contact person or guaranteed sales lead.

Catalog queries and empty results have no company fee; the startup fee still applies, including to failed runs. Companies successfully delivered before a partial source failure remain billable. The minimum selectable spending budget is $0.01; this is **not a minimum charge**. The Actor checks the remaining budget and stops delivering companies when it is exhausted.

At these prices, three companies cost $0.00905 and 100 companies cost $0.30005, including one start. Data remains available under its source license: payment is for the hosted processing service, not ownership or exclusive access to the data.

### Data license and attribution

Data source: **Growthfund_Open Data Hub, Exhibitions - Exhibitors & Exhibits, HELEXPO**. The [portal terms](https://data.growthfund.gr/en/terms-and-privacy/) permit download, reuse and redistribution and specify **CC BY 4.0 unless a dataset states otherwise**. No override was declared in the checked dataset metadata. Retain the attribution and source/license links when reusing exports. Website normalization, filtering and grouping are our transformations.

This is an independent tool, not endorsed by Growthfund or HELEXPO. Their logos are not used. The data license does not apply to this program's source code.

### Troubleshooting and support

- **No exhibition matched / ambiguous name:** run `{"mode":"catalog"}` and use the exact resource ID, or include the year in the name.
- **No companies match the filters:** remove filters or try another exhibition. This can be a successful empty result; it does not imply the source is empty.
- **Source HTTP error or changed CSV:** check `RUN_SUMMARY`. Do not assume a partial export is complete or repeatedly retry a blocked source.
- **Fewer results than expected:** check `outputCapped`, `stoppedByBudget` and per-resource counts. Exhibition snapshots may be historical or incomplete at the publisher.
- **Greek characters in Excel:** use `COMPANIES.csv`, which includes a UTF-8 BOM. Nested source evidence is preserved most fully in JSON.

When reporting a problem in the Actor's Issues tab, include the run ID, selected exhibition and error message. Do not include account tokens or personal billing information. Start a new run rather than resurrecting a terminated run; resuming a previous delivery is not supported and can duplicate records.

### Local development

Python 3.11 or newer and [uv](https://docs.astral.sh/uv/) are needed locally.

```bash
uv sync --frozen
uv run exhibitor-export --input examples/agrotica.json --output-dir outputs/agrotica
uv run exhibitor-export --input examples/catalog.json --output-dir outputs/catalog
uv run exhibitor-export --input examples/technology-and-agriculture.json --output-dir outputs/combined
uv run pytest
uv run ruff check .
```

Each local run writes `companies.json`, `companies.csv`, `summary.json`, and `ATTRIBUTION.txt`. Failed/partial runs return exit code 1 and still write their diagnostic report. Invalid input returns exit code 2.

To run the actual Apify SDK entry point locally:

```bash
cp examples/agrotica.json INPUT.json
uv run python -m exhibitor_actor
```

`INPUT.json`, local storage, outputs and credentials are ignored by Git. Do not commit credentials.

### Docker and deployment

```bash
docker build -t helexpo-exhibitor-export:local .
docker run --rm \
  -v "$PWD/examples/agrotica.json:/app/INPUT.json:ro" \
  helexpo-exhibitor-export:local
```

The `.actor` directory contains Actor metadata plus input, output and Dataset view definitions. Deploying, setting a price and publishing are separate steps requiring an Apify account. Nothing here automatically creates or publishes a cloud Actor.

# Actor input Schema

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

Catalog returns available exhibitor resources without a company-exported event fee.

## `exhibitions` (type: `array`):

Choose exact names, an unambiguous name fragment including its year, or IDs from Catalog mode. Up to 8 resources.

## `maxCompanies` (type: `integer`):

Limit after filters and grouping. Selected source CSVs are still downloaded in full; see source counts in RUN_SUMMARY.

## `requireWebsite` (type: `boolean`):

Exclude missing, invalid and social-only websites before grouping and billing. A source-published website is not independently verified or checked for availability.

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

Optional case-insensitive exact country filter, e.g. Greece. No inferred headquarters country.

## `keywords` (type: `array`):

Keep observations matching ANY keyword in names, product text or represented-entity names.

## `excludeDomains` (type: `array`):

Optional company domains to exclude, e.g. example.com. Uses registrable domains.

## `includeRepresentedCompanies` (type: `boolean`):

Preserve source Branches as reported represented entities, not as inferred owners or subsidiaries.

## Actor input object example

```json
{
  "mode": "companies",
  "exhibitions": [
    "AGROTICA 2026"
  ],
  "maxCompanies": 3,
  "requireWebsite": false,
  "countries": [],
  "keywords": [],
  "excludeDomains": [],
  "includeRepresentedCompanies": true
}
```

# Actor output Schema

## `records` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `attribution` (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 = {
    "exhibitions": [
        "AGROTICA 2026"
    ],
    "maxCompanies": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("dimweaker/helexpo-exhibitor-company-export").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 = {
    "exhibitions": ["AGROTICA 2026"],
    "maxCompanies": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("dimweaker/helexpo-exhibitor-company-export").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 '{
  "exhibitions": [
    "AGROTICA 2026"
  ],
  "maxCompanies": 3
}' |
apify call dimweaker/helexpo-exhibitor-company-export --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dimweaker/helexpo-exhibitor-company-export"
        }
    }
}
```

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/rfZswMdqCZs61Tsqb/builds/Zrm7SPreCeNXXTadZ/openapi.json
