# Immobiliare.it Scraper - Italy Listings, Price Drops & Agencies (`topapi/immobiliare-scraper`) Actor

Scrape immobiliare.it listings for sale or rent by place, search URL, radius or polygon: price, price drops, m², rooms, floor, features, GPS, photos, agency, phones. Add-ons: listing details (energy class, dates, fees) and agency profiles. Monitor mode, past the 2,000 cap. $0.50 per 1,000 listings.

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

## Pricing

from $0.50 / 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.

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

### What does Immobiliare.it Scraper do?

**Immobiliare.it Scraper** extracts property listings for sale and rent from immobiliare.it, Italy's largest property portal. Give it a place (comune, province, region or zone), immobiliare.it search URLs with your filters, a point and radius, a map polygon, or listing URLs, and get one row per listing: price and price drop, m², rooms, bedrooms, bathrooms, floor, condition, heating, features, address, zones, coordinates, photos, agency and phone numbers. Built for property investors, agencies, price trackers, relocation services and market researchers.

Immobiliare.it scraper · Immobiliare.it API alternative · Italy real estate data · Italian property listings export

- **Every way to search:** a place name, any immobiliare.it search URL (zones, map areas, `/search-list/` links, any language version), a point + radius, a polygon, or listing URLs and ids
- **immobiliare.it's own filters:** sale or rent, property type, price, m², rooms, bathrooms, condition, floor, garage, garden, terrace, balcony, lift, cellar, pool, furnished, heating, air conditioning, sea view, virtual tour, exclude auctions, and 10 sort orders
- **Past the 2,000-listing cap:** immobiliare.it shows at most 80 pages (2,000 listings) per search; larger searches are split into price bands so every listing is reachable (2,500 listings from an 8,754-listing search, measured)
- **Price drops on every row:** the former price, the drop in € and %, and the day of the drop, whenever immobiliare.it shows one
- **Add-ons when you need them:** listing details (full description, creation and update dates, ZIP code, energy class, year built, availability, condominium fees, every photo in HD, floor plans, videos) and agency profiles (website, office address, phones, opening hours, listings on sale and sold)
- **Monitor mode:** scheduled runs return only new listings (and price changes if you want)
- **No login, cookies or API key.** Pay only for delivered rows: no start fee

### What data can you get from immobiliare.it?

<table>
<tr><td>🏷️ Title, URL, listing id</td><td>💶 Price, formatted price, price bracket</td><td>📉 Previous price, drop € / %, drop date</td></tr>
<tr><td>📐 Size m², price per m²</td><td>🛏️ Rooms, bedrooms, bathrooms</td><td>🏢 Floor, lift</td></tr>
<tr><td>✨ Condition, heating, garage</td><td>🧾 Features (balcony, cellar, terrace…)</td><td>🌊 Views (sea, panoramic)</td></tr>
<tr><td>📍 Address, comune, province, region</td><td>🗺️ Zone + sub-zone, latitude, longitude</td><td>📷 Main photo, all photos, captions</td></tr>
<tr><td>🏢 Agency name, page, logo, phones</td><td>👤 Agent name and phones, private-seller flag</td><td>🏗️ New-build projects with their units</td></tr>
<tr><td>📅 Created / updated dates (details)</td><td>⚡ Energy class + consumption (details)</td><td>🧱 Year built, floors, kitchen, availability (details)</td></tr>
<tr><td>💡 Condominium fees, costs (details)</td><td>🖼️ HD photos by room, floor plans, videos (details)</td><td>🌐 Agency website, address, hours, sold count (agency)</td></tr>
</table>

### How to scrape immobiliare.it

1. Type a place in **Location** (for example `Milano`, `Provincia di Bergamo` or `Toscana`), or paste immobiliare.it URLs.
2. Choose **For sale or to rent** and the **Property type**, and set any **Filters**.
3. Set **Max listings**, switch on an add-on if you need it, and press **Start**.
4. Download the dataset as JSON, CSV or Excel, or connect it to your tools.

### ⬇️ Input

