idealista logo

Property & travel · Live on Apify

Idealista Scraper: Spain, Italy, Portugal and France

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.

About $0.58 for 1,000 results$0.00057 per result + $0.0121 per run. Apify bills you, not us.One result in a run of its own: about $0.01.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

propertyCode112996863
urlhttps://www.idealista.com/inmueble/112996863/
countryes

How to use it: 3 steps

  1. 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.
  2. Paste your input and press StartNo 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 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 forPriceWhen
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
  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
TaskInputYou getKey fieldsNext step
Compare prices in a citylocation, propertyType, maxItemsListingprice, size, rooms, addressCSV or Excel export
Get new listings from a searchstartUrls or location, onlyNewListingpropertyCode, url, price, firstSeenSchedule, then Slack or Notion
Track price changesmonitoringMode, detectPriceChanges, onlyNewprice_change rowoldPrice, newPrice, priceDelta, pctChangeWebhook or API
Find reduced listingsonlyPriceDrops, minPriceDropPercentageListingprice, priceDrop, urlCSV export
Review agenciesmode, agencySlugsAgency profilename, totalListings, businessAddress, activeSinceYearCRM 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
  • 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

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.

one 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. You need your Apify API token from Apify Console → Settings → API & Integrations.

Python · apify-client
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
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"}'
LangChain · langchain-apify
# 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)
FieldTypeMeaning
propertyCodestringIdealista listing ID. Agency profiles use agencySlug instead.
urlstringPublic listing page.
sourcestringData source. Always idealista.
countrystringIdealista site of this row: es, it, pt or fr.
operationstringsale or rent. Null if the source does not report it.
propertyTypestringSource property type, such as flat, chalet, office or vacationRental. Null if not reported.
titlestringListing title from Idealista. Null if not reported.
pricenumberListing price in EUR. Read priceBasis for total, monthly or nightly pricing. Null when unavailable.
currencystringPrice currency. Always EUR.
sizenumberBuilt area in square meters. Null if not reported.
roomsnumberNumber of bedrooms. 0 means a studio. Null if not reported.
bathroomsnumberNumber of bathrooms. Null if not reported.
floorstringFloor as text, such as 2, bj (ground floor) or en. Null if not reported.
addressstringAddress text from the listing. It can be approximate. Null if not reported.
areasarrayStreet, neighbourhood and larger places shown on the listing page, most specific first. Detail pages only.
agencyobjectPublic business name, slug and logo. Empty for private sellers and when the page names no agency.
latnumberLatitude. It can be approximate when the address is hidden. Null if not reported.
lngnumberLongitude. It can be approximate when the address is hidden. Null if not reported.
photosarrayAvailable source image URLs. URLs can expire; full details return the full gallery.
descriptionstringListing description with HTML, email addresses and phone numbers removed. Search rows can be shorter than rows with full details. Null if not reported.
featuresobjectPublic property characteristics, such as lift, terrace, garden, heating and condition. Available fields depend on property type.
energyCertificationobjectEnergy rating object. Filled when full details are included; otherwise null.
fetchedAtstringTime this listing was fetched, in UTC.
eventstringRow type: listing, price_change, removed or agency.
priceBasisstringtotal, per_month or per_night. Holiday rentals are priced per night.
priceIsFrombooleanTrue for a development starting price, rather than a specific unit price.
namestringPublic business name of an agency.
agencySlugstringAgency identifier from its Idealista profile URL.
logostringPublic agency logo URL.
totalListingsnumberNumber of listings reported on the agency profile.
businessAddressobjectPublic street, street number, locality, postal code and coordinates of an agency business.
numPhotosnumberNumber of photos reported on the listing. Missing values are null.
_detailsobjectFull characteristics, media, energy rating and available development units. Included when details are requested or a listing is fetched directly. Missing values are null.
priceByAreanumberListing price per square meter in EUR. Missing values are null.
latitudenumberSource latitude. Also available as lat. Missing values are null.
longitudenumberSource longitude. Also available as lng. Missing values are null.
priceDropobjectReduction amount, percentage and date currently reported by Idealista. Missing values are null.
hasPlanbooleanWhether a floor plan is available. Missing values are null.
firstSeenstringUTC time when this history first recorded the listing or agency. Missing values are null.
oldPricenumberPrevious 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.

SettingName in the APITypeExample value
Country requiredcountrystring"es"
Sale or rent requiredoperationstring"sale"
Property type requiredpropertyTypestring"homes"
Locationlocationstring"Madrid"
Maximum resultsmaxItemsinteger10
Locationslocationsarray
Postal codespostalCodesarray
Latitudelatitudenumber
Longitudelongitudenumber
Radius in kmdistanceKminteger20
Map polygonpolygonarray
Property codes or URLspropertyCodesarray
Listing or search URLsstartUrlsarray
Sort ordersortBystring"mostRecent"
Include full detailsfetchDetailsbooleanfalse
Minimum price in EURminPricenumber0
Maximum price in EURmaxPricenumber0
Minimum area in m²minSizenumber0
Maximum area in m²maxSizenumber0
Published sincepublicationDatestring""
Rental typesrentalTypesarray
Bedroomsbedroomsarray
Bathroomsbathroomsarray
Home typeshomeTypearray
Conditionconditionarray

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure