Pisos.com Scraper - Spain Property Listings avatar

Pisos.com Scraper - Spain Property Listings

Pricing

from $1.79 / 1,000 listings

Go to Apify Store
Pisos.com Scraper - Spain Property Listings

Pisos.com Scraper - Spain Property Listings

Pisos.com scraper for Spanish property for sale or to rent. Give a province or town, or paste a search, and get one row per listing: price, price per m², area, rooms, bathrooms, floor, neighbourhood, coordinates, agency and phone. $1.85 per 1,000 listings.

Pricing

from $1.79 / 1,000 listings

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Give it a Spanish province or town, or paste a pisos.com search, and get one row per property listing for sale or to rent: 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: price, price per m², area, rooms, bathrooms, floor, neighbourhood to province, coordinates, agency and phone, photos
Ceiling3,000 listings per search, 5,000 per run
Account neededNone
Price$1.85 per 1,000 listings on the free plan, down to $1.79 on Business. The free plan's $5 a month covers about 2,700

🔍 What Pisos.com Scraper does

It reads the same results pages a logged-out visitor sees, 30 listings a page, and builds each row from the listing card. 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.

Three more things the run catches so you do not pay for them. The site lets listings up to about 10% over your maximum price through, so each price is checked and those are left out. Past the last page, pisos.com hands back page 1 again, and the run stops instead of charging you twice for the same flats. And when a search has only a handful of matches, the site can pad the page with other listings it thinks you might like, which are skipped.

📋 What data you get from each pisos.com listing

What you getField
pisos.com's listing id, the link and the titlelistingId, url, title
Sale or rent, and the property typeoperation, propertyType
Asking price or monthly rent, and price per m²price, priceCurrency, pricePerM2
Built area, rooms, bathrooms and floorareaM2, rooms, bathrooms, floor
Neighbourhood, district, town, province and countryneighbourhood, district, municipality, province, country
Map positionlatitude, longitude
The advertiser, its type, its page on pisos.com and its phoneadvertiserName, advertiserType, advertiserUrl, phone
Whether it is a new-build promotionisNewDevelopment
Photo count, lead photo and photo linksimageCount, imageUrl, images
The short description from the results pagedescriptionSnippet
With includeDetails: the whole description, feature list, agency reference and last updatedescription, features, reference, lastUpdated
Which search found it, and where on itsearchUrl, page, position, scrapedAt

▶️ How to scrape pisos.com listings

  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.

Leave both Where and Search URLs empty and you get one labelled sample row, not charged, so you can see the columns first.

💰 How much does it cost to scrape pisos.com?

$1.85 per 1,000 listings on the free plan, with the detail pages or without. On the free plan, the $5 Apify gives you each month covers about 2,700 listings.

FreeStarterScaleBusiness
Per 1,000 listings returned$1.85$1.83$1.81$1.79
Per 1,000 listings privateSellersOnly checks and leaves out$0.08$0.079$0.078$0.077
A privateSellersOnly run that checks the most it can, 3,000 listings$0.24$0.237$0.234$0.231

Not charged: the sample row, every diagnostic row, a listing above your maxPrice, a padding listing that is not part of your search, 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 you give it

{
"location": "madrid",
"operation": "venta",
"propertyType": "pisos",
"minPrice": 200000,
"maxPrice": 300000,
"sortBy": "newest",
"maxItems": 200
}
FieldDefaultWhat it is
locationnone: a 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. Every listing you get is at or under maxPrice.
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.
privateSellersOnlyoffOnly listings placed by the owners, not by agencies. pisos.com has no filter for it, so the run reads the results and leaves out the agency listings, each one billed as a checked listing. Private sellers were about one listing in 464 when we counted, so most of what such a run pays for is checking. One run checks at most 3,000 listings, and only on searches.
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, 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"
}
FieldHow to read it
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.
floorText, such as "2ª planta".
districtOnly cities split into districts, such as Madrid, fill it.
advertiserType, phoneThe 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.
imagesOn grid rows, only the few photos the results page loads. imageCount is the real count.
description, features, reference, lastUpdatedFilled only with includeDetails, otherwise null.

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.

CodeWhat 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, nothing at or under your maxPrice, or no private seller among the listings checked.
BAD_URLThat is not a pisos.com search or listing URL the run can read, or it is a single listing while privateSellersOnly is on.
OPTION_NOT_LIVEprivateSellersOnly could not be switched on for that run. Nothing was searched.
CHECK_LIMITThe run checked 3,000 listings for private sellers and stopped there.
NOT_FOUNDA pasted listing has been taken down, usually because it sold or was withdrawn.
FETCH_FAILEDpisos.com did not return the page, or a pasted listing's page showed no price, size or location. Run it again.

💡 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 a market report with the price, area and link for each listing.

🚧 What it does not do

  • 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.
  • Many private sellers. The site is fed by agencies, so privateSellersOnly reads a lot of listings to find a few.
  • 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.
  • A pasted single rental listing. Only listings for sale can be pasted one by one; a rental listing's own URL gets a free BAD_URL row. Paste the rental search instead.
  • The ignored-filter check on pasted searches. It runs only when you use location with a price bound, and a pasted search's own price ceiling is not re-checked.
  • It is not an official pisos.com tool. Dami's Studio is independent and is not affiliated with or endorsed by pisos.com, or by any other company named on this page.

🧭 Which Spanish property scraper do you need?

If you wantUse
Spain on Fotocasa, with map coordinates and searches near a pointFotocasa Scraper
Spain on pisos.comThis one
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.

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 an address copied from the site is the most reliable way in.

Can I filter on a garage or a terrace?

Yes, through startUrls. Set the filter up on pisos.com and paste the address.

How fresh is the data, and can I run it every day?

It is read live when the run starts. With includeDetails, lastUpdated tells you when the advertiser last touched the listing. Yes, schedule it with sortBy on newest.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/pisos-com-scraper. Either way the run happens on your Apify account at the same price.

These are public adverts. Rows carry agency names and phone numbers, and data-protection law such as GDPR can cover contact details, so have a reason for collecting them. With privateSellersOnly, rows hold private people's phones: keep only what you need and mind cold-call rules. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

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