# Immobiliare.it Scraper — Italy Property Data & API (`sian.agency/immobiliare-property-scraper`) Actor

Immobiliare.it scraper & real estate data API for Italy's #1 property portal. Sale & rent listings in every city: price, size, rooms, baths, floor, address, GPS, photos, agency, energy class — clean JSON/CSV. Fast overview or full detail. No-code, no immobiliare.it API key needed.

- **URL**: https://apify.com/sian.agency/immobiliare-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 3 total users, 1 monthly users, 88.9% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 overview listings

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Immobiliare.it Scraper — Italy Property Data & API 🇮🇹🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Smart Idealista Scraper](https://img.shields.io/badge/Store-Smart%20Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) [![Dubai Real Estate Scraper](https://img.shields.io/badge/Store-Dubai%20Real%20Estate-93D500)](https://apify.com/sian.agency/bayut-property-scraper?fpr=sian) [![Redfin Property Scraper](https://img.shields.io/badge/Store-Redfin%20Property%20Scraper-A02021)](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian)

#### 🎉 The fast, no-code Immobiliare.it data API — scrape ~90% of useful fields essentially free, no immobiliare.it API key required
##### Built for property investors, agents, proptech teams, and market researchers who need clean Italian real-estate data — for sale and for rent — across every city in Italy.

### 📋 Overview

**Pull listings from Immobiliare.it — Italy's #1 property portal — as clean JSON or CSV.** For sale (*vendita*) and for rent (*affitto*), across Milano, Roma, Torino, Napoli, Firenze and every comune in Italy. Pick the depth that fits the job: a fast, low-cost overview scan for sizing a market, or the full per-property record.

**Why investors and agents choose us:**
- ⚡ **Two depths, one actor**: a fast Overview scan for whole-market sweeps, or full Detail records when you need everything
- 🔁 **Detail = Overview + more**: every overview field is on a Detail row too, with deeper data added on top — never less
- 💰 **Pay-per-result pricing**: Overview from **$3 per 1,000 listings** — only charged for listings actually extracted
- 📐 **Analysis-ready**: price, size in m², rooms, baths, floor, **price-per-m²** and **GPS coordinates** on every row
- 🎯 **Three ways to search**: by city name, by a pasted Immobiliare.it search URL (your filters honored), or by specific listing URLs
- 💎 **No API key, no code**: no immobiliare.it API access needed — point, click, export a real-estate data feed
- 🆓 **Free to try**: up to 25 listings per run, no credit card

### ✨ Features

- 🧭 **Overview mode**: 25 listings per page — price, specs, location, agency, photo gallery — ideal for fast market sweeps
- 🔍 **Detail mode**: full per-listing record — energy class, construction year, condominium fees, complete feature list, hi-res photos
- 🗺️ **By place / search URL / listing URL**: type a city + sale/rent, paste an Immobiliare.it search link, or drop in specific listings
- 🎚️ **Filters**: contract (sale/rent), property type (apartments, villas, detached houses), price range, min rooms, min surface
- 📐 **Price-per-m² + thumbnail** computed on every row for instant comparison
- 📍 **GPS + full address** on every listing for mapping and territory analysis
- 📞 **Agent contact built in**: agency name, agent name and **phone** on every listing — instant lead lists
- 🧾 **Self-documenting datasets**: every row carries a `metadata` object recording the exact search settings that produced it
- 📤 **Clean exports**: JSON, CSV, Excel, or the full REST API

### 🎬 Quick Start

Pick a scrape depth, choose how to search, set filters, and run. Results stream to the Apify dataset as clean JSON/CSV.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~immobiliare-property-scraper/runs?token=[YOUR_TOKEN]" \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","places":["Milano"],"contract":"sale","maxResults":50}'
````

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick your scrape depth

**Overview** for a fast price + spec scan (25 listings/page), or **Detail** for the full per-property record.

#### Step 2: Choose how to search

**By place** (type a city like `Milano` + sale/rent), **By search URL** (paste an Immobiliare.it search link — filters honored), or **By listing URL** (detail mode — drop in specific listings).

#### Step 3: Set filters & run

Property type, price range, min rooms, min surface, Max results — then hit **Start**.

**That's it! In under a minute, you'll have:**

