# Idealista Property Detail Scraper - $1.00 / 1000 Listings (`scrapeunblocker/idealista-detail-scraper`) Actor

Full idealista listing pages in Spain, Italy and Portugal: feature groups, bathrooms, year built, price breakdown, price per m2, address lines, coordinates, photo gallery with captions, floor plans and the advertiser. By listing URL, id or search URL. $1.00 per 1000 listings.

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

## Pricing

from $1.00 / 1,000 results

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 Property Detail Scraper

Get the **full idealista listing page** of properties in **Spain (idealista.com), Italy (idealista.it) and Portugal (idealista.pt)** as clean structured JSON: title, location line, operation and property type, price (monthly for rentals), original price and price drop, price per m2, the price breakdown idealista shows (community fees, deposit ...), built and usable area, rooms, bathrooms, floor, lift, parking, every feature group as idealista lists it (specific features, building, equipment, energy certificate), year built, energy rating, description, address lines, coordinates (flagged when the advertiser hides the exact spot), the whole photo gallery with captions, floor plans, plan / video / 3D tour counts and the advertiser (name, type, reference, agency page, logo). No idealista account, no API key, no proxies to configure.

### Features

- **Three countries** - idealista.com, idealista.it and idealista.pt.
- **Any listing input** - a listing URL or the numeric listing id with its country.
- **Or read the listings of a search** - give idealista search URLs (with their filters) and the top listings of each search are read in full.
- **Everything on the page** - feature groups, price breakdown, address, coordinates, full gallery with captions and sizes, floor plans, advertiser and the last-updated note.
- **Removed listings are free** - a listing its advertiser took down comes back in `ERRORS` with the removal date when idealista shows one, and is not billed.
- **Deduplicated** - the same listing given twice (id and URL, or found by two searches) is read once.

Searching many listings? Our **Idealista Scraper** returns search results (price, area, rooms, agency) at a lower price per listing; feed the listing URLs you need in full to this actor.

### Use cases

- **Property valuation** - area, rooms, bathrooms, floor, energy rating, year built and price per m2 for comparables.
- **Investment due diligence** - community fees, deposits, condition and features before a viewing.
- **Geo analysis** - coordinates and address lines for mapping listings.
- **Listing monitoring** - re-read listings to track price changes and removals.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `listings` | array | - | idealista listing URLs or numeric ids. |
| `country` | string | `es` | Site of numeric ids: `es`, `it` or `pt`. |
| `searchUrls` | array | Lisbon sales (example) | Optional idealista search URLs; their top listings are read in full. |
| `maxListingsPerSearch` | integer | `5` | Listings read per search URL (1-300). |
| `proxyCountry` | string | - | Optional exit-IP country (ISO-2). Leave empty for the most reliable exit. |
| `concurrency` | integer | `2` | Listings read at the same time (1-3). |

#### Example input

```json
{
  "listings": [
    "https://www.idealista.pt/imovel/34665653/",
    "https://www.idealista.it/immobile/37068709/"
  ],
  "searchUrls": ["https://www.idealista.pt/arrendar-casas/porto/"],
  "maxListingsPerSearch": 20
}
```

### Output

One dataset item per listing (shortened):

