# Immobiliare.it 🏠 Scraper ⚡ (`nogards95/immobiliare-it-scraper`) Actor

Extract Italian real estate listings from Immobiliare.it as structured JSON: price, size, rooms, floor, seller type, agency contacts and coordinates. Sale, rent and new developments.

- **URL**: https://apify.com/nogards95/immobiliare-it-scraper.md
- **Developed by:** [Nogards](https://apify.com/nogards95) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.59 / 1,000 results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 — Italian Real Estate Listings

Property listings from Immobiliare.it, Italy's largest property portal
(annunci immobiliari) — apartments, houses, commercial units and new
developments, for sale, for rent or at auction — delivered as clean,
structured JSON.

### Who is this for

Real estate agencies tracking competitor inventory and pricing, property
investors running price-per-m² analysis across cities and zones, lead-generation
teams collecting agency contacts, and market researchers building housing
datasets for the Italian market.

### What you get

- Every listing with **price, size (m²), rooms, bathrooms, floor, typology**
  (bilocale, trilocale, attico, villa…) and macrozone/microzone — parsed into
  fields, not left as free text.
- **Seller identification** on each listing: agency (with name, profile page and
  phone), builder, or private.
- **Full location**: region, province, city, street, and coordinates.
- **Detail mode** adds the full description, energy class, heating and
  air-conditioning type, and the listing's publish and last-update dates.

### Sample output

```json
{
  "id": "98802932",
  "title": "Trilocale viale 25 Aprile 168, Cavoretto, Torino",
  "headline": "Luminoso attico affacciato su Torino e sulle montagne",
  "link": "https://www.immobiliare.it/annunci/98802932/",
  "listingType": "sale",
  "isNewDevelopment": false,
  "price": 420000,
  "priceText": "€ 420.000",
  "currency": "EUR",
  "typology": "Trilocale",
  "sizeSqm": 133,
  "rooms": 3,
  "bathrooms": 1,
  "bedrooms": 2,
  "floorText": "2 piani: Interrato (-2), 1°",
  "sellerType": "agency",
  "agencyName": "Da Proprietà",
  "agencyId": "236188",
  "agencyUrl": "https://www.immobiliare.it/pro/236188/236188/",
  "address": "Viale 25 Aprile",
  "city": "Torino",
  "province": "Torino",
  "region": "Piemonte",
  "macrozone": "Cavoretto, Gran Madre",
  "microzone": "Cavoretto",
  "latitude": 45.032,
  "longitude": 7.6928,
  "images": ["https://pwm.im-cdn.it/image/1232171856/large-c.jpg"],
  "imageCount": 16,
  "energyClass": "A",
  "publishedAt": "2024-11-14T09:00:00.000Z",
  "detailFetched": true
}
```

New developments come back with `isNewDevelopment: true`, `price: null`, and the
range in `priceMin` / `priceMax`.

### Input

| Field | Description |
|---|---|
| `location` | City or province name, e.g. `Milano`, `Roma`, `Napoli`. |
| `locationType` | `city` (default) or `province`. |
| `listingType` | `sale`, `rent` or `auction`. Default `sale`. |
| `propertyCategory` | `residential`, `commercial`, `rooms` or `newDevelopments`. |
| `minPrice` / `maxPrice` | Price bounds in EUR. |
| `minSizeSqm` / `maxSizeSqm` | Size bounds in m². |
| `minRooms` / `maxRooms` | Number of rooms. |
| `sortBy` | `relevance`, `latest`, `priceAsc`, `priceDesc`. |
| `maxItems` | How many listings to return. Up to 2,000 per search. Default 50. |
| `includeDetail` | Also fetch each listing's detail page (slower, priced higher). |
| `searchMode` / `searchUrl` | Set `searchMode` to `byUrl` and paste an Immobiliare.it search URL instead of a location. |

#### Example runs

```json
{ "location": "Milano", "listingType": "sale", "maxPrice": 400000, "minRooms": 3, "maxItems": 500 }
```

```json
{ "location": "Roma", "listingType": "rent", "maxItems": 200, "includeDetail": true }
```

```json
{ "searchMode": "byUrl", "searchUrl": "https://www.immobiliare.it/vendita-case/napoli/", "maxItems": 100 }
```

### Getting more than 2,000 results

Immobiliare.it caps any single search at roughly 2,000 results. To cover a large
city completely, run several searches split by price band (0–150k, 150–300k,
300–600k, 600k+) or by individual municipality, and combine the datasets.

### Technical notes

- Reads Immobiliare.it's listing data as JSON. No headless browser — fast and
  low cost.
- Repeated promoted listings are deduplicated within a run; you are never
  charged twice for the same property.
- Every attribute is optional on the source. Missing values come back as `null`,
  never as `0`.
- Coordinates and street are what the seller published; some listings withhold
  the exact address.
- Runs through Apify Proxy by default.

# Actor input Schema

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

Search by a location name, or by pasting a full Immobiliare.it search URL.

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

City or province name, e.g. Milano, Roma, Napoli. Used when search mode is 'By location'.

## `locationType` (type: `string`):

Whether the location above is a city (comune) or a whole province.

## `searchUrl` (type: `string`):

A full Immobiliare.it search-results URL (e.g. https://www.immobiliare.it/vendita-case/milano/). Used when search mode is 'By search URL'. Contract, category and filters are read from the URL.

## `listingType` (type: `string`):

For sale, for rent, or auction.

## `propertyCategory` (type: `string`):

Residential homes, commercial units, rooms, or new developments.

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

Only listings priced at or above this (EUR).

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

Only listings priced at or below this (EUR).

## `minSizeSqm` (type: `integer`):

Only listings of at least this floor area.

## `maxSizeSqm` (type: `integer`):

Only listings of at most this floor area.

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

Only listings with at least this many rooms.

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

Only listings with at most this many rooms.

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

Result ordering requested from Immobiliare.it.

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

How many listings to return. Immobiliare.it caps any single search at ~2,000 results; for a full large city, split the run by price band or municipality.

## `includeDetail` (type: `boolean`):

Also fetch each listing's detail page for the full description, energy class, heating type and publish/update dates. One extra request per listing — slower, and priced higher.

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

Apify Proxy. Datacenter rotation is enough — the API has no anti-bot layer.

## Actor input object example

```json
{
  "searchMode": "byLocation",
  "location": "Milano",
  "locationType": "city",
  "searchUrl": "https://www.immobiliare.it/vendita-case/milano/",
  "listingType": "sale",
  "propertyCategory": "residential",
  "sortBy": "relevance",
  "maxItems": 50,
  "includeDetail": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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": "Milano",
    "searchUrl": "https://www.immobiliare.it/vendita-case/milano/",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("nogards95/immobiliare-it-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": "Milano",
    "searchUrl": "https://www.immobiliare.it/vendita-case/milano/",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("nogards95/immobiliare-it-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": "Milano",
  "searchUrl": "https://www.immobiliare.it/vendita-case/milano/",
  "maxItems": 50
}' |
apify call nogards95/immobiliare-it-scraper --silent --output-dataset

```

## MCP server setup

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