# Idealista Scraper: Spain, Italy, Portugal and France

> Idealista scraper: enter an area and a property type. Get prices, sizes, locations, agencies and photos for Spain, Italy, Portugal and France. No login.

URL: https://cliqtomedia.com/actors/idealista-scraper/

Category: Real estate, travel & cars · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/idealista-scraper?fpr=cliqto

Get public Idealista property listings for Spain, Italy, Portugal and France. Each row has the price, size, rooms, address, agency and main photo. You can also watch a search for changes.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `es` in Country. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Search Idealista property listings in Spain, Italy, Portugal and France, and get a table of prices, sizes, locations, agencies and photos. You enter an area and a property type. You need no Idealista account, API key or proxy setup.



### Good for

- Compare asking prices and sizes across areas.
- Get new listings from a saved search on a schedule.
- Follow price changes and missing listings for one search.
- Build a list of agencies with their public addresses and listing counts.
- Pull full details for a known set of listing IDs.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.0121 (from $0.0085 on paid Apify plans) | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Saved result | $0.00057 (from $0.0004 on paid Apify plans) | One saved listing, price-change event, removal or public agency profile. |
| Checked page or object | $0.0093 (from $0.0065 on paid Apify plans) | One source page read: a search page of up to 30 listings, or a direct agency lookup. Billed even when no new result is saved. Failed requests are free. |
| Listing detail | $0.0093 (from $0.0065 on paid Apify plans) | One full listing page read, when Include full details is on or a listing is looked up directly. Failed requests are free. |

- One result: about $0.01.
- 1,000 results: about $0.58.
- Every day 100 results, for 30 days: about $2.07 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 8 November 2026. Current price: https://apify.com/cliqtomedia/idealista-scraper?fpr=cliqto

## Questions

### Do I need an Idealista account or API key?

No. You need only an Apify account.

### Does it return seller phone numbers?

No. Phones and emails in listing text are replaced with [redacted].

### Does it return view or contact counters?

No. Idealista shows them only to signed-in users.

### Will I get every listing in an area?

Set `maxItems` to 0 for a full scan. `scanComplete` in `RUN_SUMMARY` tells you if the scan finished. The result can still miss listings that change during the run.

### How fresh is the data?

Each row shows what Idealista returned at `fetchedAt`. Use a schedule to keep it current.

### How do I keep two monitors apart?

Give each search its own `stateName`, or leave it empty so that each search gets its own history.

## Data fields

- `propertyCode` (string): Idealista listing ID. Agency profiles use agencySlug instead.
- `url` (string): Public listing page.
- `source` (string): Data source. Always idealista.
- `country` (string): Idealista site of this row: es, it, pt or fr.
- `operation` (string): sale or rent. Null if the source does not report it.
- `propertyType` (string): Source property type, such as flat, chalet, office or vacationRental. Null if not reported.
- `title` (string): Listing title from Idealista. Null if not reported.
- `price` (number): Listing price in EUR. Read priceBasis for total, monthly or nightly pricing. Null when unavailable.
- `currency` (string): Price currency. Always EUR.
- `size` (number): Built area in square meters. Null if not reported.
- `rooms` (number): Number of bedrooms. 0 means a studio. Null if not reported.
- `bathrooms` (number): Number of bathrooms. Null if not reported.
- `floor` (string): Floor as text, such as 2, bj (ground floor) or en. Null if not reported.
- `address` (string): Address text from the listing. It can be approximate. Null if not reported.
- `areas` (array): Street, neighbourhood and larger places shown on the listing page, most specific first. Detail pages only.
- `agency` (object): Public business name, slug and logo. Empty for private sellers and when the page names no agency.
- `lat` (number): Latitude. It can be approximate when the address is hidden. Null if not reported.
- `lng` (number): Longitude. It can be approximate when the address is hidden. Null if not reported.
- `photos` (array): Available source image URLs. URLs can expire; full details return the full gallery.
- `description` (string): Listing description with HTML, email addresses and phone numbers removed. Search rows can be shorter than rows with full details. Null if not reported.
- `features` (object): Public property characteristics, such as lift, terrace, garden, heating and condition. Available fields depend on property type.
- `energyCertification` (object): Energy rating object. Filled when full details are included; otherwise null.
- `fetchedAt` (string): Time this listing was fetched, in UTC.
- `event` (string): Row type: listing, price_change, removed or agency.
- `priceBasis` (string): total, per_month or per_night. Holiday rentals are priced per night.
- `priceIsFrom` (boolean): True for a development starting price, rather than a specific unit price.
- `name` (string): Public business name of an agency.
- `agencySlug` (string): Agency identifier from its Idealista profile URL.
- `logo` (string): Public agency logo URL.
- `totalListings` (number): Number of listings reported on the agency profile.
- `businessAddress` (object): Public street, street number, locality, postal code and coordinates of an agency business.
- `numPhotos` (number): Number of photos reported on the listing. Missing values are null.
- `_details` (object): Full characteristics, media, energy rating and available development units. Included when details are requested or a listing is fetched directly. Missing values are null.
- `priceByArea` (number): Listing price per square meter in EUR. Missing values are null.
- `latitude` (number): Source latitude. Also available as lat. Missing values are null.
- `longitude` (number): Source longitude. Also available as lng. Missing values are null.
- `priceDrop` (object): Reduction amount, percentage and date currently reported by Idealista. Missing values are null.
- `hasPlan` (boolean): Whether a floor plan is available. Missing values are null.
- `firstSeen` (string): UTC time when this history first recorded the listing or agency. Missing values are null.
- `oldPrice` (number): Previous saved price for a price_change event. Missing values are null.

