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

Ultimate Idealista scrape property listings from Spain, Italy and Portugal. Search by place name, URL, ZIP code, coordinates or property codes. Optional add-ons: listing statistics, comments and nearby places.

- **URL**: https://apify.com/happyendpoint/idealista-scraper.md
- **Developed by:** [Happy Endpoint](https://apify.com/happyendpoint) (community)
- **Categories:** Real estate, Integrations, Automation
- **Stats:** 2 total users, 2 monthly users, 94.4% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 search-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/platform/actors/running/actors-in-store#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

## Idealista Scraper: Spain, Italy and Portugal real estate data

### ⚡ **NO PROXY NEEDED · LIVE DATA IN SECONDS**

#### 📊 **Type a place name, click Run, download a ready-to-use spreadsheet. No developers needed.**

From "I need all Madrid listings under 500k" to a finished Excel, CSV or JSON file in under a minute. Prices, sizes, photos, GPS, agent contacts and market signals, all in one run.

> 🏠 Prefer to just paste Idealista URLs? Try our lightweight [Idealista Scraper by URL](https://apify.com/happyendpoint/idealista-scraper-by-url). No proxies needed there either.

**What only this actor gives you:**

- 🔑 **No proxies, ever.** Everything is handled for you. Zero configuration, zero extra cost, zero blocked runs to debug.
- 📍 **No location IDs to hunt.** Type "Chamberi, Madrid" and the actor finds the exact area itself. Every other Idealista actor makes you look up IDs or paste URLs.
- 🗣️ **Plain-words search.** Write "penthouse with terrace in Chamberi" and the actor understands it. No other Idealista actor has this.
- 📊 **Listing statistics.** Views, favourites and contact counts per listing. No other Idealista actor has this.
- 💬 **Listing comments** and 🚇 **nearby places** (closest metro, stations, landmarks with distances). No other Idealista actor has these.
- 🌍 **3 countries, 18 languages.** Spain, Italy and Portugal in one actor, descriptions in the language you pick.
- 💶 **Fair billing.** One property = one dataset item = one billed result. Duplicates removed before billing. Failed lookups never billed.

***

### All the ways to use this actor

There are 7 input modes. Fill in only one, or mix URLs freely. If several are filled, the actor picks the first available in this order: URLs, property codes, coordinates, ZIP code, location, search query.

#### 1. Type a place name (easiest)

Works with cities, districts and neighborhoods. The actor resolves the area for you.

```json
{
    "country": "es",
    "operation": "sale",
    "propertyType": "homes",
    "location": "Chamberi, Madrid",
    "maxItems": 100
}
```

Add more places in one run with `locations`:

```json
{
    "country": "es",
    "operation": "rent",
    "location": "Madrid",
    "locations": ["Barcelona", "Valencia"],
    "maxItems": 300
}
```

#### 2. Describe what you want in plain words

The actor understands free-text queries and turns them into a real search.

```json
{
    "country": "es",
    "searchQuery": "penthouse with terrace in chamberi",
    "maxItems": 50
}
```

#### 3. Paste search URLs from your browser

Do your search on Idealista, copy the address bar, paste it here. Filters inside the URL are respected.

```json
{
    "startUrls": [
        { "url": "https://www.idealista.com/venta-viviendas/madrid-madrid/" },
        { "url": "https://www.idealista.it/vendita-case/milano-milano/" }
    ],
    "maxItems": 200
}
```

#### 4. Paste single property URLs

Each property page returns one item with complete details. You can mix property URLs and search URLs in the same run.

```json
{
    "startUrls": [
        { "url": "https://www.idealista.com/inmueble/106387165/" },
        { "url": "https://www.idealista.pt/imovel/33939171/" }
    ]
}
```

#### 5. Fetch by property codes

Already know the listing codes? Skip URLs entirely.

```json
{
    "country": "es",
    "propertyCodes": ["106387165", "106316721"]
}
```

#### 6. Search by ZIP code

```json
{
    "country": "es",
    "operation": "sale",
    "zipCode": "28001",
    "maxItems": 100
}
```

#### 7. Search around a map point

Pick a spot, set a radius (1 to 15 km), get everything around it.

```json
{
    "country": "es",
    "operation": "rent",
    "latitude": "40.4168",
    "longitude": "-3.7038",
    "radiusKm": 5,
    "maxItems": 100
}
```

### Filters

All optional, combine freely with modes 1, 2, 5, 6 and 7: `minPrice`, `maxPrice`, `minSize`, `maxSize`, `minRooms`, `minBathrooms`, and amenity switches (`hasElevator`, `hasParking`, `hasSwimmingPool`, `hasAirConditioning`, `hasTerrace`, `hasGarden`, `petsAllowed`, `hasVirtualTour`, `furnishedKitchen`).

```json
{
    "country": "es",
    "operation": "sale",
    "location": "Madrid",
    "minPrice": 200000,
    "maxPrice": 500000,
    "minRooms": 2,
    "hasElevator": true,
    "maxItems": 200
}
```

Power users can pass extra switches via `advancedFilters`, for example `{"penthouse": "true", "seaViews": "true"}`.

### Extra data add-ons

Enrich every result with data no other Idealista actor can deliver. Each add-on is billed per result, so only enable what you need.

| Add-on | Field added | What you get |
|---|---|---|
| `addDetails` | `details` | Complete property page: all photos, full description, energy certificate, agent profile |
| `addStats` | `stats` | Views, favourites and contact counts. Spot high-demand or stale listings |
| `addComments` | `comments` | User comments on the listing |
| `addNearbyPois` | `nearbyPois` | Closest metro stops, train stations and landmarks with distances |

```json
{
    "country": "es",
    "location": "Malaga",
    "maxItems": 50,
    "addStats": true,
    "addNearbyPois": true
}
```

💡 Investor tip: many views plus few contacts plus a long time online usually means a negotiable seller. That is exactly what `addStats` shows you.

### Output

One item per property. Preview the data in the Output tab (Overview and Location views) or export JSON, CSV or Excel from the Dataset tab.

```json
{
    "propertyCode": "106387165",
    "price": 3490000,
    "priceByArea": 13270,
    "propertyType": "duplex",
    "operation": "sale",
    "size": 263,
    "rooms": 4,
    "bathrooms": 5,
    "address": "Duplex in Calle de Alcala, Goya, Madrid",
    "province": "Madrid",
    "municipality": "Madrid",
    "district": "Salamanca",
    "neighborhood": "Goya",
    "latitude": 40.4258423,
    "longitude": -3.6759932,
    "url": "https://www.idealista.com/inmueble/106387165/",
    "description": "Top-floor duplex in the Salamanca district...",
    "hasLift": true,
    "numPhotos": 36,
    "multimedia": { "images": [{ "url": "https://...", "tag": "living" }] },
    "agency": { "commercialName": "Acme Real Estate" },
    "stats": { "views": { "value": 6539 }, "favorites": { "value": 266 } },
    "nearbyPois": { "locations": [{ "name": "Sol (Madrid)", "subType": "metro", "distance": 42 }] },
    "scrapedAt": "2026-07-31T12:00:00.000Z"
}
```

### Billing, simple and transparent

You pay per result. A search that returns 20 listings bills exactly 20 results. Full property details bill at the detail rate. Add-ons bill per enriched result. Duplicates are removed before billing and failed lookups are never billed. Use **Max results** to cap any run. See the Pricing tab for current rates.

### Tips

- Always set **Max results**: a whole province can hold tens of thousands of listings.
- Schedule a run with **Sort by: Newest first** every morning to track fresh listings in your area.
- One search can return up to about 2,500 results. Need more from a big area? Split it with price ranges (for example 0 to 200k, 200k to 400k, ...) or run several districts.
- Rooms and Vacation rentals exist only for rent; Business transfers only for sale.

### FAQ

**Do I need a proxy?** No. Nothing to configure, nothing extra to pay. It just works.

**Do I need Idealista location IDs?** No. Type a place name. IDs still work if you have them.

**Which countries are supported?** Spain (idealista.com), Italy (idealista.it) and Portugal (idealista.pt). You can mix countries in one run via URLs.

**Can I scrape rentals?** Yes. Set Operation to "For rent", or paste a rentals URL.

**How fresh is the data?** Live. Every run fetches current listings, not a cached database.

**What formats can I export?** JSON, CSV, Excel, XML and RSS via the Dataset tab or the Apify API.

**Can I run it on a schedule?** Yes, use Apify Schedules. Combine with "Newest first" sorting for daily market monitoring.

**Is scraping Idealista legal?** This actor only extracts publicly visible listing data. Personal data is protected by GDPR and other regulations, so only scrape personal data if you have a legitimate reason. If unsure, consult a lawyer.

### For AI agents and LLM apps

Purpose: extract Idealista property listings (Spain, Italy, Portugal) as one dataset item per property.

Minimal input: `{ "country": "es", "operation": "sale", "location": "Madrid", "maxItems": 50 }`

Single property: `{ "country": "es", "propertyCodes": ["106387165"] }`

Any Idealista URL: `{ "startUrls": [{ "url": "https://www.idealista.com/venta-viviendas/madrid-madrid/" }], "maxItems": 50 }`

Behaviors to know: always set `maxItems` (each result is billed). Input precedence when several are set: startUrls, then propertyCodes, then coordinates, then zipCode, then location, then searchQuery. Add-on flags (`addDetails`, `addStats`, `addComments`, `addNearbyPois`) enrich every result and bill extra per result. No proxy configuration is needed or accepted.

### What does Idealista Scraper do?

Idealista is the leading real-estate portal of Spain and one of the biggest in Italy and Portugal, with millions of active listings. This actor turns any Idealista search into clean, structured data: prices, sizes, rooms, GPS coordinates, photos, descriptions, agent contacts, and optional statistics, comments and nearby places. You get spreadsheet-ready or API-ready output in minutes, without building a scraper, managing proxies or fighting anti-bot systems.

### Why scrape Idealista?

- 📈 Track prices and price per m2 by city, district or neighborhood
- 🏠 Find undervalued listings and monitor new supply daily
- 💼 Generate leads and comparable-property reports for real-estate businesses
- 📊 Research rental yields, market trends and housing affordability
- 🤖 Feed live property data into AI agents, dashboards and CRMs
- 🗺️ Build map apps with GPS coordinates and nearby-place data

### More Idealista actors by HappyEndpoint

- [🏠 Idealista Scraper by URL](https://apify.com/happyendpoint/idealista-scraper-by-url): paste any Idealista URL and get the data. Simple, fast, no proxies needed.

### SEO keywords

idealista scraper, idealista api, scrape idealista, idealista data extraction, idealista spain scraper, idealista italy scraper, idealista portugal scraper, idealista.com scraper, idealista.it scraper, idealista.pt scraper, spain real estate scraper, spain property data, madrid property scraper, barcelona property scraper, valencia property scraper, malaga property scraper, lisbon property scraper, porto property scraper, milan property scraper, rome property scraper, real estate data spain, real estate api spain, property listings api, real estate market analysis, rental yield data spain, property price tracker, real estate lead generation, idealista bulk export, idealista json, idealista csv, idealista no proxy, idealista listing statistics, idealista comments, property data for ai agents, real estate scraper no proxy

### Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Idealista S.A.U. or any related entity. All trademarks belong to their respective owners. Property data belongs to its original publishers.

# Actor input Schema

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

Which Idealista site to search.

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

Look for properties that are for sale or for rent.

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

The kind of property to search for. Homes covers flats and houses. Note: Rooms and Vacation rentals only work with For rent, and Business transfers only works with For sale.

## `location` (type: `string`):

Type a place name, for example 'Madrid', 'Chamberi, Madrid' or 'Lisboa'. The actor finds the matching area for you. You can also paste an Idealista location ID like 0-EU-ES-28-07-001-079 if you have one.

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

Optional. Add more places to search in the same run. Same format as Location.

## `searchQuery` (type: `string`):

Optional. Describe what you want in plain words, for example 'penthouse with terrace in Chamberi'. Only used when Location is empty.

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

Optional. Paste Idealista pages straight from your browser: search result pages or single property pages. Works with idealista.com, idealista.it and idealista.pt. When URLs are set, the location fields are ignored.

## `propertyCodes` (type: `array`):

Optional. Idealista property codes to fetch directly, for example 106387165. Each code returns one item with full details.

## `zipCode` (type: `string`):

Optional. Search by postal code, for example 28001.

## `latitude` (type: `string`):

Optional. Search around a map point. Fill in both Latitude and Longitude, for example 40.4168.

## `longitude` (type: `string`):

Optional. Search around a map point. Fill in both Latitude and Longitude, for example -3.7038.

## `radiusKm` (type: `integer`):

How far around the map point to search, in kilometers. Between 1 and 15.

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

Lowest price. For rentals this is the monthly rent.

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

Highest price. For rentals this is the monthly rent.

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

Smallest built area in square meters.

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

Largest built area in square meters.

## `minRooms` (type: `integer`):

At least this many bedrooms.

## `minBathrooms` (type: `integer`):

At least this many bathrooms.

## `hasElevator` (type: `boolean`):

Only buildings with an elevator.

## `hasParking` (type: `boolean`):

Only listings that include a parking space.

## `hasSwimmingPool` (type: `boolean`):

Only listings with a swimming pool.

## `hasAirConditioning` (type: `boolean`):

Only listings with air conditioning.

## `hasTerrace` (type: `boolean`):

Only listings with a terrace.

## `hasGarden` (type: `boolean`):

Only listings with a garden.

## `petsAllowed` (type: `boolean`):

Only listings where pets are allowed.

## `hasVirtualTour` (type: `boolean`):

Only listings with a virtual tour.

## `furnishedKitchen` (type: `boolean`):

Only listings with a furnished kitchen.

## `advancedFilters` (type: `object`):

Optional, for power users. Extra filters as JSON, with values as the text "true". Examples: {"penthouse": "true"} for penthouses only, {"seaViews": "true"} for sea views, {"luxury": "true"} for luxury homes, {"balcony": "true"}, {"studio": "true"}, {"newDevelopment": "true"}.

## `addDetails` (type: `boolean`):

Adds the complete property page data to every result (all photos, full description, energy certificate, agent info). Slower, and each detailed property is billed at the detail rate.

## `addStats` (type: `boolean`):

Adds views, favourites and contact counts to every result. Great for spotting high-demand or stale listings.

## `addComments` (type: `boolean`):

Adds user comments left on the listing to every result.

## `addNearbyPois` (type: `boolean`):

Adds the closest metro stops, train stations and landmarks with distances to every result.

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

Stop after saving this many results. Use 0 for no limit.

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

Order of the results.

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

Language for property descriptions.

## `check` (type: `string`):

Used by automated platform tests. When no search input is filled in, the actor runs a quick self-test instead of scraping. You can ignore this field.

## Actor input object example

```json
{
  "country": "es",
  "operation": "sale",
  "propertyType": "homes",
  "radiusKm": 3,
  "hasElevator": false,
  "hasParking": false,
  "hasSwimmingPool": false,
  "hasAirConditioning": false,
  "hasTerrace": false,
  "hasGarden": false,
  "petsAllowed": false,
  "hasVirtualTour": false,
  "furnishedKitchen": false,
  "addDetails": false,
  "addStats": false,
  "addComments": false,
  "addNearbyPois": false,
  "maxItems": 50,
  "sortBy": "relevance",
  "language": "en",
  "check": "status"
}
```

# 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 = {
    "check": "status"
};

// Run the Actor and wait for it to finish
const run = await client.actor("happyendpoint/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 = { "check": "status" }

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

```

## MCP server setup

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