# Spain Rural Accommodation Registry - Phone, Email, Licence (`wellbuilt_zythem/spain-rural-accommodation-registry`) Actor

17,000+ officially registered rural houses, agroturismos, rural hotels and tourist accommodations in Spain, read from the regional government registries and unified into one clean dataset with phone, email, website, GPS and registry number. Filter for the ones with no website.

- **URL**: https://apify.com/wellbuilt\_zythem/spain-rural-accommodation-registry.md
- **Developed by:** [Carlos Escanez](https://apify.com/wellbuilt_zythem) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 accomodation records

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?

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

## Spain Rural & Tourist Accommodation Registry — with phone, email and registry number

**17,000+ officially registered rural houses, agroturismos, rural hotels and tourist accommodations across Spain, in one clean dataset** — plus 72,000 Canary Islands holiday homes on request. Over 8,400 are casas rurales. Every record carries its official registry number, so you know it is a licensed business and not a dead listing.

This is not a scraper of a booking portal. It reads the **regional government registries** — the legal register every Spanish accommodation must appear in — and unifies 9 different regional files into one schema.

***

### Why this exists

Spain has no national list of rural accommodations. Each autonomous region publishes its own, in its own format, with its own column names, its own encoding, and its own idea of what a "casa rural" is called. One region calls it `Casa Rural de Alquiler`, another `Casa turismo rural`, another `TURISME D'INTERIOR`. One ships Latin-1 with semicolons, another UTF-8 with commas. One stores the province as the number `44`.

Unifying that is a day of work and a permanent maintenance job. This Actor is that work, done and maintained.

***

### What you get

| Field | Notes |
|---|---|
| `name` | Normalised out of ALL CAPS |
| `type` | One of `casa_rural`, `apartamento_rural`, `hotel_rural`, `agroturismo`, `albergue`, `camping`, `vivienda_turistica`, `hotel`, `otro` |
| `typeRaw` | The original regional wording |
| `category` | Stars, "espigas", or the regional grading |
| `registryNumber` | Official licence number |
| `address`, `postalCode`, `municipality`, `province`, `comarca`, `region` | |
| `phone` | Normalised to `+34XXXXXXXXX` |
| `phones` | Every number on record, deduplicated |
| `email` | Validated format, lowercased |
| `website` | Normalised to a full URL |
| `capacity`, `rooms` | Beds and rooms where published |
| `latitude`, `longitude` | Where published, bounds-checked |
| `hasPhone`, `hasEmail`, `hasWebsite` | Booleans, so you can filter without writing code |
| `source`, `sourceUrl`, `licence`, `scrapedAt` | Full provenance for every record |

***

### Coverage

| Code | Region | Records | Phone | Email | Website | GPS |
|---|---|---:|---:|---:|---:|---:|
| `CL` | Castilla y León | 4,145 | 99% | 84% | 56% | 62% |
| `CM` | Castilla-La Mancha | 3,139 | 95% | 92% | — | — |
| `CN` | Canarias — tourism register | 2,793 | — | — | — | 96% |
| `AR` | Aragón | 2,028 | 97% | 54% | 23% | — |
| `MC` | Región de Murcia | 1,909 | 84% | 29% | 11% | — |
| `IB-MA` | Illes Balears — Mallorca | 1,851 | — | — | — | 78% |
| `CN-H` | Canarias — hotels | 845 | — | — | — | 95% |
| `IB-ME` | Illes Balears — Menorca | 442 | 89% | — | 1% | 100% |
| | **Standard total** | **17,152** | | | | |
| `CN-VV` | Canarias — holiday homes | 71,946 | — | — | — | 99% |

Blank means the regional registry does not publish that field, not that the Actor missed it.

**Canarias holiday homes are opt-in.** That single file holds 71,946 records with no contact details. Leaving `regions` empty gives you the standard set and never that file, so a default run cannot surprise you with a sixfold bill. Name `CN-VV` when you want it.

By accommodation type across the standard set: **8,475 casas rurales**, 2,303 rural apartments, 744 rural hotels and posadas, 59 agroturismos, plus villas, campsites and hotels.

More regions are added as their open-data portals publish machine-readable registries. Galicia, Asturias, Cantabria, Extremadura, La Rioja, Navarra, Cataluña, Comunitat Valenciana, Andalucía and País Vasco are on the list. Request one and it usually lands in the next release.

***

### Who buys this

- **Property management and channel-manager software** looking for accommodations to onboard.
- **Web design and marketing agencies** — see the `onlyWithoutWebsite` filter below.
- **Insurance, laundry, smart-lock and amenity suppliers** selling into the sector.
- **Tourism researchers and public bodies** needing a normalised national picture.
- **OTAs and booking platforms** building inventory.

***

### The filter that makes this a prospecting tool

Set `onlyWithoutWebsite: true` and you get only the accommodations with **no website on record**. Combined with `onlyWithPhone` or `onlyWithEmail`, that is a contactable list of licensed businesses that still need a web presence.

In Castilla y León alone that is 1,825 accommodations. Across the standard set, over 14,000.

```json
{
  "regions": ["CL", "CM", "AR"],
  "types": ["casa_rural", "hotel_rural"],
  "onlyWithoutWebsite": true,
  "onlyWithEmail": true
}
```

***

### Example inputs

**Everything, every region**

```json
{}
```

**Rural houses in Ávila and Soria with a phone number**

```json
{
  "regions": ["CL"],
  "provinces": ["Ávila", "Soria"],
  "types": ["casa_rural"],
  "onlyWithPhone": true
}
```

Province and municipality matching ignores accents and case, so `avila` finds `Ávila`.

**Large places only, for a higher-ticket offer**

```json
{
  "types": ["hotel_rural", "agroturismo"],
  "minCapacity": 20
}
```

***

### Example output

```json
{
  "id": "cl-34/000035-los__volantes",
  "registryNumber": "34/000035",
  "name": "Los Volantes",
  "type": "casa_rural",
  "typeRaw": "Casa Rural de Alquiler",
  "category": "3 Estrellas",
  "address": "Calle Los Volantes S/N",
  "postalCode": "34477",
  "municipality": "Bárcena de Campos",
  "province": "Palencia",
  "region": "Castilla y León",
  "country": "ES",
  "phone": "+34979887050",
  "phones": ["+34979887050", "+34669311911"],
  "email": "los_volantes@hotmail.com",
  "website": "https://www.ecoturismopalencia.es",
  "capacity": 9,
  "latitude": 42.483102,
  "longitude": -4.498252,
  "hasPhone": true,
  "hasEmail": true,
  "hasWebsite": true,
  "source": "https://datosabiertos.jcyl.es",
  "licence": "JCyL open data (attribution)",
  "scrapedAt": "2026-09-10T08:00:00.000Z"
}
```

***

### Pricing

Pay per delivered record. **Filtered-out rows cost you nothing** — you are charged only for records that actually land in your dataset. The full standard set is a few dollars; a single province is cents.

Use `maxResults` to cap any run, and the filters to pay only for the records you want.

***

### Reliability

- If one regional portal is down, the run continues with the rest and reports the failure in the `RUN_SUMMARY` key-value record instead of failing the whole job.
- Records are deduplicated by region plus registry number.
- Every regional file is fetched fresh on each run, so you always get the current register.

***

### Data source and licence

All data comes from official open-data portals published by the Spanish autonomous regions, under their respective open licences (attribution, and share-alike in the case of Castilla-La Mancha). Each record carries its `source`, `sourceUrl` and `licence` so you can attribute correctly.

**What you pay for is the collection, normalisation, validation and maintenance, not the data itself.** The underlying registers are public. Assembling and keeping them usable across 6 regional formats is the product.

This Actor contains **only business data** — registered accommodation establishments and their published business contact details. It contains no personal data of private individuals.

***

### Questions or a region you need

Open an issue on the Actor page. Regional coverage requests are prioritised by demand.

# Actor input Schema

## `regions` (type: `array`):

Which regional registries to read. Leave empty for the standard set (~17,000 records). Canarias holiday homes are excluded unless you name them: that file alone adds 72,000 records with no contact details.

## `types` (type: `array`):

Filter by normalised type. Leave empty to get every type.

## `provinces` (type: `array`):

Filter by province name, accent-insensitive. Example: Ávila, Soria, Cuenca.

## `municipalities` (type: `array`):

Filter by municipality name, accent-insensitive.

## `onlyWithoutWebsite` (type: `boolean`):

The prospecting filter. Returns only places that have no website on record — the ones that still need one.

## `onlyWithEmail` (type: `boolean`):

Drop records without a usable email address.

## `onlyWithPhone` (type: `boolean`):

Drop records without a valid Spanish phone number.

## `minCapacity` (type: `integer`):

Only places with at least this many beds. Bigger places have bigger budgets.

## `maxResults` (type: `integer`):

Stop after this many records. Leave at 0 for no limit.

## Actor input object example

```json
{
  "regions": [],
  "types": [],
  "provinces": [],
  "municipalities": [],
  "onlyWithoutWebsite": false,
  "onlyWithEmail": false,
  "onlyWithPhone": false,
  "minCapacity": 0,
  "maxResults": 0
}
```

# Actor output Schema

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

Registered tourist accommodations with licence number, type, capacity, address and contact details, one item per property.

## `runSummary` (type: `string`):

What the run actually did: sources swept, records delivered, records charged for, and any failures. Read this to see what a run cost before trusting its numbers.

# 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 = {
    "provinces": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("wellbuilt_zythem/spain-rural-accommodation-registry").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 = { "provinces": [] }

# Run the Actor and wait for it to finish
run = client.actor("wellbuilt_zythem/spain-rural-accommodation-registry").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 '{
  "provinces": []
}' |
apify call wellbuilt_zythem/spain-rural-accommodation-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wellbuilt_zythem/spain-rural-accommodation-registry"
        }
    }
}
```

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/OsuLDaFnGHiMoCztd/builds/cJ2yjv1xQzquYra0Z/openapi.json
