How to use it: 3 steps
- Make a free Apify accountApify 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
esin Country. Each start is one run. - Download the resultsWhen 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.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
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.
Who uses it
Property investors
Compare asking prices and sizes across areas.
Real estate agents
Build a list of agencies with their public addresses.
Market analysts
Follow price changes and missing listings for one search.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| 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. |
Examples
- 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. That is enough for about 8,500 results.
Prices checked on 8 November 2026. See the current price on Apify.
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.
Details
Step by step on Apify
- Open the Input tab. Keep Country, Sale or rent and Property type at Spain, For sale and Homes (box 1).
- Keep Location as Madrid, or enter another area (box 2).
- Keep Maximum results at the prefilled 10 (box 3). A larger value costs more, as shown in Pricing.
- Click Start at the bottom of the page, below the screenshot.
- When the run finishes, check the
price,sizeandaddresscolumns 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 for better results
- 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 and good to know
- Idealista can change its pages or block access. Saved rows stay in the dataset when a run stops
maxItems0 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
scanCompletefalse andstopReasonINCOMPLETE_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.
restartsinRUN_SUMMARYcounts these moves, andremovedrows wait for the next complete scan
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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. You need your Apify API token from Apify Console → Settings → API & Integrations.
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)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"}'# 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)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
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 (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Country required | country | string | "es" |
| Sale or rent required | operation | string | "sale" |
| Property type required | propertyType | string | "homes" |
| Location | location | string | "Madrid" |
| Maximum results | maxItems | integer | 10 |
| Locations | locations | array | |
| Postal codes | postalCodes | array | |
| Latitude | latitude | number | |
| Longitude | longitude | number | |
| Radius in km | distanceKm | integer | 20 |
| Map polygon | polygon | array | |
| Property codes or URLs | propertyCodes | array | |
| Listing or search URLs | startUrls | array | |
| Sort order | sortBy | string | "mostRecent" |
| Include full details | fetchDetails | boolean | false |
| Minimum price in EUR | minPrice | number | 0 |
| Maximum price in EUR | maxPrice | number | 0 |
| Minimum area in m² | minSize | number | 0 |
| Maximum area in m² | maxSize | number | 0 |
| Published since | publicationDate | string | "" |
| Rental types | rentalTypes | array | |
| Bedrooms | bedrooms | array | |
| Bathrooms | bathrooms | array | |
| Home types | homeType | array | |
| Condition | condition | array |







