Fotocasa Scraper - Spain Property Listings avatar

Fotocasa Scraper - Spain Property Listings

Pricing

from $0.62 / 1,000 listings

Go to Apify Store
Fotocasa Scraper - Spain Property Listings

Fotocasa Scraper - Spain Property Listings

Fotocasa scraper for Spain. Type a town or paste a search URL, for sale or rent, and get one row per listing: price, price per m², surface, rooms, bathrooms, floor, neighbourhood, coordinates, advertiser, features and photos. Search near a point too. $0.65 per 1,000 listings.

Pricing

from $0.62 / 1,000 listings

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

8 days ago

Last modified

Share

Type a Spanish town or paste a fotocasa.es search, and get one row per property listing: asking price or rent, price per m², built surface, rooms, bathrooms, floor, neighbourhood, coordinates, the advertiser, the feature list and every photo link.

One thing to know before you start. Fotocasa has no filter of its own for agency versus private seller, so that filter is applied after each page is read. Ask for private sellers only in an agency-heavy town and you get back fewer rows than you asked for. You are not charged for the ones it drops, and the run says how many there were.

InputA place name, or fotocasa.es search URLs
OutputOne row per listing: price, price per m², surface, rooms, bathrooms, floor, address down to the neighbourhood, coordinates, advertiser, features, photos
Ceiling20,000 listings per run
Account neededNone
Price$0.65 per 1,000 listings on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 7,500

🔍 What Fotocasa Scraper does

Give it a place and it looks the name up against Fotocasa's own index, picks the match with the most live listings, builds the search and pages through it. Or skip the lookup: set your filters on fotocasa.es, copy the address bar, and paste it in. Whatever you picked on the site travels with the URL.

It covers sales and rentals across eight property types: homes, garages, offices, commercial premises, land, rural houses, whole buildings and storage rooms. It also reads rooms in shared homes, rent-to-own homes and business transfers of commercial premises.

Price, surface, room, bathroom and publication-date filters are handed to Fotocasa, so listings outside them never reach you and never cost anything. Two filters work differently. The advertiser filter is described above. A search near a point is the other: Fotocasa ignores distance, so the run reads the place's listings and keeps the ones within radiusKm of your point, measured from each listing's own map position. Type the town or district the point is in, because a small circle in a big place comes back with fewer rows than you asked for.

Newest first is the default order. Fotocasa's own relevance order shuffles between requests, and paging deep into a shuffled list hands you the same flat twice.

📋 What data you get from each Fotocasa listing

What you getField
Fotocasa's listing number, its ad id and the linkid, adId, url
Sale or rent, property type and subtypetransactionType, propertyType, propertySubtype
Price as a number and as Fotocasa prints it, and whether it is monthlyprice, priceText, pricePeriod
The old price when it has been cutpreviousPrice
Price per m² and built surfacepricePerM2, surfaceM2
Rooms, bathrooms, floor, condition and whether it is a new buildrooms, bathrooms, floor, condition, isNewConstruction
Address down to the neighbourhood, with district, town, province and postcodeaddress, neighbourhood, district, municipality, province, postcode
Map position, and the distance from your point on a search near onelatitude, longitude, distanceKm
Agency or private, the advertiser's name and page, and a phone when one is publishedadvertiserType, advertiserName, advertiserUrl, phone
The advertiser's description and the feature listdescription, features
Photo links, photo count, floor plan and virtual tour flagsimages, imageCount, hasFloorPlan, hasVirtualTour
When it was published, and when it was readpublishedAt, scrapedAt
Where in which search it was foundsearchUrl, page, position

▶️ How to scrape Fotocasa listings

  1. Open Fotocasa Scraper and click Try for free.
  2. Type a town into Place, or paste search pages into Fotocasa search URLs.
  3. Pick Buy or rent and a Property type.
  4. Set Maximum listings. Start around 20 to see the shape of the output.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Start a run with nothing filled in and you get one labelled sample row and nothing else, so you can see the field shape before spending anything.

💰 How much does it cost to scrape Fotocasa?

$0.65 per 1,000 listings on the Free plan. Paid plans pay a little less: $0.64 on Starter, $0.63 on Scale and $0.62 on Business. On the free plan, the $5 Apify gives you each month covers about 7,500 listings.

You pay per listing row delivered, and maxItems caps it, so it doubles as your spending cap. Duplicates found twice across searches, listings dropped by the advertiser filter, the publication period or the radius, the sample row and diagnostic rows are all free.

📥 What you give it