| Input | What it does |
|---|---|
| `location` / `locations` | A comune, province, region or zone, as you would type it on immobiliare.it. Matched with immobiliare.it's own place search; each place is one search. |
| `province`, `area` | A province code (`RM`, `MI`…) to search a whole province or to pick the right town when a name exists twice; a zone inside the town (`Navigli`, `Centro Storico`). |
| `startUrls` / `urlsFromFile` | immobiliare.it search URLs with their filters, zone and map URLs, `/search-list/` URLs, and listing URLs (`/annunci/<id>/`), from any language version. |
| `listingIds` | Listing ids: the full record of each listing. |
| `latitude`, `longitude`, `radiusKm` | Search around a point. |
| `polygon` | A map area as `lat,lng` points separated by `;`. |
| `operation` | `sale`, `rent`, or `auction` (sale listings that are court auctions). |
| `propertyType` | `homes`, `apartments`, `penthouses`, `villas`, `detachedHouses`, `lofts`, `newBuilds`, `rooms`, `offices`, `shops`, `warehouses`, `garages`, `land`, `buildings`, `sheds`. |
| `minPrice`, `maxPrice`, `minSize`, `maxSize`, `minRooms`, `maxRooms`, `bathrooms` | Applied by immobiliare.it before anything is read. |
| `condition`, `floor`, `garage`, `garden`, `terrace`, `balcony`, `lift`, `cellar`, `pool`, `furnished`, `autonomousHeating`, `airConditioning`, `seaView`, `virtualTour`, `excludeAuctions` | immobiliare.it's own filters. |
| `sortBy` | `relevance`, `newest`, `oldest`, `priceLow`, `priceHigh`, `sizeLarge`, `sizeSmall`, `roomsMost`, `roomsLeast`, `privateFirst`. |
| `sellerType` | `any`, `private` (private sellers only) or `agency`. |
| `minBedrooms`, `maxBedrooms`, `requirePhone`, `onlyPriceDrops`, `minPriceDropPercent`, `includeKeywords`, `excludeKeywords`, `postedAfter` | Row filters, run before anything is charged. |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch` | How many listings (0 = no limit). |
| `splitLargeSearches` | Read past the 2,000-listing cap by splitting into price bands (on by default). |
| `includeDetails` | ➕ Listing details add-on. |
| `includeAgencyDetails` | ➕ Agency profiles add-on (once per agency per run). |
| `language` | Titles and labels in `it`, `en`, `de`, `es`, `fr`, `pt`, `el` or `ru`. |
| `monitorMode`, `includePriceChanges`, `skipFirstRun`, `monitorStoreName`, `resetMonitor` | Scheduled runs that return only new listings / price changes. |
| `maxConcurrency`, `proxyConfiguration` | Workers (default 12) and proxy (Apify residential, Italy). |

#### Input JSON

```json
{
  "location": "Milano",
  "operation": "rent",
  "propertyType": "apartments",
  "minRooms": 2,
  "maxPrice": 2000,
  "lift": true,
  "sortBy": "newest",
  "maxItems": 200,
  "includeDetails": true
}
```

#### Paste an immobiliare.it link to reuse the filters you set on the site

Set the filters on immobiliare.it and paste the address, for example `https://www.immobiliare.it/vendita-case/bologna/con-ascensore/?prezzoMassimo=300000&localiMinimo=3`. The town, zone, contract, category, typology and every filter in the address are read with immobiliare.it's own URL resolver. Map searches (`/search-list/?vrt=…` or a radius) work too. If a URL carries a filter immobiliare.it's search data has no equivalent for (`con-lusso`, `con-prezzo-basso`), the URL is skipped and the status says so, so no unfiltered listings are sold as filtered.

#### Private sellers only

Set **Seller** to `private`: the search is read in immobiliare.it's "private sellers first" order and stops at the first page without one (measured: 10 private listings in Bologna from 1 page).

### ⬆️ Output

One row per listing. A real row from a run on 2026-10-28 (Milano, for sale):

```json
{
  "id": 132096140,
  "url": "https://www.immobiliare.it/annunci/132096140/",
  "title": "Monolocale via Privata Martiri Triestini 10, San Siro, Milano",
  "contract": "sale",
  "typology": "Monolocale",
  "price": 200000,
  "previousPrice": 220000,
  "priceDropPercent": 9.1,
  "priceDropDate": "2026-10-21",
  "pricePerM2": 4762,
  "size": 42,
  "rooms": "1",
  "bathrooms": "1",
  "floor": "7",
  "condition": "Buono / Abitabile",
  "heating": "Centralizzato",
  "macrozone": "San Siro, Trenno",
  "latitude": 45.474,
  "longitude": 9.1428,
  "agencyName": "Affiliato Tecnorete: SVILUPPO IMMOBILIARE ZAVATTARI SRL",
  "agencyPhones": ["02 8126 9318"]
}
```

With Listing details and Agency profiles on, a row also carries (Napoli, for rent):