## Input settings

- `country` (string, required): Idealista site to search: Spain, Italy, Portugal or France. Default: Spain. URLs must belong to this country, or the run stops with an input error.
- `operation` (string, required): Choose listings for sale or for rent. Default: For sale. Rent prices are per month. Holiday rental prices are per night.
- `propertyType` (string, required): Kind of property to search. Default: Homes. Rooms means rooms for rent. Business transfers means businesses offered for transfer.
- `location` (string): City, district or postal area name, the place part of an Idealista URL, or a search URL. Example: Madrid or madrid-madrid. Leave blank to search all provinces of the country. Locations, Postal codes, coordinates, a polygon and URLs replace this field.
- `maxItems` (integer): Maximum dataset rows across all areas. Default: 50. Example: 10 for a first test. Use 0 to continue until the search ends, the run times out or the charge limit is reached. Report removed listings needs 0. Up to 1800 rows per search are possible without splitting; above that the Actor splits the search for you.
- `locations` (array): One city, area name or search URL per line. Example: Madrid, Barcelona. Areas run in this order. Replaces Location.
- `postalCodes` (array): One postal code per line, in the selected country. Example: 28001. Replaces Location, Locations, coordinates and polygon.
- `latitude` (number): Center latitude of a circle search, from -90 to 90. Example: 40.4168. Also fill in Longitude. Replaces Location, Locations and polygon.
- `longitude` (number): Center longitude of a circle search, from -180 to 180. Example: -3.7038. Also fill in Latitude.
- `distanceKm` (integer): Circle radius in whole kilometers, used only with Latitude and Longitude. Default: 20. Minimum: 1.
- `polygon` (array): Search inside a shape. Add at least three [latitude, longitude] points. Example: [[40.45,-3.72],[40.45,-3.66],[40.40,-3.69]]. Replaces Location and Locations.
- `propertyCodes` (array): Listing IDs or listing URLs for direct lookup. Example: 112993138. Location and search filters are not used. Full details are included. A listing that no longer exists is reported in RUN_SUMMARY notFound.
- `startUrls` (array): Idealista listing or search URLs from the selected country. A search URL brings its own area, sort and filters. Listing URLs work like Property codes. A URL filter this Actor cannot read stops the run with an error, so no filter is lost.
- `sortBy` (string): Order of listings within each area. Default: Most recent. Holiday homes and new developments can only be ordered by price, so other choices use the source default for them.
- `fetchDetails` (boolean): Default: off. On: add full descriptions, the full photo gallery, energy ratings, coordinates and property characteristics. Each listing needs one more source request, so the run is slower and each listing has an extra Listing detail charge.
- `minPrice` (number): Lowest price in EUR. Use the same basis as the listing: total for sale, per month for rent. Default: 0, no limit. Example: 200000.
- `maxPrice` (number): Highest price in EUR. Must not be below Minimum price. Default: 0, no limit. Example: 500000.
- `minSize` (number): Smallest size in square meters. Default: 0, no limit. Example: 60.
- `maxSize` (number): Largest size in square meters. Must not be below Minimum size. Default: 0, no limit. Example: 120.
- `publicationDate` (string): Only listings published in this period. Default: Any time. Sale supports 48 hours, rent supports 24 hours, and both support week and month. Another choice for the operation stops the run with a clear error.
- `rentalTypes` (array): Rental length. Empty: all rental types. Use with operation For rent.
- `bedrooms` (array): Number of bedrooms. Choose several to include each. Empty: any number.
- `bathrooms` (array): Number of bathrooms. Choose several to include each. Empty: any number.
- `homeType` (array): Kind of home, used with property type Homes. Choose several to include each. Empty: all kinds.
- `condition` (array): Property condition. Choose several to include each. Empty: any condition.

