# Immobiliare.it Scraper: Italy Homes and Agencies (`automation_craft/immobiliare-scraper`) Actor

Export Immobiliare.it homes, rentals and auctions from any comune, zona, region or radius in Italy, pasted links, annunci or agenzie, no login. Rows: price, superficie, locali, piano, address, photos, planimetrie, agency phones; add spese condominiali, classe energetica. Pay per ad, Excel or API.

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

## Pricing

from $0.66 / 1,000 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/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: Italy Homes and Agencies

**Immobiliare.it scraper and API** for Italy's property portal Immobiliare.it: type a comune, a province, a region, "Italia" or a zone of a city, paste Immobiliare.it search links with their filters, give ad links or ad numbers, draw a radius around a point, or name an agency, and get one row per ad with its price, price cut where the site shows one, surface in m², rooms (locali), bedrooms, bathrooms, floor, condition, heating, address with its zones, coordinates, photos, floor plans and the agency with its phone numbers. Turn on Listing details for the ad's full record (description, every fact, condominium and heating costs, energy class, surface breakdown, mortgage estimate, videos, documents and every unit of a new build project) and Agency profile for the agency's address, phones, website and opening hours. List the real estate agencies of a place from Immobiliare.it's agency directory.

No login, no cookies and no browser. For sale, for rent and auctions, in ten categories: homes, new builds, rooms for rent, whole buildings, storage, garages and parking spaces, offices, land, industrial sheds, shops.

#### What you can do with it

- Pull every flat for sale in a Milan zone or a Rome comune into a sheet with price, m², locali, floor and the computed price per m², for a price comparison or a house hunt.
- Read the newest ads of a search every morning on a schedule (newest first is the default order).
- Collect the ads within a few kilometres of an address with the radius search: every row delivered lies inside the circle by its own coordinates.
- Build a list of the estate agencies active in a city: the agency directory of a place, each agency's own ads, and its profile with address, phones, website, opening hours and listing and sold counts.
- Study new build projects: with Listing details each project row carries every unit with its price, surface, rooms, floor and energy class, and the project's price and surface range.

### Quick start

1. Open the **Input** tab and type a place in **Places**, for example `Milano`, `provincia di Lecce`, `Lombardia` or `Navigli, Milano`.
2. Pick the **Contract** (for sale by default), the **Category** (homes by default) and any filters: price, surface, rooms, bedrooms, bathrooms, floor, condition, energy rating, garden, terrace, lift, keywords, seller.
3. Or paste one or more Immobiliare.it links into **Immobiliare.it links**: a search, an ad, an agency or an agency directory.
4. Set **Max rows per run** and, for each ad's full record, turn on **Listing details**.
5. Click **Start**. Download the rows as JSON, CSV or Excel, or read them through the Apify API.

### What data you get

One row per ad (`type: "listing"`) and one per agency of the agency directory or asked by number (`type: "agency"`), plus free rows that tell you what happened:

- one coverage row per search, agency or directory place (`type: "search"`, see below),
- free status rows (`type: "status"`) for anything that was not read: a place Immobiliare.it does not know (with the candidates when several places match), a refused setting or link, an ad number that is gone (`status: "not_found"`), an agency profile number that does not exist (`status: "agency_not_found"`; an agency number asked in `agencies` that has no ads gives a coverage row with total 0), searches the run did not reach (`status: "not_reached"`), a stop at your maximum cost per run,
- one free run summary (`type: "summary"`) with the rows, pages, charges and requests of the run.

