# Immobiliare.it Scraper: Italy Property Listings (`reventadata/immobiliare-scraper`) Actor

Scrape Immobiliare.it homes for sale or rent in Italy by city, province or region slug. Price, surface, rooms, floor, address, coordinates, condition, photos, agency names and phones, agent contacts where listed. Filter by price, surface and rooms. Unofficial.

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

## Pricing

from $1.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.

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

## Immobiliare.it Scraper

> **Unofficial.** This Actor is not affiliated with, authorised by, endorsed by, or in any
> way officially connected to Immobiliare.it. "Immobiliare.it" is a trademark of its
> respective owner and is used here only to describe what this tool reads. It reads the same
> public search pages a browser does.

Immobiliare.it Scraper turns an Immobiliare.it search for homes for sale or for rent in Italy into a clean table: price, surface, rooms, floor, address and coordinates, photos, and the agency and agent who list the property.

### What does it do?

Give it a place (a city, province or region slug such as `torino`, `milano`, `lombardia`), sale or rent, and optional price, surface and rooms limits. It reads the search result pages and returns one row per ad.

### Why use it?

- **Seller contact:** agency name and phone on nearly every row, agent name and phone where the ad names a contact agent, and the seller type (agency, builder, private), exactly as the listing publishes them. Private sellers show no name or phone on the site, so none is returned.
- **Filters applied by the site:** price, surface and rooms limits and the price sort are sent to Immobiliare.it itself, so the rows you pay for already match.
- **Structured fields, not text:** numeric price and surface next to the text the site shows, coordinates, floor, condition, heating and feature tags.
- **Reaches a site that blocks plain scrapers:** pages are fetched through a third-party unblocking service that the Actor pays for; you need no proxy and no key of your own.

### How to use it

1. Choose `contract` (sale or rent) and the `location` slug. Copy the slug from an Immobiliare.it search URL (the part after `/vendita-case/` or `/affitto-case/`).
2. Optionally set price, surface and rooms limits and the sort.
3. Set `maxItems` and `maxPages`, run the Actor, and download the dataset as JSON, CSV or Excel.

**Limit of the site:** Immobiliare.it serves at most 80 pages (2,000 ads) for one search, even when it reports more ads. When a search is bigger, the Actor logs a warning; narrow it with a smaller location or the price, surface and rooms filters (for example one run per price band). Each page takes about 30 seconds, so a full 80-page search takes about 40 minutes.

#### Input

| Field | Type | Description |
|---|---|---|
| `contract` | string | `sale` or `rent`. |
| `location` | string | Location slug, for example `torino`. |
| `minPrice`, `maxPrice` | integer | Price limits in euros (monthly rent on rent searches). |
| `minSurface` | integer | Minimum surface in m². |
| `minRooms`, `maxRooms` | integer | Rooms (locali) limits. |
| `sortBy` | string | `relevance` (site default) or `priceAscending`. |
| `maxItems` | integer | Maximum rows to return. |
| `maxPages` | integer | Maximum result pages (25 ads each), up to 80. |

#### Sample Input

```json
{
    "contract": "sale",
    "location": "torino",
    "maxItems": 25,
    "maxPages": 1
}
```

#### Output

One row per ad. Main fields: `id`, `url`, `title`, `contract`, `price`, `priceText`, `typology`, `rooms`, `bedrooms`, `bathrooms`, `surfaceM2`, `floor`, `floorText`, `condition`, `heating`, `features`, `address`, `zone`, `neighbourhood`, `city`, `province`, `region`, `latitude`, `longitude`, `imageUrl`, `photos`, `agencyName`, `agencyType`, `agencyPhone`, `agencyUrl`, `agentName`, `agentType`, `agentPhone`, `priceOriginalText` and `priceReductionPercent` (reduced prices), `isProject` and `projectUnits` (new-development tiles that group several units), `transactionDate` (closed ads). Fields the ad does not give are null (empty lists for `features`, `photos` and the phone lists). Rooms and bathrooms can be ranges or open-ended (`5+`) because that is how the site writes them; `bedrooms` and `surfaceM2` are numbers when the site gives a single value. Photo links are small thumbnails.

#### Sample Output

A real row (Torino, for sale), with the description, most photo links and empty fields left out:

```json
{
    "id": "133462776",
    "url": "https://www.immobiliare.it/annunci/133462776/",
    "title": "Trilocale largo Orbassano 75, Crocetta, Torino",
    "contract": "sale",
    "price": 225000,
    "priceText": "€ 225.000",
    "typology": "Trilocale",
    "rooms": "3",
    "bedrooms": 2,
    "bathrooms": "1",
    "surfaceM2": 80,
    "floor": "4",
    "floorText": "4°, con ascensore",
    "hasElevator": true,
    "condition": "Ottimo / Ristrutturato",
    "features": ["balcone", "impianto tv centralizzato", "arredato", "cantina"],
    "address": "Largo Orbassano",
    "zone": "Crocetta, San Secondo",
    "city": "Torino",
    "province": "Torino",
    "region": "Piemonte",
    "latitude": 45.0528,
    "longitude": 7.6563,
    "photoCount": 25,
    "photos": ["https://pwm.im-cdn.it/image/2027101106/xxs-c.jpg", "https://pwm.im-cdn.it/image/2027101154/xxs-c.jpg"],
    "agencyName": "Immobilia San Paolo",
    "agencyType": "agenzia",
    "agencyPhone": "011 1852 4795",
    "agentName": "Pietro Adamo",
    "agentType": "agente immobiliare",
    "agentPhone": "011 1852 4795"
}
```

### Pricing

For current pricing and details, see the Store page.

### Privacy & Compliance

This Actor reads only publicly accessible search pages and returns the public data they show, including the agency and agent names and phone numbers the ads publish. It sends no login and returns nothing from behind a login.

# Actor input Schema

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

Homes for sale (vendita-case) or for rent (affitto-case).

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

The place as it appears in an immobiliare.it search URL after /vendita-case/ or /affitto-case/, for example "torino", "milano" or "lombardia". Copy it from a real search URL. An unknown slug stops the run with an error.

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

Optional. Sent to the site as its minimum price filter. On a rent search this is the monthly rent.

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

Optional. Sent to the site as its maximum price filter. On a rent search this is the monthly rent.

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

Optional. Sent to the site as its minimum surface filter.

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

Optional. Sent to the site as its minimum number of rooms (locali) filter.

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

Optional. Sent to the site as its maximum number of rooms (locali) filter.

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

The site's default relevance order, or price from lowest to highest.

## `maxItems` (type: `integer`):

Hard cap on rows pushed.

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

Cap on result pages fetched (25 ads each). The site serves at most 80 pages (2,000 ads) per search, so narrow big searches with a smaller location or the filters above. Each page is one paid unblocking request on the Actor's side and takes about 30 seconds.

## Actor input object example

```json
{
  "contract": "sale",
  "location": "torino",
  "sortBy": "relevance",
  "maxItems": 25,
  "maxPages": 1
}
```

# Actor output Schema

## `listings` (type: `string`):

Property listings: price, surface, rooms, floor, location, agency and agent and a link to the ad.

# 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 = {
    "location": "torino",
    "maxItems": 25,
    "maxPages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/immobiliare-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 = {
    "location": "torino",
    "maxItems": 25,
    "maxPages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("reventadata/immobiliare-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 '{
  "location": "torino",
  "maxItems": 25,
  "maxPages": 1
}' |
apify call reventadata/immobiliare-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reventadata/immobiliare-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/URS0ubLzJ1hVRUwCx/builds/rICfN6c5InOt0weU7/openapi.json
