# Pisos.com Scraper (`solidcode/pisos-scraper`) Actor

\[💰 $2.2 / 1K] Extract Spanish property listings from pisos.com — sale and rental flats, houses, and new developments. Get price, size, rooms, bathrooms, address, GPS coordinates, energy rating, photos, and agency contact. Filter by location, operation, type, price, rooms, and size.

- **URL**: https://apify.com/solidcode/pisos-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Pisos.com Scraper

Pull property listings from pisos.com at scale — prices, price per m², size, rooms, bathrooms, addresses, GPS coordinates, energy ratings, photo galleries, and agency phone contacts for homes, offices, land, and commercial property across Spain. Search for sale (venta) or rent (alquiler) with structured filters, or paste any pisos.com URL. Built for property investors, real-estate agencies, and market researchers who need fresh Spanish listing data without copy-pasting from pisos.com page by page.

### Why This Scraper?

- **Nine property types, sale and rent** — flats/apartments, houses/chalets, new developments (obra nueva), offices, commercial premises, garages, land, storage rooms, and buildings, for both venta (buy) and alquiler (rent) in one actor.
- **Every Spanish province and city** — search Madrid, Barcelona, Valencia, or any town, province, or neighborhood; accented and multi-word names like "Málaga" and "Palma de Mallorca" are handled automatically.
- **Up to 3,000 listings per search** — page through pisos.com's full reachable window, then stack several locations or tighter filters to go well beyond that in a single run.
- **Price per m² on every row** — total sale price or monthly rent, divided by built area, so you get the €/m² comparison figure with no spreadsheet math.
- **Price, bedroom, bathroom, and size range filters** — narrow by minimum/maximum price, minimum bedrooms and bathrooms, and minimum/maximum size in m², all matched on pisos.com's search so you only collect — and pay for — listings that fit.
- **Agency name and phone on every listing** — the contact phone number is captured straight from the search card, no per-listing detail fetch required, making this a ready-made lead list.
- **Full descriptions, energy rating, and ~35 photos per property** — enable full details to add the complete Spanish listing description, the A–G energy-efficiency certificate letter, exact GPS coordinates, and every full-size photo URL.
- **Four sort orders** — order results by relevance, newest first, lowest price first, or highest price first before collection begins.
- **Paste-a-URL power mode** — copy any filtered pisos.com search or single-listing URL from your browser and collect exactly what you see, filters and all.

### Use Cases

**Market Research**
- Track asking prices and €/m² across provinces, cities, and neighborhoods
- Compare inventory levels between property types and regions
- Monitor new developments (obra nueva) entering a target market
- Benchmark rent vs. sale pricing in the same area

**Investment Analysis**
- Rank opportunities by price per square meter across ZIP-level areas
- Spot below-market listings with the "Lowest price first" sort
- Build comparables sets filtered by rooms, bathrooms, and size
- Assess energy ratings before factoring in renovation costs

**Lead Generation**
- Build agency contact lists with name and phone from every card
- Separate private-seller listings from professional agencies
- Target sellers by property type, price band, or location
- Feed fresh listings into a CRM as they appear

**Relocation & Real-Estate Services**
- Assemble shortlists for clients moving to a Spanish city
- Filter to family homes by minimum bedrooms and size
- Map candidate properties by exact coordinates
- Pull full descriptions and photo galleries for client presentations

**Price Monitoring**
- Re-run a saved search to track price changes over time
- Watch a specific neighborhood via a pasted URL
- Alert on newly listed properties with "Newest first"
- Track average €/m² trends by re-running the search on a schedule

### Getting Started

#### Simple Location Search

The quickest start — one city, default filters (for sale, all types):

