Fotocasa Scraper - Spain Property Listings
Pricing
from $0.62 / 1,000 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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
8 days ago
Last modified
Categories
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.
| Input | A place name, or fotocasa.es search URLs |
| Output | One row per listing: price, price per m², surface, rooms, bathrooms, floor, address down to the neighbourhood, coordinates, advertiser, features, photos |
| Ceiling | 20,000 listings per run |
| Account needed | None |
| 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 get | Field |
|---|---|
| Fotocasa's listing number, its ad id and the link | id, adId, url |
| Sale or rent, property type and subtype | transactionType, propertyType, propertySubtype |
| Price as a number and as Fotocasa prints it, and whether it is monthly | price, priceText, pricePeriod |
| The old price when it has been cut | previousPrice |
| Price per m² and built surface | pricePerM2, surfaceM2 |
| Rooms, bathrooms, floor, condition and whether it is a new build | rooms, bathrooms, floor, condition, isNewConstruction |
| Address down to the neighbourhood, with district, town, province and postcode | address, neighbourhood, district, municipality, province, postcode |
| Map position, and the distance from your point on a search near one | latitude, longitude, distanceKm |
| Agency or private, the advertiser's name and page, and a phone when one is published | advertiserType, advertiserName, advertiserUrl, phone |
| The advertiser's description and the feature list | description, features |
| Photo links, photo count, floor plan and virtual tour flags | images, imageCount, hasFloorPlan, hasVirtualTour |
| When it was published, and when it was read | publishedAt, scrapedAt |
| Where in which search it was found | searchUrl, page, position |
▶️ How to scrape Fotocasa listings
- Open Fotocasa Scraper and click Try for free.
- Type a town into Place, or paste search pages into Fotocasa search URLs.
- Pick Buy or rent and a Property type.
- Set Maximum listings. Start around 20 to see the shape of the output.
- 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}
| Field | Default | What it is |
|---|---|---|
location | none, the form starts at Valencia | A 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. |
startUrls | none | Search pages copied from fotocasa.es, one per line. Use these instead of location when you have already built the search on the site. |
transactionType | sale | sale, 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. |
propertyType | homes | homes, garages, offices, premises, land, rural-houses, buildings or storage-rooms. |
locationLevel | auto | How 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. |
maxItems | 100 | Hard cap on rows delivered, up to 20,000. |
sortType | publicationDate | publicationDate (newest first), price (cheapest first), pricem2 (cheapest per m² first), surface (largest first) or scoring. |
advertiser | any | any, agency or private. |
publicationDate | any | lastDay, 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, maxPrice | none | Euros. On rentals this is the monthly rent. |
minSurface, maxSurface | none | Built surface in m², as Fotocasa reports it. |
minRooms, maxRooms | none | Bedrooms, not total rooms. Fotocasa caps this filter at 10. |
minBathrooms, maxBathrooms | none | Bathrooms. Fotocasa caps this filter at 10. |
latitude, longitude | none | A point on the map, such as 39.4699 and -0.3763 for the middle of Valencia. Only used with radiusKm. |
radiusKm | none | 1 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. |
proxyConfiguration | none | Optional. 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"}
| Field | How to read it |
|---|---|
id | Fotocasa's own listing number. Stable, so use it to dedupe across runs. |
price, pricePeriod | A number in euros. pricePeriod is month on rentals and null on sales. |
previousPrice | The old asking price when Fotocasa is showing a reduction, otherwise null. |
bathrooms, floor, condition | null when the advertiser did not fill that in, which is common on rentals. |
latitude, longitude | Fotocasa's own coordinates, which on some listings point at the street rather than the door. |
distanceKm | Only on a search near a point: how far the listing's coordinates are from it, in km. |
advertiserType | agency or private. phone is only present when the advertiser published one. |
features | Fotocasa's own English-ish keys, such as pets_allowed and air_conditioning. |
searchUrl, page, position | Where 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.
| Row | How to spot it | Charged |
|---|---|---|
| A listing | no _sample and no _diagnostic key | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on _sample and _diagnostic being absent. Real listings carry no charged field.
| Code | What it means |
|---|---|
NO_RESULTS | The search is valid, Fotocasa just has nothing matching right now. |
LOCATION_NOT_FOUND | The place name matched nothing. Try the plain town name, or paste a search URL. |
LOCATION_LOOKUP_FAILED | Fotocasa's place lookup did not answer properly this time. Run it again, or paste a search URL. |
LOCATION_LEVEL_UNAVAILABLE | No area of the size you asked for exists there, so the next one up was used. |
NOT_A_FOTOCASA_URL | One of your startUrls is not a fotocasa.es address. The others still ran. |
BAD_INPUT | The 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_OUT | How 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_RESULTS | Fewer rows than asked for, because only some listings in that search match the advertiser filter or fall inside your radius. |
DEADLINE_REACHED | The run timeout was approaching, so paging stopped. Everything delivered is complete. |
PAGE_NOT_FOUND, HTTP_ERROR | The first page of that search did not load. Check the URL, then run it again. |
NO_DATA_BLOCK, DATA_BLOCK_UNPARSEABLE, NO_RESULTS_IN_BLOCK | The 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_CLAMPED | A network setting in your input was not usable. |
UNEXPECTED_ERROR | Something 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
sortTypeonpublicationDateandidas 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
pricePerM2comes 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,longitudeandradiusKm.
🚧 What it does not do
- No contact details beyond what the advertiser published.
phoneisnullon 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
locationLeveltoMUNICIPALITYif 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
scrapedAtrecords 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 want | Use |
|---|---|
| Spain on Fotocasa, with map coordinates and searches near a point | This one |
| Spain on pisos.com, with the agency's phone number | Pisos.com Scraper |
| Short-stay prices on Airbnb, to set against long-term rents | Airbnb 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.
Is scraping Fotocasa legal?
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.