# Europe Events & Group-Accommodation Demand Scraper (`belcaidsaad/europe-events-demand`) Actor

European group-accommodation demand in one feed: TED procurement notices (precision) + conferenceindex listings (volume), de-templated and deduped. Per row: source, title, city, country, category, room-block fit 1-5, urgency, routing thesis. For hotel sales and MICE connectors.

- **URL**: https://apify.com/belcaidsaad/europe-events-demand.md
- **Developed by:** [Saad Belcaid](https://apify.com/belcaidsaad) (community)
- **Categories:** Lead generation, News, Travel
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 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

## Europe Events → Hotel Demand

> **Built specifically for Youssef** — to find group-accommodation demand across Europe without living inside Sales Navigator.

**Built by [Saad Belcaid](https://www.skool.com/@saadbelcaid).**

---

### What it does (in one breath)

It finds events happening across Europe that need hotel rooms — conferences, congresses, trade shows — plus public bodies that are literally out shopping for hotels and event space right now. One clean list. That's it.

You point it at Europe. It hands you back a list of "here's who needs rooms, where, and when." You take that to hotels.

---

### Why you'd want it

A hotel's Director of Sales cares about one thing: **who's bringing a room block to my city, and when.**

This hands you exactly that. So instead of cold-pitching hotels, you show up with: *"There's a 3-day congress landing in your city in October — here's the demand."* That gets a meeting every time.

---

### What you get

A spreadsheet. One row per event or opportunity. Each row tells you:

- **What** — the event or the thing being bought ("International Cardiology Congress")
- **Where** — city + country
- **When** — the date
- **How hot** — a 1–5 score for how much hotel demand it means
- **Why it matters** — a one-line pitch you can paste straight into an email
- **Link** — straight to the source

That's the whole thing. No setup, no API key.

---

### Two places it looks

1. **Public tenders (TED)** — when a government, university, or public body officially shops for hotel rooms or event space. Rare, but pure gold — they've literally raised their hand.
2. **Event listings** — the thousands of upcoming conferences and congresses across Europe. This is the volume.

Both end up in the same list.

---

### How much you get

Run it across Europe and you get **~6,800 clean opportunities** right now — and that's dialed *down* for quality. Turn the dial up and it climbs into the tens of thousands. More than enough to work every day.

You can narrow it:
- **Just a few countries?** List them.
- **Only the hottest?** Crank the minimum score.
- **Only the next few months?** Set a horizon.

---

### How to run it

1. Open it on Apify, hit **Start**. (Defaults are already set for clean, live, all-of-Europe.)
2. Wait a couple minutes.
3. Download the spreadsheet — or feed the dataset straight into Connector OS Station to match it against hotels.

Want it on autopilot? Set an Apify **Schedule** (e.g. every Monday morning) and a fresh list lands in your inbox each week.

---

### The honest part

A chunk of the volume is academic conferences — they're real and they *do* book hotel rooms, but they're less premium than big branded trade shows. If you want only the best, flip it to **TED-only** or raise the minimum score. Volume vs. quality — your call, one setting.

---

### Settings (only if you want to tinker)

| Setting | What it does | Default |
|---|---|---|
| `countries` | Limit to certain countries (e.g. `DEU`, `FRA`) | all Europe |
| `minRoomBlockScore` | Hide weak signals (1–5) | 3 |
| `sources` | `TED` only, events only, or both | both |
| `maxPagesPerCountry` | More pages = more events | 5 |
| `monthsAhead` | Only events within N months | off |
| `publishedAfterDays` | TED: only recent tenders | 180 |

Everything else has a sensible default. You can ignore all of it and just hit Start.

---

*Free, public data: TED (EU public procurement) + conferenceindex.org (public conference directory). No API key, no proxy.*

# Actor input Schema

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

Which sources to pull. TED = procurement notices (precision). conferenceindex = upcoming events (volume).
## `countries` (type: `array`):

Restrict by ISO3 (DEU, FRA, ESP, ITA, GBR, NLD, BEL, PRT, AUT, CHE, IRL, POL, SWE, NOR, DNK, FIN, GRC, CZE, HUN, ROU, HRV, BGR, SVK, SVN, LTU, LVA, EST, LUX). Empty = all Europe.
## `minRoomBlockScore` (type: `integer`):

Drop signals below this room-block fit (1-5). 3 strips procurement noise + low-fit events.
## `minUrgency` (type: `integer`):

Drop signals below this urgency (1-5).
## `maxResults` (type: `integer`):

Cap on signals returned (after sorting hottest-first).
## `dropTemplatedMinCities` (type: `integer`):

Drop conferenceindex auto-generated academic titles that recur across this many cities. 0 = keep all. 5 is a good default.
## `publishedAfterDays` (type: `integer`):

TED only. Drop notices older than this (server-side). TED 'ACTIVE' keeps old framework notices, so set ~180 for live demand. 0 = keep all.
## `cpvCodes` (type: `array`):

TED CPV codes to query (hotel / congress / event / seminar services).
## `scope` (type: `string`):

TED notice scope.
## `tedPageSize` (type: `integer`):

Procurement notices fetched per TED API request. Higher = fewer requests.
## `tedMaxPages` (type: `integer`):

Cap on TED pagination. More pages = more procurement notices.
## `maxPagesPerCountry` (type: `integer`):

More pages = more events per country.
## `monthsAhead` (type: `integer`):

Keep only events within this many months. 0 = no horizon cap.
## `upcomingOnly` (type: `boolean`):

Drop events whose date is already in the past.
## `politeDelayMs` (type: `integer`):

Throttle between requests. Raise if sources rate-limit (locally use 300-500; on Apify with proxy lower is fine).

## Actor input object example

```json
{
  "sources": [
    "TED",
    "conferenceindex"
  ],
  "countries": [],
  "minRoomBlockScore": 3,
  "minUrgency": 1,
  "maxResults": 20000,
  "dropTemplatedMinCities": 5,
  "publishedAfterDays": 180,
  "cpvCodes": [
    "55120000",
    "55110000",
    "55100000",
    "55270000",
    "98341000",
    "79950000",
    "79952000",
    "79952100",
    "79951000"
  ],
  "scope": "ACTIVE",
  "tedPageSize": 100,
  "tedMaxPages": 40,
  "maxPagesPerCountry": 5,
  "monthsAhead": 0,
  "upcomingOnly": true,
  "politeDelayMs": 300
}
````

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("belcaidsaad/europe-events-demand").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("belcaidsaad/europe-events-demand").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 '{}' |
apify call belcaidsaad/europe-events-demand --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=belcaidsaad/europe-events-demand",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Europe Events & Group-Accommodation Demand Scraper",
        "description": "European group-accommodation demand in one feed: TED procurement notices (precision) + conferenceindex listings (volume), de-templated and deduped. Per row: source, title, city, country, category, room-block fit 1-5, urgency, routing thesis. For hotel sales and MICE connectors.",
        "version": "2.0",
        "x-build-id": "xHk8coriGNcjB1PgQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/belcaidsaad~europe-events-demand/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-belcaidsaad-europe-events-demand",
                "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/belcaidsaad~europe-events-demand/runs": {
            "post": {
                "operationId": "runs-sync-belcaidsaad-europe-events-demand",
                "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/belcaidsaad~europe-events-demand/run-sync": {
            "post": {
                "operationId": "run-sync-belcaidsaad-europe-events-demand",
                "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",
                "properties": {
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Which sources to pull. TED = procurement notices (precision). conferenceindex = upcoming events (volume).",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "TED",
                            "conferenceindex"
                        ]
                    },
                    "countries": {
                        "title": "Countries (ISO3)",
                        "type": "array",
                        "description": "Restrict by ISO3 (DEU, FRA, ESP, ITA, GBR, NLD, BEL, PRT, AUT, CHE, IRL, POL, SWE, NOR, DNK, FIN, GRC, CZE, HUN, ROU, HRV, BGR, SVK, SVN, LTU, LVA, EST, LUX). Empty = all Europe.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "minRoomBlockScore": {
                        "title": "Minimum Room-Block Score",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Drop signals below this room-block fit (1-5). 3 strips procurement noise + low-fit events.",
                        "default": 3
                    },
                    "minUrgency": {
                        "title": "Minimum Urgency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Drop signals below this urgency (1-5).",
                        "default": 1
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Cap on signals returned (after sorting hottest-first).",
                        "default": 20000
                    },
                    "dropTemplatedMinCities": {
                        "title": "Drop Templated (min cities)",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Drop conferenceindex auto-generated academic titles that recur across this many cities. 0 = keep all. 5 is a good default.",
                        "default": 5
                    },
                    "publishedAfterDays": {
                        "title": "TED: Published Within (days)",
                        "minimum": 0,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "TED only. Drop notices older than this (server-side). TED 'ACTIVE' keeps old framework notices, so set ~180 for live demand. 0 = keep all.",
                        "default": 180
                    },
                    "cpvCodes": {
                        "title": "TED: CPV Codes",
                        "type": "array",
                        "description": "TED CPV codes to query (hotel / congress / event / seminar services).",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "55120000",
                            "55110000",
                            "55100000",
                            "55270000",
                            "98341000",
                            "79950000",
                            "79952000",
                            "79952100",
                            "79951000"
                        ]
                    },
                    "scope": {
                        "title": "TED: Scope",
                        "enum": [
                            "ACTIVE",
                            "LATEST",
                            "ALL"
                        ],
                        "type": "string",
                        "description": "TED notice scope.",
                        "default": "ACTIVE"
                    },
                    "tedPageSize": {
                        "title": "TED: Page Size",
                        "minimum": 1,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Procurement notices fetched per TED API request. Higher = fewer requests.",
                        "default": 100
                    },
                    "tedMaxPages": {
                        "title": "TED: Max Pages",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Cap on TED pagination. More pages = more procurement notices.",
                        "default": 40
                    },
                    "maxPagesPerCountry": {
                        "title": "conferenceindex: Max Pages per Country",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "More pages = more events per country.",
                        "default": 5
                    },
                    "monthsAhead": {
                        "title": "conferenceindex: Months Ahead",
                        "minimum": 0,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Keep only events within this many months. 0 = no horizon cap.",
                        "default": 0
                    },
                    "upcomingOnly": {
                        "title": "conferenceindex: Upcoming Only",
                        "type": "boolean",
                        "description": "Drop events whose date is already in the past.",
                        "default": true
                    },
                    "politeDelayMs": {
                        "title": "Polite Delay Between Requests (ms)",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Throttle between requests. Raise if sources rate-limit (locally use 300-500; on Apify with proxy lower is fine).",
                        "default": 300
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