```json
{
    "searchLocations": ["Madrid"],
    "maxResults": 50
}
````

#### Filtered Search (Price, Rooms, Type)

Three-bedroom flats for sale in Barcelona between €200,000 and €500,000:

```json
{
    "searchLocations": ["Barcelona"],
    "operationType": "sale",
    "propertyType": "flats",
    "priceMin": 200000,
    "priceMax": 500000,
    "minRooms": 3,
    "minBathrooms": 2,
    "sort": "price-asc",
    "maxResults": 200
}
```

#### Full Details from Pasted URLs

Collect a filtered search page and a single listing, enriched with descriptions, energy ratings, coordinates, and all photos:

```json
{
    "startUrls": [
        "https://www.pisos.com/venta/pisos-valencia/",
        "https://www.pisos.com/comprar/piso-gaztambide_madrid-64265666304_996957/"
    ],
    "includeDetails": true,
    "maxResults": 100
}
```

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchLocations` | string\[] | `["Madrid"]` | Spanish cities, towns, provinces, or neighborhoods to search (e.g. "Madrid", "Barcelona", "Valencia", "Malaga"). Each entry runs its own search using the filters below. Leave empty if you are pasting Start URLs instead. |
| `startUrls` | string\[] | `[]` | Power-user input. Paste pisos.com search-result URLs or individual listing URLs, copied from your browser after applying filters. When provided, these override Search Locations and the filters below — any filters in the URL are used as-is. |

#### Filters

Applied to Search Locations only. Ignored when Start URLs are provided.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `operationType` | select | `For Sale (Venta)` | Buy or rent: For Sale (Venta) or For Rent (Alquiler). |
| `propertyType` | select | `All Types` | Property category: All Types, Flats / Apartments (Pisos), Houses / Chalets (Casas), New Developments (Obra Nueva), Offices (Oficinas), Commercial Premises (Locales / Naves), Garages (Garajes), Land / Plots (Terrenos), Storage Rooms (Trasteros), or Buildings (Edificios). |
| `priceMin` | integer | null | Only include listings at or above this price in euros (total sale price, or monthly rent for rentals). |
| `priceMax` | integer | null | Only include listings at or below this price in euros. |
| `minRooms` | integer | null | Only include properties with at least this many bedrooms (0–10; 0 = studio / no bedroom filter). |
| `minBathrooms` | integer | null | Only include properties with at least this many bathrooms (0–10). |
| `sizeMin` | integer | null | Only include properties with at least this built area in square meters. |
| `sizeMax` | integer | null | Only include properties with at most this built area in square meters. |
| `sort` | select | `Relevance` | Result order: Relevance, Newest first, Lowest price first, or Highest price first. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum listings to collect across all searches and URLs combined. Set to 0 for unlimited. Collected in full pages of about 30, so the final page may overshoot slightly. A single broad location search tops out near a few thousand results — add filters or search several locations to reach more. Start with 10–50 to test. |
| `includeDetails` | boolean | `false` | Visit each property's own page to add the full description, all photos, energy certificate rating, listing reference, floor, features, and exact coordinates. Leave off for a faster, cheaper run — the standard fields (price, price per m², size, rooms, baths, address, cover photo, agency) are always included. |

### Output

Each listing is one flat row. Here's a representative result with full details enabled:

```json
{
    "listingId": "64265666304",
    "url": "https://www.pisos.com/comprar/piso-gaztambide_madrid-64265666304_996957/",
    "operationType": "sale",
    "title": "Piso en venta en Gaztambide",
    "price": 575000,
    "priceCurrency": "EUR",
    "pricePerSqm": 3710,
    "propertyType": "flat",
    "isNewDevelopment": false,
    "rooms": 3,
    "bathrooms": 2,
    "areaSqm": 155,
    "floor": "4ª",
    "energyRating": "D",
    "features": ["Ascensor", "Aire acondicionado: Sí", "Terraza"],
    "description": "Luminoso piso exterior reformado en el barrio de Gaztambide...",
    "reference": "VIV-2401",
    "location": "Gaztambide, Chamberí, Madrid Capital, Madrid",
    "neighborhood": "Gaztambide",
    "city": "Madrid Capital",
    "province": "Madrid",
    "postalCode": "28015",
    "country": "Spain",
    "latitude": 40.4361,
    "longitude": -3.7133,
    "coverImage": "https://fotos.imghs.net/xl-wp/1/2/3/example.jpg",
    "images": ["https://fotos.imghs.net/xl-wp/1/2/3/example.jpg"],
    "numPhotos": 34,
    "agencyName": "Princess Homes",
    "agencyPhone": "910000000",
    "agencyUrl": "https://www.pisos.com/inmobiliaria-princess_homes/",
    "agencyLogoUrl": "https://fotos.imghs.net/logos/example.png",
    "isPrivateSeller": false,
    "scrapedAt": "2026-07-16T14:30:00Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Unique pisos.com listing identifier |
| `url` | string | Direct pisos.com listing URL |
| `operationType` | string | `sale` or `rent` |
| `title` | string | Listing title (e.g. "Piso en venta en Gaztambide") |
| `propertyType` | string | Normalized category (flat, house, penthouse, duplex, studio, office, commercial, garage, land, storage, building, new-development) |
| `isNewDevelopment` | boolean | Whether the listing is a new development (obra nueva) |
| `price` | number | Total sale price, or monthly rent for rentals, in euros |
| `priceCurrency` | string | Always `EUR` |
| `pricePerSqm` | number | Price divided by built area (€/m²) |
| `scrapedAt` | string | ISO timestamp of data extraction |

#### Property Details

| Field | Type | Description |
|-------|------|-------------|
| `rooms` | number | Number of bedrooms |
| `bathrooms` | number | Number of bathrooms |
| `areaSqm` | number | Built area in square meters |
| `floor` | string | Floor level (e.g. "4ª", "Bajo") |
| `energyRating` | string | A–G energy-efficiency certificate letter (full details only) |
| `reference` | string | Agency's internal listing reference (full details only) |
| `features` | string\[] | Free-form amenities (lift, terrace, pool, parking, air conditioning, etc.; full details only) |
| `description` | string | Full listing description text (full details only) |
| `numPhotos` | number | Number of listing photos |

#### Location & Address

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | Human-readable location line |
| `neighborhood` | string | Neighborhood / district |
| `city` | string | City |
| `province` | string | Province |
| `postalCode` | string | 5-digit Spanish postal code (when available) |
| `country` | string | Always `Spain` |
| `latitude` | number | Latitude (exact on full-detail rows) |
| `longitude` | number | Longitude (exact on full-detail rows) |

#### Media

| Field | Type | Description |
|-------|------|-------------|
| `coverImage` | string | Full-size cover photo URL |
| `images` | string\[] | All full-size photo URLs, deduped (full details only) |

#### Agency Contact

| Field | Type | Description |
|-------|------|-------------|
| `agencyName` | string | Listing agency name |
| `agencyPhone` | string | Agency contact phone number |
| `agencyUrl` | string | Agency profile URL on pisos.com |
| `agencyLogoUrl` | string | Agency logo image URL |
| `isPrivateSeller` | boolean | `true` for a private seller, `false` for a professional agency |

### Tips for Best Results

- **Start small.** Set `maxResults` to 10–50 on your first run to confirm the data matches your needs, then scale up.
- **Beat the 3,000-per-search ceiling.** A single broad location search tops out near 3,000 listings — split into several locations, or add price, room, and size filters, to collect more of the market.
- **Enable full details only when you need them.** The standard fields (price, price per m², size, rooms, baths, address, cover photo, agency name and phone) come on every run. Turn on full details for descriptions, energy ratings, all photos, and exact coordinates — it's slower and costs more per listing.
- **Type accented and multi-word locations naturally.** "Málaga", "A Coruña", and "Palma de Mallorca" all work — accents are handled for you. If a very specific district returns nothing, fall back to the parent city or province.
- **Paste a URL for filters we don't expose.** Apply any filter on pisos.com in your browser, copy the URL into Start URLs, and the actor collects exactly that view — the easiest way to target a single neighborhood or a niche filter.
- **Your price and size limits are guaranteed.** pisos.com's own maximum-price filter is loosely enforced, so the actor also enforces your min/max price and max size on the results — listings never exceed the bounds you set.
- **Pick the right sort.** Use "Lowest price first" for deal-hunting or "Newest first" to catch just-listed properties before the wider market reacts.

### Pricing

**From $2.20 per 1,000 results** — competitive with the market for Spanish real-estate data, with agency phone contacts and price-per-m² included at no extra charge. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.26 | $0.245 | $0.235 | $0.22 |
| 1,000 | $2.60 | $2.45 | $2.35 | $2.20 |
| 10,000 | $26.00 | $24.50 | $23.50 | $22.00 |
| 100,000 | $260.00 | $245.00 | $235.00 | $220.00 |

A "result" is any listing row in the output dataset. Platform fees are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate real estate research, market analysis, and lead generation. Users are responsible for complying with applicable laws and pisos.com's Terms of Service. Do not use extracted data for spam, harassment, or any illegal purpose. Handle any personal or agency contact data in line with GDPR and applicable data-protection rules.

# Actor input Schema

## `searchLocations` (type: `array`):

Spanish cities, towns, provinces, or neighborhoods to search (e.g. 'Madrid', 'Barcelona', 'Valencia', 'Malaga'). Each entry runs its own search using the filters below. Each single location search returns up to about 3,000 listings (pisos.com's own limit) — to collect more, split a big area into several smaller locations or add price/room/size filters. Leave empty if you are pasting Start URLs instead.

## `startUrls` (type: `array`):

Power-user input. Paste pisos.com search-result URLs (e.g. https://www.pisos.com/venta/pisos-madrid/) or individual listing URLs, copied from your browser after applying filters. When provided, these override the Search Locations and Filters below — any filters in the URL are used as-is.

## `operationType` (type: `string`):

Buy or rent. Ignored when Start URLs are provided.

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

Filter by property category. Choose 'All Types' to include everything.

## `priceMin` (type: `integer`):

Only include listings at or above this price in euros (total sale price, or monthly rent for rentals). Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only include listings at or below this price in euros. Leave empty for no maximum.

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

Only include properties with at least this many bedrooms (0 = studio / no bedroom filter). Leave empty for no minimum.

## `minBathrooms` (type: `integer`):

Only include properties with at least this many bathrooms. Leave empty for no minimum.

## `sizeMin` (type: `integer`):

Only include properties with at least this built area in square meters. Leave empty for no minimum.

## `sizeMax` (type: `integer`):

Only include properties with at most this built area in square meters. Leave empty for no maximum.

## `sort` (type: `string`):

How pisos.com orders results before we collect them.

## `maxResults` (type: `integer`):

Maximum number of listings to collect across all searches and URLs combined. Set to 0 for unlimited (unlimited is still capped at an internal safety limit of 100,000 listings per run). Results are collected in full pages of about 30, so the final page may overshoot this cap by a few records. A single broad location search tops out near 3,000 results on pisos.com — add price, room, or size filters (or search several locations) to reach more. Tip: start with 10-50 to test, then increase.

## `includeDetails` (type: `boolean`):

Visit each property's own page to add the full description, all photos, energy certificate rating, listing reference, floor, features (lift, terrace, pool, parking), and exact coordinates. Leave off for a faster, cheaper run — the standard fields (price, price per m², size, rooms, baths, address, cover photo, agency) are always included.

## Actor input object example

```json
{
  "searchLocations": [
    "Madrid"
  ],
  "startUrls": [],
  "operationType": "sale",
  "propertyType": "all",
  "sort": "relevance",
  "maxResults": 100,
  "includeDetails": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped property listings with key fields — price, size, rooms, baths, type, location, agency, and listing URL.

## `details` (type: `string`):

Full per-listing fields including description, all photos, energy rating, features, reference, coordinates, agency contact, and timestamps.

# 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 = {
    "searchLocations": [
        "Madrid"
    ],
    "startUrls": [],
    "operationType": "sale",
    "propertyType": "all",
    "sort": "relevance",
    "maxResults": 100,
    "includeDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/pisos-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 = {
    "searchLocations": ["Madrid"],
    "startUrls": [],
    "operationType": "sale",
    "propertyType": "all",
    "sort": "relevance",
    "maxResults": 100,
    "includeDetails": False,
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchLocations": [
    "Madrid"
  ],
  "startUrls": [],
  "operationType": "sale",
  "propertyType": "all",
  "sort": "relevance",
  "maxResults": 100,
  "includeDetails": false
}' |
apify call solidcode/pisos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/pisos-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Pisos.com Scraper",
        "description": "[💰 $2.2 / 1K] Extract Spanish property listings from pisos.com — sale and rental flats, houses, and new developments. Get price, size, rooms, bathrooms, address, GPS coordinates, energy rating, photos, and agency contact. Filter by location, operation, type, price, rooms, and size.",
        "version": "1.0",
        "x-build-id": "hz4e7TmAyHXvbLc8H"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~pisos-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-pisos-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~pisos-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-pisos-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~pisos-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-pisos-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchLocations": {
                        "title": "Search Locations",
                        "type": "array",
                        "description": "Spanish cities, towns, provinces, or neighborhoods to search (e.g. 'Madrid', 'Barcelona', 'Valencia', 'Malaga'). Each entry runs its own search using the filters below. Each single location search returns up to about 3,000 listings (pisos.com's own limit) — to collect more, split a big area into several smaller locations or add price/room/size filters. Leave empty if you are pasting Start URLs instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Power-user input. Paste pisos.com search-result URLs (e.g. https://www.pisos.com/venta/pisos-madrid/) or individual listing URLs, copied from your browser after applying filters. When provided, these override the Search Locations and Filters below — any filters in the URL are used as-is.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "operationType": {
                        "title": "Operation",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Buy or rent. Ignored when Start URLs are provided.",
                        "default": "sale"
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "all",
                            "flats",
                            "houses",
                            "new-development",
                            "offices",
                            "commercial",
                            "garages",
                            "land",
                            "storage",
                            "buildings"
                        ],
                        "type": "string",
                        "description": "Filter by property category. Choose 'All Types' to include everything.",
                        "default": "all"
                    },
                    "priceMin": {
                        "title": "Minimum Price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings at or above this price in euros (total sale price, or monthly rent for rentals). Leave empty for no minimum."
                    },
                    "priceMax": {
                        "title": "Maximum Price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings at or below this price in euros. Leave empty for no maximum."
                    },
                    "minRooms": {
                        "title": "Minimum Bedrooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only include properties with at least this many bedrooms (0 = studio / no bedroom filter). Leave empty for no minimum."
                    },
                    "minBathrooms": {
                        "title": "Minimum Bathrooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only include properties with at least this many bathrooms. Leave empty for no minimum."
                    },
                    "sizeMin": {
                        "title": "Minimum Size (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include properties with at least this built area in square meters. Leave empty for no minimum."
                    },
                    "sizeMax": {
                        "title": "Maximum Size (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include properties with at most this built area in square meters. Leave empty for no maximum."
                    },
                    "sort": {
                        "title": "Sort Order",
                        "enum": [
                            "relevance",
                            "newest",
                            "price-asc",
                            "price-desc"
                        ],
                        "type": "string",
                        "description": "How pisos.com orders results before we collect them.",
                        "default": "relevance"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to collect across all searches and URLs combined. Set to 0 for unlimited (unlimited is still capped at an internal safety limit of 100,000 listings per run). Results are collected in full pages of about 30, so the final page may overshoot this cap by a few records. A single broad location search tops out near 3,000 results on pisos.com — add price, room, or size filters (or search several locations) to reach more. Tip: start with 10-50 to test, then increase.",
                        "default": 100
                    },
                    "includeDetails": {
                        "title": "Include Full Property Details",
                        "type": "boolean",
                        "description": "Visit each property's own page to add the full description, all photos, energy certificate rating, listing reference, floor, features (lift, terrace, pool, parking), and exact coordinates. Leave off for a faster, cheaper run — the standard fields (price, price per m², size, rooms, baths, address, cover photo, agency) are always included.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