{
"location": "Valencia",
"transactionType": "rent",
"propertyType": "homes",
"maxItems": 100,
"minPrice": 800,
"maxPrice": 2000,
"minRooms": 2
}
FieldDefaultWhat it is
locationnone, the form starts at ValenciaA town, district or neighbourhood, spelled the way Fotocasa's own search box spells it. The -capital in their URLs is part of the address, not the name.
startUrlsnoneSearch pages copied from fotocasa.es, one per line. Use these instead of location when you have already built the search on the site.
transactionTypesalesale, rent, share (a room in a shared home), rent-to-own, or transfer (a business transfer, or traspaso). share and rent-to-own exist for homes only and transfer for premises only; any other pairing stops with a free BAD_INPUT row. Ignored when you paste a URL, since the URL already says which.
propertyTypehomeshomes, garages, offices, premises, land, rural-houses, buildings or storage-rooms.
locationLevelautoHow big an area the name should resolve to. auto takes whichever match has the most live listings, so a bare province name gets you the province. Set MUNICIPALITY to pin it to a town.
maxItems100Hard cap on rows delivered, up to 20,000.
sortTypepublicationDatepublicationDate (newest first), price (cheapest first), pricem2 (cheapest per m² first), surface (largest first) or scoring.
advertiseranyany, agency or private.
publicationDateanylastDay, last48Hours, lastWeek or lastMonth: only listings published in that period, applied by Fotocasa. Place searches only. With startUrls filled in the run stops with a free BAD_INPUT row, so set the date on the site before copying the URL.
minPrice, maxPricenoneEuros. On rentals this is the monthly rent.
minSurface, maxSurfacenoneBuilt surface in m², as Fotocasa reports it.
minRooms, maxRoomsnoneBedrooms, not total rooms. Fotocasa caps this filter at 10.
minBathrooms, maxBathroomsnoneBathrooms. Fotocasa caps this filter at 10.
latitude, longitudenoneA point on the map, such as 39.4699 and -0.3763 for the middle of Valencia. Only used with radiusKm.
radiusKmnone1 to 50 km. Only listings that close to the point are delivered, and the ones farther away are dropped uncharged. Set all three point fields or none: a missing one, or a point outside Spain, stops the run with a free BAD_INPUT row.
proxyConfigurationnoneOptional. Point the run at your own servers if traffic has to leave from a particular network.

📤 What you get back

A real row, with the photo links trimmed and the description left out:

{
"id": "190879808",
"adId": "41be50f4-1bff-49d8-aa31-7c64409b439a",
"url": "https://www.fotocasa.es/es/alquiler/vivienda/valencia-capital/.../190879808/d",
"transactionType": "rent",
"propertyType": "home",
"propertySubtype": "intermediate floor",
"price": 1800,
"priceText": "1.800 €",
"pricePeriod": "month",
"previousPrice": null,
"pricePerM2": 15,
"surfaceM2": 120,
"rooms": 4,
"bathrooms": null,
"floor": null,
"condition": null,
"isNewConstruction": false,
"address": "Els Orriols",
"neighbourhood": "Els Orriols",
"district": "Rascanya",
"municipality": "Valencia",
"province": "Valencia",
"postcode": "46019",
"latitude": 39.49346496734346,
"longitude": -0.3712033344287845,
"advertiserType": "agency",
"advertiserName": "HOUSINGANYWHERE",
"advertiserUrl": "https://www.fotocasa.es/es/pro/housinganywhere/",
"phone": null,
"features": ["furnished", "washing_machine", "tv", "pets_allowed", "laundry"],
"images": ["https://static.fotocasa.es/images/ads/1cab486a-...?rule=original"],
"imageCount": 10,
"hasFloorPlan": false,
"hasVirtualTour": false,
"publishedAt": "2026-09-20T01:02:40.153Z",
"searchUrl": "https://www.fotocasa.es/es/alquiler/viviendas/espana/...",
"page": 1,
"position": 1,
"scrapedAt": "2026-09-20T02:42:01.740Z"
}
FieldHow to read it
idFotocasa's own listing number. Stable, so use it to dedupe across runs.
price, pricePeriodA number in euros. pricePeriod is month on rentals and null on sales.
previousPriceThe old asking price when Fotocasa is showing a reduction, otherwise null.
bathrooms, floor, conditionnull when the advertiser did not fill that in, which is common on rentals.
latitude, longitudeFotocasa's own coordinates, which on some listings point at the street rather than the door.
distanceKmOnly on a search near a point: how far the listing's coordinates are from it, in km.
advertiserTypeagency or private. phone is only present when the advertiser published one.
featuresFotocasa's own English-ish keys, such as pets_allowed and air_conditioning.
searchUrl, page, positionWhere in which search the listing was found, so you can trace a row back.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itCharged
A listingno _sample and no _diagnostic keyyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

