# Idealista Scraper API - Spain, Italy & Portugal Real Estate (`makework36/idealista-scraper`) Actor

Scrape Idealista property listings (Spain, Italy, Portugal). Get price, location, size, rooms, description, photos. HTTP only, fast, pay per result.

- **URL**: https://apify.com/makework36/idealista-scraper.md
- **Developed by:** [deusex machine](https://apify.com/makework36) (community)
- **Categories:** Real estate, Lead generation
- **Features:** Limited permissions
- **Stats:** 73 total users, 2 monthly users, 97.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 property listings

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 Real Estate Scraper

> ⭐ **Useful?** [Leave a review](https://apify.com/makework36/idealista-scraper/reviews) — takes 10 seconds and helps a lot!

Scrape property listings from Idealista.com. Works with Spanish, Italian, and Portuguese markets. Extracts prices, locations, details, and images from search result pages.

### What data does it extract?

| Field | Description |
|-------|-------------|
| title | Listing title (e.g., "Flat in calle de Alcalá") |
| price | Listed price (e.g., "€285,000") |
| details | Size, rooms, floor info (e.g., "3 bed, 2 bath, 95 m²") |
| location | Neighborhood or area |
| url | Direct link to the listing |
| image | Main listing photo URL |
| searchUrl | The search URL this listing came from |
| scrapedAt | ISO timestamp |

### 🎯 Use cases

- **Property market research** — Track asking prices across neighborhoods or cities
- **Investment analysis** — Monitor listings in target areas to spot deals
- **Price comparison** — Compare prices per square meter across different zones
- **Real estate data feeds** — Build datasets for property analytics dashboards
- **Relocation research** — Quickly gather and compare available properties in a new city

### 🚀 How to use

#### Search for apartments in Madrid

```json
{
    "searchUrls": [
        "https://www.idealista.com/en/venta-viviendas/madrid/"
    ],
    "maxListings": 50
}
```

#### Multiple searches

```json
{
    "searchUrls": [
        "https://www.idealista.com/en/venta-viviendas/barcelona/eixample/",
        "https://www.idealista.com/en/alquiler-viviendas/madrid/centro/",
        "https://www.idealista.com/en/venta-viviendas/valencia/"
    ],
    "maxListings": 100
}
```

#### Rental listings in Lisbon

```json
{
    "searchUrls": [
        "https://www.idealista.pt/arrendar-casas/lisboa/"
    ],
    "maxListings": 30
}
```

### 📥 Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| searchUrls | string\[] | — | Idealista search result page URLs (required) |
| maxListings | integer | 50 | Maximum listings to extract (1-500) |

### 📋 Output example

```json
{
    "title": "Flat in calle de Serrano, Salamanca, Madrid",
    "price": "€485,000",
    "details": "3 bed · 2 bath · 110 m² · 4th floor with lift",
    "location": "Salamanca, Madrid",
    "url": "https://www.idealista.com/inmueble/12345678/",
    "image": "https://img3.idealista.com/blur/WEB_LISTING/0/id.pro.es/12345678_xxl.jpg",
    "searchUrl": "https://www.idealista.com/en/venta-viviendas/madrid/barrio-de-salamanca/",
    "scrapedAt": "2025-03-22T18:06:12.000Z"
}
```

### ⚡ Performance

- Uses residential proxies geolocated in Spain to avoid blocks
- Handles Idealista's cookie consent popup automatically
- Falls back to JSON-LD structured data if DOM selectors fail
- Retries up to 5 times per URL with different proxy sessions

### ❓ FAQ

**How do I get the search URLs?**
Go to idealista.com (or idealista.pt / idealista.it), set your filters (location, price range, bedrooms, etc.), and copy the URL from your browser. The scraper works with whatever filters you apply on the site.

**Does it scrape individual listing detail pages?**
No — it extracts data from search result pages only. Each listing includes a direct URL you can use to visit the full detail page.

**Why does Idealista block requests?**
Idealista has aggressive anti-scraping measures. The actor uses stealth browser settings and residential proxies to work around this, but some requests may still fail. Running with a lower `maxListings` value and from Spanish IPs gives the best results.

**Does it work with Idealista Italy and Portugal?**
Yes. Use the appropriate domain: idealista.it for Italy, idealista.pt for Portugal. The scraper extracts the same fields regardless of the country.

### ❓ Extended FAQ

#### How much does it cost to scrape Idealista?

Pay-per-result on Apify (no monthly subscription). At $1.00 per 1,000 listings, scraping 100 properties costs ~$0.10. Apify Free plan includes $5 credit (~5,000 listings to start).

#### Is Idealista scraping legal in Spain?

Idealista listings are public data. Scraping for personal market research, lead generation, or analytics is generally legal under EU GDPR when the data is non-personal. Always respect Idealista's Terms of Service and don't republish copyrighted content.

#### Can I get historical Idealista price data?

The scraper returns current listings only. To track price history, schedule the scraper to run daily or weekly (Apify supports cron schedules) and store results.

#### Which Idealista markets are supported?

Idealista España (.com), Italia (.it), and Portugal (.pt) — all three countries Idealista operates in. Pass URLs from any domain.

#### Can I filter by price range, rooms, or property type?

Yes — apply the filters directly on idealista.com / .it / .pt before copying the URL. The scraper respects all filter parameters in the URL.

#### What's the difference vs other Idealista scrapers?

HTTP + light browser fallback (no full Puppeteer overhead). 5-10× cheaper compute than browser-only competitors. Built-in residential proxy + retries to handle Idealista's anti-bot measures.

### 🔗 Related actors

- [VRBO Scraper](https://apify.com/makework36/vrbo-scraper) — vacation rentals + Expedia hotels
- [Trustpilot Scraper API](https://apify.com/makework36/trustpilot-reviews-scraper) — reviews & business search
- [Fast Airbnb Price Scraper](https://apify.com/makework36/fast-airbnb-price-scraper) — Airbnb listings + prices
- [Flight Price Scraper 2026](https://apify.com/makework36/flight-price-scraper) — compare flights across 7 sources

# Actor input Schema

## `searchUrls` (type: `array`):

Idealista search result URLs

## `maxListings` (type: `integer`):

Maximum listings to scrape

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.idealista.com/en/venta-viviendas/madrid/"
  ],
  "maxListings": 50
}
```

# Actor output Schema

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

All scraped items in the default dataset (JSON).

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

Default dataset formatted as CSV for spreadsheets (Google Sheets, Excel).

# 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 = {
    "searchUrls": [
        "https://www.idealista.com/en/venta-viviendas/madrid/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("makework36/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 = { "searchUrls": ["https://www.idealista.com/en/venta-viviendas/madrid/"] }

# Run the Actor and wait for it to finish
run = client.actor("makework36/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 '{
  "searchUrls": [
    "https://www.idealista.com/en/venta-viviendas/madrid/"
  ]
}' |
apify call makework36/idealista-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,makework36/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/JU437SFfW4cYPtwEh/builds/uzCAp3YhalDkLZVUH/openapi.json
