# Immobiliare.it Scraper - Italy Property Listings, Sale & Rent (`amitaviv/immobiliare-it-scraper`) Actor

Scrape immobiliare.it (Italy) sale, rent and auction listings from any search URL (city, zone, province, region, map area). One record per listing: price, m², rooms, floor, address, coordinates, features, agency, photos. New-listings monitoring. $0.70 per 1,000 listings on Bronze.

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

## Pricing

from $0.56 / 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

Italian property listings for sale and for rent from immobiliare.it search URLs: price, size, rooms, bathrooms, floor, address, coordinates, features, agency and photos, one record per listing. Apart from the start fee, you pay only for delivered listings, and a run that delivers nothing because of an error ends as Failed, never as a green empty run.

### What you get

- Price (with the previous price, percentage and date when the advertiser lowered it), price per m², size, rooms, bedrooms, bathrooms (also as a number for "5+" and ranges), floor, elevator, condition, heating, parking, features (balcony, terrace, cellar, furnished, …), views
- Address as published, city, province, region, zone (macrozone and microzone), latitude and longitude, and how exact the advertiser chose to show the location
- Contract (sale, rent or auction), category, property type, whether it is a new development (`isNewBuild`: the site files it under "Nuove costruzioni"), whether the site marks it as recently published (`isRecentlyPublished`, the site's "new" badge), luxury, number of units for a building project
- Advertiser type (agency, builder, private), agency name, id, page and business phone
- Title, short text, description, photo URLs in full size, the site's ad tier
- One record per listing, as JSON, CSV or Excel, or through the API.
- A run summary (`OUTPUT_SUMMARY` in the run's key-value store): what was requested, delivered and charged, which search URLs failed or were ignored, and why the run stopped.

What it does not return: energy class and publication or update dates (immobiliare.it shows them only on listing pages, which it refuses to automated clients), the full description of listings outside the site's top ad tier, private advertisers' names and phones (unless you opt in, see "Legal and responsible use"), the agent's name and photo from the advertiser box, anything behind a login.

Also covering Spain, Portugal and Italy: our [Idealista Scraper](https://apify.com/amitaviv/idealista-scraper) reads idealista.com, idealista.pt and idealista.it.

### How to use

1. Open immobiliare.it, search for a place (city, zone, province or region) and set your filters. Copy the URL from the browser.
2. Paste it into **Search URLs**. Several URLs are fine.
3. Set **Max listings per search URL** and press Start.
4. Download the results from the Output tab, or read them from the API.

Supported:

- Sale and rent of homes (also apartments, penthouses, villas, detached houses, lofts, farmhouses), rooms, offices, shops, garages, warehouses, sheds, land, buildings, new builds and auctions (`/aste-immobiliari/milano/`).
- URLs of a city (`/vendita-case/milano/`), a zone (`/vendita-case/milano/centro/`), a province (`/vendita-case/milano-provincia/`) and a region (`/vendita-case/lombardia/`).
- Private advertisers only (`/vendita-case/roma/da-privati/`).
- The feature pages the site links under every search: `con-ascensore`, `con-garage`, `con-cantina`, `con-terrazzo`, `con-giardino`, `con-piscina`, `con-piano-terra`, `con-piani-intermedi`, `con-ultimo-piano`, `con-riscaldamento-autonomo`, `con-aria-condizionata`, `con-lusso` and `da-ristrutturare`, e.g. `/vendita-case/milano/centro/con-garage/`. On every run the actor compares the site's count for a feature page with the count of the same search without it; if the site did not narrow the search, that URL fails by name instead of delivering unfiltered listings (searches of 25 results or fewer are not compared). Example: `/vendita-case/bologna/con-terrazzo/` 909 of 3,614 (run `BubRYl9L5CacfjEqk`).
- Map and multi-zone searches (`/search-list/?…`), including an area you draw on the map. A `/search-list/` URL that has neither a place nor a drawn area would search all of Italy, so it is refused.
- Language versions of the same URLs (`/en/vendita-case/torino/`) are read like the Italian ones. Filters and sort order in the URL are applied.

Not supported, each with a message that names it: the feature pages `con-vista-mare` and `con-prezzo-basso` (we found no search filter behind them), microzone pages, single listing pages.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | list of text | none (required) | immobiliare.it search URLs. Duplicates are ignored; URLs the actor cannot use (other sites, listing pages, unsupported pages) are ignored and listed in the summary. |
| `maxItemsPerQuery` | number | 100 | Stop after this many listings for each search URL (at most 2,000, the site's own limit). |
| `onlyNew` | yes/no | no | Monitoring: return and charge only listings that earlier runs have not delivered. See "Monitoring". |
| `monitorKey` | text | empty | Name of the monitor memory, to keep two schedules apart. |
| `includePrivateSellerData` | yes/no | no | Include the names and phone pictures that private advertisers publish. Only with a lawful basis under the GDPR. |

```json
{
  "startUrls": [
    "https://www.immobiliare.it/affitto-case/roma/",
    "https://www.immobiliare.it/vendita-case/milano/centro/con-ascensore/",
    "https://www.immobiliare.it/vendita-case/torino/da-privati/"
  ],
  "maxItemsPerQuery": 50
}
```

### Example result

Taken from run `3vramNkP5de0XZSsI` (the input above) on 2026-10-14; only the photo list is shortened:

```json
{
  "id": "131343430",
  "url": "https://www.immobiliare.it/annunci/131343430/",
  "title": "Quadrilocale via Giuseppe Failla, Mostacciano, Roma",
  "contract": "rent",
  "category": "Residenziale",
  "typology": "Quadrilocale",
  "price": 2200,
  "priceText": "€ 2.200/mese",
  "currency": "EUR",
  "pricePerSqm": 15,
  "previousPrice": 2350,
  "priceReducedPercent": 6.4,
  "priceReducedDate": "2026-10-13",
  "surfaceSqm": 144,
  "rooms": 4,
  "roomsMin": 4,
  "roomsText": "4",
  "bedrooms": 3,
  "bathrooms": 3,
  "bathroomsMin": 3,
  "bathroomsText": "3",
  "floor": "1",
  "floorText": "1°, con ascensore",
  "elevator": true,
  "condition": "Ottimo / Ristrutturato",
  "heating": "Centralizzato",
  "garage": "1 posto auto",
  "features": ["caminetto", "impianto di allarme", "porta blindata", "esposizione esterna", "balcone", "impianto tv centralizzato", "arredato"],
  "views": [],
  "isNewBuild": false,
  "isRecentlyPublished": false,
  "isLuxury": false,
  "unitsInListing": 1,
  "address": "Via Giuseppe Failla",
  "city": "Roma",
  "province": "Roma",
  "region": "Lazio",
  "macrozone": "Eur, Torrino, Tintoretto",
  "microzone": "Mostacciano",
  "latitude": 41.7984,
  "longitude": 12.4518,
  "locationPrecision": "exact",
  "caption": "Mostacciano- elegante appartamento arredato con terrazzo",
  "description": "Comfort abitativo e ambienti studiati in ogni dettaglio \n\nIn zona Mostacciano proponiamo in locazione un elegante e moderno appartamento residenziale, completamente arredato, pensato per chi desidera vivere in un ambiente raffinato, luminoso e perfettamente organizzato.\n\nL'abitazione si distingue per la distribuzione moderna e funzionale degli spazi, dove ogni ambiente è stato progettato per garantire comfort e vivibilità. L'ampia zona living con cucina open space rappresenta il cuore della casa: uno spazio accogliente e conviviale, ideale per la vita quotidiana e per i momenti da condividere.",
  "imageUrl": "https://pwm.im-cdn.it/image/2028034590/xxl.jpg",
  "images": ["https://pwm.im-cdn.it/image/2028034590/xxl.jpg", "https://pwm.im-cdn.it/image/1978600062/xxl.jpg", "https://pwm.im-cdn.it/image/1978600076/xxl.jpg", "…"],
  "hasVirtualTour": false,
  "isPrivate": false,
  "advertiserType": "agency",
  "advertiserLabel": "agenzia",
  "advertiserName": "Engel & Völkers Roma",
  "agencyId": "200835",
  "agencyUrl": "https://www.immobiliare.it/agenzie-immobiliari/200835/engel-voelkers-roma/",
  "advertiserPhones": ["06 9763 7235"],
  "advertiserPhoneImageUrl": null,
  "privateDataRedacted": false,
  "adVisibility": "supervetrina",
  "searchUrl": "https://www.immobiliare.it/affitto-case/roma/",
  "scrapedAt": "2026-10-14T18:35:13.603Z"
}
```

| Field | Meaning |
|---|---|
| `id` | immobiliare.it's own listing id; stable between runs. |
| `contract` | `sale`, `rent` or `auction`. Sale searches include auctions, as on the site; `/aste-…/` URLs return auctions only. |
| `price` | In euros; per month for rentals; the base price for auctions. `null` when the price is "on request" (`priceText` then says so). |
| `pricePerSqm` | `price` / `surfaceSqm`, rounded to whole euros (per month for rentals). Only for single-unit listings with both values published, never for auctions. |
| `previousPrice`, `priceReducedPercent`, `priceReducedDate` | Set when the advertiser lowered the price and the site shows it. |
| `rooms`, `bathrooms` | Exact numbers; `null` when the site writes "5+" (rooms), "3+" (bathrooms) or a range. |
| `roomsMin`, `bathroomsMin` | Always a number when the site gives one: the lower bound, so "5+" is 5 and "2 - 4" (a project's units) is 2. Filter and sort on these. The site's text stays in `roomsText` / `bathroomsText`. |
| `isNewBuild` | `true` when the site files the listing under its new-developments category ("Nuove costruzioni", mostly builders' projects with several units; every listing of a `/nuove-costruzioni/` search). An individual home in condition "Nuovo / In costruzione" is `false` here; see `condition`. |
| `isRecentlyPublished` | The site's "new" badge: the listing was published recently (the site does not say how recently). Not a new build. |
| `garage` | The parking the search results describe; `null` when they say nothing, which happens also for listings a `con-garage` search returns. |
| `features` | The features the search results list. The list is shorter than on the listing page: a feature page filters by the site's own data, so its listings do not always name that feature here (in run `VjJVsc602zT0X3WK1`, none of 25 `con-giardino` listings listed a garden, while the site counted 9,397 of 25,732 Rome sale listings with one). |
| `floor` | The site's short form: a number, `T` ground floor, `R` raised ground floor, `S` basement and so on; `floorText` in words. |
| `locationPrecision` | `exact` (point on the map), `area` (the advertiser shows only the area) or `none` (no map shown; `latitude` and `longitude` are then `null`). |
| `description` | The text as the search results carry it: the site shortens it, and gives it only for listings in its top ad tier. In our test runs 230 of 345 listings had one. |
| `advertiserType` | `agency`, `constructor` (builder) or `pro` as the site classifies the business; `private` for every listing without an agency or builder. |
| `adVisibility` | The site's paid ad tier (`supervetrina`, `vetrina`, `top`, `premium`, `star`, or `null`). |
| `privateDataRedacted` | `true` when this is a private advertiser's listing and their name, phone and contact details in the text were left out. |

Fields the site does not provide for a given listing are `null` (or an empty list), never missing.

### Pricing

Pay per event. You pay for what is delivered, not for time or memory.

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Actor start (charged by Apify once per GB of memory; the default 1 GB run counts 1) | $0.0042 | $0.0035 | $0.00315 | $0.0028 |
| Listing delivered | $0.00084 | $0.0007 | $0.00063 | $0.00056 |

Worked example on the Bronze plan: 3 search URLs, 50 listings each = 150 × $0.0007 + $0.0035 = $0.105 + $0.0035 = **$0.1085**. 1,000 listings cost $0.70 + $0.0035 = $0.7035. A scheduled monitoring run that finds 5 new listings costs 5 × $0.0007 + $0.0035 = $0.007; a run that finds nothing new costs $0.0035. The default 1 GB is enough: a 2,000-listing run peaked at 597 MB (run `YzJpc9FfPQcPmezr5`). Each extra GB of memory adds a start event.

- Listings that could not be delivered are not charged. A listing returned by two of your searches in one run is delivered and charged once.
- The maximum total charge you set for a run is respected: the actor stops before it would go over, keeps what was delivered, and says so in the status message (run `gdbOppl3wSbcWlS3Y`: limit $0.0245, delivered exactly 30 listings).

### Reliability and failure behaviour

| What happened | Run status | Status message |
|---|---|---|
| Listings delivered | Succeeded | `Scraped 150 listings from 3 queries` |
| A search URL the actor cannot use (other site, listing page, unsupported feature page, map URL without place or area) | ignored and listed in the summary; when no URL is left, **Failed** within seconds and the status message names the first unusable one | `Nothing to do: none of the 2 entries in the input is usable (first: "…": …)` |
| The site has no listings for your search | Succeeded | `0 results: immobiliare.it has no listings for this query` |
| Some URLs worked, some failed | Succeeded | `Scraped 75 listings from 5 queries — 2 of 5 queries failed ("…": …)` |
| Nothing delivered because of errors or blocking | **Failed** | `No listings delivered: immobiliare.it blocked every attempt; try again later. No listings were charged (the start fee applies).` |
| Input the actor cannot use | **Failed**, within seconds | `Nothing to do: … Add at least one entry to "startUrls", e.g. "https://www.immobiliare.it/vendita-case/milano/". …` |
| A feature page the site did not apply (its count with the filter is about the same as without it) | that URL fails, nothing charged for it | `immobiliare.it did not apply the feature page "…" (… listings with it, … without), so this search would deliver listings without that feature: …` |
| A place name the site does not know | that URL fails | `could not match the place "…" to immobiliare.it's search: open the search on immobiliare.it, choose the place from its list and paste the address you get` |
| The site answers with listings from all of Italy (its place filter not applied) | that URL fails, nothing charged for it | `immobiliare.it answered with listings from all of Italy, so the place of this search URL was not applied: …` |
| Maximum charge reached | Succeeded | `… — stopped at the maximum charge set for this run` |
| Run timeout close | Succeeded | `… — stopped just before the run timeout; raise the timeout to get the rest` |

- immobiliare.it protects its search with an anti-bot service that turns away part of the browser sessions. The actor opens a new session (new Italian residential IP) whenever one is refused, up to 8 attempts per request; when two search URLs in a row are refused on every attempt, the remaining ones are not tried and the run ends as Failed. In our 25 test runs on 2026-10-14 with this session recipe, 20 of 46 browser sessions were refused and replaced, and no search failed because of blocking. An earlier build without pauses between requests had all 16 sessions of a run refused, so this can change if the site tightens its protection.
- A passing server error (HTTP 500) is asked again twice before that search fails.
- Each search URL is translated to the site's search and checked with the site's own resolver before any listing is read: a URL whose place, zone or page type the actor cannot map fails by name. The resolver does not prove that the listings search applies every filter, so feature pages are also checked by their count (see "How to use"); filters you set in the URL's query (price, size, rooms, …) are forwarded as they are.
- Listings are saved page by page. A run that is aborted, times out or is resurrected keeps what was delivered and never delivers or charges the same listing twice.
- Speed: 2,000 listings in 140 seconds (run `YzJpc9FfPQcPmezr5`).

### Limits

- immobiliare.it shows at most 2,000 listings (80 pages) per search. For a larger area, paste one URL per zone or per price range.
- While the pages of a search are read, the site's order sometimes shifts a little: in our tests up to 2 listings in 75 came back on a later page (delivered and charged once, run `21mgneYKRx4iZJJNN`) and as many may not be shown at all; a 2,000-listing run had none (run `YzJpc9FfPQcPmezr5`).
- `/da-privati/` URLs: the site lists private advertisers first and then everyone else; the actor keeps only the private advertisers and stops there.
- Energy class and publication date are not available (see "What you get"). `description` is present only for listings in the site's top ad tier.
- Feature pages `con-vista-mare` and `con-prezzo-basso` and microzone pages are not supported (see "How to use").
- Italy only; field values are in Italian, as on the site.

### Monitoring: only new listings

1. Turn on **Only new listings** and save the input as a task.
2. Schedule the task (for example hourly or daily).
3. The first run delivers what it finds, newest first, up to the maximum. Every later run reads newest first and delivers and charges only listings it has not delivered before for the same search; it stops at the first page on which every listing is already known. A run with nothing new ends as Succeeded with `0 new listings…` and charges only the start.

Verified: run `21mgneYKRx4iZJJNN` delivered 50 new rentals in Milan, run `Verw3yRTvOEsIvACC` right after delivered 0 and charged no listing, and run `eN3Sf3fucqDOdedQa` 17 minutes later delivered and charged the 3 listings published in between.

- Monitoring runs bypass the site's cache, which otherwise serves search pages 15 minutes old or older, so they read the site's current listings.
- The first run's maximum per search marks the rest of the last page it read as seen (those listings are older than what was delivered). Listings left out because the **maximum charge** stopped a run are not marked as seen.
- A later run reads only down to the first page it already knows. If a run's maximum per search or maximum charge stops it before that, it does not go back for the rest next time: set both high enough for the new listings between two runs (the status message warns you when this happens).

The memory is a key-value store named `immobiliare-it-scraper-monitor` in your own account (one record per search and monitor name, at most 10,000 ids each, oldest forgotten first). Delete the store or change **Monitor name** to start over. To be notified, add an integration to the task (email, Slack, webhook) on "run succeeded".

### FAQ

**Do I need a proxy?** No. The actor uses Apify's Italian residential proxy itself; its cost is included in the price.

**Why did I get fewer listings than the site shows?** The site's 2,000 limit per search, your maximum per search, or listings moving between pages while they are read (see "Limits"). The run summary lists for every search how many listings the site reported.

**Can I scrape single listing pages?** No: immobiliare.it refuses listing pages (`/annunci/…`) to automated clients, so they are not supported.

**Can I run it from code?** Yes: the API, the Apify clients for JavaScript and Python, Make, Zapier, n8n. The Output tab shows the URLs.

**What happens when the site changes?** Runs fail loudly instead of returning empty data; report the run id under Issues.

### Legal and responsible use

This actor collects property listings that immobiliare.it shows publicly without a login. Most are published by agencies and builders; for those it returns the business name, page and the phone number they publish, but not the name or photo of the agent shown in the advertiser box. An agency's title and description are returned as the agency wrote them, and some agencies put an agent's business name, phone or e-mail in that text. Every listing without an agency or builder is treated as a private advertiser's ("privato", `isPrivate: true`): the advertiser's name and phone are `null` and phone numbers and e-mail addresses written into the texts are masked, unless you turn on **Include private advertisers' names and phone pictures**, which you may do only with a lawful basis under the GDPR. The property's address and coordinates are returned as the advertiser chose to show them on the site.

immobiliare.it's terms do not allow reproducing its content without permission. You are responsible for how you use the data: respect the site's terms, copyright and database rights, and data-protection law (GDPR and others). Do not use the output to contact private advertisers for unsolicited marketing. If you are unsure, ask a lawyer before you build on it.

### Changelog

- 2026-10-14 0.1: first version: search URLs incl. map areas and feature pages, auctions, monitoring, private-advertiser redaction.
- 2026-10-14, fixes: `isNewBuild` now means a new development (category "Nuove costruzioni"); it used to copy the site's "new" badge, which is now `isRecentlyPublished`. `con-terrazzo` pages are filtered (they returned the whole search before), and every feature page is checked against the unfiltered count. When every input URL is refused, the summary lists them all.

### Related actors

- [Idealista Scraper](https://apify.com/amitaviv/idealista-scraper): Italy's other large property portal (idealista.it, also Spain and Portugal); many listings are on only one of the two, so running both on the same city gives a fuller picture of the market.
- [Idealista Rental Yield Finder](https://apify.com/amitaviv/idealista-rental-yield-finder): gross rental yield, median price and rent per m² for an Italian city and each of its districts, as one report per area instead of raw listings.
- [Fotocasa Scraper](https://apify.com/amitaviv/fotocasa-scraper): the same kind of listing data for Spain, if you follow more than one Southern European market.
- [ImmoScout24 Scraper](https://apify.com/amitaviv/immoscout24-scraper): the same kind of listing data for Germany.

### Support

Open an issue on the actor's **Issues** tab with the run id.

# Actor input Schema

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

Required. immobiliare.it search result URLs copied from the browser's address bar after you choose the place and filters, e.g. https://www.immobiliare.it/vendita-case/milano/ or https://www.immobiliare.it/affitto-case/roma/?prezzoMassimo=1500. Each URL is one search; several are fine. Sale and rent of homes, rooms, offices, shops, garages, land, new builds and auctions; city, zone, province and region searches; private advertisers only (/da-privati/); the site's feature pages such as /con-ascensore/, /con-terrazzo/ or /con-garage/ (a feature page whose filter the site does not apply fails by name); map searches (/search-list/ URLs with a place or an area drawn on the map). Filters and sort order in the URL are applied. Not supported: single listing pages (/annunci/…), microzone pages and the feature pages /con-vista-mare/ and /con-prezzo-basso/.

## `maxItemsPerQuery` (type: `integer`):

Maximum number of listings delivered for each search URL, from 1 to 2,000; default 100. Apart from the start fee you pay only per delivered listing, so this also caps the cost. immobiliare.it shows at most 2,000 results per search, so larger areas need one URL per zone or per price range.

## `onlyNew` (type: `boolean`):

Off (default): every run delivers the listings it finds. On: return and charge only listings that earlier runs of this actor in your account have not delivered for the same search, for scheduled monitoring. Searches are then read newest first, bypassing the site's cache. The first run delivers up to the maximum. Set maxItemsPerQuery and the run's maximum charge high enough for the new listings between two runs: a later run does not go back for listings a limit left out. The memory is a key-value store named immobiliare-it-scraper-monitor in your account; delete it to start over.

## `monitorKey` (type: `string`):

Only with onlyNew. A free name for the monitor memory, e.g. milano-daily. Runs with the same search URL and the same monitor name share one memory; give two schedules different names to keep their memories apart. Default: empty (one shared memory per search).

## `includePrivateSellerData` (type: `boolean`):

Off (default): for listings by private persons ("privato", isPrivate: true) the advertiser's name and phone are null and phone numbers and e-mail addresses in their texts are masked (privateDataRedacted: true). Agencies' and builders' business name, page and phone are delivered either way. On: private advertisers' names and phone pictures as published. Turn on only if you have a lawful basis under the GDPR to process this personal data; by turning it on you confirm that you do.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.immobiliare.it/vendita-case/milano/"
  ],
  "maxItemsPerQuery": 100,
  "onlyNew": false,
  "includePrivateSellerData": false
}
```

# Actor output Schema

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

All delivered listings as JSON, one object per listing. Main fields: id, url, title, contract (sale, rent or auction), category, typology, price (EUR; per month for rentals; base price for auctions), priceText, pricePerSqm, previousPrice, priceReducedPercent, surfaceSqm (m²), rooms, roomsMin, bedrooms, bathrooms, floor, elevator, condition, heating, garage, features, isNewBuild, address, city, province, region, macrozone, microzone, latitude, longitude, locationPrecision, description, imageUrl, images, advertiserType (agency, constructor, pro or private), advertiserName, agencyUrl, advertiserPhones, privateDataRedacted, searchUrl, scrapedAt. A value the site does not give is null (or an empty list).

## `resultsCsv` (type: `string`):

All delivered listings as a CSV file, one row per listing, with the same fields as the JSON output (lists are flattened into numbered columns).

## `summary` (type: `string`):

JSON record OUTPUT_SUMMARY: what was requested, delivered and charged; per search how many listings the site reports; which search URLs failed or were ignored and why; why the run stopped.

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

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

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

```

## MCP server setup

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