Filter on _sample and _diagnostic being absent. Real listings carry no charged field.

CodeWhat it means
NO_RESULTSThe search is valid, Fotocasa just has nothing matching right now.
LOCATION_NOT_FOUNDThe place name matched nothing. Try the plain town name, or paste a search URL.
LOCATION_LOOKUP_FAILEDFotocasa's place lookup did not answer properly this time. Run it again, or paste a search URL.
LOCATION_LEVEL_UNAVAILABLENo area of the size you asked for exists there, so the next one up was used.
NOT_A_FOTOCASA_URLOne of your startUrls is not a fotocasa.es address. The others still ran.
BAD_INPUTThe input asked for something this search cannot apply, such as publicationDate with pasted URLs, transfer on homes, or a point with a missing field. Nothing was searched.
FILTERED_OUTHow many listings the advertiser filter dropped, how many were older than the publication period you set, or how many lay outside your radius. None of them were charged.
FILTER_LIMITED_RESULTSFewer rows than asked for, because only some listings in that search match the advertiser filter or fall inside your radius.
DEADLINE_REACHEDThe run timeout was approaching, so paging stopped. Everything delivered is complete.
PAGE_NOT_FOUND, HTTP_ERRORThe first page of that search did not load. Check the URL, then run it again.
NO_DATA_BLOCK, DATA_BLOCK_UNPARSEABLE, NO_RESULTS_IN_BLOCKThe first page of that search loaded without its listings in it. Run it again, and open an issue with the URL if it repeats.
PROXY_GROUP_CLAMPEDA network setting in your input was not usable.
UNEXPECTED_ERRORSomething broke. The run still exits cleanly with whatever it had.

One bad URL never stops the others, and a diagnostic row never fails the run.

💡 What people use it for

  • Tracking asking prices in one neighbourhood week by week, with sortType on publicationDate and id as the dedupe key.
  • Pulling everything a single estate agency has listed in a province, using advertiser.
  • Building a price-per-m² picture of a town before buying, since pricePerM2 comes straight off the listing rather than being worked out afterwards.
  • Finding private-seller rentals under a budget, which is the search most people build by hand and then reload every morning.
  • Listings within a kilometre or two of a school, a station or an office, with latitude, longitude and radiusKm.

🚧 What it does not do

  • No contact details beyond what the advertiser published. phone is null on most listings and there are no email addresses at all.
  • A bare province name gives you the province. "Valencia" resolves to whichever match has the most live ads. Set locationLevel to MUNICIPALITY if you meant the city.
  • The advertiser filter runs after the page is read, so it can return fewer rows than maxItems.
  • Fields the advertiser left blank come back null. Bathrooms, floor and condition are missing often enough that you should plan for it.
  • Coordinates are Fotocasa's, and on some listings they mark the street, not the building.
  • The radius is applied here, not by Fotocasa. The place still decides which listings are read, and the run stops reading a search where fewer than 1 listing in 50 falls inside the circle. The smallest radius is 1 km.
  • Photo links point at Fotocasa's image servers. They are links, not an archive.
  • Rows are a snapshot. A flat can be sold, relisted or repriced an hour later, and scrapedAt records when it was read.
  • Spain only. Fotocasa does not list anywhere else.
  • It is not an official Fotocasa tool. Dami's Studio is independent and is not affiliated with or endorsed by Fotocasa, 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 pointThis one
Spain on pisos.com, with the agency's phone numberPisos.com Scraper
Short-stay prices on Airbnb, to set against long-term rentsAirbnb Listings Scraper

❓ Questions people ask

Do I need a Fotocasa account?

No. Nothing to sign up for and no key to manage.

Can I just paste a search I already built on the site?

Yes, that is usually the best way. Put the address-bar URL into startUrls and every filter you set comes with it.

Why did I get fewer listings than I asked for?

Either the search does not have that many, or the advertiser filter, the publication period or the radius dropped some. The diagnostic row tells you which.

Can I watch one area over time?

Yes. Schedule it, keep sortType on publicationDate, and dedupe on id. New listings arrive at the top.

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/fotocasa-scraper. Either way the run happens on your Apify account at the same price.

These are public adverts on a public site. Some rows carry an advertiser's name and phone number, which is personal data under GDPR, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a sensible starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the place or URL you used. The errorCode on the diagnostic row usually names the problem on its own.