# Idealista Scraper (`automly/idealista-scraper`) Actor

Scrape Idealista listings in Spain, Italy and Portugal: homes, rooms, offices, shops, garages and land for sale or rent by place, filters or any Idealista link, with price, photos, map location, features, agency, full details and view counts.

- **URL**: https://apify.com/automly/idealista-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.45 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What is Idealista Scraper?

**Idealista Scraper** lets you **scrape property listings from Idealista** in **Spain (idealista.com), Italy (idealista.it) and Portugal (idealista.pt)**: homes, rooms, offices, shops, garages, storage rooms, land, buildings, new developments and holiday lets, for sale or for rent. Get the price and price cuts, size, bedrooms and bathrooms, floor, lift and parking, full address and map coordinates, description, every photo, the agency, the publication date, and on request the full listing page and how many people viewed and saved each listing. Search by city, district or neighbourhood with Idealista's own filters, or paste any Idealista link, click **Start**, and download the listings as Excel, CSV or JSON.

- ⚡ **Fast:** about 8,400 listings from one search in under 3 minutes, or 300 listings with full details and statistics in under a minute (our tests)
- 🔎 **Whole searches:** big searches come back whole, far past the 2,500 results the site shows for one search
- 🌍 **Three countries in one tool:** Spain, Italy and Portugal, every property type
- 🔓 **No login:** no Idealista account needed
- 🛡️ **No personal contact data:** phone numbers, private sellers' names and email addresses are never collected

### What can Idealista Scraper do?

- **Scrape Idealista search results** for any place: `Madrid`, `Chamberí, Madrid`, `Barcelona`, `Málaga`, `Lisboa`, `Porto`, `Roma`, `Milano`
- **Homes for sale or for rent**, plus rooms, offices, shops and premises, business transfers, garages, storage rooms, land, buildings, new developments and holiday lets
- **Filter** by price, size, bedrooms, bathrooms, condition, floor, publication date and must-haves like lift, terrace, parking, pool, garden or air conditioning
- **Sort** by newest, price, price per m², size, last update or biggest price drop
- **Paste Idealista links**: search pages with any filters you set on the site, map areas you drew, several areas at once, an agency's page, or single listings
- **Full listing details** on request: every photo, complete description with translations, energy certificate, community fees, construction details and last update time
- **Listing statistics** on request: views, emails, shares and favourites of each listing
- **Monitor new listings** daily with **Published within: Last day** and a schedule
- Export to Excel, CSV, JSON, HTML or XML, or send the data to Google Sheets, Make, Zapier and more

### What data can you extract from Idealista?

| | | |
|---|---|---|
| 🏷️ Title and listing link | 💶 Price, price per m² and price cuts | 📐 Size, bedrooms, bathrooms |
| 🏢 Floor, lift, exterior, parking | 🏊 Pool, terrace, garden, air conditioning | 🛠️ Condition and property subtype |
| 📍 Address, neighbourhood, district, city, province | 🗺️ Latitude and longitude | 📝 Full description |
| 📸 Photos with the room each shows, videos, 3D tours | 📅 Publication date | 🏪 Agency name, logo and Idealista page |
| ⚡ Energy certificate (with details) | 💰 Community fees (with details) | 👀 Views, emails, favourites (with statistics) |

### How to scrape Idealista

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **Idealista Scraper**.
3. Enter places, one per line, or paste Idealista links.
4. Pick the country, buy or rent, the property type and any filters, and set how many listings you want per search.
5. Click **Start**, then download the listings as Excel, CSV, JSON or HTML.

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

You pay per listing saved. A listing with full details or statistics costs a little more than a listing from the search alone. The **Pricing** tab shows the exact price per 1,000 listings on your Apify plan, with lower prices on paid plans.

