# Pisos.com Scraper — Spain Real Estate Data (`logiover/pisos-com-property-scraper`) Actor

Pisos.com unofficial API: scrape Spain property listings without login and export real estate data to CSV, JSON or Excel.

- **URL**: https://apify.com/logiover/pisos-com-property-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate, AI, Automation
- **Features:** Limited permissions
- **Stats:** 83 total users, 23 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Pisos.com Property Scraper — Spain Real Estate Listings, Prices & Leads (No API)

![Pisos.com Property Scraper — Spain Real Estate Data Extractor](https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/GjS6nQ8qauOdq9KGy-actor-oFvugM3TTMIJ6vnoj-4SaadiXGsi-unnamed.webp.png)

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00A67E?logo=apify\&logoColor=white) ![No API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f) ![No login](https://img.shields.io/badge/No%20login-required-2ea44f) ![Pay per result](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6) ![Real Estate](https://img.shields.io/badge/Category-Real%20Estate-8B5CF6) ![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)

Scrape property listings from **[Pisos.com](https://www.pisos.com)**, one of Spain's largest real estate portals (owned by Vocento) — apartments, houses, attics, duplexes, studios, lofts, rural estates, commercial premises, offices, warehouses, land, garages and storage rooms, for **sale, rent or new construction**, anywhere in Spain. Get **price in EUR, price/m², price drops, GPS coordinates, full address, energy class, advertiser data & image galleries** in clean structured JSON. **Fast HTTP scraping, no browser, no API key, no login.**

> ### 🏆 Why this Pisos.com scraper?
>
> **60+ fields per listing** · **hundreds to thousands of listings per run** · direct HTTP + structured parsing (no headless browser) · residential-proxy ready · 20+ feature flags (elevator, parking, pool, sea view…) · export to JSON / CSV / Excel. The unofficial **Pisos.com API alternative** for Spanish real-estate market research, investment screening and advertiser lead generation.

***

### ✨ What this Actor does / Key features

- 🇪🇸 **Nationwide targeting** — scrape Pisos.com across all of Spain by province (e.g. `madrid`) or city (e.g. `madrid_capital`), or all Spain with `espana`.
- 🏢 **13 property types** — apartments, houses, attics, duplexes, studios, lofts, rural estates, commercial premises, offices, warehouses, land, garages and storage rooms.
- 🔁 **Sale, rent & new build** — venta, alquiler or obra nueva via a single `transactionType`.
- 💰 **Full pricing** — price in EUR, **price-per-m²**, plus price-drop amount and flag.
- 📐 **Property detail** — built / usable / terrain area (m²), rooms, bathrooms, floor, building condition, year built, orientation and energy certificate (class, consumption, emissions).
- 📍 **Full address & GPS** — province, city, district, neighborhood, full address and **latitude/longitude** for every listing.
- 🏷️ **20+ feature flags** — elevator, parking, garage, terrace, balcony, AC, heating, garden, pool, storage, fitted wardrobes, sea view, furnished, luxury, exterior and featured.
- 🧑‍💼 **Advertiser lead data** — advertiser ID, name, URL and type (agency / private) for outreach.
- 🖼️ **Image galleries** — main image plus the full list of image URLs and image count.
- 🔎 **Client-side filters** — price, area, rooms, advertiser type and keyword.
- ⚡ **Direct HTTP extraction** — no headless browser; automatic pagination with configurable caps.

### 🚀 Quick start (3 steps)

1. **Configure** — pick `transactionType` (sale / rent / new), `propertyType` (e.g. `apartment`) and a `location` slug (e.g. `madrid_capital`). Add price/area/room filters if you want.
2. **Run** — click **Start**. The Actor paginates the search results and streams listings into your dataset.
3. **Get your data** — open the **Output** tab and export to **JSON, CSV, Excel or XML**, or pull it via the Apify API.

### 📥 Input

Set at least `transactionType`, `propertyType`, `location`, `maxListings`, `maxPages` and `proxyConfiguration`. Filters are optional.

#### Example — apartments for sale in Madrid (with price & room filter)

```json
{
  "transactionType": "sale",
  "propertyType": "apartment",
  "location": "madrid_capital",
  "sortBy": "newest",
  "minPrice": 200000,
  "maxPrice": 500000,
  "minRooms": 2,
  "maxListings": 200,
  "maxPages": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "ES"
  }
}
```

#### Example — rentals in Barcelona (private advertisers only, lead generation)

```json
{
  "transactionType": "rent",
  "propertyType": "apartment",
  "location": "barcelona_capital",
  "advertiserType": "private",
  "sortBy": "newest",
  "maxListings": 1000,
  "maxPages": 40,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "ES" }
}
```

#### Example — new-build (Obra Nueva) developments in Valencia province

```json
{
  "transactionType": "new",
  "propertyType": "apartment",
  "location": "valencia",
  "maxListings": 300,
  "maxPages": 20,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "ES" }
}
```

| Field | Type | Description |
|-------|------|-------------|
| `transactionType` | enum | `sale` (Venta), `rent` (Alquiler) or `new` (Obra Nueva). **Required.** |
| `propertyType` | enum | `apartment`, `house`, `attic`, `duplex`, `studio`, `loft`, `ruralEstate`, `commercial`, `office`, `warehouse`, `land`, `garage` or `storage`. **Required.** |
| `location` | string | Pisos.com location slug. Province alone (e.g. `madrid`) targets the whole province; append `_capital` for the city (e.g. `madrid_capital`). Use `espana` for all Spain. **Required.** |
| `sortBy` | enum | `relevance`, `newest`, `priceAsc`, `priceDesc` or `areaDesc`. |
| `minPrice` / `maxPrice` | integer | Price range in EUR (applied client-side). |
| `minArea` / `maxArea` | integer | Surface area range in m² (client-side). |
| `minRooms` / `maxRooms` | integer | Room-count range, 0–20 (client-side). |
| `advertiserType` | enum | `all`, `agency` or `private` (client-side filter). |
| `keyword` | string | Optional substring filter on title and description. |
| `maxListings` | integer | Hard cap on listings saved (default 200). **Required.** |
| `maxPages` | integer | Hard cap on search pages crawled (default 20, ~33 listings/page). **Required.** |
| `proxyConfiguration` | object | Apify Proxy settings — RESIDENTIAL group with country=ES recommended and default. **Required.** |

#### Location slugs

| Slug | Coverage | Slug | Coverage |
|------|----------|------|----------|
| `espana` | All Spain | `sevilla_capital` | Seville city |
| `madrid` | Madrid province | `malaga` / `malaga_capital` | Málaga |
| `madrid_capital` | Madrid city | `alicante` | Alicante |
| `barcelona` | Barcelona province | `zaragoza` | Zaragoza |
| `barcelona_capital` | Barcelona city | `bilbao` | Bilbao |
| `valencia` / `valencia_capital` | Valencia | `mallorca` | Mallorca |

> **Finding a location slug:** browse pisos.com, apply a location filter, and copy the slug from the URL. Use lowercase ASCII and replace spaces with underscores. Append `_capital` for the city itself (e.g. `madrid` = province, `madrid_capital` = city).

#### Additional input fields

These optional fields are also available in the input form and API:

| Field | Type | Default | Description |
|---|---|---|---|
| `fetchDetails` | boolean | `true` | Open each listing's own page to fill the detail-only columns: usable area, plot size, condition, building age, energy certificate, orientation and the amenity flags (lift, garage, terrace, pool, furnished…). |
| `timeBudgetSecs` | integer | `180` | Maximum wall-clock time used for fetching pages. Results collected before the deadline are preserved. Increase this for very large exports. |

### 📤 Output

One row per listing — **60+ fields**, exportable to JSON, CSV, Excel or XML. Here is a trimmed sample record:

```json
{
  "adId": "12345678_67890",
  "detailUrl": "https://www.pisos.com/comprar/piso-madrid_capital_chamberi-12345678_67890/",
  "title": "Piso reformado en Chamberí",
  "transactionType": "sale",
  "propertyType": "apartment",
  "price": 425000,
  "priceCurrency": "EUR",
  "pricePerSqm": 5882,
  "priceDropValue": 15000,
  "hasPriceDrop": true,
  "areaSqm": 72,
  "usableAreaSqm": 65,
  "rooms": 2,
  "roomsLabel": "2 hab.",
  "bathrooms": 1,
  "floor": "3",
  "buildingCondition": "Buen estado",
  "buildingAge": "Entre 30 y 50 años",
  "orientation": "Sur",
  "energyClass": "E",
  "province": "Madrid",
  "city": "Madrid",
  "district": "Chamberí",
  "neighborhood": "Trafalgar",
  "fullAddress": "Calle de Trafalgar, Chamberí, Madrid",
  "latitude": 40.4324,
  "longitude": -3.7012,
  "mainImageUrl": "https://static.pisos.com/…/main.jpg",
  "imageUrls": ["https://…/1.jpg", "https://…/2.jpg", "…"],
  "imageCount": 18,
  "advertiserId": "ag-40912",
  "advertiserName": "Inmobiliaria Centro Madrid",
  "advertiserType": "agency",
  "hasElevator": true,
  "hasParking": false,
  "hasTerrace": true,
  "hasAirConditioning": true,
  "isExterior": true,
  "isNewListing": true,
  "dateUpdated": "2026-09-23",
  "labels": ["Nuevo"],
  "searchLocation": "madrid_capital",
  "scrapedAt": "2026-07-06T10:30:00.000Z"
}
```

<details>
<summary><b>📋 Full field reference (click to expand)</b></summary>

| Field | Description |
|-------|-------------|
| `adId` / `detailUrl` | Listing ID and detail page URL |
| `title` / `shortDescription` | Listing headline and short description |
| `transactionType` / `propertyType` | sale/rent/new and property category |
| `price` / `priceCurrency` / `pricePerSqm` | Price, currency (EUR) and price per m² |
| `priceDropValue` / `hasPriceDrop` | Price reduction amount and flag |
| `areaSqm` / `usableAreaSqm` / `terrainAreaSqm` | Built, usable and terrain area in m² |
| `rooms` / `roomsLabel` / `bathrooms` / `floor` | Room and bathroom counts, room label, floor |
| `buildingCondition` / `buildingAge` / `orientation` | Condition, building age band ("Entre 30 y 50 años" — Pisos.com publishes a band, never an exact year) and orientation |
| `energyClass` / `energyConsumption` / `energyEmissions` | Energy certificate data |
| `country` / `province` / `city` / `district` / `neighborhood` / `fullAddress` | Full location breakdown |
| `latitude` / `longitude` | GPS coordinates |
| `mainImageUrl` / `imageUrls` / `imageCount` | Main image and image gallery |
| `advertiserId` / `advertiserName` / `advertiserUrl` / `advertiserType` | Advertiser details (agency / private) |
| `hasElevator` / `hasParking` / `hasGarage` / `hasTerrace` / `hasBalcony` / `hasAirConditioning` / `hasHeating` / `hasGarden` / `hasPool` / `hasStorage` / `hasFittedWardrobes` / `isFurnished` | Amenity flags read from the listing's own feature list. `true` = advertised, `false` = not advertised, empty = detail page unavailable |
| `isExterior` / `isNewListing` / `labels` | Exterior vs interior, newly-published flag, and the listing's own badge labels (e.g. "Nuevo") |
| `dateUpdated` | Date the ad was last updated (Pisos.com does not publish an original posting date) |
| `searchUrl` / `searchTransaction` / `searchPropertyType` / `searchLocation` / `searchSortBy` / `searchKeyword` | Search context used |
| `scrapedAt` | Scrape timestamp (ISO 8601) |

Detail-only columns — `usableAreaSqm`, `terrainAreaSqm`, `buildingCondition`, `buildingAge`, `orientation`, `energyClass` / `energyConsumption` / `energyEmissions`, `dateUpdated` and every amenity flag — are read from each listing's own page, which the Actor visits automatically (**Fetch detail pages**, on by default). Turn that input off for a faster listing-page-only export; those columns then come back empty.

Some of these are genuinely property-dependent rather than missing: `terrainAreaSqm` only exists for houses/chalets with a plot, `floor` only for flats, and the energy certificate is only present when the advertiser uploaded one (roughly 25–45% of ads).

</details>

### 💡 Use cases

- **Market research** — track Spanish property prices, price/m² and price drops across provinces, cities and neighborhoods.
- **Investment screening** — compare sale vs. rent pricing per area to estimate gross rental yield.
- **Portals & aggregators** — feed Pisos.com listings into your own search platform or comparison tool.
- **Lead generation** — use `advertiserType: private` for direct-owner leads, or cluster agency listings by `advertiserId`.
- **Relocation & buyer's agents** — build curated shortlists filtered by price, area, rooms and features.
- **Data science teams** — build valuation models with structured location, area, energy and feature data.

### 👥 Who uses it

Real-estate agencies & proptech teams · property investors & flippers · valuation and mortgage analysts · market researchers & data journalists · relocation and buyer's agents · lead-gen agencies building advertiser contact lists.

### 💰 Pricing

This Actor runs on a simple **pay-per-result** model — you pay for the listings you extract, with no separate Apify platform fees to calculate. Try it on the **free tier** first, then scale up. See the **Pricing** tab on this page for the current rate.

### ❓ Frequently Asked Questions

**Does Pisos.com have a public API?**
Pisos.com does not provide an open public listings API, so this Actor extracts the structured data directly from its search pages — giving you Spanish real estate data with no API key.

**Is this a Pisos.com API alternative?**
Yes. Pisos.com has no open public listings API, so this Actor works as an unofficial **Pisos.com API alternative** — it reads the structured data directly from search pages with no API key.

**Do I need a Pisos.com account or API key?**
No. The Actor scrapes publicly visible listings — no login and no API key required, only an Apify account.

**Can I scrape Pisos.com without an API key or login?**
Yes. The Actor extracts publicly visible Spanish property listings with no login and no API key required — just set your location and filters.

**Is scraping Pisos.com legal?**
The Actor collects publicly available listing data. You are responsible for using it in compliance with Pisos.com's terms of service, robots.txt and applicable laws such as GDPR. The Actor uses a polite throttle between pages.

**How do filters work?**
Price, area, rooms, advertiser type and keyword filters are applied client-side after fetching pages — not via the search URL. With very narrow filters, increase `maxPages` so the Actor crawls enough pages to find matches.

**How much data can I get?**
Pisos.com shows ~33 listings per page. Set `maxListings` and `maxPages` to control volume — a single run can return hundreds to thousands of listings.

**Why are some detail-page fields empty?**
Detail-only columns — `usableAreaSqm`, `terrainAreaSqm`, `buildingCondition`, `buildingAge`, `orientation`, `energyClass` / `energyConsumption` / `energyEmissions`, `dateUpdated` and every amenity flag — are read from each listing's own page, which the Actor visits automatically (**Fetch detail pages**, on by default). Turn that input off for a faster listing-page-only export; those columns then come back empty.

Some of these are genuinely property-dependent rather than missing: `terrainAreaSqm` only exists for houses/chalets with a plot, `floor` only for flats, and the energy certificate is only present when the advertiser uploaded one (roughly 25–45% of ads).

**Do I need a proxy?**
A RESIDENTIAL proxy with country=ES is recommended and set by default. Adjust `proxyConfiguration` if you use your own proxy provider.

**How do I export Pisos.com data to CSV or JSON?**
Run the Actor, then download the resulting dataset as CSV, JSON or Excel from the Apify Console, or pull it via the Apify API for a clean Spain real estate data export.

**How do I scrape apartments for sale in Madrid from Pisos.com?**
Set `transactionType` to `sale`, `propertyType` to `apartment` and `location` to `madrid_capital`, and the Actor returns every Madrid apartment listing with price and price-per-m².

**How do I scrape rental properties in Barcelona on Pisos.com?**
Set `transactionType` to `rent` and `location` to `barcelona_capital`, and the scraper collects Barcelona rental listings with price, area, rooms and GPS coordinates.

**Can I filter Pisos.com listings by price and number of rooms?**
Yes. `minPrice`, `maxPrice`, `minRooms` and `maxRooms` apply client-side after fetching pages, so you can narrow results to your exact budget and layout.

### 🔗 More real estate scrapers by logiover

Building a cross-country property dataset? Pair Pisos.com with the rest of the European (and beyond) real-estate suite:

| Country | Actor |
|---|---|
| 🇪🇸 Spain | [Habitaclia Scraper](https://apify.com/logiover/habitaclia-com-spain-scraper) |
| 🇵🇱 Poland | [Otodom.pl Scraper](https://apify.com/logiover/otodom-pl-scraper-polish-real-estate-data) |
| 🇨🇿 Czechia | [Sreality.cz Scraper](https://apify.com/logiover/sreality-cz-scraper-czech-real-estate-data) |
| 🇬🇷 Greece | [Spitogatos Scraper](https://apify.com/logiover/spitogatos-gr-real-estate-scraper-greece-properties-data) · [XE.gr Scraper](https://apify.com/logiover/xe-gr-real-estate-scraper-greece-property-data) |
| 🇮🇹 Italy | [Casa.it Scraper](https://apify.com/logiover/casa-it-scraper-italy-real-estate) · [Subito Scraper](https://apify.com/logiover/subito-it-property-scraper) |
| 🇩🇪 Germany | [ImmobilienScout24 Scraper](https://apify.com/logiover/immobilienscout24-de-scraper-germany-real-estate) · [WG-Gesucht Scraper](https://apify.com/logiover/wg-gesucht-scraper) |
| 🇵🇹 Portugal | [Imovirtual Scraper](https://apify.com/logiover/imovirtual-pt-scraper-portugal-real-estate) |
| 🇫🇷 France | [Bien'ici Scraper](https://apify.com/logiover/bien-ici-fr-scraper-france-real-estate) |
| 🇷🇴 Romania | [Storia.ro Scraper](https://apify.com/logiover/storia-ro-scraper-romania-real-estate) |
| 🇳🇱 Netherlands | [Funda Scraper](https://apify.com/logiover/funda-scraper) |
| 🇮🇪 Ireland | [MyHome.ie Scraper](https://apify.com/logiover/myhome-ie-scraper) |
| 🇦🇹 Austria | [Willhaben Scraper](https://apify.com/logiover/willhaben-at-scraper) |
| 🇩🇰 Denmark | [Boliga Scraper](https://apify.com/logiover/boliga-scraper) |
| 🇧🇬 Bulgaria | [Imot.bg Scraper](https://apify.com/logiover/imot-bg-scraper-bulgaria-real-estate) |

👉 Browse all **[logiover scrapers on Apify Store](https://apify.com/logiover)** — 180+ actors across real estate, jobs, crypto, social media & B2B data.

### ⏰ Scheduling & integration

Schedule this Actor on Apify to monitor new listings and price changes across Spanish cities. Export results to JSON, CSV or Excel, sync to Google Sheets, or push to your database, BI tools and webhooks through the Apify API. Connect it to **Make, n8n or Zapier** to build automated real-estate pipelines.

### 🤖 AI Agents, MCP & RAG Integration

**Pisos.com Scraper** works natively as an on-demand data tool for AI assistants and autonomous workflows.

Connect this Actor directly to **Apify AI**, **Claude Desktop**, **Cursor**, **VS Code**, **Windsurf**, **LangChain**, or **LlamaIndex** via the official **Apify MCP Server** — no custom wrapper code needed:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=logiover/pisos-com-property-scraper"
    }
  }
}
```

- **Schema-typed inputs & outputs:** Clean JSON records with explicit `.actor/input_schema.json` and `.actor/output_schema.json` definitions so LLM agents infer parameters and parse fields accurately without HTML noise.
- **Bounded & predictable runs:** Built-in volume caps and pay-per-result budget guards prevent runaway agent tool loops.
- **RAG & automation ready:** Stream run datasets straight into vector stores, n8n, Make, Zapier, or webhook pipelines.

### 💬 Support, Issues & Reviews

- **Bug reports & target-site changes:** Hit an unexpected empty result or selector change? [Open a ticket in the Issues tab](https://apify.com/logiover/pisos-com-property-scraper/issues) with your **Run ID** or sample input — we actively monitor issues and ship fixes fast.
- **Feature & field requests:** Need an additional data attribute or filter? [Request it in the Issues tab](https://apify.com/logiover/pisos-com-property-scraper/issues).
- **Enjoying this Actor?** If it saved you engineering time, please consider leaving an honest [review on Apify Store](https://apify.com/logiover/pisos-com-property-scraper/reviews) or bookmarking [logiover/pisos-com-property-scraper](https://apify.com/logiover/pisos-com-property-scraper) — organic developer feedback helps others discover reliable tools and keeps maintenance prioritized.

### ⚖️ Legal

This Actor extracts only publicly available data and is intended for legitimate research, analytics and lead-generation use. You are responsible for complying with Pisos.com's terms of service, robots.txt, GDPR and any applicable local laws.

***

This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Pisos.com; Pisos.com and all other trademarks mentioned here are the property of their respective owners.

### Pisos.com scraping — frequently asked questions

#### Do I need a Pisos.com API key, account or login?

No. This Actor reads publicly available pages and feeds, so there is nothing to register for and no credentials to manage.

#### How do I export Pisos.com data to CSV, Excel, JSON or Google Sheets?

Open the **Storage** tab after a run and pick the format you want — CSV, Excel, JSON, XML or an HTML table. For Google Sheets, Airtable or a database, use the dataset URL or the Apify API so the sheet refreshes itself on every run.

#### Can I schedule this Pisos.com scraper to run daily or hourly?

Yes. Use the **Schedules** tab and pick a cadence. Daily is enough for most tracking work; pick hourly only if the listings you care about really do change that fast.

#### How many listings can I get, and what does it cost?

See the volume section above for a measured figure. Billing is per result, so you pay for the rows you actually receive and a run that finds nothing costs nothing.

#### Is scraping Pisos.com legal?

This Actor collects only information that Pisos.com publishes publicly. It does not log in, does not defeat access controls and does not touch private data. You remain responsible for how you use the output, including under GDPR and similar rules where personal data is involved.

#### What happens if Pisos.com blocks the run or changes its layout?

A refused exit IP is swapped for a fresh one within a quarter of a second and retried, and rate limiting is waited out rather than fought. If nothing gets through, the run **fails with the reason** instead of reporting success with zero rows — so an empty result always means "no matches", never "the source would not answer".

#### Can I use this with an AI agent, LangChain or an MCP client?

Yes. The Actor is callable over the Apify API and through Apify's MCP server, so an agent can run it and read the dataset back as a tool call.

### 📝 Changelog

#### 2026-11-14

- Verified live production health run (2026-11-14): extracted **13** structured records in **179.6s** with valid schema output.
- Hardened internal proxy stall fallback and pay-per-event dataset instance budget protection.

#### 2026-11-11

- Added reliable terminal run status telemetry and structured Apify AI / MCP Server (`mcp.apify.com`) tool configuration.
- Added direct Issues & Reviews support links and refreshed live maintenance verification.

#### 2026-11-01

- Monthly health check (2026-11-01): a live run on the current build completed successfully and returned data. Input options, output fields and pricing are unchanged.
- README refreshed: 1 link to retired Actors removed; independence disclaimer added; documented 2 additional input fields.

#### 2026-10-15

- Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
- A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
- A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
- Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.
- The prefilled example for `maxListings` is now 126 (was 30).
- The default used when the field is left out for `maxListings` is now 1,008 (was 200).
- The default used when the field is left out for `maxPages` is now 60 (was 20).

#### 2026-09-24

**Fixed the 26 columns that were always empty.** The Actor advertised detail-page
attributes but only ever parsed the search-results page, so every detail-only
column was hard-coded to `null` on every row.

- The Actor now opens each listing's own page (new **Fetch detail pages** input,
  on by default, 5 at a time) and reads the real values. Measured on 40 live
  Madrid / Barcelona / Valencia / Sevilla / Marbella / Toledo listings, these
  went from **0% to**: amenity flags `hasElevator`, `hasParking`, `hasGarage`,
  `hasTerrace`, `hasBalcony`, `hasAirConditioning`, `hasHeating`, `hasGarden`,
  `hasPool`, `hasStorage`, `hasFittedWardrobes`, `isFurnished` **100%**;
  `dateUpdated` **100%**; `buildingCondition` **82–100%**; `buildingAge`
  **82–83%**; `usableAreaSqm` **64–100%**; `orientation` **43–67%**;
  `energyClass` / `energyConsumption` / `energyEmissions` **25–43%**;
  `isExterior` **39%**; `terrainAreaSqm` **50% of houses/chalets** (flats have
  no plot, so it stays empty for them by design).
- Amenity flags are now `true`/`false` instead of `true`/empty. `false` means
  the advertiser did not list that amenity; an empty cell means the detail page
  could not be read, so empty never silently means "no".
- `labels` was empty because Pisos.com renamed its badge markup. Re-pointed at
  the current per-listing tag slot, so `labels` now returns real badges such as
  "Nuevo", plus a new `isNewListing` boolean. The page's other two badges are
  deliberately ignored: "TOP" is emitted for every single card and
  "Oportunidad" for every standard result slot, so neither says anything about
  an individual listing.
- Removed four columns the source does not publish at all, rather than keep
  shipping permanently empty (or permanently identical) headers:
  **`advertType`** (duplicated `advertiserType`, no separate source value),
  **`hasSeaView`** and **`isLuxury`** (no such attribute on Pisos.com — checked
  against coastal Benidorm and Marbella luxury listings), and **`isFeatured`**
  (Pisos.com marks every result as "TOP", so the flag could only ever be true
  for everything).
- Replaced two mislabelled columns with what the source actually publishes:
  **`yearBuilt` → `buildingAge`** (Pisos.com states an age band such as
  "Entre 30 y 50 años", never a construction year) and
  **`datePosted` → `dateUpdated`** (only the ad's last-updated date is
  published, never the original posting date).
- Detail fetching observes the existing wall-clock budget and stops opening new
  pages near the deadline, so results collected so far are always written out.
  A 30-listing Store-prefill run adds about 12 seconds.

#### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 65 columns returned, 55.9% of cells populated.
- Run reliability reviewed: 98.5% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.
- Noted that 26 column(s) came back empty in this sample (`advertType`, `usableAreaSqm`, `terrainAreaSqm`, `buildingCondition`, `yearBuilt`, `energyClass` and others); these are under review.

#### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

#### 2026-08-11

- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

#### 2026-08-03

- Fixed intermittent five-minute quality-test timeouts with a deterministic run deadline and bounded HTTP retries.
- Made restricted/proxy-off execution graceful instead of failing during proxy initialization.
- Kept normal output capacity unchanged; only the Store prefilled example was reduced to a fast 30-listing health run.

#### 2026-07-06

- ✨ README overhaul: richer 60+ field output sample, three ready-to-run example scenarios, full field reference, and an expanded cross-country real-estate suite.

#### 2026-07-01

- Maintenance pass: re-verified end-to-end on live data and confirmed successful runs within the 5-minute quality window on the default input.
- Sharpened Store metadata (SEO title & description) and expanded the FAQ with high-intent, long-tail questions for easier discovery in Google and Apify Store search.
- Added ready-to-run example tasks that cover common real-world use cases.

#### 2026-06-28

- Health check passed — Actor verified working end-to-end on the Apify platform.
- Changelog refreshed for Store quality compliance.

#### 2026-06-20

- Maintenance & reliability pass: re-verified end-to-end against live data and confirmed the Actor completes successfully within the 5-minute quality window on the default input.
- Refreshed the prefilled example input and tuned run defaults for faster, lower-cost runs.

#### 2026-06-15

- Reliability pass: re-verified end-to-end on live data with real-world inputs. Routine maintenance build.

#### 2026-06-07

- Docs: added coverage for using the Actor as a Pisos.com unofficial API alternative, exporting Spain real estate data to CSV/JSON, and scraping Pisos.com without an API key or login.

#### 2026-06-05

- 🛡️ Reliability fix: results are no longer dropped by strict output validation — runs now complete cleanly even at high volume (thousands of results).
- ⚡ Stability & performance hardening; fresh rebuild.

#### 2026-06-04

- Verified live & refreshed build — reliability/maintenance pass.

#### 2026-06-01

- Maintenance & reliability pass: pulled the latest source and rebuilt the Actor on the current base image; build verified.

***

\*Maintained: last verified 2026-11-14 — checked end-to-end against live run history (reliability, output fields and types, and time/memory budgets).

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/pisos-com-property-scraper/changelog.md

# Actor input Schema

## `transactionType` (type: `string`):

Sale (venta), rent (alquiler), or new development (promociones).

## `propertyType` (type: `string`):

Category of property to search.

## `location` (type: `string`):

Pisos.com location slug. Examples: 'madrid_capital', 'barcelona_capital', 'valencia_capital', 'sevilla_capital', 'malaga_capital', 'madrid', 'barcelona', 'valencia', 'sevilla', 'malaga', 'alicante', 'zaragoza', 'bilbao', 'cadiz', 'mallorca', 'espana' (all Spain). Use lowercase ASCII; replace spaces with underscore. Append '\_capital' for the city itself (e.g. 'madrid' = province, 'madrid_capital' = city).

## `sortBy` (type: `string`):

How to sort the results.

## `minPrice` (type: `integer`):

Minimum price in EUR. Applied client-side after fetching pages.

## `maxPrice` (type: `integer`):

Maximum price in EUR. Applied client-side.

## `minArea` (type: `integer`):

Minimum surface area in m². Applied client-side.

## `maxArea` (type: `integer`):

Maximum surface area in m². Applied client-side.

## `minRooms` (type: `integer`):

Minimum number of rooms (habitaciones). Applied client-side.

## `maxRooms` (type: `integer`):

Maximum number of rooms. Applied client-side.

## `advertiserType` (type: `string`):

Filter by advertiser type (client-side).

## `keyword` (type: `string`):

Optional keyword filter applied client-side to title and description.

## `maxListings` (type: `integer`):

Hard cap on number of listings saved.

## `maxPages` (type: `integer`):

Maximum search pages to crawl (safety cap). Pisos.com shows ~33 listings per page.

## `fetchDetails` (type: `boolean`):

Open each listing's own page to fill the detail-only columns: usable area, plot size, condition, building age, energy certificate, orientation and the amenity flags (lift, garage, terrace, pool, furnished…). These values exist ONLY on the detail page — turn this off for a faster, listing-page-only export and those columns will come back empty.

## `timeBudgetSecs` (type: `integer`):

Maximum wall-clock time used for fetching pages. Results collected before the deadline are preserved. Increase this for very large exports.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. Recommend RESIDENTIAL group with country=ES if you hit blocks.

## Actor input object example

```json
{
  "transactionType": "sale",
  "propertyType": "apartment",
  "location": "madrid_capital",
  "sortBy": "relevance",
  "advertiserType": "all",
  "maxListings": 126,
  "maxPages": 2,
  "fetchDetails": true,
  "timeBudgetSecs": 180,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All property listings scraped from Pisos.com by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "transactionType": "sale",
    "propertyType": "apartment",
    "location": "madrid_capital",
    "sortBy": "relevance",
    "advertiserType": "all",
    "maxListings": 126,
    "maxPages": 2,
    "fetchDetails": true,
    "timeBudgetSecs": 180,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ES"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/pisos-com-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "transactionType": "sale",
    "propertyType": "apartment",
    "location": "madrid_capital",
    "sortBy": "relevance",
    "advertiserType": "all",
    "maxListings": 126,
    "maxPages": 2,
    "fetchDetails": True,
    "timeBudgetSecs": 180,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ES",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/pisos-com-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "transactionType": "sale",
  "propertyType": "apartment",
  "location": "madrid_capital",
  "sortBy": "relevance",
  "advertiserType": "all",
  "maxListings": 126,
  "maxPages": 2,
  "fetchDetails": true,
  "timeBudgetSecs": 180,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}' |
apify call logiover/pisos-com-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/pisos-com-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/oFvugM3TTMIJ6vnoj/builds/5UqB5VAYkGxpvYH5u/openapi.json
