# Idealista Spain Scraper - 50 Rows FREE Per Run (`acumix/idealista-scraper`) Actor

Every idealista.com listing in Spain: rent and sale - homes, rooms, garages, offices, premises, land - with price, size, rooms, coordinates, seller name and phone. Includes a private-owner filter idealista itself does not offer. 50 rows free every run. Refreshed weekly.

- **URL**: https://apify.com/acumix/idealista-scraper.md
- **Developed by:** [liviu robert ciocazan](https://apify.com/acumix) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.40 / 1,000 listing rows

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

## Idealista Scraper — Spain Property Data, Rent and Sale, Private Owners with Phone Numbers

This **Idealista scraper** returns every property listing published on idealista.com in
Spain — **rent and sale**, all categories — with price, size, rooms, coordinates, seller
type and, where the seller publishes one, a **phone number**. It is a complete Spanish
property dataset you can query directly: **939,478 listings**, verified at **100.0%
coverage** against idealista's own per-category counts, refreshed **every day**.

**The first 50 rows of every run are free**, so you can see the real data before paying
for a single row. After that it is **$0.40 per 1,000 listings**.

Fields come out **exactly as idealista publishes them**. Nothing is renamed or
normalised, so a value in a row is the value the portal showed.

### What this Idealista scraper extracts

Every listing carries the fields idealista publishes on its search surface:

| Group | Fields |
|---|---|
| Identity | listing code, URL, operation (rent/sale), category, property type |
| Price | price in EUR, price per m² |
| Property | size m², rooms, bathrooms, floor, condition, features |
| Location | province, municipality, district, neighbourhood, address, **latitude/longitude** |
| Seller | seller type (private / professional), name, agency name, **phone number** |
| Media | thumbnail, photo count |

Coordinates are on essentially every row, so output drops straight onto a map or into
a geospatial join.

### Idealista private owners — a filter idealista's own API does not have

idealista does not let you filter by seller type. The parameter exists in its own app and
is **silently ignored**, and its published filter catalogue has no such field. This Actor
can do it because every ad's seller type is stored at scan time:

**222,252 private-owner listings (23.7% of the catalogue), 175,089 of them with a phone
number.**

Private share varies enormously by category, and **not** in the direction most people
assume:

| Category | Listings | Private | Private % |
|---|---|---|---|
| Rooms (`bedrooms`) | 42,932 | 28,952 | **67.4%** |
| Storage rooms | 7,939 | 4,101 | **51.7%** |
| Garages | 69,986 | 35,825 | **51.2%** |
| Land | 117,868 | 39,519 | 33.5% |
| Commercial premises | 126,329 | 25,423 | 20.1% |
| Offices | 30,251 | 5,688 | 18.8% |
| Homes | 535,321 | 81,624 | 15.2% |
| Buildings | 8,852 | 1,120 | 12.7% |

Homes are the **least** private-heavy category at 15.2%. So a homes-only search finds
about **37% of the private inventory and misses the other 63%** — if private sellers are
what you are after, search the other categories too.

By operation: **rent is 41.8% private** (91,650 of 219,228), **sale is 18.1%** (130,602
of 720,250).

### Idealista scraper input options

No code required — fill in the form:

- **What to return** — listings, or a free coverage report
- **Rent or sale** — `rent`, `sale`, or both
- **Category** — homes, rooms, premises, garages, offices, land, storage rooms, buildings
- **Seller type** — private owners only, professionals only, or all
- **Only listings with a phone number** — on/off
- **Province** — pick from all 56, spelled as idealista spells them
- **Municipality** — pick from 2,500, so you cannot mistype `Malaga` for `Málaga`
- **Min / max price** in EUR
- **How many listings** — your row cap, which is also your spend cap

Provinces and municipalities are **predefined pickers**, not free text. A typo cannot
silently return zero rows.

### Pricing — $0.40 per 1,000 rows, 50 rows free every run

| Output | Returns | Cost |
|---|---|---|
| `listings` | One row per property | **$0.40 / 1,000** — first **50 rows of every run free** |
| `coverage` | What the latest scan captured per category, against idealista's own totals | **free** |

The free allowance is **per run, not per account** — every run starts with 50 free rows,
so you can re-check the data whenever you like. You are charged per row delivered, and
`How many listings` is a hard cap, so a run cannot overspend.

### How fresh is the Idealista data?

The catalogue is **rebuilt from scratch every day**, so a typical row is a few hours old
and never more than about 24. Rows older than 14 days are never served at all.

Because the dataset is already built, **a run is a query, not a scrape**: it returns
immediately, and it is not limited by idealista's 2,500-ads-per-query paging ceiling that
caps a live scrape. The database is swapped atomically after each refresh, so you always
read a complete catalogue — never a half-built one.

Coverage is **published, not claimed**: the free `coverage` output reports what the last
scan captured per category against the portal's own totals. The most recent scan reached
**100.0% on all 15 operation × category combinations**, cross-checked against a second,
independent idealista endpoint that found **zero listings the scan had missed**.

### Known gaps, stated rather than hidden

- `furnished` is always `unknown` — idealista does not publish it on this surface.
- A phone number is present for about **79% of private sellers** (175,089 of 222,252),
  not all of them. The rest are reachable only through the portal's own messaging.
- Energy-certificate data is not on this surface and is not included.
- **Spain only.** idealista also operates in Italy, Portugal and France; those are not
  in this Actor today.

### FAQ

**How many idealista listings will I get?**
Up to 939,478 — the whole Spanish catalogue. Your `How many listings` value caps each
run, and `coverage` (free) tells you how many match your filters before you pay.

**Can I get idealista listings from private owners only, without agencies?**
Yes. Set **Seller type** to private. That returns 222,252 listings, 175,089 with a phone
number. idealista's own API cannot do this.

**Does this include phone numbers?**
Where the seller published one. 175,089 private-owner listings carry a phone number;
professional sellers additionally carry an agency name.

**Can I scrape idealista without coding?**
Yes — pick your filters in the form and run it. Output exports as CSV, Excel, JSON or XML,
or you can pull it from the API.

**How often is the data updated?**
Daily. A row is typically a few hours old; nothing older than 14 days is served.

**Does it cover Italy, Portugal or France?**
Not today — Spain only.

**What does it cost to get 10,000 listings?**
$4.00 — 10,000 rows at $0.40/1,000, minus the 50 free rows each run.

**Is the data complete, or just the first few pages?**
Complete, and the claim is checkable: the free `coverage` output reports captured-versus-
portal totals per category. The latest scan was 100.0% across all 15 combinations.

**Is scraping idealista legal?**
This returns information idealista publishes publicly. You are responsible for complying
with applicable law — including GDPR where a listing's phone number or seller name is
personal data, for which you are the data controller once you use it — and with the
portal's terms. Nothing here is legal advice.

# Actor input Schema

## `outputType` (type: `string`):

listings = one row per ad. coverage = what the latest weekly scan captured, per category, against idealista's own totals (free).

## `operation` (type: `string`):

Rental listings, sale listings, or both.

## `category` (type: `string`):

The idealista category. 'bedrooms' is room-sharing and exists for rent only.

## `ownerType` (type: `string`):

idealista itself offers NO owner filter - this works because we store every ad's seller type.

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

About 70% of private sellers publish a phone number.

## `province` (type: `array`):

Pick one or more provinces. The count beside each name is how many listings we currently hold there.

## `municipality` (type: `array`):

Optional. Narrow to specific towns or cities.

## `minPrice` (type: `integer`):

Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Leave empty for no maximum.

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

The first 50 rows of every run are free.

## Actor input object example

```json
{
  "outputType": "listings",
  "operation": "rent",
  "category": "homes",
  "ownerType": "all",
  "onlyWithPhone": false,
  "maxItems": 1000
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per idealista listing, fields exactly as the portal publishes them.

# 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("acumix/idealista-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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,acumix/idealista-scraper"
        }
    }
}
```

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/KD2FrBjHZKEgbcPv5/builds/ZbKf82c6sMu33iNYW/openapi.json