Every Apify account gets **$5 of free usage each month**, which is plenty to try the scraper on real searches. **Max listings per search** keeps the cost of a run under control, and you can also set a maximum cost per run.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Locations** | Places to search, like `Madrid`, `Chamberí, Madrid` or `Lisboa`, one per line. An Idealista location ID like `0-EU-ES-28-07-001-079` works too |
| **Idealista links** | Search pages, drawn map areas, multi-area searches, agency pages (`/pro/<name>/`) and single listings (`/inmueble/<id>/`, `/immobile/<id>/`, `/imovel/<id>/`) |
| **Country** | Spain, Italy or Portugal, for place names (links name their own country) |
| **Buy or rent** | For sale or for rent |
| **Property type** | Homes, rooms, new developments, offices, shops, business transfers, garages, storage rooms, land, buildings or holiday lets |
| **Max listings per search** | How many listings to save for each place or link (default 100). Set 0 for every listing |
| **Sort by** | Relevance (default), newest, oldest, price, price per m², size, recently updated or biggest price drop |
| **Min / Max price (€)** | Price range in euros (per month for rentals) |
| **Min / Max size (m²)** | Size range in square metres |
| **Bedrooms / Bathrooms** | Studio, 1, 2, 3, 4 or more bedrooms; 1, 2, 3 or more bathrooms |
| **Published within** | Last day, week or month |
| **Condition / Floor** | New build, good condition or needs renovation; top, middle or ground floor |
| **Must have** | Lift, parking, terrace, balcony, garden, pool, air conditioning, exterior, storage room, fitted wardrobes, sea views, luxury, accessible, floor plan, virtual tour, bank-owned |
| **Full listing details** | Adds the whole listing page under `_details` |
| **Listing statistics** | Adds views, emails, shares and favourites under `_stats` |
| **Language** | English (default), Spanish, Catalan, Italian, Portuguese, French or German texts |
| **Proxy configuration** | Leave the default |

Flats for sale in Chamberí (Madrid), 2 or 3 bedrooms, up to 600,000 euros, with a lift:

```json
{
  "locations": ["Chamberí, Madrid"],
  "operation": "sale",
  "propertyType": "homes",
  "maxPrice": 600000,
  "bedrooms": ["2", "3"],
  "features": ["elevator"],
  "maxItems": 200
}
```

Every rental in Lisbon with full details and statistics:

```json
{
  "country": "pt",
  "locations": ["Lisboa"],
  "operation": "rent",
  "maxItems": 0,
  "includeDetails": true,
  "includeStats": true
}
```

A search page copied from Idealista, an agency and a single listing:

```json
{
  "startUrls": [
    "https://www.idealista.com/alquiler-viviendas/barcelona-barcelona/con-precio-hasta_1500,de-dos-dormitorios/",
    "https://www.idealista.com/pro/engel-volkers/",
    "https://www.idealista.it/immobile/36857446/"
  ],
  "maxItems": 0
}
```

New listings in Valencia every day (schedule it daily):

```json
{
  "locations": ["Valencia"],
  "publishedWithin": "day",
  "sortBy": "newest",
  "maxItems": 0
}
```

### ⬆️ Output

Every listing is one row:

```json
{
  "propertyCode": "112811056",
  "url": "https://www.idealista.com/inmueble/112811056/",
  "thumbnail": "https://img4.idealista.com/s/v1/...",
  "numPhotos": 5,
  "floor": "bj",
  "price": 700.0,
  "priceInfo": {
    "price": {
      "amount": 700.0,
      "currencySuffix": "€/month",
      "priceDropInfo": {"formerPrice": 800.0, "priceDropValue": 100, "priceDropPercentage": 13}
    }
  },
  "propertyType": "studio",
  "operation": "rent",
  "size": 28.0,
  "exterior": true,
  "rooms": 0,
  "bathrooms": 1,
  "address": "Studio in Sur, Entrevías, Madrid",
  "province": "Madrid",
  "municipality": "Madrid",
  "district": "Puente de Vallecas",
  "neighborhood": "Entrevías",
  "country": "es",
  "locationId": "0-EU-ES-28-07-001-079-13-001",
  "latitude": 40.3745899,
  "longitude": -3.6690166,
  "showAddress": false,
  "description": "Apartment on Ronda del Sur, 211. Located on the ground floor, exterior with good natural lighting, an open-plan layout, and furnished...",
  "hasVideo": true,
  "status": "good",
  "firstActivationDate": 1791974391000,
  "newDevelopment": false,
  "priceDropValue": 100,
  "dropDate": 1791974594000,
  "multimedia": {
    "images": [{"url": "https://img4.idealista.com/s/v1/...", "tag": "bedroom"}],
    "videos": [{"url": "https://st3v.idealista.com/4f/9a/59/1482896015.mp4"}]
  },
  "contactInfo": {
    "commercialName": "Imperium Real Estate",
    "contactName": "Imperium",
    "userType": "professional",
    "micrositeShortName": "imperium-real-estate"
  },
  "hasLift": false,
  "priceDropPercentage": 13,
  "priceByArea": 25.0,
  "features": {"hasSwimmingPool": false, "hasTerrace": false, "hasAirConditioning": true, "hasBoxRoom": false, "hasGarden": false},
  "detailedType": {"typology": "flat", "subTypology": "studio"},
  "suggestedTexts": {"title": "Studio in Sur, Entrevías, Madrid"},
  "hasPlan": false,
  "has3DTour": false,
  "topPlus": false,
  "source": "Madrid",
  "scrapedAt": "2026-10-16T08:51:58Z"
}
```

