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

Extracts property listings, photos, features, locations, and optional contact phones from Idealista for sale and rental searches.

- **URL**: https://apify.com/scraptivo/idealista-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:** Real estate, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 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?

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** collects property listings from [Idealista](https://www.idealista.com) and turns them into structured data for lead generation, market research, and investment analysis. Provide a location such as "Madrid" or a search URL, choose buy or rent, run the Actor, and export price, size, bedrooms, location, photos, agency, and more to JSON, CSV, Excel, or your preferred integration. Optionally enrich listings with full details and advertiser phone numbers. From just **$2.50 per 1,000 items**.

### What can you automate with Idealista Scraper?

- **Build property lead lists** — export listings with price, size, and contact details.
- **Monitor market prices** — track sale and rental price changes per area over time.
- **Analyze supply** — segment listings by property type, bedrooms, and floor.
- **Enrich a CRM** — push structured listings into your existing pipeline.
- **Schedule recurring collection** — refresh a market daily or weekly.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Real-estate agencies | Track competitor listings and market supply. |
| Investors | Analyze price-per-square-meter and yield by area. |
| Lead-generation teams | Collect property details and advertiser contacts. |
| Market researchers | Study the Spanish property market by region. |

### What data can you collect from Idealista?

| Data group | Example fields | How it helps |
|---|---|---|
| Listing identity | `propertyId`, `url`, `title`, `publicationDate` | Identify and link each listing. |
| Pricing | `price`, `pricePerSqm`, `operation` | Compare sale vs rental pricing. |
| Property details | `bedrooms`, `bathrooms`, `sqm`, `floor`, `propertyType` | Filter by unit attributes. |
| Location | `address`, `latitude`, `longitude` | Map listings and segment by area. |
| Media & description | `thumbnail`, `images`, `description`, `amenities` | Enrich records with visuals and text. |
| Contacts | `agency`, `agencyUrl`, `phoneNumbers` | Optional advertiser and phone data. |

### How to use Idealista Scraper

1. Open the Actor and go to the **Input** tab.
2. Enter a location in **Search Queries** or paste a **Start URL**.
3. Choose **Operation** (buy or rent) and a **Property Type**.
4. Set a **Max Items** limit and optional detail toggles.
5. Run the Actor, then export the dataset as JSON, CSV, or Excel.

```json
{
  "searchQueries": ["Madrid"],
  "operation": "buy",
  "propertyType": "homes",
  "maxItems": 25,
  "scrapeListingDetails": true,
  "locale": "es"
}
```

### Example workflow

#### Weekly snapshot of Madrid rental supply

1. Run a "Madrid" rental search every Monday.
2. Keep only listings above your target `sqm` and within your `price` band.
3. Send new records to a spreadsheet or CRM.
4. Deduplicate using the stable `propertyId` or `url`.

### Automate and integrate your results

Schedule the Actor from the Apify Console or via API to run daily or weekly. After a successful run, trigger a webhook to push results to Google Sheets, Make, Zapier, Slack, or a database. Use the stable `propertyId` or `url` as your deduplication key.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---:|---|---|---|
| `startUrls` | array | No | — | Direct Idealista search or listing URLs (override location filters). |
| `searchQueries` | array | No | `["Madrid"]` | Location text such as "Madrid" or "barcelona eixample". |
| `operation` | string | No | — | `buy` or `rent`. |
| `propertyType` | string | No | — | Category: `homes`, `rooms`, `offices`, `land`, etc. |
| `maxItems` | integer | No | `10` | Max listings to return (0 = unlimited). |
| `maxPages` | integer | No | — | Max search pages per URL (0 = unlimited). |
| `scrapeListingDetails` | boolean | No | `false` | Fetch the full detail page per listing. |
| `includeContactPhones` | boolean | No | `false` | Fetch advertiser phone numbers. |
| `requestDelayMs` | integer | No | — | Delay between listing fetches. |
| `locale` | string | No | — | Site language (`es`, `en`, `it`, `pt`). |

### Output example

```json
{
  "propertyId": 98412345,
  "url": "https://www.idealista.com/inmueble/98412345/",
  "title": "Piso en venta en Madrid Centro",
  "price": 385000,
  "pricePerSqm": 4250,
  "bedrooms": 3,
  "bathrooms": 2,
  "sqm": 91,
  "floor": "4",
  "propertyType": "homes",
  "operation": "buy",
  "address": "Madrid Centro, Madrid",
  "latitude": 40.4168,
  "longitude": -3.7038,
  "amenities": ["ascensor", "terraza", "garaje"],
  "agency": "Example Inmobiliaria",
  "phoneNumbers": [],
  "publicationDate": "2026-08-10"
}
```

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

Billing is pay-per-event. You are charged **$2.50 per 1,000 items** for search-result listings (`dataset-item`). Enabling listing details or contact phones adds **$2.50 per 1,000** for each of `listing-details` and `contact-details` respectively. A one-time `Actor Start` fee of $0.00005 applies per run. Apify plan discounts reduce these prices further.

### Reliability and responsible use

Residential proxies with Spanish exits are required and configured by default. Search results include price, size, bedrooms, and location; `phoneNumbers` is populated only when contact phones are enabled and the advertiser publishes a number. Rooms and holiday stays are rent-only, while new homes and transfers are buy-only. Use the Actor only for lawful purposes and respect Idealista's terms of service.

### Frequently asked questions

#### Can I scrape both sales and rentals?

Yes. Set `operation` to `buy` or `rent`. Some property types are restricted to one operation — for example, rooms and holiday stays are rent-only.

#### Can I schedule Idealista Scraper to run automatically?

Yes. Use the Apify Scheduler to run daily or weekly and keep market data current.

#### What counts as one result?

One result is one listing added to the dataset (`dataset-item`). Full detail pages and phone-number lookups are separate events billed only when enabled.

#### Why are some fields empty?

`phoneNumbers` appears only when `includeContactPhones` is enabled and the advertiser published a number. Detail-only fields require `scrapeListingDetails`.

#### How do I avoid duplicate records?

Deduplicate on the stable `propertyId` or listing `url`.

#### Do I need a proxy?

Yes — residential proxies with Spanish exits are required and enabled by default.

### Related Scraptivo automations

- [Apartments Scraper](https://apify.com/scraptivo/apartments-scraper) — apartment rental listings.
- [Otodom Scraper](https://apify.com/scraptivo/otodom-scraper) — Polish property listings.
- [Rightmove Scraper](https://apify.com/scraptivo/rightmove-scraper) — UK property listings.
- [Propertyfinder Scraper](https://apify.com/scraptivo/propertyfinder-scraper) — Middle East property listings.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, a sample location and operation, required fields, and expected volume so we can assess the request.

# Actor input Schema

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

Optional Idealista search or listing URLs. When present, these are used and search location / buy-rent filters are ignored.

## `searchQueries` (type: `array`):

Location text such as "Madrid", "malaga teatinos", or "barcelona eixample". Used only when Start URLs are empty.

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

Operation used with search location. Ignored when Start URLs are provided. Rooms and holiday stays are rent-only; new homes and transfers are buy-only.

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

Listing category used with search location. Ignored when Start URLs are provided.

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

Maximum number of listings to scrape (0 = unlimited)

## `maxPages` (type: `integer`):

Maximum number of search result pages to scan per search URL (0 = unlimited)

## `scrapeListingDetails` (type: `boolean`):

Fetch the full detail page for each listing. Charged as listing-details when successful.

## `includeContactPhones` (type: `boolean`):

Fetch advertiser phone numbers. Charged as contact-details when successful.

## `requestDelayMs` (type: `integer`):

Delay between listing fetches in milliseconds

## `locale` (type: `string`):

Site language used for location suggest (es, en, it, pt)

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

Residential proxies are required. Spanish (ES) exits work best for idealista.com.

## Actor input object example

```json
{
  "startUrls": [],
  "searchQueries": [
    "Madrid"
  ],
  "operation": "buy",
  "propertyType": "homes",
  "maxItems": 10,
  "maxPages": 0,
  "scrapeListingDetails": true,
  "includeContactPhones": false,
  "requestDelayMs": 250,
  "locale": "es",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}
```

# Actor output Schema

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

Dataset containing scraped Idealista listings

## `runStats` (type: `string`):

Record count and timestamps for this run

# 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 = {
    "searchQueries": [
        "Madrid"
    ],
    "maxItems": 10,
    "scrapeListingDetails": false,
    "includeContactPhones": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ES"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/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 = {
    "searchQueries": ["Madrid"],
    "maxItems": 10,
    "scrapeListingDetails": False,
    "includeContactPhones": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ES",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/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 '{
  "searchQueries": [
    "Madrid"
  ],
  "maxItems": 10,
  "scrapeListingDetails": false,
  "includeContactPhones": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}' |
apify call scraptivo/idealista-scraper --silent --output-dataset

```

## MCP server setup

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