```json
{
  "creationDate": "2026-09-10T17:37:32.000Z",
  "lastModified": "2026-10-26T09:48:11.000Z",
  "zipcode": "80132",
  "energyClass": "G",
  "energyConsumption": "≥ 175 kWh/m² anno",
  "yearBuilt": 1700,
  "availability": "libero",
  "kitchen": "Cucina abitabile",
  "condominiumFees": "€ 300/mese",
  "reference": "VIA NICOTERA 38",
  "agencyProfileName": "Fabrizio Berti Immobiliare",
  "agencyWebsite": "https://www.fabriziobertiimmobiliare.it/",
  "agencyListingsCount": 37
}
```

#### Fields and how often they are filled

Measured on real runs of 2026-10-28: 2,200 search rows (Torino and Milano, for sale) and 100 rows with both add-ons (Napoli, for rent).

| Field | Filled |
|---|---|
| id, url, title, priceFormatted, size, address, city, macrozone, microzone, latitude, longitude, heating, mainPhoto, photos | 100% |
| price | 99.5% (the rest are "price on request") |
| rooms 99.8% · bedrooms 95.1% · bathrooms 94.9% · floor 93.9% · condition 95.8% · features 99.4% | as published |
| agencyName, agencyPhones | 100% / 99.8% of agency listings (private sellers show none) |
| hasLift 75% · garage 29.3% · views 19.5% | only when the advertiser states it |
| previousPrice, priceDropPercent, priceDropDate | 4.7% (listings with a price drop) |
| creationDate, lastModified, description, reference (details) | 100% |
| energyClass 88% · zipcode 85% · condominiumFees 88% · availability 89% · yearBuilt 68% · floorPlans 42% · videos 27% (details) | as published |
| agencyWebsite 75% · agencyListingsCount, agencySoldCount, agencyFullAddress 87% (agency profiles) | per listing; private sellers have no agency |

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

Pay per event, no start fee:

| Event | Price | Charged when |
|---|---|---|
| Listing (`listing`) | **$0.0005** ($0.50 per 1,000) | a listing row is delivered |
| Listing details (`listing-details`) | $0.00063 | Listing details is on and the listing's record was read |
| Agency profile (`agency-details`) | $0.009 | Agency profiles is on: once per agency per run, never for a private seller |

Listings removed by a filter, duplicates and listings seen by earlier monitor runs are never charged. A listing URL / id row is read from its full record and costs one listing (the details come with it). Set a maximum charge on the run and the actor stops cleanly at it, delivering only what fits.

Measured runs (Apify platform, 256 MB):

| Run | Rows | Time |
|---|---|---|
| Roma, for sale, 20 listings (the prefill) | 20 | 3.4 s |
| Roma, for sale, 100 listings (empty input) | 100 | 4.5 s |
| Milano, to rent, 2+ rooms, max €2,000, lift | 100 | 30 s |
| Torino, for sale, 1,200 listings | 1,200 | 24 s |
| Torino, for sale, 2,500 listings (8,754 found: split into price bands) | 2,500 | 230-280 s |
| Bologna, for sale, 100 listings + Listing details | 100 + 100 details | 100 s |
| Napoli, to rent, 100 listings + Listing details + Agency profiles | 100 + 100 details + 57 agencies | 71 s |
| monitor poll with nothing new | 0 (nothing charged) | 3.2 s |

### Run it on a schedule

1. Turn on **Monitor mode** and give the schedule its own **Monitor memory name**.
2. Optional: **Skip first run** remembers what is listed now without delivering it; **Also deliver price changes** adds listings seen before whose price changed (`changeType: "priceChange"`, `monitorPreviousPrice`, `priceChange`).
3. Create an Apify **Schedule** (for example every hour). Monitor mode reads newest first and stops at the first page with nothing new: a poll with nothing new reads one page and charges nothing.

### Integrations, API & MCP

Run it from the Apify API, the JavaScript or Python client, Make, Zapier, n8n, Google Sheets, webhooks or the Apify MCP server for AI agents. Example API call:

```bash
curl -X POST "https://api.apify.com/v2/acts/TopApi~immobiliare-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"location":"Firenze","operation":"rent","maxItems":50}'
```

### Limits & empty runs

- **2,000 listings per search** is immobiliare.it's own cap (80 pages of 25); `splitLargeSearches` reads past it with price bands. Listings with the price on request (about 0.5%) belong to no price band, so a split search does not include them.
- **immobiliare.it's bot check:** the actor reads immobiliare.it's own data through Italian residential connections. About 1 request in 25 meets the bot check (26 of 659 on the platform, 2026-10-28); that worker then moves to the Apify Unblocker for the rest of the run (no CAPTCHA is ever answered). Listing details read through the Unblocker cost more than they bill, so they have a small per-run share: on a very large details run, a few listings may come without details (never charged for details, and the status says how many). More workers (`maxConcurrency`) keep more of a run on the cheaper route.
- **Auctions only** has no immobiliare.it filter: `operation: auction` reads sale listings and keeps the court auctions.
- **Bedrooms and keywords** have no immobiliare.it filter either; they run on the rows before the charge.
- **Detail labels** (energy, kitchen, availability) are in Italian, as immobiliare.it publishes them.
- If immobiliare.it refuses every route, the run ends with an error status and nothing is charged; a search that matches nothing ends with a status saying what to change.