With **Full listing details**, `_details` adds every photo, the complete description and its translations, `moreCharacteristics` (community fees, built and usable area, energy rating, furniture, orientation...), the energy certificate, all features as Idealista lists them, the agency's own link for the listing and `modificationDate` (when it was last updated). With **Listing statistics**, `_stats` adds `views`, `contactMails`, `sentToFriend` and `favorites`.

Prices are in euros; rentals are per month. Dates are milliseconds since 1970 (as Idealista gives them). When the advertiser hides the exact address, the coordinates are approximate and `showAddress` is false. The **Listings** and **Locations** tabs show the main fields as tables; every field is in the downloads. The run report lists how many listings Idealista has for each search and how many were saved, and names any place or link that does not exist.

### How can I use Idealista data?

- **Market research:** asking prices and price per m² by city, district and neighbourhood, for sale and rent
- **Investment analysis:** rental yields, price cuts and time on market across Spain, Italy and Portugal
- **Lead generation:** agencies active in an area, their listings and their Idealista pages
- **Price monitoring:** daily new listings and price drops with a schedule
- **Portfolio and valuation:** comparable properties by size, bedrooms, floor and condition
- **Proptech and dashboards:** feed maps and models with clean, structured listing data

### Idealista search links work as they are

Set up a search on idealista.com, idealista.it or idealista.pt with any filters (price, size, bedrooms, property subtypes, condition, must-haves, a drawn map area or several areas), copy the link from the address bar and paste it into **Idealista links**. The scraper reads the same search in the same order. A link carries its own filters: the filters in the form apply to **Locations** only.

### Use with AI agents (MCP)

AI agents can run this scraper through the Apify MCP server. Ask for example "Find 2-bedroom flats for rent in Barcelona under 1,500 euros on Idealista" and the agent sends:

```json
{
  "locations": ["Barcelona"],
  "operation": "rent",
  "maxPrice": 1500,
  "bedrooms": ["2"],
  "maxItems": 50
}
```

### Integrations and API

