# Immobiliare.it Scraper \[💰$0.60] | Italian Property Data (`ahmed_jasarevic/immobiliare-scraper`) Actor

Extract property listings from immobiliare.it (Italy's #1 portal): price, rooms, sqm, address + GPS, agency + phones, photos, floor, energy class and full descriptions. No API key needed.

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

## Pricing

from $0.60 / 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?

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 — Extract Italian Property Listings, Prices & Agency Data

Extract **property listings, prices, rooms, surface area, GPS coordinates, agency names, phone numbers, photos, floor, energy class, and full descriptions** from [immobiliare.it](https://www.immobiliare.it) — Italy's largest real-estate portal with over 1.3 million annual transactions. Build lead lists, monitor prices, and run market research across every Italian city — no API key needed.

#### What You Can Do

- **Italian real estate market research** — track asking prices, price per m², and inventory across Milano, Roma, Torino, Firenze, and every Italian comune
- **Property investment analysis** — compare sale vs rental yields, energy classes, and typologies across cities and neighborhoods
- **Agency lead generation** — collect agency names, profile URLs, and public phone numbers per area for outreach
- **Price monitoring** — schedule recurring runs to diff priceValue over time and detect new listings or price drops
- **Proptech data feeds** — feed CRM, pricing models, or dashboards with structured Italian real-estate data
- **Luxury & new-build tracking** — filter by typology and energy class to monitor premium segments

#### How It Works

1. Paste any immobiliare.it search URL (`/vendita-case/milano/`), a listing page (`/annunci/ID/`), or simply enter a city name
2. The Actor uses a Cheerio-based HTTP crawler with DataDome anti-bot bypass (TLS fingerprinting, session-cookie pooling, residential proxy rotation)
3. It parses embedded `__NEXT_DATA__` and `application/json` script blobs to reconstruct listing objects — no browser, no DOM scraping
4. Turn on **Fetch detail pages** to enrich each hit with full description, floor, energy class, all photos, GPS via JSON-LD, and agency data
5. Results stream into the default dataset — export as JSON, CSV, Excel, or via the Apify API

### Scrape Italian Property Listings for Market Research

Feed the Actor a city-and-contract search URL or fill in the City, Contract, and Category fields and it walks through immobiliare.it's paginated results, collecting ~25 listings per page. Enable detail-page fetching to enrich every record with full descriptions, energy classes, floor levels, and agency phone numbers.

### Extract Agency Contact Data for Lead Generation

Each listing row includes the agency name, profile URL, and — when available — public phone numbers. Enable **Fetch agency profiles** to follow agency pages and verify additional contact information. Build outreach lists for real-estate agents across Italian cities.

### Build a Home Services Database Without Official API Access

Immobiliare.it does not offer a public developer API for listing data. This Actor reverse-engineers the same JSON payloads the website renders, extracting structured property records from the data source that powers the portal — no login, no CAPTCHA solving, no browser automation overhead.

### Input Parameters

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `searchUrls` | `array` | No | Milano sale URL | Any immobiliare.it search, listing, or agency URL. Takes priority over Cities. |
| `cities` | `array` | No | — | City slugs (e.g. milano, roma, napoli). Used only when Search URLs is empty. |
| `contract` | `string` | No | `sale` | `sale` (vendita), `rent` (affitto), or `both` |
| `category` | `string` | No | `case` | URL category segment (case, appartamenti, ville, …) |
| `sort` | `string` | No | `relevance` | `relevance` or `newest` |
| `maxPages` | `integer` | No | `5` | Result pages per search (~25 listings each). Range: 1–200. |
| `maxListings` | `integer` | No | `100` | Hard cap on rows pushed to the dataset. 0 = no cap. |
| `includeAgencies` | `boolean` | No | `false` | Also collect agency cards for each searched city |
| `maxConcurrency` | `integer` | No | `3` | Simultaneous requests for HTML pages |
| `maxRequestRetries` | `integer` | No | `3` | Retries per request (anti-bot challenges rotate proxy sessions) |
| `maxRequestsPerCrawl` | `integer` | No | `500` | Absolute request budget for the whole run |
| `proxyConfiguration` | `object` | No | Residential IT | Only needed for detail/agency pages. DataDome blocks datacenter IPs. |

#### Example Input

```json
{
  "searchUrls": [{ "url": "https://www.immobiliare.it/vendita-case/milano/" }],
  "maxPages": 3,
  "maxListings": 50,
  "includeAgencies": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "IT" }
}
```

### Output Fields — Listings Dataset

| Field | Description |
|-------|-------------|
| `url` / `id` | Canonical listing URL and numeric immobiliare.it ID |
| `title` | Listing headline |
| `contract` | `sale` or `rent` |
| `price` / `priceValue` | Display price (e.g. "€ 4.000.000") and numeric euros |
| `typology` | e.g. Trilocale, Villa unifamiliare, Bilocale |
| `rooms` / `bathrooms` / `bedrooms` | Locali, bagni, camere |
| `sqm` | Surface area in m² |
| `floor` / `energyClass` / `heating` / `condition` | Piano, classe energetica, riscaldamento, stato |
| `address` / `city` / `province` / `region` / `neighborhood` | Full location hierarchy |
| `latitude` / `longitude` | GPS coordinates |
| `description` | Full advert text |
| `photos[]` | Full-resolution image URLs |
| `features[]` | Balcony, elevator, garage, views… |
| `agencyName` / `agencyUrl` / `agencyPhones[]` / `agentName` | Advertiser contact data |
| `detailFetched` | Whether the detail page was reached |

#### Example Output

```json
{
  "recordType": "LISTING",
  "id": 125884809,
  "url": "https://www.immobiliare.it/annunci/125884809/",
  "title": "Villa unifamiliare Parco Fuor del Vento 50, Alassio",
  "contract": "sale",
  "price": "€ 4.000.000",
  "priceValue": 4000000,
  "typology": "Villa unifamiliare",
  "rooms": "5+",
  "bathrooms": "3",
  "sqm": "316 m²",
  "floor": "1°",
  "energyClass": "D",
  "address": "Parco Fuor del Vento",
  "city": "Alassio",
  "province": "Savona",
  "latitude": 44.0092,
  "longitude": 8.1725,
  "agencyName": "Santandrea Luxury Houses - Alassio",
  "agencyPhones": ["0182 196 5503"],
  "photos": ["https://pwm.im-cdn.it/image/1847729683/r.jpg"],
  "description": "Nel cuore di Alassio...",
  "detailFetched": true
}
```

### Integrations & Automation

- **API** — call the Actor programmatically via the [Apify API](https://docs.apify.com/api) or the [Apify MCP server](https://mcp.apify.com)
- **Scheduling** — set up a daily or weekly schedule to monitor new listings and price changes
- **Webhooks** — receive a notification when a run completes
- **Zapier / Make / n8n** — connect to Google Sheets, Airtable, HubSpot, or your CRM for automated lead routing
- **Dataset exports** — download results as JSON, CSV, Excel, XML, or RSS

**Recommended schedule:** Run daily to monitor new listings, or weekly for market research snapshots across multiple cities.

#### Related Actors

- [Immobiliare.it Scraper by igolaizola](https://apify.com/igolaizola/immobiliare-it-scraper) — comprehensive Immobiliare.it scraper with auction data and province-level filtering
- [Casa.it Scraper by benthepythondev](https://apify.com/benthepythondev/casa-it-scraper) — Italy's second-largest portal for cross-portal market coverage
- [Subito.it Real Estate Scraper](https://apify.com/memo23/subito-real-estate-scraper) — Italian classifieds scraper for broader property data
- [Bayut Real Estate Scraper](https://apify.com/ahmed_jasarevic/bayut-scraper) — Dubai and UAE property data for international investors
- [Rightmove Property Scraper](https://apify.com/capeter/rightmove-scraper) — UK property data for European market comparison

### FAQ

#### Why use this Actor instead of the official Immobiliare.it API?

Immobiliare.it offers a paid Insights API for enterprise clients, but it requires a commercial agreement and is priced for institutional users. This Actor extracts the same structured listing data from publicly visible pages — no API key, no contract, no minimum spend. It's designed for individual investors, small teams, and researchers who need Italian real-estate data at a fraction of the cost.

#### What are alternatives to scraping Immobiliare.it for Italian property data?

Alternatives include Immobiliare.it's paid Insights API (enterprise pricing), Idealista.it (Spain/Italy/Portugal portal with its own API), Casa.it (Italy's second-largest portal), and Subito.it (Italian classifieds). For international investors, combining Immobiliare.it data with other European portals gives the best cross-market coverage.

#### How does this Actor handle Immobiliare.it's anti-bot protection?

Immobiliare.it uses DataDome (TLS fingerprinting + IP reputation + JS challenge). The Actor counters with TLS-fingerprinted HTTP requests, realistic desktop headers, session-cookie pooling, proxy-session rotation on retries, and low concurrency (2–4). All traffic goes through the Apify residential proxy group by default. No paid anti-bot API is required.

#### Can I scrape all listings in a specific Italian city?

Yes. Set `maxPages` high enough (each page yields ~25 listings) and `maxListings` to your target count. For example, setting `maxPages: 40` and `maxListings: 1000` will collect up to 1,000 listings across 40 search result pages.

#### Does this work for both sale and rent listings?

Yes. Set `contract` to `sale` (vendita), `rent` (affitto), or `both`. The Actor supports all property categories on immobiliare.it: apartments, houses, villas, offices, shops, warehouses, land, rooms, and new developments.

#### Can I scrape Immobiliare.it from outside Italy?

Yes, but detail pages require Italian residential proxies. The search API works from any location, but immobiliare.it's DataDome protection blocks datacenter IPs on detail pages. Keep `proxyConfiguration` set to the RESIDENTIAL group with `apifyProxyCountry: "IT"` for full coverage.

#### What happens if DataDome blocks a request?

The Actor automatically retries with a fresh proxy session. If you see challenge retries in the log, lower concurrency to 2 and ensure the residential proxy group is enabled.

### For AI Agents & LLM Apps

**Purpose:** Extract structured Italian property listings from immobiliare.it for market research, lead generation, or investment analysis.

**Minimal working input:**

```json
{
  "searchUrls": [{ "url": "https://www.immobiliare.it/vendita-case/milano/" }],
  "maxPages": 2,
  "maxListings": 20
}
```

**Variant — city-based search (no URL needed):**

```json
{
  "cities": ["roma"],
  "contract": "rent",
  "category": "appartamenti",
  "maxPages": 3,
  "maxListings": 50
}
```

**Output fields:** url, id, title, contract, price, priceValue, typology, rooms, bathrooms, sqm, floor, energyClass, address, city, province, region, latitude, longitude, description, photos, features, agencyName, agencyUrl, agencyPhones, agentName, detailFetched

**Behaviors an agent should know:**

- `searchUrls` takes priority over `cities` — when both are set, only `searchUrls` is used
- Detail page fetching (`includeAgencies: false` by default) significantly increases run time and request count — keep `maxRequestsPerCrawl` high for large runs
- DataDome blocks datacenter IPs on detail pages — residential IT proxies are required for full descriptions and phone numbers
- Phone numbers are agency business lines shown publicly on the portal — some private sellers hide numbers
- The `priceValue` field is numeric euros — use for filtering and sorting; the `price` field is display-formatted (e.g. "€ 4.000.000")

**Pricing model:** Pay-per-event. $0.0006 per listing, $0.00005 actor start fee.

### Legal & Compliance Disclaimer

This Actor is independent and is not affiliated with, endorsed by, or sponsored by Immobiliare.it or its parent company. It accesses only publicly available pages on immobiliare.it — no login bypass, no CAPTCHA solving, and no private user data is collected. Users are responsible for their own compliance with Immobiliare.it's Terms of Service and applicable data-protection laws (including GDPR where relevant).

### SEO Keywords

immobiliare.it scraper, italy real estate data, italian property listings, immobiliare.it api alternative, scrape immobiliare.it, italy property market data, milan apartment prices, rome real estate data, italian real estate scraper, immobiliare.it property data, italy housing market research, property for sale italy data, immobiliare search scraper, italian real estate lead generation, italy rental listings data, immobiliare.it price per square meter, italian property investment data, milan real estate market data, rome apartment listings, italy proptech data

# Actor input Schema

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

Paste any immobiliare.it search page (e.g. https://www.immobiliare.it/vendita-case/milano/), listing page (/annunci/ID/) or agency page. The actor auto-detects the URL type. Takes priority over Cities.

## `cities` (type: `array`):

City slugs to search (e.g. milano, roma, napoli). Used only when Search URLs is empty. Contract and Category below apply to each city.

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

vendita = for sale, affitto = for rent.

## `category` (type: `string`):

URL category segment used when building searches from city names.

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

Result ordering for city-built searches (newest = criterio=data\&ordine=desc).

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

Result pages to fetch per search (~25 listings each). Hard cap, 1-200.

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

Hard cap on rows pushed to the dataset. 0 = no cap (request cap still applies).

## `includeAgencies` (type: `boolean`):

Also collect agency cards for each searched city via the internal API (name, address, logo, profile URL, platform stats). No phone numbers — those are only on protected HTML profiles.

## `maxConcurrency` (type: `integer`):

Simultaneous requests for directly-crawled HTML pages. API searches run sequentially and ignore this.

## `requestDelayMs` (type: `integer`):

Reserved for a future per-request delay. Concurrency limit currently paces requests.

## `maxRequestRetries` (type: `integer`):

Retries per request (anti-bot challenges rotate proxy sessions between retries).

## `maxRequestsPerCrawl` (type: `integer`):

Absolute request budget for the whole run (loop safety).

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

Only needed for detail/agency pages (the fast search API needs no proxy). Detail HTML is DataDome-protected: datacenter IPs get 403 — residential IT proxies required for full descriptions.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.immobiliare.it/vendita-case/milano/"
    }
  ],
  "cities": [],
  "contract": "sale",
  "category": "case",
  "sort": "relevance",
  "maxPages": 5,
  "maxListings": 100,
  "includeAgencies": false,
  "maxConcurrency": 3,
  "requestDelayMs": 1000,
  "maxRequestRetries": 3,
  "maxRequestsPerCrawl": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}
```

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.immobiliare.it/vendita-case/milano/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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 = { "searchUrls": [{ "url": "https://www.immobiliare.it/vendita-case/milano/" }] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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 '{
  "searchUrls": [
    {
      "url": "https://www.immobiliare.it/vendita-case/milano/"
    }
  ]
}' |
apify call ahmed_jasarevic/immobiliare-scraper --silent --output-dataset

```

## MCP server setup

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