- A clean dataset of Italian property listings (JSON / CSV / Excel)
- Price, size, rooms, GPS, agency and price-per-m² on every row
- A repeatable, no-code real-estate data feed

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast & cheap) or `detail` (full fields). Default `overview`. |
| searchMode | string | No | `byPlace`, `bySearchUrl`, or `byListingUrl` (detail only). |
| places | array | No | City / comune names, e.g. `["Milano","Roma"]` (byPlace). |
| contract | string | No | `sale` (vendita) or `rent` (affitto). Default `sale`. |
| propertyType | string | No | `appartamenti`, `ville`, `case-indipendenti`, or empty for all. |
| searchUrls | array | No | Immobiliare.it search URLs (bySearchUrl) — on-page filters honored. |
| listingUrls | array | No | Listing URLs or IDs (detail / byListingUrl). |
| maxResults | integer | No | Max listings this run. FREE tier capped at 25. |
| minPrice / maxPrice | integer | No | Price range filter (€). |
| minRooms / minSurface | integer | No | Minimum rooms / surface (m²). |

**Example — by place:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "places": ["Milano", "Roma"],
  "contract": "sale",
  "propertyType": "appartamenti",
  "maxPrice": 500000,
  "maxResults": 200
}
```

**Example — by search URL:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.immobiliare.it/vendita-ville/roma/"],
  "maxResults": 100
}
```

### 📤 Output

Results are saved to the Apify dataset with **30+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| propertyTitle | string | Listing title |
| url | string | Listing URL |
| contract | string | `sale` or `rent` |
| typology | string | Property type (Appartamento, Villa, …) |
| price | number | Asking price (€) |
| price\_per\_sqm\_eur | number | Price per m² (computed) |
| surface\_sqm | number | Surface area (m²) |
| rooms / bedrooms / bathrooms | number | Room counts |
| floor / elevator | string / bool | Floor + lift |
| city / province / region | string | Location rollup |
| address / latitude / longitude | string / number | Address + GPS |
| agency\_name / agent\_name / agency\_phone | string | Agency + agent contact |
| agency\_id / agency\_url / is\_private | int / string / bool | Seller |
| energy\_class | string | *(detail)* energy efficiency class |
| building\_year | number | *(detail)* construction year |
| condominium\_expenses | string | *(detail)* monthly condo fees |
| features / photos / thumbnail | array / string | Amenities + photo gallery |

**Example:**

```json
{
  "id": 128819432,
  "propertyTitle": "Quadrilocale via Alessandro Stradella, Milano",
  "url": "https://www.immobiliare.it/annunci/128819432/",
  "contract": "sale",
  "typology": "Appartamento",
  "price": 1300000,
  "price_per_sqm_eur": 8667,
  "surface_sqm": 150,
  "rooms": 4,
  "bathrooms": 2,
  "floor": "2°, con ascensore",
  "city": "Milano",
  "province": "Milano",
  "region": "Lombardia",
  "address": "Via Alessandro Stradella",
  "latitude": 45.4786,
  "longitude": 9.216,
  "agency_name": "Agenzia Elle B Immobiliare",
  "agent_name": "Laura Barletta",
  "agency_phone": "0481 375481",
  "energy_class": "A",
  "building_year": 1920,
  "condominium_expenses": "€ 235/mese",
  "photo_count": 23
}
```

### 💼 Use Cases & Examples

#### 1. Market research & price benchmarking

**Analysts sizing a city or neighbourhood market.**
**Input:** `byPlace` Milano, sale, all residential. **Output:** thousands of listings with price-per-m². **Use:** build a live price index per zone.

#### 2. Investment sourcing

**Investors hunting undervalued stock.**
**Input:** `byPlace` + `maxPrice` + `minSurface`. **Output:** filtered listings with €/m² and GPS. **Use:** rank deals by price-per-m² vs zone median.

#### 3. Lead generation for agents

**Agents building a private-seller / agency contact list.**
**Input:** Overview scan of a target area. **Output:** `agency_name` + `is_private` on every row. **Use:** prospecting and competitive coverage.

#### 4. Proptech & valuation data feeds

**Proptech teams powering AVMs and dashboards.**
**Input:** scheduled `bySearchUrl` runs. **Output:** a clean, repeatable Italian real-estate data feed. **Use:** feed models without an immobiliare.it API.

#### 5. Relocation & buyer search

**Relocation services shortlisting homes for clients.**
**Input:** `byPlace` + filters + Detail mode. **Output:** full records with photos, energy class, condo fees. **Use:** curated client shortlists.

#### 6. Comparative market analysis (CMA)