Run Idealista Scraper from your own code with the [Apify API](https://docs.apify.com/api/v2), schedule it in the Console, or connect it to Google Sheets, Make, Zapier, Slack, Airbyte and more through [Apify integrations](https://apify.com/integrations). Results can be downloaded as JSON, CSV, Excel, HTML or XML.

### FAQ

**Is it legal to scrape Idealista?**
This scraper collects only listings Idealista shows publicly, without logging in. It leaves out phone numbers, private sellers' names and contact details typed into descriptions. Personal data is protected by the GDPR in the EU: if your results include any, make sure you have a legitimate reason to keep it, and check Idealista's terms for your use case. When in doubt, ask a lawyer.

**Why do big searches come back in order of price?**
Idealista shows at most 2,500 results for one search. To give you every listing, a bigger search asked for in full (Max listings per search 0, or above 2,500) is read in order of price. Listings without a price come last on Idealista and are left out of such searches; any search with a price filter leaves them out too.

**Can I scrape a whole province?**
Add "provincia" to the name, like `Madrid provincia` or `Barcelona provincia` (in Portugal "distrito", like `Lisboa distrito`; a plain `Madrid` is the city), or use the province's location ID, like `0-EU-ES-28` for the province of Madrid. Several provinces: one per line.

**A place was not found.**
Write it the way Idealista names it, and add the city or province after a comma when the name is ambiguous, like `Centro, Madrid`. You can also copy the search link from Idealista instead.

**Holiday lets come without full details.**
Idealista keeps holiday lets apart from its other listings and shows no full listing page for them, so they come with the search data only.

### Other real estate scrapers

Looking for other property sites? Check our other real estate scrapers on the Apify Store.

# Actor input Schema

## `locations` (type: `array`):

Places to search, one per line, e.g. Madrid, Chamberí, Madrid, Barcelona, Málaga, Lisboa or Roma. City, district, neighbourhood, area or province names work, written the way Idealista names them (add the city or province after a comma when a name is ambiguous). An Idealista location ID such as 0-EU-ES-28-07-001-079 also works. Each place is its own search with the filters below.

## `startUrls` (type: `array`):

Links copied from idealista.com, idealista.it or idealista.pt, e.g. https://www.idealista.com/alquiler-viviendas/madrid-madrid/con-precio-hasta_1500/. A search link keeps its own filters and order (the filters below are not added to it); an agency page (/pro/<name>/) lists that agency's listings; a listing link (/inmueble/<id>/) returns that listing with full details.

## `country` (type: `string`):

Which Idealista site the place names are searched on, e.g. Spain. Links and location IDs already name their country.

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

Listings for sale or for rent, e.g. For rent.

## `propertyType` (type: `string`):

What kind of property to list, e.g. Homes. Rooms and holiday lets are for rent only; new developments and business transfers are for sale only.

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

The most listings to save from each place or search link, e.g. 500. 0 means every listing. Searches with more than 2,500 results are read to the end in order of price.

## `sortBy` (type: `string`):

The order listings are saved in, e.g. Newest first. Searches with more than 2,500 results asked for in full are read in order of price.

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

Lowest price in euros, e.g. 150000 (for rent: per month, e.g. 800). Listings without a price are left out when a price is set.

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

Highest price in euros, e.g. 400000 (for rent: per month, e.g. 1500).

## `minSize` (type: `integer`):

Smallest built area in square metres, e.g. 60.

## `maxSize` (type: `integer`):

Largest built area in square metres, e.g. 120.

## `bedrooms` (type: `array`):

Bedroom counts to include, e.g. 2 and 3. Leave empty for any.

## `bathrooms` (type: `array`):

Bathroom counts to include, e.g. 2. Leave empty for any.

## `publishedWithin` (type: `string`):

Only listings published recently, e.g. Last week. For sales the shortest window is 48 hours.

## `condition` (type: `array`):

Property condition, several allowed, e.g. Good condition. Leave empty for any.

## `floor` (type: `array`):

Which floors to include, e.g. Top floor. Leave empty for any.

## `features` (type: `array`):

Only listings with all of these, e.g. Lift and Terrace.

## `includeDetails` (type: `boolean`):

Adds each listing's full page data under \_details: every photo, the complete description and its translations, energy certificate, community fees, construction details, all features and the last update time. Slower.

## `includeStats` (type: `boolean`):

Adds \_stats to each listing: how many times it was viewed, emailed, shared and saved as a favourite.

## `language` (type: `string`):

Language of the listing texts, e.g. English: titles, feature labels, and the description when Idealista has it in that language.

## `proxyConfiguration` (type: `object`):

Leave the default.

## Actor input object example

```json
{
  "locations": [
    "Chamberí, Madrid"
  ],
  "country": "es",
  "operation": "sale",
  "propertyType": "homes",
  "maxItems": 100,
  "sortBy": "relevance",
  "publishedWithin": "any",
  "includeDetails": false,
  "includeStats": false,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `locations` (type: `string`):

No description

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

No description

## `report` (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 = {
    "locations": [
        "Chamberí, Madrid"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = {
    "locations": ["Chamberí, Madrid"],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/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 '{
  "locations": [
    "Chamberí, Madrid"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/idealista-scraper --silent --output-dataset

```

## MCP server setup

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