# Immobiliare.it Scraper: Italy Listings & Agency Phones (`axlymxp/immobiliare-property-scraper`) Actor

Export immobiliare.it property listings for sale or rent in Italy: price, surface, rooms, GPS, photos and the agency name and phone. Search by city or province with filters, no login or URLs needed. Pay only for results.

- **URL**: https://apify.com/axlymxp/immobiliare-property-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 dataset items

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Property Scraper

Export property listings from **immobiliare.it**, Italy's largest real-estate portal, for sale or for rent. Search by city or province with price, surface, room and property-type filters. Every row has the price, surface, rooms, GPS position and photos, plus the **agency name and phone number**, so the same run feeds market analysis and agency lead lists. No login, no API key, no search URLs to paste.

### Output fields

| Field | Description |
| --- | --- |
| `id`, `url` | Immobiliare.it listing id and the listing page |
| `title`, `propertyType`, `propertyTypeId`, `category`, `transaction` | Apartment / Villa / Loft ..., Sale or Rent |
| `price`, `priceText`, `currency` | Price in euros (monthly rent for rentals) and as displayed |
| `surfaceM2`, `rooms`, `bedrooms`, `bathrooms`, `floor`, `hasLift`, `furnished` | Property facts |
| `condition`, `heating`, `features`, `isLuxury`, `isNewConstruction` | Condition, heating and feature tags |
| `city`, `cityId`, `province`, `provinceName`, `zipCode`, `street`, `macrozone`, `microzone` | Location |
| `latitude`, `longitude`, `locationPrecision` | Position (exact or approximate, as the listing allows) |
| `sellerType` | `agency` or `private` |
| `agencyId`, `agencyName`, `agencyLogo`, `agencyPhone`, `agencyPhones` | Agency contact data on agency listings |
| `imageCount`, `images` | Photo count and full-size photo URLs |
| `createdAt`, `updatedAt`, `scrapedAt` | Timestamps (UTC) |
| `description`, `energyClass`, `yearBuilt`, `condoFees`, `agentName`, `agencyAddress` | Only with **Fetch full details** (one extra request per listing) |

Phone coverage: in a 3,000-listing sample (Rome, for sale), 2,868 of the 2,869 agency listings carried a phone number. Private sellers (131 of 3,000) are returned without contact data.

### Use cases

- **Agency lead lists:** set *Only agency listings* and group by `agencyName` to build a list of active agencies in a city, with their phone numbers.
- **Price and rent monitoring:** schedule a daily run per city sorted by most recent, and compare `price` per `surfaceM2`.
- **Investment research:** filter by price, rooms and surface, then rank by price per m².
- **PropTech data feeds:** push the dataset to a database or sheet through Apify integrations.

### Input

- **Locations:** Italian cities (`Milano`, `Roma`, `Torino`) or two-letter province codes (`MI`, `RM`, `TO`). A city name searches that city only; a province code searches the whole province.
- **Buy or rent**, **property types** (empty means all residential types), **price**, **surface**, **rooms** and **bedrooms** ranges.
- **Only agency listings / only private sellers**, **sort order** (most recent, price, size), **max listings**.
- **Fetch full details:** adds description, energy class, year built, condominium fees, agent name and the agency address.
- **Proxy:** Apify datacenter proxy by default. A DataDome challenge makes the actor switch to a new exit automatically; if a run still reports it is blocked, choose Apify RESIDENTIAL with country Italy.

```json
{
    "locations": ["Milano", "Roma"],
    "transaction": "rent",
    "propertyTypes": ["Apartment"],
    "priceMax": 1500,
    "onlyAgencies": true,
    "maxItems": 200
}
```

### Scheduling and integrations

Schedule runs and send results to Google Sheets, webhooks, Zapier or Make with Apify schedules and integrations. The key-value store holds a `SUMMARY` record with the number of listings and the locations searched.

### FAQ

- **How many listings can I get?** A search for Rome (for sale) returned 3,000 listings in about 1.5 minutes in testing, and paging worked past 10,000 listings on one search. When you pick several property types, each type is searched in turn, so rows come grouped by type.
- **Does it need an immobiliare.it account?** No. It reads the public listing data.
- **Are phone numbers private owners' numbers?** No. They come from the listing's agency contact; private sellers have none.
- **Why is `description` empty?** Descriptions, energy class, year built, costs and the agency address are only included with *Fetch full details*.
- **Can I search a neighbourhood?** Not yet: use a city or a province code, then filter on `macrozone` / `microzone` in the output.
- **A run stopped with "Blocked by DataDome".** Retry with the proxy set to Apify RESIDENTIAL, country Italy.

# Actor input Schema

## `locations` (type: `array`):

Italian cities (Milano, Roma, Torino) or two-letter province codes (MI, RM, TO). A city name matches the city itself; use the province code to search a whole province.

## `transaction` (type: `string`):

Properties for sale or for rent.

## `propertyTypes` (type: `array`):

Leave empty for all residential types. Each type is searched separately, so results are grouped by type.

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

Minimum price in euros (monthly rent when renting).

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

Maximum price in euros (monthly rent when renting).

## `surfaceMin` (type: `integer`):

Minimum surface in square metres.

## `surfaceMax` (type: `integer`):

Maximum surface in square metres.

## `roomsMin` (type: `integer`):

Minimum number of rooms (locali).

## `roomsMax` (type: `integer`):

Maximum number of rooms (locali).

## `bedroomsMin` (type: `integer`):

Minimum number of bedrooms.

## `bedroomsMax` (type: `integer`):

Maximum number of bedrooms.

## `onlyAgencies` (type: `boolean`):

Skip private sellers. Agency listings carry the agency name and, for most of them, a phone number.

## `onlyPrivateSellers` (type: `boolean`):

Skip agency listings.

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

Result order.

## `fetchDetails` (type: `boolean`):

Adds the description, energy class, year built, condominium fees, agent name and the agency address. Makes one extra request per listing, so runs are slower.

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

Stop after this many listings in total.

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

Apify datacenter proxy by default; a DataDome challenge rotates to a new exit automatically. If a run reports it is blocked, switch to Apify RESIDENTIAL with country Italy.

## Actor input object example

```json
{
  "locations": [
    "Milano"
  ],
  "transaction": "buy",
  "onlyAgencies": false,
  "onlyPrivateSellers": false,
  "sortBy": "newest",
  "fetchDetails": false,
  "maxItems": 50,
  "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 = {
    "locations": [
        "Milano"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/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 = {
    "locations": ["Milano"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/immobiliare-property-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 '{
  "locations": [
    "Milano"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call axlymxp/immobiliare-property-scraper --silent --output-dataset

```

## MCP server setup

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