Fill rates below were measured on the 328 distinct ads delivered by 22 test runs of this Actor on the Apify platform on 2026-11-01 (Milan, Rome, Bologna and a radius search around Milan centre; homes for sale and for rent, auctions, rooms for rent, offices for rent, new builds, private sellers only, one agency's ads, ads by number). 291 of the 328 ads are from agencies, 37 from private sellers. The build of that day left a private seller's street and position out; since 2026-11-06 every ad's street and position are delivered as the ad shows them, so the street and position figures below are the lower bound.

| Field | What it holds | Fill (N=328) |
|---|---|---|
| `id`, `url`, `title`, `typology` | Immobiliare.it ad number, the ad's link, its title, its type (Appartamento, Villa, Ufficio) | 100% |
| `contract`, `category` | `sale` or `rent`, and the category (`homes`, `newBuilds`, `rooms`, `offices`, ...) | 100% |
| `price`, `priceText` | price in euros (a monthly rent for rentals, a project's cheapest unit), and the text as shown | 95.7% (`price`; empty when the price is on request) |
| `previousPrice`, `priceDropPercent` | the price before the last cut and the cut in percent, when the site shows one | rare: 2 of 328 here, 48 of 2,270 search items in the build's tests |
| `surfaceSqm`, `pricePerSqmComputed` | surface in m², and price per m² computed from the two | 99.1%, 94.8% |
| `rooms`, `bedrooms`, `bathrooms` | rooms (locali) as shown ("2", "5+", a project's "2-4"), bedrooms, bathrooms | 97.6%, 86.6%, 94.5% |
| `floor`, `lift`, `balcony`, `terrace`, `cellar`, `furnished` | floor as shown ("T" ground floor, "R" raised, a number) and the flags the ad states | 95.1% (`floor`), flags by ad |
| `condition`, `heating`, `features` | condition, heating and the ad's feature list, as the site writes them | 90.2%, 89.6%, 90.9% |
| `address.city`, `address.province`, `address.region`, `address.macrozone`, `address.microzone` | comune, province, region and the zones of the city | 100% (`city`, `province`, `region`), 94.8% (`macrozone`) |
| `address.street`, `address.postcode` | street and postcode where the advertiser publishes them | 84.5%, 79.9% (agency ads: 95.2% street) |
| `latitude`, `longitude`, `locationPrecision`, `geohash` | position and whether it is exact or approximate | 83.2% (agency ads: 93.8%) |
| `photos`, `photoCount`, `coverPhoto` | every photo with its room label | 99.4% |
| `floorPlans` | floor plans | 72.6% |
| `advertiser` | `agency` (number, name, logo, phones, profile link) or `private` | 100% (agency phones: 289 of 291 agency ads) |
| `createdAt`, `updatedAt` | when the ad was published and last changed | 100% |
| `isAuction`, `auction` | auctions, with the court where the ad names one | auctions only |
| `search` | the search that found the row: place, page, position, order and Immobiliare.it's total | 100% |

Why some figures are lower: `price` is empty only where the ad says "Prezzo su richiesta" (14 of 14 empty prices); the measured runs left a private seller's street and position out (37 of the 328 ads; delivered since 2026-11-06), and some agencies publish no street or position; bedrooms are missing on offices (25 of 25) and on some homes.

**Listing details** (the add-on, `details`, with `detailsStatus: "read"`): `description`, `caption`, `reference`, every fact row in `facts` (with `condition`, `availability`, `kitchen`, `garden`, `parking`, `concierge`, `heatingText`, `airConditioning`, `buildingFloors`, `yearBuilt` as their own fields), `costs` (condominium and heating costs, deposit, as the record lists them), `energy` (class, consumption text, kWh/m² where the record gives a figure, every rating), `surfaceTotals` and `surfaceBreakdown`, `featureTags`, `pricePerSqmText`, `mortgage` (amount, monthly payment, rate, years), `videos`, `virtualTourUrl`, `roomPlanViewerUrl`, `documents`, `externalLinks`, and for a new build project `workProgress`, `units`, `unitsPriceRange` and `unitsSurfaceRange`. Measured on the 11 records of the same runs: description, facts and building floors 11 of 11, energy class 9, year built, costs and surface breakdown 8, videos 5, virtual tour 4, project units 3 (every project). The build's tests read 150 records of Rome rentals: energy class with a kWh/m² figure on 99, videos on 29, a virtual tour on 10.

**Agency rows** (`type: "agency"`, from `agencyDirectoryPlaces`, a pasted directory link or `agencyProfiles`), measured on 22 agencies: `name`, `logo`, `yearsOnPortal` 22 of 22, `plan`, `featuredAds`, `bannerImage` 21 of 22, with `directory` (place, position, how many the place lists).

**Agency profile** (the add-on, `agencyProfile`, once per agency per run, on listing rows and agency rows), measured on 13 profiles: `address`, `phones`, `yearsOnPortal`, `listingsCount`, `soldCount` 13 of 13, `openingHours` and `description` 12, `website` 11, `association` 10, plus `city`, `province`, `latitude`, `longitude`, `logo`, `isBuilder` and `profileUrl`.

#### The coverage row: was the search read to its end?

Every search (and every agency and directory place) ends with one free row that says how far it got (from the prefilled run, shortened):

```json
{
  "type": "search",
  "searchKey": "s0d72e3e9c2416c70",
  "kind": "place",
  "label": "location 1",
  "place": "Milano (MI)",
  "contract": "sale",
  "category": "homes",
  "filters": {},
  "sort": "newest",
  "sellerType": "any",
  "total": 19096,
  "met": 20,
  "delivered": 20,
  "pagesRead": 1,
  "pagesFailed": 0,
  "skippedFree": {},
  "repeats": 0,
  "beyondCaps": 0,
  "withheldByChargeLimit": 0,
  "complete": false,
  "resumeSkipItems": 20,
  "stoppedBy": "max_items"
}
```

`total` is Immobiliare.it's own count, `met` the distinct ads the run saw, `delivered` the rows you got. `complete` is true only when every page was read, nothing failed, no cap or cost limit stopped the walk, and the ads met reach Immobiliare.it's total. When it is false, `stoppedBy` says why (`max_items`, `max_items_per_search`, `max_pages`, `charge_limit`, `page_failed`, `source_total_not_reached`, `source_refused`) and `resumeSkipItems` says where to continue. `skippedFree` counts the ads a check left out free, by reason (for example `outside_area` on a radius search).

#### Example listing row (an agency's ad, shortened)

```json
{
  "type": "listing",
  "id": "134286737",
  "url": "https://www.immobiliare.it/annunci/134286737/",
  "title": "Appartamento",
  "contract": "sale",
  "category": { "id": 1, "key": "homes", "name": "Residenziale" },
  "typology": { "id": 4, "name": "Appartamento" },
  "price": 378000,
  "priceText": "€ 378.000",
  "currency": "EUR",
  "previousPrice": null,
  "priceDropPercent": null,
  "pricePerSqmComputed": 6750,
  "surfaceSqm": 56,
  "rooms": "2",
  "bedrooms": 1,
  "bathrooms": "1",
  "floor": "1",
  "lift": true,
  "balcony": true,
  "condition": "Nuovo / In costruzione",
  "heating": "Centralizzato",
  "features": ["cancello elettrico", "fibra ottica", "videocitofono", "porta blindata", "balcone"],
  "visibility": "sky",
  "address": {
    "street": "Via Giovanni Antonio Amadeo, 24",
    "postcode": "20133",
    "city": "Milano",
    "province": "Milano",
    "provinceCode": "MI",
    "region": "Lombardia",
    "country": "Italia",
    "macrozone": "Città Studi, Susa",
    "microzone": "Città Studi"
  },
  "latitude": 45.4708,
  "longitude": 9.2328,
  "locationPrecision": "exact_location",
  "photos": [
    { "url": "https://pwm.im-cdn.it/image/2045736443/xxl.jpg", "thumbnail": "https://pwm.im-cdn.it/image/2045736443/m-c.jpg", "label": "Salone" }
  ],
  "photoCount": 11,
  "isPrivate": false,
  "advertiser": {
    "type": "agency",
    "agencyId": 44797,
    "name": "Rclass Luxury Real Estate | Milano",
    "phones": [{ "type": "vTel1", "number": "+390289741117" }],
    "profileUrl": "https://www.immobiliare.it/agenzie-immobiliari/44797/"
  },
  "createdAt": "2026-10-31T08:28:56.000Z",
  "search": { "kind": "place", "label": "location 1", "place": "Milano (MI)", "page": 1, "total": 19096, "position": 1, "sort": "newest" },
  "scrapedAt": "2026-11-01T02:58:01.998Z"
}
```

With Listing details on, the same ad also carries (shortened):

```json
{
  "detailsStatus": "read",
  "details": {
    "caption": "BILOCALE RISTRUTTURATO E MAI ABITATO CON BALCONE",
    "availability": "libero",
    "buildingFloors": "8 piani",
    "kitchen": "Cucina a vista",
    "concierge": "Portiere mezza giornata",
    "heatingText": "Centralizzato, a pavimento, alimentato a gas",
    "yearBuilt": 1960,
    "pricePerSqmText": "6.750 €/m²",
    "costs": [{ "label": "Spese condominio", "value": "€ 120/mese" }],
    "energy": { "class": "D", "consumptionText": "≥ 3,51 kWh/m² anno", "kwhPerSqmYear": null },
    "mortgage": { "amount": "€ 264.600", "monthlyPayment": "€ 1.157", "ratePercent": "3,29", "years": 30 },
    "documents": [{ "title": "Scarica capitolato", "url": "https://pic.im-cdn.it/file/23392553", "format": "pdf" }]
  }
}
```

#### Example agency row (agency directory of Milan with Agency profile, shortened)

```json
{
  "type": "agency",
  "id": "188106",
  "name": "Poliedro Immobiliare",
  "profileUrl": "https://www.immobiliare.it/agenzie-immobiliari/188106/",
  "yearsOnPortal": 12,
  "plan": "gold",
  "featuredAds": 22,
  "directory": { "label": "directory place 1", "place": "Milano (MI)", "position": 1, "listed": 100 },
  "agencyProfile": {
    "name": "Poliedro Immobiliare",
    "address": "via l.l. zamenhof 11 20136 - Milano",
    "city": "Milano",
    "phones": [{ "type": "vTel1", "number": "+390281260575" }, { "type": "tel1", "number": "0289415569" }],
    "website": null,
    "yearsOnPortal": 12,
    "association": "Fimaa",
    "listingsCount": 23,
    "soldCount": 1,
    "openingHours": [{ "day": "Lunedì", "open": true, "periods": ["09:00 - 13:00", "14:30 - 19:00"] }],
    "agents": null
  }
}
```

### How much does it cost to scrape Immobiliare.it?

You pay per row delivered (pay per event). Prices per 1,000 events:

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (one ad row) | $0.69 | $0.69 | $0.68 | $0.66 |
| Listing details (add-on, only when on) | $0.92 | $0.84 | $0.76 | $0.66 |
| Results page (one page of up to 20 search results or agency listings) | $0.50 | $0.40 | $0.40 | $0.30 |
| Agency profile (add-on, once per agency per run) | $1.40 | $1.30 | $1.20 | $1.00 |
| Agency (one agency row: directory or agency profile asked by number) | $1.19 | $1.09 | $0.99 | $0.85 |

Each run also pays a one time Actor start of $0.0075 on every plan. Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$0.69 / 1,000" on the Listing row means one ad costs less than a tenth of a cent, and "$1.40 / 1,000" on the Agency profile row means one agency profile costs 0.14 cents.

Worked examples (event charges; add the one time Actor start to each run):

- The prefilled run (20 homes for sale in Milan): 20 listings and one results page, $0.0143 on the Free plan, $0.0135 on Gold.
- 1,000 listings of a search (50 pages of 20): $0.715 on Free, $0.675 on Gold.
- With Listing details on, add $0.92 (Free) to $0.66 (Gold) per 1,000 records read: $1.635 on Free, $1.335 on Gold for 1,000 ads with their records.
- 100 agencies of a city's agency directory: $0.119 on Free, $0.085 on Gold; with Agency profile on, $0.259 on Free, $0.185 on Gold (a directory has no page fee).
- Free: repeats (an ad found by two of your searches is charged once per run), ads a filter or the radius leaves out, skipped results, a page that delivered no charged listing, a record that could not be read (the ad's row is delivered and charged as a Listing, its details are not charged), an agency profile that could not be read, gone ads and unknown agencies asked by number, and every coverage, status and summary row. A run with invalid input charges only the start fee.
- Set a maximum cost per run in the Apify Console: the run stops at the first row it cannot pay, delivers no row unpaid and says so on a free status row.

### How fast is it?

A run reads Immobiliare.it through three Italian addresses side by side, each at about one request every 2 seconds (a faster pace on one address was refused by the site in the build's tests):

- Search rows: 20 per request. On the platform 1,000 Rome rows took 70 seconds (51 requests), about 50,000 rows an hour.
- Listing details and Agency profile: one request per record or profile. On the platform 200 rows with Listing details took 295 seconds, about 2,400 an hour. Plan big detail runs accordingly, or read the search rows first and the records of the ads you keep.
- Ads by number without Listing details: 30 per request.
- If the site's bot protection turns one address away, the run goes on on the other two (it never draws a new address after a refusal); in the build's 200 record test one address was turned away and the run delivered all 200.

For large runs raise the run timeout in the run options; a run that times out keeps every row it delivered.

### Input

| Setting | What it does |
|---|---|
| `locations` | Places as Immobiliare.it writes them: a comune (`Milano`, `San Giovanni (PC)` with its province code when several share the name), a province (`provincia di Milano`, or its code in capitals: `MI`), a region (`Lombardia`), `Italia`, or a zone of a city (`Navigli, Milano`). Codes from the candidates of a free row also work (`comune:8042`, `zona:10057`). A name that matches several places, or none, is a free row with the candidates. |
| `startUrls` | Links copied from immobiliare.it: a search (`/vendita-case/milano/?prezzoMassimo=300000`, with its filters, order and page), an ad (`/annunci/<number>/`), an agency (`/agenzie-immobiliari/<number>/`), an agency directory (`/agenzie-immobiliari/<city>/`), or a remote text or CSV file of links (at most 10 files a run, 10,000 links a file; a larger file is a free row, never cut). A setting you give replaces the same filter of a search link. A link the Actor cannot send as the site means it is a free row. |
| `listingIds` | Ad numbers (`49720693`) or ad links. A gone ad is a free `not_found` row. |
| `agencies` | Agencies whose own ads to read, by agency link or number. Filters do not apply to them. |
| `agencyProfiles` | Agencies to deliver as one Agency row each with their profile, by agency link or number. |
| `agencyDirectoryPlaces` | Places whose agencies to list from Immobiliare.it's agency directory, written like `locations`. |
| `latitude`, `longitude`, `radiusKm` | A radius search around a point in Italy, 0.1 to 100 km; all three go together. |
| `contract`, `category`, `typologies` | For sale (default), for rent or auctions; one of ten categories (homes by default; rooms are for rent only and new builds for sale only, as on the site); property types inside homes or new builds. Each one you set replaces a search link's own (a category you set drops the link's property type); property types you set need a link of their category. |
| `priceMin`, `priceMax`, `surfaceMin`, `surfaceMax`, `roomsMin`, `roomsMax`, `bedroomsMin`, `bedroomsMax` | Ranges in euros (a monthly rent for rentals), m², rooms (1 to 5, 5 means 5 or more) and bedrooms. |
| `bathrooms`, `floorBands`, `condition`, `energyRating`, `ownershipType`, `investmentOnly` | Bathrooms, floor bands (ground, intermediate, top), condition, energy band, kind of ownership (bare ownership, usufruct, ...), properties sold with a tenant. |
| `garageTypes`, `gardenTypes`, `heatingTypes`, `terrace`, `balcony`, `lift`, `cellar`, `pool`, `furnished`, `virtualTourOnly`, `excludeAuctions` | Must haves. A switch set to `false` drops that filter from a pasted link. |
| `keywords` | Words the ad must contain, as the site's own keyword filter reads them (`terrazzo`, `attico`). |
| `sellerType` | Any, private sellers only, or agencies only (read in the site's own private first or agencies first order, so not with `sort` or a link's own order). Set to `any`, it also drops a link's private sellers switch. |
| `roomTypes`, `roommatesGender`, `roommatesOccupation`, `petsAllowed`, `smokersAllowed` | Rooms for rent: single, double, triple or shared; who lives in the flat; pets and smokers. |
| `sort` | `newest` (default), `relevance`, `oldest`, `priceLow`, `priceHigh`, `biggest`, `smallest`, `mostRooms`, `fewestRooms`, `highestFloor`, `lowestFloor`, `biggestPriceCut`, `pricePerSqmLow`, `pricePerSqmHigh`. Immobiliare.it orders newest first by publication day, paid placements first within a day. |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `skipItems` | Caps for the run and per search, and results to skip at the top of each search (free; not with the radius search, which is read as map cells). To continue a capped search, set `skipItems` to the `resumeSkipItems` value of its coverage row. |
| `includeDetails`, `includeAgencyProfile` | The Listing details and Agency profile add-ons. |
| `includeRawRecord` | Also deliver the Immobiliare.it app's own JSON of each ad in `raw` (no extra charge; on every ad, private sellers' ads included). |
| `photosWithoutWatermark` | Give each photo link on the image host's copy without the Immobiliare.it watermark (an advertiser's own mark stays). |
| `includePersonalData` | Has no effect: all public data is always delivered (kept so saved inputs keep working; see below). |
| `language` | Language of the labels and fact values in records: `it` (default), `es`, `pt`, `el`, `de`, `fr`. Ad texts stay as the advertiser wrote them. |
| `outputFields` | Keep only these fields of each row (`price`, `address.city`); `type`, `id` and the search keys always stay, and paid add-ons stay whole. |
| `proxyConfiguration` | Apify's Italian residential proxy by default (at most three addresses a run), or up to three http proxy links of your own. |

Filters apply to every place, radius and search link of the run. A filter Immobiliare.it's own form does not offer for the category refuses the run before any request, so it charges only the start fee (for a pasted link, that link is a free row and the run goes on). Filters cannot be combined with `agencies`, `agencyProfiles` or `agencyDirectoryPlaces` in the same run.

#### Input examples

The prefill (20 homes for sale in Milan, newest first):

```json
{
  "locations": ["Milano"],
  "maxItems": 20,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

A place search with filters: two and three room flats for rent in two Milan zones, with their records:

```json
{
  "locations": ["Navigli, Milano", "Affori, Milano"],
  "contract": "rent",
  "typologies": ["apartment"],
  "roomsMin": 2,
  "roomsMax": 3,
  "priceMax": 1800,
  "balcony": true,
  "includeDetails": true,
  "maxItems": 200
}
```

A pasted website search link, with its own filters kept:

```json
{
  "startUrls": [{ "url": "https://www.immobiliare.it/vendita-case/milano/?prezzoMassimo=300000" }],
  "maxItems": 100
}
```

Ads by number:

```json
{
  "listingIds": ["49720693", "https://www.immobiliare.it/annunci/134286737/"],
  "includeDetails": true
}
```

A radius search, 2 km around Milan's cathedral:

```json
{
  "latitude": 45.4642,
  "longitude": 9.19,
  "radiusKm": 2,
  "contract": "sale",
  "maxItems": 100
}
```

An agency's ads with its profile:

```json
{
  "agencies": ["https://www.immobiliare.it/agenzie-immobiliari/44797/"],
  "includeAgencyProfile": true,
  "maxItems": 100
}
```

The agency directory of a city, with each agency's profile:

```json
{
  "agencyDirectoryPlaces": ["Lecce"],
  "includeAgencyProfile": true,
  "maxItems": 50
}
```

#### Personal data

Every field Immobiliare.it shows publicly is delivered on every run: a private seller's street, exact coordinates and geohash, the links a private seller adds (videos, virtual tour, room plan viewer, documents, outside links), the record's contact person and the raw record of their ads, an agent's name and photo, and an agency profile's list of agents. Free texts such as descriptions come as the advertiser wrote them. The `includePersonalData` setting has no effect and is kept only so saved inputs keep working. You are responsible for using personal data lawfully (GDPR included).

### What this Actor does NOT do

- No monitoring mode: no "only new since the last run", no price change or removal tracking, no alerts. Run it on a schedule with the default newest first order and compare runs in your own sheet. The Actor keeps no memory between runs, so an ad found again by a later run is charged again.
- No price history and no date of a price cut: Immobiliare.it serves the previous price and the cut only, and only on some ads.
- No agent's own phone and no e-mail address: Immobiliare.it serves the agency's phone numbers only (always delivered on agency ads) and no e-mail; the Actor does not visit agencies' own websites. The agency's website link comes with Agency profile.
- No cadastral data and no view counters: Immobiliare.it's records carry none.
- No more than 100 agencies per place in the agency directory: Immobiliare.it lists at most 100 for a place. A place that reaches 100 says so on its coverage row; ask the city's zones ("Navigli, Milano") for the rest.
- No faster pace, more parallel requests or retries you can set, and no outside unblocking service: the Actor reads through at most three Italian residential addresses a run, side by side, at the pace Immobiliare.it tolerates, and never replaces an address the site turned away. In the rare case the site's bot protection turns away all three, the run stops and says so (`source_refused`).
- No endless unpaid work: requests that bring no charged row (places that find nothing, made up ad numbers) are covered only by a small allowance. In the build's tests a run of 100 town searches that all found nothing read 14 of them, and a run of 200 made up ad numbers with Listing details read 29, then stopped with a free `not_reached` row saying how many entries were left; the run charged only its start. Searches that deliver rows raise the allowance as they go.
- No rows Immobiliare.it does not show: an empty field means the ad does not carry it, never a guessed value.
- No map page links (`/ricerca-mappa/`): use the radius settings or a list search link instead.
- No filters on agencies, agency profiles or the agency directory, and no `sort` together with `sellerType`: such inputs are refused before any request (only the start fee is charged).
- No currency conversion and no translation of ad texts: prices stay in euros, and only the record's labels follow `language`.
- No other portals of the Immobiliare.it group and no other countries: Italy only.

### FAQ

#### Does Immobiliare.it have an API for listings?

Immobiliare.it's own API pages are for its Insights market data and for agencies that sync their ads to the portal; we found no public API that returns the ads of a search. This Actor works like an API: send a JSON input through the Apify API and read the ads as JSON, CSV or Excel.

#### Is it legal to scrape Immobiliare.it?

This Actor reads only what Immobiliare.it shows without a login. Immobiliare.it's terms of use forbid any commercial exploitation of the information on its site and app; whether and how you use the data is your decision.

#### How do I get new Immobiliare.it listings as soon as they are posted?

Keep the default order, newest first, set a small `maxItems` and run the Actor on an Apify schedule: each run returns the newest ads of your searches. The Actor keeps no memory between runs, so an ad still among the newest is delivered and charged again by the next run.

#### How does it read Immobiliare.it without getting blocked?

It reads Immobiliare.it's own app data through Apify's Italian residential proxy, three addresses side by side at a steady pace of about one request every 2 seconds each, and never replaces an address the site turned away. If Immobiliare.it's bot protection turns away all three, the run stops there: the free summary row and the run's status message say so (`stoppedBy: "source_refused"`), and searches it did not reach are not charged.

#### How do I get a list of the real estate agencies in an Italian city?

Put the city in `agencyDirectoryPlaces` (or paste its `/agenzie-immobiliari/<city>/` link): each agency Immobiliare.it lists there is one Agency row with name, logo, years on the site, plan and featured ads, and Agency profile adds address, phones, website and opening hours. Immobiliare.it lists at most 100 agencies a place, so for a big city also ask its zones ("Navigli, Milano").

#### Why does this Actor run with limited permissions?

It needs nothing beyond its own run storage (the dataset it writes and its own key value store), so it runs with Apify's limited permissions: it cannot read or change anything else in your account.

### Use it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~immobiliare-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Milano"], "maxItems": 100}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('automation_craft/immobiliare-scraper').call({ locations: ['Roma'], contract: 'rent', maxItems: 200 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'listing').length);
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/immobiliare-scraper").call(run_input={"listingIds": ["49720693"], "includeDetails": True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("price"))
```

### Changelog

- 0.1 (2026-11-01): first version.

### More data tools by Automation Craft

- [Idealista Scraper: Spain, Italy, Portugal Homes](https://apify.com/automation_craft/idealista-scraper)
- [ImmoScout24 Scraper: Rentals, Sales and Agencies](https://apify.com/automation_craft/immoscout24-scraper)
- [SeLoger Scraper: Listings, Prices and Agencies](https://apify.com/automation_craft/seloger-scraper)
- [Immowelt Scraper: Rents, Prices and Energy Data](https://apify.com/automation_craft/immowelt-scraper)
- [Bien'ici Scraper: France Real Estate Ads & DPE](https://apify.com/automation_craft/bienici-scraper)
- [PAP Scraper: pap.fr Real Estate Ads & Phones](https://apify.com/automation_craft/pap-scraper)
- [FINN Eiendom Scraper: Norway Homes and Rentals](https://apify.com/automation_craft/finn-eiendom-scraper)
- [Zillow Scraper: Homes for Sale, Rent and Sold](https://apify.com/automation_craft/zillow-scraper)
- [Redfin Scraper: Homes for Sale, Sold Comps, Agents](https://apify.com/automation_craft/redfin-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/immobiliare-scraper/changelog.md

# Actor input Schema

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

Places as Immobiliare.it writes them: a comune ("Milano", "Bologna", "San Giovanni (PC)" with its province code when several share the name), a province ("provincia di Milano", or its code in capitals: "MI"), a region ("Lombardia"), the whole country ("Italia") or a zone of a city ("Navigli, Milano"). Codes from the candidates of a free row also work ("comune:8042", "provincia:MI", "regione:lom", "zona:10057"). A name matching several places, or none, is a free row listing the candidates.

## `startUrls` (type: `array`):

Links copied from immobiliare.it: a search (/vendita-case/milano/?prezzoMassimo=300000, with its filters, order and page), an ad (/annunci/<number>/), an agency (/agenzie-immobiliari/<number>/) or an agency directory (/agenzie-immobiliari/<city>/), or a remote text or CSV file of links (at most 10 files a run, 10,000 links a file). A search link keeps its own settings; each setting you give below replaces the same setting of the link. A link the Actor cannot send as the site means it is a free row.

## `listingIds` (type: `array`):

Immobiliare.it ad numbers (the digits of an /annunci/ link, such as "49720693") or ad links. Each ad is delivered as one row (with its full record when Listing details is on); an ad that is gone is a free row.

## `agencies` (type: `array`):

Immobiliare.it agencies whose own listings to read: an agency link ("https://www.immobiliare.it/agenzie-immobiliari/42693/...") or the agency number alone. Every ad of the agency is one Listing row. Filter settings do not apply to agencies.

## `agencyProfiles` (type: `array`):

Agencies to deliver as one row each with their full profile: an agency link ("https://www.immobiliare.it/agenzie-immobiliari/42693/...") or the agency number. Each is charged as one Agency and one Agency profile; an agency that does not exist is a free row.

## `agencyDirectoryPlaces` (type: `array`):

Places whose agencies to list, written like "Places" ("Milano", "Navigli, Milano", "provincia di Lecce"). Each agency Immobiliare.it lists for the place is one Agency row (name, logo, years on the site, plan, featured ads); turn on Agency profile for its address, phones, website, opening hours and listing counts. The site lists at most 100 agencies a place: a city that reaches 100 says so, and its zones list their own.

## `latitude` (type: `number`):

Centre of a radius search (a point in Italy, such as 45.4642). Give latitude, longitude and radius together.

## `longitude` (type: `number`):

Centre of a radius search (such as 9.19).

## `radiusKm` (type: `number`):

Radius around the centre, 0.1 to 100 km. Every ad delivered lies inside the circle by its own coordinates; the search is read as the map cells that cover the circle.

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

For sale (default), for rent, or auctions (ads for sale at auction). Set, it replaces a search link's own.

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

The kind of property (default homes; rooms are for rent only, new builds for sale only). Set, it replaces a search link's own and drops the link's property type.

## `typologies` (type: `array`):

Types inside the category: for homes apartment, penthouse, detachedHouse, farmhouse, villa, terracedHouse, loft; for new builds apartment, penthouse, villa, loft, shop, office, garage, shed, storage. Several types are joined with OR.

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

Lowest price in euros (a monthly rent for rentals).

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

Highest price in euros (a monthly rent for rentals). A new build project shows the price of its cheapest unit.

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

Smallest surface in square metres.

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

Largest surface in square metres.

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

Fewest rooms, 1 to 5 (homes and new builds).

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

Most rooms, 1 to 5; 5 means 5 or more (homes and new builds).

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

Fewest bedrooms (homes and new builds).

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

Most bedrooms (homes and new builds).

## `bathrooms` (type: `string`):

Number of bathrooms (homes and new builds).

## `floorBands` (type: `array`):

Floor bands, joined with OR (homes, new builds, rooms).

## `condition` (type: `string`):

Condition of the property (homes, buildings).

## `energyRating` (type: `string`):

Energy efficiency band as Immobiliare.it offers it (homes, buildings).

## `ownershipType` (type: `string`):

Kind of ownership sold (homes for sale).

## `investmentOnly` (type: `boolean`):

Only properties sold with a tenant (immobile a reddito; homes and offices for sale).

## `garageTypes` (type: `array`):

Garage or parking included, joined with OR (homes).

## `gardenTypes` (type: `array`):

Garden, joined with OR (homes).

## `heatingTypes` (type: `array`):

Heating or air conditioning, joined with OR (homes).

## `terrace` (type: `boolean`):

Only properties with a terrace (homes, rooms). Set to false to drop this filter from a pasted link.

## `balcony` (type: `boolean`):

Only properties with a balcony (homes, rooms). Set to false to drop this filter from a pasted link.

## `lift` (type: `boolean`):

Only properties with a lift (homes). Set to false to drop this filter from a pasted link.

## `cellar` (type: `boolean`):

Only properties with a cellar (homes). Set to false to drop this filter from a pasted link.

## `pool` (type: `boolean`):

Only properties with a pool (homes). Set to false to drop this filter from a pasted link.

## `furnished` (type: `boolean`):

Only furnished properties (homes). Set to false to drop this filter from a pasted link.

## `virtualTourOnly` (type: `boolean`):

Only ads with a virtual tour (homes, buildings, garages). Set to false to drop this filter from a pasted link.

## `excludeAuctions` (type: `boolean`):

Leave out ads sold at auction (sales). Set to false to drop this filter from a pasted link.

## `keywords` (type: `string`):

Words the ad must contain, as the site's own keyword filter reads them (such as "terrazzo" or "attico").

## `sellerType` (type: `string`):

Private sellers only, or agencies only. Read in the site's own private first (or agencies first) order, so it does not go with Sort or a search link's own order. Set to Any, it drops a link's private sellers switch.

## `roomTypes` (type: `array`):

Room or bed in a single, double, triple or shared room, joined with OR (category rooms).

## `roommatesGender` (type: `string`):

Who lives in the flat (category rooms).

## `roommatesOccupation` (type: `string`):

Occupation of the flatmates (category rooms).

## `petsAllowed` (type: `boolean`):

Only rooms where pets are allowed (category rooms).

## `smokersAllowed` (type: `boolean`):

Only rooms where smoking is allowed (category rooms).

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

Order of the results (default newest first: Immobiliare.it orders by publication day, paid placements first within a day). A search link keeps its own order unless you set one here.

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

Stop after this many paid rows (listings and agencies) in the whole run. Leave empty for no cap.

## `maxItemsPerSearch` (type: `integer`):

Stop each search, agency or directory place after this many rows.

## `maxPagesPerSearch` (type: `integer`):

Stop each search or agency after this many pages of 20 ads.

## `skipItems` (type: `integer`):

Results of each search to skip before the first row (free), to continue where an earlier run stopped: the coverage row of an incomplete search gives the number as resumeSkipItems. It replaces a pasted link's page number.

## `includeDetails` (type: `boolean`):

Add the ad's full record to each row: description, all facts (floor, building floors, kitchen, heating, year built, availability, parking), condominium and heating costs, deposit, energy class with kWh/m², surface breakdown, price per m², mortgage estimate, videos, virtual tour, documents and every unit of a new build project. Charged per row as Listing details; a row whose record could not be read is not charged for it.

## `includeAgencyProfile` (type: `boolean`):

Add the agency's profile to its rows, once per agency per run: address, phones, website, opening hours, years on the site, association, listings and sold counts, description. Charged once per agency as Agency profile; a profile that could not be read, or that the run's unpaid work allowance could not pay for, is not charged and the row says why.

## `includeRawRecord` (type: `boolean`):

Also deliver the Immobiliare.it app's own JSON of each ad in the field "raw" (no extra charge). On every ad, private sellers' ads included.

## `photosWithoutWatermark` (type: `boolean`):

Give each photo link on the image host's unmarked copy (the same file without the portal's watermark; an advertiser's own mark stays). Off by default: the links are the ones the app serves.

## `includePersonalData` (type: `boolean`):

All public data is always delivered and this setting has no effect (kept so saved inputs keep working).

## `language` (type: `string`):

Language of the labels and fact values Immobiliare.it writes in records (default Italian). Ad texts stay as the advertiser wrote them.

## `outputFields` (type: `array`):

Keep only these fields of each row (dotted paths such as "price", "address.city"); "type", "id" and the search keys always stay. Leave empty for every field.

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

The Actor reads Immobiliare.it through Apify's Italian residential proxy (at most three addresses a run). You may give up to three proxy links of your own instead.

## Actor input object example

```json
{
  "locations": [
    "Milano"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (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": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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