# European Hotel Occupancy & Tourism Statistics (Eurostat) (`open_skies_data/european-tourism-occupancy`) Actor

Returns monthly tourism statistics per European country (EU, EFTA and EU candidate countries): hotel room occupancy %, tourist nights, arrivals, average stay, foreign guest share, % change vs last year and 2019, and rank in Europe. Source: Eurostat.

- **URL**: https://apify.com/open\_skies\_data/european-tourism-occupancy.md
- **Developed by:** [Jofre Masip](https://apify.com/open_skies_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

## 🏨 European Hotel Occupancy & Tourism Statistics (Eurostat)

**How full are Europe's hotels, how many tourists are coming, where from and for how long? Get monthly hotel occupancy, tourist nights, arrivals, average length of stay and foreign guest share for every European country, in one clean table.**

Official tourism figures are scattered across separate Eurostat tables, in different units and formats. This Actor combines them into **one row per country and month**, adds the comparisons and ratios you would otherwise calculate yourself, and delivers a ready-to-use dataset in seconds: Excel, CSV, JSON, Google Sheets or API.

- 🛏️ **Hotel room and bed occupancy rates** (%)
- 🌙 **Tourist nights** in hotels, holiday rentals and campsites
- ✈️ **Foreign vs domestic guests**, with the foreign share already calculated
- 🧳 **Guest arrivals and average length of stay** (nights per guest)
- 📈 **Change vs last year and vs 2019** (pre-pandemic)
- 🏆 **Rank in Europe** by tourist nights every month
- ⏱️ **Recent data**: usually just 2–3 months behind
- ✅ **Official, verifiable source**: Eurostat, free to reuse commercially with attribution. Every row links to the original dataset

### What can you use it for?

| You are… | Use it to… |
|---|---|
| 🏨 **Hotel group or independent hotel** | Benchmark your occupancy against the national market every month |
| 🏠 **Holiday rental manager or real estate investor** | See how demand for holiday rentals compares with hotels, and where it's growing |
| 🏛️ **Tourism board or destination marketer** | Track foreign vs domestic demand and your country's rank in Europe |
| ✈️ **Airline or travel company** | Spot growing markets and seasonal peaks before planning capacity |
| 📊 **Consultant, analyst or researcher** | Build market studies with clean, comparable figures for 30+ countries |
| 📰 **Journalist** | Publish tourism trends and rankings the day the data comes out |

### How to use it

1. Click **Try for free**.
2. Choose the **countries** you want, or leave the field empty for all of Europe.
3. Tick **Latest month only** for a quick snapshot, or set a **From month** for history.
4. Press **Start** and export the results to Excel, CSV, JSON or Google Sheets.

💡 **Tip:** schedule it monthly and send the results automatically to Google Sheets, Slack or your database with Apify integrations. Your tourism dashboard updates itself.

### Input examples

**Southern Europe, last 12 months**

```json
{ "countries": ["ES", "FR", "IT", "PT", "EL"] }
```

**All of Europe, latest month only (monthly ranking)**

```json
{ "latestMonthOnly": true }
```

**Spain since January 2019 (full history for trend analysis)**

```json
{ "countries": ["ES"], "fromPeriod": "2019-01" }
```

### Output

One row per country and month, biggest tourism markets first, months in order. Example with real June 2026 figures for Spain (arrivals and average stay are illustrative):

| Country | Month | Hotel room occupancy (%) | Nights spent | Nights vs last year (%) | Foreign guests (%) | Guest arrivals | Average stay (nights) | Rank in Europe |
|---|---|---|---|---|---|---|---|---|
| Spain | 2026-06 | 74.4 | 53,584,423 | -1.4 | 63.3 | 14,000,000 | 3.83 | 1 |

Each row in JSON:

```json
{
  "country": "Spain",
  "countryCode": "ES",
  "month": "2026-06",
  "hotelRoomOccupancyPct": 74.42,
  "hotelBedOccupancyPct": 67.45,
  "nightsSpent": 53584423,
  "nightsChangeVsPreviousYearPct": -1.4,
  "nightsChangeVs2019Pct": 7.2,
  "nightsForeignGuests": 33929419,
  "nightsDomesticGuests": 19655004,
  "foreignGuestsSharePct": 63.3,
  "nightsHotels": 38615011,
  "nightsHolidayRentals": 9241580,
  "nightsCampsites": 5727832,
  "arrivals": 14000000,
  "averageStayNights": 3.83,
  "rankInEuropeByNights": 1,
  "source": "Eurostat",
  "sourceDataset": "tour_occ_nim, tour_occ_arm, tour_occ_mnor",
  "sourceUrl": "https://ec.europa.eu/eurostat/databrowser/view/tour_occ_nim/default/table",
  "eurostatLastUpdate": "2026-09-22"
}
```

| Field | Meaning |
|---|---|
| `country`, `countryCode` | Country name and Eurostat country code |
| `month` | Month, as YYYY-MM |
| `hotelRoomOccupancyPct` | Share of hotel bedrooms occupied that month (%) |
| `hotelBedOccupancyPct` | Share of hotel bed-places occupied that month (%) |
| `nightsSpent` | Nights spent by guests in hotels, holiday rentals and campsites |
| `nightsChangeVsPreviousYearPct` | Change in nights versus the same month last year (%) |
| `nightsChangeVs2019Pct` | Change in nights versus the same month in 2019 (%) |
| `nightsForeignGuests`, `nightsDomesticGuests` | Nights by guests living abroad / in the country |
| `foreignGuestsSharePct` | Share of nights spent by foreign guests (%) |
| `nightsHotels`, `nightsHolidayRentals`, `nightsCampsites` | Nights by type of accommodation |
| `arrivals` | Guests arriving at tourist accommodation |
| `averageStayNights` | Average length of stay: nights ÷ arrivals |
| `rankInEuropeByNights` | Position among European countries by nights that month (1 = most nights) |
| `source`, `sourceDataset` | Data provider and Eurostat dataset code |
| `sourceUrl` | Link to the original dataset on Eurostat, to check any figure |
| `eurostatLastUpdate` | Date Eurostat last updated the dataset |

Some fields can be empty when a country has not reported that figure yet.

### How much does it cost?

You pay **$5 per 1,000 rows**. One row is one country and one month, with all the metrics above.

| What you ask for | Rows | Cost |
|---|---|---|
| One country, last 12 months | 12 | $0.06 |
| 5 countries, last 12 months | 60 | $0.30 |
| All of Europe, latest month | ~35 | about $0.18 |
| All of Europe since 2019 | ~3,000 | about $15 |

Use **Maximum rows** to cap the cost of any run.

### 🤖 Use it with AI agents

This Actor works as a tool for AI assistants and agents (ChatGPT, Claude, Cursor and others) through the [Apify MCP server](https://docs.apify.com/integrations/mcp). Once connected, your assistant can answer questions like:

- *"What was hotel occupancy in Spain, Italy and Greece this summer?"*
- *"Which European countries have the highest share of foreign tourists?"*
- *"How has tourism in Portugal changed compared with 2019?"*

Why it works well for agents:

- ⚡ **Fast:** a typical run finishes in under 30 seconds, well within agent time limits.
- 📦 **Compact output:** clean rows with plain field names, no HTML or nested objects. Ask for only the fields you need to keep answers short.
- 🔓 **No login or API keys needed:** it reads official open data.
- 🧾 **Verifiable:** every row includes a link to the original Eurostat dataset, so the agent can cite its source.
- 💸 **Pay per row:** agents only pay for the data they actually use.

Example agent call: `{ "countries": ["ES", "IT", "EL"], "fromPeriod": "2026-06" }`

To connect it, add the Apify MCP server to your AI tool and include this Actor (`european-tourism-occupancy`) among its tools. See the [Apify MCP documentation](https://docs.apify.com/integrations/mcp) for setup.

### FAQ

**Where does the data come from?**
From Eurostat, the statistical office of the European Union: datasets `tour_occ_nim` (nights spent), `tour_occ_arm` (arrivals) and `tour_occ_mnor` (hotel occupancy rates). National statistics offices report these figures under EU Regulation 692/2011.

**How recent is it?**
Countries report at their own pace; the latest month is usually 2–3 months ago. Every run returns the most recent version published, and fields a country hasn't reported yet stay empty.

**What does "holiday rentals" include?**
Eurostat's category "holiday and other short-stay accommodation": holiday homes and apartments, youth hostels and similar, when they are registered as tourist accommodation.

**Are the ratios calculated by Eurostat?**
Occupancy rates come directly from Eurostat. The changes versus last year and 2019, the foreign guest share, the average stay and the ranking are calculated by this Actor from Eurostat's figures.

**Can I use the data commercially?**
Yes. Eurostat allows free reuse of its data, including commercially, as long as Eurostat is credited as the source and any changes are indicated (see its [reuse policy](https://ec.europa.eu/eurostat/about-us/policies/copyright)). Every row includes the source and a link to the original dataset. In line with that policy, this Actor only returns data for EU, EFTA and EU candidate countries.

**Something missing?**
Open an issue on the **Issues** tab. Feature requests are welcome.

### Data source, reliability and changes

- **Source:** Eurostat, the statistical office of the European Union. Nights spent: [`tour_occ_nim`](https://ec.europa.eu/eurostat/databrowser/view/tour_occ_nim/default/table). Arrivals: [`tour_occ_arm`](https://ec.europa.eu/eurostat/databrowser/view/tour_occ_arm/default/table). Hotel occupancy: [`tour_occ_mnor`](https://ec.europa.eu/eurostat/databrowser/view/tour_occ_mnor/default/table).
- **Who reports the figures:** national statistical offices, from surveys of tourist accommodation, under EU Regulation (EU) No 692/2011 on tourism statistics.
- **What this Actor changes:** it combines the three datasets into one row per country and month, and calculates the change versus last year and 2019, the foreign guest share, the average length of stay and the rank in Europe. Occupancy rates, nights and arrivals are passed through as Eurostat publishes them.
- **Coverage:** EU, EFTA and EU candidate countries, in line with Eurostat's reuse policy. The rank in Europe is calculated among these countries.

*Source: Eurostat. Data modified as described above; Eurostat has no responsibility for these changes. This Actor is independent and not affiliated with or endorsed by Eurostat.*

# Actor input Schema

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

Two-letter Eurostat country codes to include, e.g. ES (Spain), FR, IT, PT, DE, EL or GR (Greece). Leave empty for all countries. Default: all countries.

## `latestMonthOnly` (type: `boolean`):

If true, return only the most recent month published for each country (usually 2-3 months ago). Default: false.

## `fromPeriod` (type: `string`):

First month to return, format YYYY-MM, e.g. 2023-01. Ignored when latestMonthOnly is true. Default: 12 months ago.

## `toPeriod` (type: `string`):

Last month to return, format YYYY-MM. Default: latest month published.

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

Maximum number of rows to return. Use it to limit output size and cost. Default: no limit.

## Actor input object example

```json
{
  "countries": [
    "ES",
    "FR",
    "IT",
    "PT",
    "EL"
  ],
  "latestMonthOnly": false
}
```

# 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 = {
    "countries": [
        "ES",
        "FR",
        "IT",
        "PT",
        "EL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("open_skies_data/european-tourism-occupancy").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 = { "countries": [
        "ES",
        "FR",
        "IT",
        "PT",
        "EL",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("open_skies_data/european-tourism-occupancy").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 '{
  "countries": [
    "ES",
    "FR",
    "IT",
    "PT",
    "EL"
  ]
}' |
apify call open_skies_data/european-tourism-occupancy --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,open_skies_data/european-tourism-occupancy"
        }
    }
}
```

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/EgUCP6CgMkFxcPsfF/builds/cwCnXmTHvvFMi1HQD/openapi.json