### FAQ

#### How many listings can Immobiliare.it Scraper collect in one run?

As many as you set in Max listings. One search returns up to 2,000 (immobiliare.it's limit); with splitting on, 2,500 listings were read from an 8,754-listing search in one run.

#### Can I search a whole province or region?

Yes. Type the province or region in Location (`Provincia di Roma`, `Lombardia`) or set the Province code.

#### Does Immobiliare.it Scraper show price drops?

Yes, on every row: `previousPrice`, `priceDropValue`, `priceDropPercent`, `priceDropDate` and `priceDropDaysAgo` whenever immobiliare.it shows a reduction. Set `onlyPriceDrops` to keep only those.

#### Can I get only new immobiliare.it listings?

Yes. Monitor mode remembers what earlier runs delivered and returns only new listings, optionally price changes.

#### Does it return the full description, energy class and dates?

Yes, with Listing details on (or for listing URLs / ids): full description, creation and update dates, ZIP code, energy class and consumption, year built, availability, condominium fees, every photo in HD, floor plans and videos.

#### Does it return agency contacts?

Every agency listing carries the agency name, page, logo and phone numbers. With Agency profiles on, it also carries the agency's website, office address and position, all phones, opening hours, listings on sale and sold.

#### Can I use English labels?

Set Language to `en` for English titles and labels on the search rows; listing-detail labels stay in Italian.

#### Do I need an immobiliare.it account, cookies or an API key?

No.

#### Can I use it with the Apify API or an MCP server?

Yes: start it from the API, a client library, a schedule, or through the Apify MCP server from an AI agent.

#### Why did my run return no listings?

Your filters matched nothing, every listing was removed by a row filter, the place or URL was not found, or (in monitor mode) nothing is new. The status message and the `RUN_SUMMARY` record say which.

#### Your feedback

Found a bug or need a field? Open an issue on the actor's Issues tab.

# Actor input Schema

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

A comune, province, region or zone as you would type it on immobiliare.it (e.g. Roma, Milano, Provincia di Bergamo, Toscana, Navigli). Matched with immobiliare.it's own place search.

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

More places, one per line. Each is a separate search with the same filters.

## `operation` (type: `string`):

Sale or rent. 'auction' reads sale listings and keeps only court auctions (aste).

## `propertyType` (type: `string`):

What kind of property. 'Homes' is every residential type.

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

Search result URLs with their filters (e.g. https://www.immobiliare.it/vendita-case/milano/?prezzoMassimo=300000), zone and map URLs, /search-list/ URLs, and listing URLs (/annunci/<id>/). Any language version works.

## `urlsFromFile` (type: `string`):

A link to a text or CSV file of immobiliare.it URLs (one per line), or the URLs pasted here.

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

immobiliare.it listing ids (the number in /annunci/<id>/). Read through the listing JSON, so these rows carry the full details.

## `province` (type: `string`):

Province code (RM, MI, NA...) to search the whole province, or to pick the right place when a name exists in several provinces.

## `area` (type: `string`):

A zone (macrozona or quartiere) inside the location's comune, e.g. Centro Storico, Navigli, Prati.

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

Search around a point instead of a place: latitude.

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

Longitude of the point.

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

Radius around the point, in km.

## `polygon` (type: `string`):

A map area as 'lat,lng' points separated by ';' (at least 3), e.g. 41.90,12.48;41.92,12.48;41.92,12.51;41.90,12.51.

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

Minimum price (monthly rent for rentals).

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

Maximum price (monthly rent for rentals).

## `minSize` (type: `integer`):

Minimum surface in m².

## `maxSize` (type: `integer`):

Maximum surface in m².

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

Minimum number of rooms (locali).

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

Maximum number of rooms (locali).

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

At least this many bathrooms.

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

Property condition as immobiliare.it classifies it.

## `floor` (type: `array`):

Ground, middle or top floor (any of them).

## `garage` (type: `boolean`):

Only listings with a garage or parking space.

## `garden` (type: `boolean`):

Private or shared garden.

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

Only listings with a terrace.

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

Only listings with a balcony.

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

Only listings with a lift.

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

Only listings with a cellar.

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

Only listings with a swimming pool.

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

Only furnished listings.

## `autonomousHeating` (type: `boolean`):

Only listings with autonomous (independent) heating.

## `airConditioning` (type: `boolean`):

Only listings with air conditioning.

## `seaView` (type: `boolean`):

Only listings with a sea view.

## `virtualTour` (type: `boolean`):

Only listings with a virtual tour.

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

Leave out court auctions (aste).

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

Order of the results (immobiliare.it's own sorts).

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

Private sellers only, agencies only, or both. Applied to every row before it is charged.

## `minBedrooms` (type: `integer`):

Keep listings with at least this many bedrooms (immobiliare.it has no bedroom filter, so it runs on the rows).

## `maxBedrooms` (type: `integer`):

Keep listings with at most this many bedrooms.

## `requirePhone` (type: `boolean`):

Keep only listings that show a phone number.

## `onlyPriceDrops` (type: `boolean`):

Keep only listings whose price was lowered (immobiliare.it shows the former price, the drop and its date).

## `minPriceDropPercent` (type: `integer`):

Keep drops of at least this percentage (turns 'Price drops only' on).

## `includeKeywords` (type: `array`):

Keep listings whose title, headline, description excerpt or features contain any of these words (e.g. terrazzo, box).

## `excludeKeywords` (type: `array`):

Drop listings that contain any of these words.

## `postedAfter` (type: `string`):

Keep listings created on or after this date (YYYY-MM-DD). The creation date lives in the listing JSON, so each candidate's listing JSON is read (charged only if 'Listing details' is on); the search is read newest first and stops once a page is older.

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

Most listings to deliver in this run (all searches together). 0 = no limit.

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

Most listings per search or location. Empty = no per-search limit.

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

Most result pages (25 listings each, 80 at most) per search.

## `splitLargeSearches` (type: `boolean`):

immobiliare.it shows at most 2,000 listings per search (80 pages). When you ask for more, the search is split into price bands so every listing is reachable.

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

Add the listing's full record: full description, reference, creation and update dates, ZIP code, energy class, year built, availability, kitchen, condominium fees, surface breakdown, every photo in HD, floor plans, videos, agent card and mortgage estimate. Charged per listing it is added to.

## `includeAgencyDetails` (type: `boolean`):

Add the agency's profile to its listings: website, full address and position, phones, description, opening hours, listings on sale and sold, partnership, agents. Charged once per agency per run; never for a private seller.

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

Language of titles and labels on the search rows (immobiliare.it's translations).

## `monitorMode` (type: `boolean`):

Deliver only listings not delivered by earlier runs of the same search (memory in a named key-value store). Run it on a schedule.

## `includePriceChanges` (type: `boolean`):

In monitor mode, also deliver listings seen before whose price changed (with monitorPreviousPrice and priceChange).

## `skipFirstRun` (type: `boolean`):

The first monitor run only remembers the current listings (nothing delivered or charged); later runs return what is new.

## `monitorStoreName` (type: `string`):

Name of the key-value store that keeps the memory. Use a different name for each separate watch list.

## `resetMonitor` (type: `boolean`):

Forget what earlier runs delivered.

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

Parallel workers, each one Italian residential exit. About 1 request in 25 meets immobiliare.it's bot check; that worker then moves to the Apify Unblocker for the rest of the run, so more workers keep more of a large run on the cheaper residential route.

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

Apify residential proxy in Italy by default (immobiliare.it challenges datacenter IPs). A worker that meets immobiliare.it's bot check moves to the Apify Unblocker.

## Actor input object example

```json
{
  "location": "Roma",
  "operation": "sale",
  "propertyType": "homes",
  "radiusKm": 2,
  "bathrooms": "",
  "condition": "",
  "sortBy": "relevance",
  "sellerType": "any",
  "maxItems": 20,
  "splitLargeSearches": true,
  "includeDetails": false,
  "includeAgencyDetails": false,
  "language": "it",
  "monitorMode": false,
  "includePriceChanges": false,
  "skipFirstRun": false,
  "monitorStoreName": "immobiliare-monitor",
  "resetMonitor": false,
  "maxConcurrency": 12,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}
```

# Actor output Schema

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

One item per immobiliare.it listing (with listing details and agency profile fields when those add-ons are on).

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

Per-search counts (site total, read, delivered, filtered, duplicates, seen before), requests per proxy rung, challenges and charges.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Roma",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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 = {
    "location": "Roma",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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 '{
  "location": "Roma",
  "maxItems": 20
}' |
apify call topapi/immobiliare-scraper --silent --output-dataset

```

## MCP server setup

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