## Step by step on Apify

1. Open the Input tab. Keep Country, Sale or rent and Property type at Spain, For sale and Homes (box 1).
2. Keep Location as Madrid, or enter another area (box 2).
3. Keep Maximum results at the prefilled 10 (box 3). A larger value costs more, as shown in Pricing.
4. Click Start at the bottom of the page, below the screenshot.
5. When the run finishes, check the `price`, `size` and `address` columns in the results table (box 5).

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Compare prices in a city | `location`, `propertyType`, `maxItems` | Listing | `price`, `size`, `rooms`, `address` | CSV or Excel export |
| Get new listings from a search | `startUrls` or `location`, `onlyNew` | Listing | `propertyCode`, `url`, `price`, `firstSeen` | Schedule, then Slack or Notion |
| Track price changes | `monitoringMode`, `detectPriceChanges`, `onlyNew` | `price_change` row | `oldPrice`, `newPrice`, `priceDelta`, `pctChange` | Webhook or API |
| Find reduced listings | `onlyPriceDrops`, `minPriceDropPercentage` | Listing | `price`, `priceDrop`, `url` | CSV export |
| Review agencies | `mode`, `agencySlugs` | Agency profile | `name`, `totalListings`, `businessAddress`, `activeSinceYear` | CRM import |

## Tips

- Search by area, postal code, circle, polygon or Idealista link.
- Full details are slow. The default 1 hour timeout fits about 200 of them.
- Photo links are signed and can expire. Download what you need soon after the run.

## Limits



- Idealista can change its pages or block access. Saved rows stay in the dataset when a run stops.
- `maxItems` 0 reads as far as time, cost and the source allow. A run stops at 30,000 page requests or 1 GB of responses, and a single page above 8 MB is refused.
- A search above the 1,800-listing window that cannot be split further keeps its first 1,800 listings and ends with `scanComplete` false and `stopReason` `INCOMPLETE_SCAN`. Splitting by price can miss listings with no price.
- Addresses and coordinates can be approximate, and coordinates can be missing, more often in France.
- Idealista shows view and contact counters only to signed-in users, so this Actor does not return them.
- Holiday rental pages show no size or agency, and those fields are null.
- Photo and media URLs are signed and can expire. Download what you need soon after the run.
- If Apify moves a run to another server, the run continues where it stopped, without saving or charging the same rows and pages twice. `restarts` in `RUN_SUMMARY` counts these moves, and `removed` rows wait for the next complete scan.

## Sample result

```json
{
  "propertyCode": "112996863",
  "url": "https://www.idealista.com/inmueble/112996863/",
  "source": "idealista",
  "country": "es",
  "operation": "sale",
  "propertyType": "homes",
  "title": "Piso en Ronda de Segovia, Imperial, Madrid",
  "price": 695000,
  "currency": "EUR",
  "priceBasis": "total",
  "priceIsFrom": false,
  "size": 105,
  "rooms": 2,
  "floor": "2ª planta exterior con ascensor",
  "address": "Ronda de Segovia, Imperial, Madrid",
  "agency": {
    "name": "FH Inmobiliaria",
    "slug": "fh-inmobiliaria",
    "logo": "https://st3.idealista.com/8e/0b/2c/fh-inmobiliaria.gif"
  },
  "numPhotos": 25,
  "event": "listing"
}
```

## Use it from code

Actor ID: `cliqtomedia/idealista-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/idealista-scraper").call(run_input={
    "country": "es",
    "operation": "sale"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~idealista-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"country": "es", "operation": "sale"}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/idealista-scraper")
result = tool.invoke({"run_input": {"country": "es", "operation": "sale"}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [Zillow Listings Scraper: Zestimates & Price Cuts, No Login](https://cliqtomedia.com/actors/zillow-scraper/)
- [Redfin & Realtor Listings Scraper (US): Sale, Sold & Rent](https://cliqtomedia.com/actors/us-property-listings/)
- [99acres & MagicBricks India Property Scraper - No Login](https://cliqtomedia.com/actors/india-property-listings/)
- [Airbnb Scraper: Listings, Prices, Calendar - No Login](https://cliqtomedia.com/actors/airbnb-scraper/)
- [Booking.com Scraper: Hotels, Prices, Reviews, No Login](https://cliqtomedia.com/actors/booking-scraper/)
- [Events Scraper: Eventbrite, Meetup & Luma — No Login](https://cliqtomedia.com/actors/events-aggregator/)