**Appraisers preparing valuations.**
**Input:** Detail mode on a set of comparable listings. **Output:** building year, energy class, full features. **Use:** defensible CMA inputs.

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/immobiliare-property-scraper').call({
  scrapeMode: 'overview', searchMode: 'byPlace', places: ['Milano'], contract: 'sale', maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/immobiliare-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byPlace', 'places': ['Milano'], 'contract': 'sale', 'maxResults': 50}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~immobiliare-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","places":["Milano"],"contract":"sale","maxResults":50}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule (e.g. daily) or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet/DB, notify, or transform

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay-per-result: only charged for listings actually extracted
- Overview and Detail priced separately so you only pay for the depth you use

💰 **Overview from $3 per 1,000 listings** — Detail priced separately for the full per-property record.

🔗 [View current pricing](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: How many listings can I extract?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: Do I need an Immobiliare.it API key?**
A: No. There's no setup and no immobiliare.it account or API key required.

**Q: What's the difference between Overview and Detail?**
A: Overview is a fast, low-cost scan covering ~90% of useful fields. Detail adds energy class, construction year, condominium fees, the complete feature list and hi-res photos — and includes everything Overview returns.

**Q: Can I use my own Immobiliare.it search filters?**
A: Yes — paste your search URL in `bySearchUrl` mode and the on-page filters (type, price, etc.) are honored.

**Q: What output formats are available?**
A: JSON, CSV, Excel — export directly from the Apify dataset.

**Q: Does it work for both sale and rent?**
A: Yes — set `contract` to `sale` (vendita) or `rent` (affitto).

**Q: Is this legal?**
A: We only extract publicly available data. See the legal note below.

### 🐛 Troubleshooting

**No results returned**

- Check the city name spelling (e.g. `Milano`, not `Milan`), or paste a working Immobiliare.it search URL instead.
- Loosen filters — an overly tight price/surface range can return zero listings.

**Property type filter seems ignored**

- Use a supported type (`appartamenti`, `ville`, `case-indipendenti`) or leave it empty for all residential.

**Fewer results than expected**

- FREE tier is capped at 25 listings per run. Upgrade to PAID for unlimited, or raise `maxResults`.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

*This is an independent tool and is not affiliated with, endorsed by, or sponsored by Immobiliare.it or its parent company. "Immobiliare.it" is a trademark of its respective owner.*

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue from the actor page
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

⚡ **OVERVIEW** — fast, cheap, ungated. Pulls ~90% of fields straight from immobiliare.it's listings API (price, size, rooms, baths, floor, address, GPS, photos, agency).

🔍 **DETAIL** — full fields per listing (energy class, build year, condominium fees, complete feature list, hi-res photos). Slower and priced higher per result.

**TIP:** Start with Overview — upgrade to Detail only when you need the extra fields.

## `searchMode` (type: `string`):

🧭 How to tell the scraper what to fetch:

- **By place** — type one or more city / municipality names (e.g. "Milano", "Roma"). Combine with the filters below.
- **By search URL** — paste an immobiliare.it search results URL; every on-page filter in the URL is honored.
- **By listing URL/ID** — Detail mode only: paste listing URLs or bare IDs to fetch specific properties.

## `places` (type: `array`):

📍 City / municipality names, e.g. "Milano", "Roma". Used when **Search by = By place**.

**TIP:** Add several at once — each place is searched in turn until **Max results** is reached.

## `contract` (type: `string`):

🏷️ **Sale** (vendita) or **Rent** (affitto). Applies to By place searches.

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

🏠 Filter By place searches by typology. Leave on **All residential** for everything.

## `searchUrls` (type: `array`):

🔗 immobiliare.it search-results URLs to scrape. Used when **Search by = By search URL**.

**TIP:** Build any search on immobiliare.it (set your filters, sort order, map area), then copy the URL from the address bar — every on-page filter is honored.

**BULK EDIT:** Click "Bulk edit" to paste many URLs, one per line.

## `listingUrls` (type: `array`):

🆔 **Detail mode only.** immobiliare.it listing URLs (e.g. https://www.immobiliare.it/annunci/12345/) or bare numeric IDs.

**BULK EDIT:** Click "Bulk edit" to paste many URLs/IDs, one per line.

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

🔢 Maximum listings to extract this run.

- **FREE tier:** capped at 25 listings per run.
- **PAID tier:** unlimited — set as high as you need.

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

💶 Optional. Minimum price filter (By place mode).

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

💶 Optional. Maximum price filter (By place mode).

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

🚪 Optional. Minimum number of rooms (By place mode).

## `minSurface` (type: `integer`):

📐 Optional. Minimum surface area in m² (By place mode).

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "places": [
    "Milano",
    "Roma"
  ],
  "contract": "sale",
  "propertyType": "",
  "searchUrls": [
    "https://www.immobiliare.it/vendita-ville/roma/"
  ],
  "listingUrls": [
    "https://www.immobiliare.it/annunci/128819432/"
  ],
  "maxResults": 100
}
```

# Actor output Schema

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

Scraped immobiliare.it listings (JSON/CSV/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 = {
    "places": [
        "Milano"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/immobiliare-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 = { "places": ["Milano"] }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/immobiliare-property-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 '{
  "places": [
    "Milano"
  ]
}' |
apify call sian.agency/immobiliare-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Immobiliare.it Scraper — Italy Property Data & API",
        "description": "Immobiliare.it scraper & real estate data API for Italy's #1 property portal. Sale & rent listings in every city: price, size, rooms, baths, floor, address, GPS, photos, agency, energy class — clean JSON/CSV. Fast overview or full detail. No-code, no immobiliare.it API key needed.",
        "version": "1.0",
        "x-build-id": "EMfTJ2JFrCbNT5cBl"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~immobiliare-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-immobiliare-property-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/sian.agency~immobiliare-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-immobiliare-property-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/sian.agency~immobiliare-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-immobiliare-property-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": {
                    "scrapeMode": {
                        "title": "⚡ Scrape mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "⚡ **OVERVIEW** — fast, cheap, ungated. Pulls ~90% of fields straight from immobiliare.it's listings API (price, size, rooms, baths, floor, address, GPS, photos, agency).\n\n🔍 **DETAIL** — full fields per listing (energy class, build year, condominium fees, complete feature list, hi-res photos). Slower and priced higher per result.\n\n**TIP:** Start with Overview — upgrade to Detail only when you need the extra fields.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🧭 Search by",
                        "enum": [
                            "byPlace",
                            "bySearchUrl",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "🧭 How to tell the scraper what to fetch:\n\n- **By place** — type one or more city / municipality names (e.g. \"Milano\", \"Roma\"). Combine with the filters below.\n- **By search URL** — paste an immobiliare.it search results URL; every on-page filter in the URL is honored.\n- **By listing URL/ID** — Detail mode only: paste listing URLs or bare IDs to fetch specific properties.",
                        "default": "byPlace"
                    },
                    "places": {
                        "title": "📍 Places",
                        "type": "array",
                        "description": "📍 City / municipality names, e.g. \"Milano\", \"Roma\". Used when **Search by = By place**.\n\n**TIP:** Add several at once — each place is searched in turn until **Max results** is reached.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "contract": {
                        "title": "🏷️ Contract",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "🏷️ **Sale** (vendita) or **Rent** (affitto). Applies to By place searches.",
                        "default": "sale"
                    },
                    "propertyType": {
                        "title": "🏠 Property type (optional)",
                        "enum": [
                            "",
                            "appartamenti",
                            "ville",
                            "case-indipendenti"
                        ],
                        "type": "string",
                        "description": "🏠 Filter By place searches by typology. Leave on **All residential** for everything.",
                        "default": ""
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "🔗 immobiliare.it search-results URLs to scrape. Used when **Search by = By search URL**.\n\n**TIP:** Build any search on immobiliare.it (set your filters, sort order, map area), then copy the URL from the address bar — every on-page filter is honored.\n\n**BULK EDIT:** Click \"Bulk edit\" to paste many URLs, one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🆔 Listing URLs or IDs",
                        "type": "array",
                        "description": "🆔 **Detail mode only.** immobiliare.it listing URLs (e.g. https://www.immobiliare.it/annunci/12345/) or bare numeric IDs.\n\n**BULK EDIT:** Click \"Bulk edit\" to paste many URLs/IDs, one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 Maximum listings to extract this run.\n\n- **FREE tier:** capped at 25 listings per run.\n- **PAID tier:** unlimited — set as high as you need.",
                        "default": 100
                    },
                    "minPrice": {
                        "title": "💶 Min price (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💶 Optional. Minimum price filter (By place mode)."
                    },
                    "maxPrice": {
                        "title": "💶 Max price (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💶 Optional. Maximum price filter (By place mode)."
                    },
                    "minRooms": {
                        "title": "🚪 Min rooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "🚪 Optional. Minimum number of rooms (By place mode)."
                    },
                    "minSurface": {
                        "title": "📐 Min surface (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "📐 Optional. Minimum surface area in m² (By place mode)."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