```json
{
  "id": "34665653",
  "url": "https://www.idealista.pt/imovel/34665653/",
  "title": "Apartamento T2 à venda na Rua da Beneficência, 100",
  "locationLine": "Entrecampos, Avenidas Novas",
  "operation": "sale",
  "propertyType": "home",
  "priceText": "660.000 €",
  "price": 660000,
  "currency": "EUR",
  "area": 151,
  "areaType": "área bruta",
  "rooms": 2,
  "bathrooms": 2,
  "floor": "Rés do chão sem elevador",
  "lift": false,
  "parking": "included",
  "features": [
    {"group": "Características específicas", "items": ["151 m² área bruta", "T2", "2 casas de banho", "Terraço e varanda"]},
    {"group": "Prédio", "items": ["Rés do chão", "Sem elevador"]}
  ],
  "priceDetails": {"Preço do imóvel": "660.000 €", "Preço por m²": "4.371 €/m²"},
  "pricePerM2": 4371,
  "description": "T2 com logradouro nas Avenidas Novas | Exterior privado e elevada procura ...",
  "address": ["Rua da Beneficência, 100", "Entrecampos", "Avenidas Novas", "Lisboa"],
  "coordinates": {"latitude": 38.7436535, "longitude": -9.157716},
  "images": [{"url": "https://img4.idealista.pt/blur/WEB_DETAIL/0/id.pro.pt.image.master/18/79/fd/321088422.jpg", "caption": "Sala de estar", "width": 1500, "height": 1000}],
  "floorPlans": [{"url": "https://img4.idealista.pt/blur/WEB_DETAIL/0/id.pro.pt.image.master/86/26/9d/303171204.jpg", "caption": "Planta", "width": 469, "height": 655}],
  "multimediaCounts": {"PICTURE": 27, "PLAN": 2, "VIRTUAL_TOUR_3D": 1, "VIDEO": 2},
  "advertiser": {
    "name": "FLIPSTONE",
    "type": "Promotora",
    "reference": "34665653",
    "agencyUrl": "https://www.idealista.pt/pro/flipstone/",
    "logo": "https://st3.idealista.pt/7b/4c/df/flipstone.gif"
  },
  "updated": "Anúncio atualizado no dia 6 de Julho",
  "country": "pt",
  "listingInput": "https://www.idealista.pt/imovel/34665653/",
  "searchUrl": null
}
```

Fields idealista does not show for a listing (year built, energy rating, usable area ...) are left out. The key-value store also holds `ERRORS` - listings and search URLs that returned no listing (removed, unknown, blocked) with the reason. These are **not billed**.

### Pricing

**$1.00 per 1000 listings**, each a full listing page. You pay only for listings delivered; removed or failed listings are not charged, and the search step is free.

### Notes

- Texts come in the site's language (Spanish, Italian, Portuguese); prices are in EUR.
- `locationApproximate` is `true` when the advertiser hid the exact address; the coordinates are then the area's centre.

# Actor input Schema

## `listings` (type: `array`):

idealista listings: a listing URL (https://www.idealista.com/inmueble/111278716/, https://www.idealista.it/immobile/37068709/, https://www.idealista.pt/imovel/34868387/) or the numeric listing id with Country below. Empty runs read the example search only when Search URLs is empty too.

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

Which idealista site numeric listing ids are on. URLs carry their own site.

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

Optional. idealista search pages copied from the browser (with their filters): the top listings of each search are read in full, like listings given above.

## `maxListingsPerSearch` (type: `integer`):

How many of the top listings of each search URL to read in full (1-300).

## `proxyCountry` (type: `string`):

Optional exit-IP country (ISO-2). Leave empty: the exit is chosen for idealista automatically, which is the most reliable.

## `concurrency` (type: `integer`):

How many listings to read at the same time (1-3).

## Actor input object example

```json
{
  "country": "es",
  "searchUrls": [
    "https://www.idealista.pt/comprar-casas/lisboa/"
  ],
  "maxListingsPerSearch": 5,
  "concurrency": 2
}
```

# Actor output Schema

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

One item per listing: features, price breakdown, address, coordinates, photos, floor plans and advertiser

## `errors` (type: `string`):

Listings and search URLs that returned no listing (removed, unknown or blocked), with the reason (not billed)

# 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.pt/comprar-casas/lisboa/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapeunblocker/idealista-detail-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.pt/comprar-casas/lisboa/"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapeunblocker/idealista-detail-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.pt/comprar-casas/lisboa/"
  ]
}' |
apify call scrapeunblocker/idealista-detail-scraper --silent --output-dataset

```

## MCP server setup

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