Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Pisos.com Scraper icon

Pisos.com Scraper

Scrape pisos.com property listings in Spain: price, price per m2, size, rooms, location, coordinates, agency and photos. Sale and rent. No account needed.

55 runs on Apify $0.00185 per listing ($1.85 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust location, operation, propertyType (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00185 per listing = $1.85 per 1,000

You are charged forWhenPrice
Listing returnedOne property listing returned in the dataset. Diagnostic rows and the labelled sample row are not charged.$0.00185

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.

Inputs

FieldWhat it doesType
locationA pisos.com place slug: a province like madrid, barcelona, alicante, or a town like marbella, elche_elx, san_sebastian_donostia. Common spellings are mapped for you. If a place 404s, open the search on pisos.com and paste the address into Search URLs instead.string
operationventa is for sale, alquiler is to rent.string
propertyTypepisos covers flats and apartments and is the broadest choice. The others narrow the search to that one type.string
maxItemsStop after this many listings across every search. You are charged per listing returned. pisos.com serves 30 per page and stops at page 100, so a single search tops out around 3,000.integer
startUrlsOptional, and the most reliable way in: set up the search on pisos.com with whatever filters you want, then paste the address here. Search pages and single listing pages both work. Paginates from wherever the URL points.array
minPriceLower price bound. For rentals this is monthly rent. Leave empty for no lower bound.integer
maxPriceUpper price bound. For rentals this is monthly rent. Every listing you get is at or under it: ones the site lets through above it are left out and not charged. Leave empty for no upper bound.integer
sortByWhich listings come first. Newest first is the one to pick if you are polling for changes.string
includeDetailsOff, every listing comes from the results grid: price, size, rooms, location, coordinates, agency, main photo. On, each listing also gets its own page fetched for the full feature list, the whole description, every photo, the agency reference and the date the advert was last updated. Same price per listing either way, but the run takes roughly ten times longer.boolean

What you get

A structured dataset — each result includes fields like:

titlepricepricePerM2areaM2roomsbathroomsflooroperationpropertyTypeneighbourhoodmunicipalityprovincelatitudelongitudeadvertiserTypeadvertiserNameimageCounturllistingId

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Pisos.com Scraper: Spanish property listings for sale and to rent, with price per m²

Give it a Spanish province or town, or paste a pisos.com search, and you get one row per listing: asking price or monthly rent, price per m², built area, rooms, bathrooms, floor, neighbourhood, coordinates, the agency and its phone number. Turn on the detail pages and each row also gets the full feature list, the whole description, every photo and the agency's own reference. The catch is depth: pisos.com never serves past page 100 of a search, so one search stops at 3,000 listings however many it advertises, and a bigger area has to be split by province or price band.

InputA place plus sale or rent, or pisos.com search URLs
OutputOne row per listing
Ceiling3,000 listings per search, 5,000 per run
Account neededNone
Price$1.85 per 1,000 listings, flat on every plan

🔍 What Pisos.com Scraper does

It reads the same logged-out results pages a visitor sees, 30 listings a page, and builds each row from the listing card. Price, size, rooms and coordinates all come from there. With includeDetails on, it also opens each listing's own page.

pisos.com spells some places its own way. elche is a 404 and elche_elx is the real page. The usual spellings are mapped for you, so elche, Elx, San Sebastián, La Coruña, Palma and Vitoria all land in the right place. A name it does not recognise gives you a free LOCATION_NOT_FOUND row, and the fix is always the same: open the search on pisos.com and paste the address into startUrls.

The site also ignores a filter it does not understand, and answers with the unfiltered set as if nothing were wrong. So when you set a price bound with location, the run first compares the result count with the unfiltered count. If they match, the filter was dropped, and you get a free FILTER_IGNORED row instead of listings you never asked for.

Past the last page, pisos.com hands back page 1 again. The run notices the repeat and stops rather than charging you twice for the same flats.

When a search has only a handful of matches, pisos.com can fill the rest of the page with other listings it thinks you might like. Those are not part of your search, so they are skipped and never charged.

📥 What you give it

{
  "location": "madrid",
  "operation": "venta",
  "propertyType": "pisos",
  "minPrice": 200000,
  "maxPrice": 300000,
  "sortBy": "newest",
  "maxItems": 200
}
FieldIf you leave it outWhat it is
locationa free sample row, unless startUrls is setA province or town, such as madrid, alicante, marbella or elche_elx. Accents and capitals are fine.
operationventaventa for sale, alquiler to rent.
propertyTypepisospisos (flats, the broadest choice), casas, aticos, duplexs, estudios, lofts, chalets or fincas_rusticas.
minPrice, maxPriceno boundEuros, and monthly rent when renting. The site lets listings up to about 10% over the ceiling through; the run checks each price and leaves those out, uncharged.
sortByrelevancerelevance, newest, cheapest or priciest. newest is the one for keeping an eye on an area.
maxItems50Listings across every search in the run, 1 to 5,000. You pay per listing returned.
startUrlsnonepisos.com search or listing URLs. A search URL keeps every filter it carries, including ones this form does not have, and pages on from wherever it points.
includeDetailsoffAlso open each listing's own page. Same price per listing, but the run takes roughly ten times longer.
proxyConfigurationnot neededLeave it alone. Only a list of your own servers entered here is used; the other settings in this box change nothing.

📤 What you get back

A real row from a real run, with the description snippet cut short:

{
  "listingId": "61748204239.106400",
  "url": "https://www.pisos.com/comprar/duplex-las_retamas_prado_santo_domingo_ensanche_sur28922-61748204239_106400/",
  "title": "Dúplex en calle de Juan Ramón Jiménez, 4",
  "operation": "venta",
  "propertyType": "duplex",
  "price": 450000,
  "priceCurrency": "EUR",
  "pricePerM2": 4091,
  "areaM2": 110,
  "rooms": 3,
  "bathrooms": 3,
  "floor": "2ª planta",
  "neighbourhood": "Las Retamas-Prado Santo Domingo-Ensanche Sur",
  "district": null,
  "municipality": "Alcorcón",
  "province": "Madrid",
  "country": "ES",
  "latitude": 40.3397,
  "longitude": -3.8323,
  "advertiserType": "professional",
  "advertiserName": "Inmobiliaria Maqueda",
  "advertiserUrl": "https://www.pisos.com/inmobiliaria-inmobiliaria_maqueda_993744_0/",
  "phone": "919387329",
  "isNewDevelopment": false,
  "imageCount": 43,
  "imageUrl": "https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_1_202602190946518929476.jpg",
  "images": [
    "https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_1_202602190946518929476.jpg",
    "https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_2_202602190946518929767.jpg"
  ],
  "descriptionSnippet": "¡Sin comisiones al comprador! Inmobiliaria maqueda presenta este ático dúplex en venta en prado santo domingo...",
  "description": null,
  "features": null,
  "reference": null,
  "lastUpdated": null,
  "searchUrl": "https://www.pisos.com/venta/pisos-madrid/",
  "page": 1,
  "position": 2,
  "scrapedAt": "2026-09-29T13:27:49.166Z"
}
FieldWhat it is
price, pricePerM2The asking price in euros, or the monthly rent on a rental. So a pricePerM2 of 15 on a rental means €15 per m² a month. On grid rows it is usually worked out as price over area, which can sit a euro away from the site's own figure; with includeDetails it is read off the listing page.
areaM2, rooms, bathrooms, floorAs the listing card shows them. floor is text, such as "2ª planta".
neighbourhood, district, municipality, provinceWhere it is. Only cities split into districts, such as Madrid, fill district.
latitude, longitudeFrom the location data pisos.com publishes on its own results pages.
advertiserType, advertiserName, advertiserUrl, phoneWho is advertising it. The site is fed by agencies, so this is nearly always professional and the phone is the agency's line.
isNewDevelopmenttrue on the new-build promotions the site slots into the grid, which is why a page can bring 33 rows instead of 30.
imageCount, imageUrl, imagesThe real photo count and the lead photo. On grid rows images holds only the few photos the results page loads.
description, features, reference, lastUpdatedFilled only with includeDetails, otherwise null.
searchUrl, page, positionWhich search the listing came from, and where on it.

How often each field is filled, measured over 305 listings from ten searches in September 2026:

FieldFilled
listingId, url, price, municipality, province, latitude, longitude, bathrooms100%
imageUrl, imageCount99.7%
areaM2, pricePerM296.7%
advertiserType, phone95.1%
rooms93.4%
advertiserName, advertiserUrl89.2%
neighbourhood88.9%
floor43.6%
district42.3%

floor and district are low because plenty of homes have neither. A detached house has no floor, and most Spanish towns have no districts.

🧾 Reading the output

RowHow to spot itCharged
A listingno _sample, _diagnostic or charged fieldyes
The sample row_sample: true, charged: false. Only when there was no location and no startUrlsno
A diagnostic row_diagnostic: true, charged: false, and an errorCodeno

Real listings carry no charged field at all, so drop every row where charged is false and you are left with the listings.

errorCodeWhat happened
LOCATION_NOT_FOUNDpisos.com has no search for that place name. Paste the search URL instead.
BAD_LOCATIONThe place name could not be turned into anything to search for.
FILTER_IGNOREDThe site dropped your price bound and answered with everything, so nothing was delivered for that search.
DEPTH_LIMITThe search advertised more than 3,000 listings and the run reached page 100. Split it up.
NO_RESULTSThe search matched nothing, or nothing at or under your maxPrice.
BAD_URLThat is not a pisos.com search or listing URL.
NOT_FOUNDA pasted listing has been taken down, usually because it sold or was withdrawn.
FETCH_FAILEDpisos.com did not return the page. Run it again.

▶️ How to run it

1. Open Pisos.com Scraper and click Try for free. 2. Type a province or town into Where, then pick Sale or rent and a Property type. To use a search you set up on pisos.com, paste its address into Search URLs instead. 3. Set Maximum listings. The form starts at 50. 4. Tick Include full detail pages if you want the description, every photo and the feature list. 5. Click Start, then export the dataset as CSV, JSON or Excel.

💰 How much does it cost?

$1.85 per 1,000 listings, flat on every Apify plan, with the detail pages or without.

Not charged: the sample row, every diagnostic row, a listing above your maxPrice, and a listing already delivered earlier in the same run. maxItems is a hard stop, so 200 means at most 200 listings are charged. A pasted single listing costs the same as any other. If its page shows none of the price, size or location, you get a free FETCH_FAILED row for it instead.

💡 What people use it for

  • Comparables before an offer: the asking price per m² of every flat in the same neighbourhood.
  • Rent against buy for one town, from a sale run and a rental run with the same filters.
  • A daily newest run with a small maxItems, to see what came on the market overnight in one area.
  • Feeding an agency CRM or a market report with the agency, phone and link for each listing.

🚧 What it does not do

  • Past page 100. One search stops at 3,000 listings. Split by province or price band to go wider.
  • Sold prices. pisos.com publishes asking prices only, and asking prices are what you get.
  • Energy ratings, floor plans or price history. None of them is on the logged-out page.
  • Private sellers, mostly. The site is fed by agencies. If private sellers are what you are after, this is the wrong portal.
  • Place names on a pasted single listing. A listing URL on its own gives the price, size, rooms, map point, description, features and photos, but leaves the neighbourhood, district, town, province, advertiser type and agency link empty. Search results fill those in, so paste a search when you need them.
  • The ignored-filter check on pasted searches. It runs only when you use location with a price bound.

🧭 Which Spanish property scraper do you need?

If you wantUse
Listings from pisos.com, for sale or to rentThis one
Listings from Idealista in Spain, Italy and PortugalIdealista Scraper
Homes for sale and to rent on FotocasaFotocasa Scraper
Short-stay prices on Airbnb, to set against long-term rentsAirbnb Listings Scraper

❓ Questions people ask

Do I need a pisos.com account or an API key? No. It reads the public pages anyone can open.

Can I get every listing in Spain? Not in one search. Run province by province, or split by price band, and you can cover far more.

How do I find the right place name? Type it the way you would say it. If it does not resolve, search on pisos.com and paste the URL into startUrls, since the site's own address always works.

Can I filter on a garage or a terrace? Yes, through startUrls. Set the filter up on pisos.com and paste the address.

How current is the data? It is read live when the run starts. With includeDetails, lastUpdated tells you when the advertiser last touched the listing.

Can I run it on a schedule? Yes. sortBy: "newest" with a modest maxItems makes a cheap daily check of what is new in an area.

🆘 If something breaks

Open the Issues tab on the actor page. Include the run ID and the input you used, or the search URL.