Immobiliare.it Scraper: Real Estate Listings & Property Data avatar

Immobiliare.it Scraper: Real Estate Listings & Property Data

Pricing

from $0.35 / 1,000 listings

Go to Apify Store
Immobiliare.it Scraper: Real Estate Listings & Property Data

Immobiliare.it Scraper: Real Estate Listings & Property Data

Scrape Immobiliare.it, Italy's property portal: homes for sale and for rent by search URL with every filter, by city or zone name, or by listing URL. Listing id, title, price, surface, rooms, bathrooms, floor, address, zone, coordinates, agency, features, photos. No login.

Pricing

from $0.35 / 1,000 listings

Rating

0.0

(0)

Developer

Hyperbach

Hyperbach

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Features

Limited permissions

Share

Immobiliare.it listings, logged out: Immobiliare.it search URLs (a city, a province or a zone, for sale or for rent, with every filter you set on the site), places by name, or listing URLs in, one row per listing out — the listing id and URL, the title, the contract, the property type, the price in euros, the surface, rooms, bedrooms, bathrooms and floor, the address, macrozone, microzone and coordinates, the agency's name and phone, the features and every photo URL — several searches in one run, a max per search. One free search row per input carries a completeness verdict: COMPLETE (the search's end), CAPPED (your limit), TRUNCATED (the site's own limit of 2,000 listings a search, with its count) or PARTIAL. No login, no API key, no browser, proxies handled for you.

$0.70 per 1,000 listing rows on the Free plan, $0.595 on Starter. A run start is $0.005. The default input returns about 50 rows for about $0.04. A value that names nothing is a free row that says why.

An Immobiliare.it listing page in a browser: a three-room flat for sale in Rome, with its price, surface, rooms, floor, features and agency. Beside it, the row this Actor returns for the listing, with macrozone, microzone and features highlighted, then the title, price, surface, rooms, floor and agency.

Why this Immobiliare.it scraper

  • Your search, as you set it on the site. Paste the URL of a search from your browser: a city, a province, a zone or a microzone, for sale or for rent, with every filter you set there (price band, surface, rooms, bathrooms, property type, the sort). The actor reads the site's own search keys from that page, so the rows are the ones the site lists for it. Or give places by name (Milano, Roma 70) with contract sale or rent.
  • Whole records from the search itself. The site's list carries 25 listings a page with the price, the surface, rooms, bedrooms, bathrooms, floor, elevator, condition and heating, the address, macrozone, microzone and coordinates, the agency's name, page and phone, the features and every photo. No extra call per listing, so a search of 1,000 listings is read in about 40 calls.
  • Listing URLs for the whole record. A listing URL (or its id) reads the listing's own page: the whole description, the street number, the price per m², the energy class, the year built and the dates created and updated.
  • Every listing of a search, checked. The site's own order, page after page, until the search's end: the free search row says COMPLETE with the site's count. The site shows 80 pages (2,000 listings) of a search, whatever its count (measured 2026-11-01); a run that reaches that end says TRUNCATED with the count. A listing met twice (on another page, in another search of the run) is delivered and charged once.
  • Agents and private advertisers stay private. An agency's or a firm's public name and phone are delivered; an agent's name and a private advertiser are never named. Every input gets a row.

Who it's for

  • Real estate investors and analysts — the flats and houses of a city or a zone for sale or for rent, with the price, the surface and the coordinates, to compare prices per m² by quarter.
  • Agencies and property managers — the competition of a zone: which agencies list what, at what price, with how many photos and which visibility tier.
  • Relocation and rental services — the rentals of a city with your filters (rooms, price band, furnished), read again every day to see what is new.

Quick start

The first 50 listings of a search URL

{
"startUrls": [
"https://www.immobiliare.it/vendita-case/roma/roma-70/?mapCenter=41.834456%2C12.517035&zoom=15"
],
"maxItemsPerSearch": 50
}

Rentals of two places by name

{
"locations": [
"Milano",
"Torino"
],
"contract": "rent",
"maxItemsPerSearch": 100
}

A search URL with its filters, and two listings

{
"startUrls": [
"https://www.immobiliare.it/vendita-case/roma/?prezzoMassimo=300000&superficieMinima=60&localiMinimo=3",
"https://www.immobiliare.it/annunci/126582415/",
"123309745"
],
"maxItemsPerSearch": 100
}

Output

One row per listing (and one free search row per input):

fieldmeaning
row_typelisting (one listing, charged) or search (the input's row with the walk's verdict; free).
input_indexThe 1-based position of the input this row answers: startUrls first, then locations.
input_valueThe input as you gave it (the URL, the listing id or the place name).
input_kindWhich input it came from: url (startUrls) or place (locations).
search_urlThe search on immobiliare.it this row comes from (your URL without the map view, or the site's own /search-list/ URL of a place), or the listing's page for a listing URL, as a URL you can open.
statusA search row: ok, no_results, not_found, invalid, duplicate, failed or not_read (see the FAQ). A listing row: ok.
status_detailWhy a search row has its status, in a sentence (null when ok).
scraped_atWhen the row was read (UTC, ISO 8601).
positionA listing row: its place among this input's delivered listings, in the site's order.
pageA listing row: the list page of the search it was on (25 listings a page; null for a listing URL).
listing_idThe site's listing id (the number in /annunci/<id>/). Deduplicate across runs and join to your own data on this.
urlThe listing's page on immobiliare.it.
titleThe listing's title as the site writes it (type, street, zone, city).
contractsale, rent or auction, as the site gives it.
property_typeThe site's property type (Appartamento, Villa, Attico - Mansarda …).
categoryThe site's category (Residenziale …).
priceThe price in euros (a rent: a month); null when the advertiser hides it.
price_textThe price as the site shows it (€ 405.000, € 1.200/mese, da € 250.000).
currencyEUR when a price is given.
surface_m2The surface in m², read from the site's text.
surface_textThe surface as the site shows it (140 m²).
roomsRooms (locali) as the site writes them (3, 5+).
bedroomsBedrooms as the site writes them.
bathroomsBathrooms as the site writes them (2, 3+).
floorThe floor's short form (R raised ground floor, T ground floor, 1, 5 …).
floor_textThe floor as the site writes it (Piano rialzato, con ascensore).
elevatorWhether the building has an elevator (null when the site does not say).
conditionThe condition as the site gives it (Nuovo / In costruzione, Ottimo / Ristrutturato, Buono / Abitabile, Da ristrutturare).
heatingThe heating as the site gives it (Autonomo, Centralizzato).
featuresThe features the site lists (balcone, cantina, terrazzo, armadio a muro …).
addressThe street as the advertiser shows it (some show only the zone).
street_numberThe street number (a listing URL's row; null on search rows).
cityThe comune.
provinceThe province.
regionThe region.
macrozoneThe site's macrozone of the city (a group of quarters).
microzoneThe site's microzone (the quarter).
latitudeLatitude of the point the listing shows (exact or approximate, as the advertiser chose).
longitudeLongitude of the same point.
advertiser_typeagency, builder (an Impresa Edile), pro (another professional, such as an auction firm) or private.
agency_nameThe agency's or the firm's public name (null for a private advertiser).
agency_idThe site's id of the agency or firm.
agency_urlThe agency's page on immobiliare.it.
agency_phoneThe agency's public phone number as the site shows it (never a private advertiser's, never an agent's own).
visibilityThe listing's paid visibility tier on the site (supervetrina, vetrina, premium, star, top).
is_new_buildWhether the site marks the listing as new.
luxuryWhether the site marks the listing as luxury.
headlineThe advertiser's headline for the listing.
descriptionThe description: on a search row where the site's list carries it (its first 600 characters; mostly the top supervetrina tier), whole on a listing URL's row.
description_completetrue when description is the whole text (a listing URL's row), false when it is the list's first 600 characters; null without a description.
price_per_m2The site's price per m² (a listing URL's row).
energy_classThe energy class (a listing URL's row).
building_yearThe year the building was built (a listing URL's row).
created_atWhen the listing was created (a listing URL's row; UTC).
updated_atWhen the listing was last updated (a listing URL's row; UTC).
photo_urlsThe photos, large size, in the site's order.
photos_countHow many photos the listing has.
placeA search row: the place the site resolved (a zone with its city, a city with its region).
listings_countA search row: the site's own count of listings for the search.
listings_deliveredA search row: listing rows delivered for this input.
pages_readA search row: list pages read (25 listings a page).
repeats_skippedA search row: listings met again (on a later page, or delivered by another input of the run), skipped and not charged.
verdictA search row: COMPLETE (the search's end), CAPPED (your limit), TRUNCATED (the site's limit of 2,000 listings, or an end under its count) or PARTIAL (stopped by a refusal or the time limit).
verdict_detailA search row: the verdict's reason in a sentence (the site's count, the end met, the cap).

Example record:

{
"row_type": "listing",
"input_index": 1,
"input_value": "https://www.immobiliare.it/vendita-case/roma/roma-70/?mapCenter=41.834456%2C12.517035&zoom=15",
"input_kind": "url",
"search_url": "https://www.immobiliare.it/vendita-case/roma/roma-70/",
"status": "ok",
"status_detail": null,
"scraped_at": "2026-11-01T02:08:19Z",
"position": 3,
"page": 1,
"listing_id": "117740709",
"url": "https://www.immobiliare.it/annunci/117740709/",
"title": "Quadrilocale via di Grotta Perfetta 558, Roma 70, Roma",
"contract": "sale",
"property_type": "Quadrilocale",
"category": "Residenziale",
"price": 449000,
"price_text": "€ 449.000",
"currency": "EUR",
"surface_m2": 160,
"surface_text": "160 m²",
"rooms": "4",
"bedrooms": "3",
"bathrooms": "2",
"floor": "4",
"floor_text": "4°, con ascensore",
"elevator": true,
"condition": "Buono / Abitabile",
"heating": "Autonomo",
"features": [
"caminetto",
"fibra ottica",
"porta blindata",
"esposizione esterna",
"balcone",
"terrazzo",
"cantina"
],
"address": "Via di Grotta Perfetta",
"street_number": null,
"city": "Roma",
"province": "Roma",
"region": "Lazio",
"macrozone": "Cecchignola, Fonte Meravigliosa",
"microzone": "Roma 70",
"latitude": 41.8361,
"longitude": 12.51,
"advertiser_type": "agency",
"agency_name": "Engel & Völkers Roma",
"agency_id": 200835,
"agency_url": "https://www.immobiliare.it/agenzie-immobiliari/200835/engel-voelkers-roma/",
"agency_phone": "06 9763 7235",
"visibility": "supervetrina",
"is_new_build": false,
"luxury": false,
"headline": "Attico e superattico panoramico, Montagnola",
"description": "In uno dei comprensori più signorili e riservati della Montagnola, nel quartiere Roma 70, proponiamo un raffinato attico e superattico in via di Grotta Perfetta, caratterizzato da …(truncated for display)",
"description_complete": false,
"price_per_m2": null,
"energy_class": null,
"building_year": null,
"created_at": null,
"updated_at": null,
"photo_urls": [
"https://pwm.im-cdn.it/image/2013537978/xxl.jpg",
"https://pwm.im-cdn.it/image/2013512944/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513000/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513024/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513048/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513080/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513116/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513150/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513190/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513228/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513254/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513278/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513302/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513332/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513354/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513372/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513392/xxl.jpg",
"https://pwm.im-cdn.it/image/2013513412/xxl.jpg"
],
"photos_count": 18,
"place": null,
"listings_count": null,
"listings_delivered": null,
"pages_read": null,
"repeats_skipped": null,
"verdict": null,
"verdict_detail": null
}

Pricing

Pay for the listings a run delivers, plus one run start; no platform usage is billed to you. The listing price falls with your Apify plan.

eventunitFreeStarterScaleBusiness
Listing (listing)per 1,000$0.70$0.595$0.49$0.35
Run start (start)per run$0.005$0.005$0.005$0.005

A listing is $0.70 per 1,000 on the Free plan ($0.0007 a listing), with the place, the agency, the features and every photo included. Each run that delivers a charged listing also pays the run start, $0.005 once; a run that delivers no charged listing pays nothing at all. So one search of 100 listings costs $0.075 on the Free plan, and several searches in one run share one start. The free search row of every input, a value that is not an immobiliare.it search or listing URL or a place the site does not know (invalid), a listing the site does not have (not_found), a search with no match (no_results), a repeated input (duplicate), an input left at the cap or the time limit (not_read) and a refusal the run could not pass (failed) are never charged. A listing is charged once a run, also when several searches list it. A run that stops early (a timeout, an abort) is charged for the listings it delivered. maxItems counts the charged rows; before the first request the log names the price of each row at your plan and the most the run can cost. Enterprise plans have their own rates: the Actor's Pricing tab shows the price for your plan.

Usage patterns

  • Searches, places and listings — startUrls takes search URLs as your browser shows them (https://www.immobiliare.it/vendita-case/milano/, /affitto-case/torino/, /vendita-ville/firenze/, a zone such as /vendita-case/roma/roma-70/; every filter in them is kept: price, surface, rooms, bathrooms, property type, the sort criterio / ordine), the site's /search-list/?… URLs, and listing URLs (https://www.immobiliare.it/annunci/<id>/) or bare listing ids. The map view of a URL (mapCenter, zoom) is not read: the search is the URL's place and filters. locations takes places by name, one a line, searched as homes for sale or for rent (contract); the free search row names the place the site took. immobiliare.it only.
  • What a row is — row_type = listing: one listing, in the site's order (position, and the list page it was on). row_type = search: the free row of one input value — place (the place the site resolved), listings_count (the site's own count), listings_delivered, pages_read, repeats_skipped, the verdict with its verdict_detail, and the status with its reason.
  • How far a search goes — maxItemsPerSearch (default 0 = every listing the site shows; the form suggests 50) stops each search after that many new listings. The site shows 80 pages (2,000 listings) of a search, whatever its count; a run that reaches that end says TRUNCATED with the count, and a zone, a price band or a property type in the URL reads more of it. maxItems caps the charged rows of the whole run. A run started over the API takes the defaults, not the form's suggestion: set maxItemsPerSearch there too.

Input configuration

fieldtypedefaultwhat it does
startUrlsarrayImmobiliare.it pages to read, one a line: a search URL as your browser shows it (https://www.immobiliare.it/vendita-case/milano/, https://www.immobiliare.it/affitto-case/roma/roma-70/, with every filter you set there: price, surface, rooms, bathrooms, property type, sort), a https://www.immobiliare.it/search-list/?… URL, or a listing URL (https://www.immobiliare.it/annunci/126582415/, or the id alone). The map view (mapCenter, zoom) is not read: the search is the URL's place and filters. A URL that is not an immobiliare.it search or listing gets a free invalid row; a URL given twice a free duplicate row.
locationsarrayPlaces by name, one a line: a city (Milano), a province (Roma provincia) or a zone (Roma 70). Each is the site's own place search's first answer, searched as homes for sale or for rent (contract); the free search row names the place the site took. A name the site does not know gets a free invalid row.
contractsale / rent"sale"The contract of the locations searches: homes for sale or for rent. URLs in startUrls keep their own.
maxItemsPerSearchinteger0Stop each search after this many new listings. 0 = every listing the site shows of it: 80 pages, 2,000 listings, whatever its count says. Listing URLs are not counted here.
maxItemsinteger0Stop the whole run after this many listing rows (the charged rows). 0 = no run cap; each search still stops at its own limit above.
feedbackstringA note to the people who maintain this Actor: what you needed and did not get. For example a missing field, a wrong or empty result, or the Actor you switch from or to, and why. The run does not read it: the rows and the charges stay the same. A person reads every note.

Errors

A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:

  • the status message starts with INPUT REJECTED;
  • the dataset holds one row, {"error": true, "code": "…", "message": "…"}, and no results;
  • the key-value store record ERROR holds the same object.

From code, check error on the first row before reading results.

A URL that is not an immobiliare.it search or listing URL (an agency page, the home page, another site) is not an error: it gets one free search row with status invalid that says why, and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.

FAQ

Which status is which?

A search row's status is ok (listings served), no_results (the site lists nothing for it; read on two connections), not_found (the site does not have the listing, HTTP 404; checked on two connections), invalid (an empty value, a URL that is not an immobiliare.it search or listing URL, a page the site does not have, a map area, or a place name the site does not know), duplicate (the same search or listing again in the input: read once; or a listing another input already delivered), failed (the site refused every try; free) or not_read (left at maxItems, the charge limit or the run's time limit). A listing row's status is ok.

Why is the description empty on most search rows?

The site's list carries the description (its first 600 characters) only for listings in its top paid tier (supervetrina). A listing URL or id in startUrls reads the listing's own page, and its row carries the whole description with the energy class, the year built and the price per m².

Does it give the agent's name or a private advertiser's phone?

No. An agency's or a firm's public name, page and phone are delivered; an agent is a person and is never named, and a private advertiser is named by type only (the site's list gives neither a private name nor a phone).

Does it need an Immobiliare.it account or API key?

No. Everything is read from immobiliare.it's public pages, logged out.

Integration

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/immobiliare-scraper').call({"startUrls": ["https://www.immobiliare.it/vendita-case/roma/roma-70/?mapCenter=41.834456%2C12.517035&zoom=15"], "maxItemsPerSearch": 50});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/immobiliare-scraper').call(run_input={'startUrls': ['https://www.immobiliare.it/vendita-case/roma/roma-70/?mapCenter=41.834456%2C12.517035&zoom=15'], 'maxItemsPerSearch': 50})
items = client.dataset(run['defaultDatasetId']).list_items().items

CLI

$apify call hyperbach/immobiliare-scraper --input '{"startUrls": ["https://www.immobiliare.it/vendita-case/roma/roma-70/?mapCenter=41.834456%2C12.517035&zoom=15"], "maxItemsPerSearch": 50}'

REST

curl -X POST "https://api.apify.com/v2/acts/hyperbach~immobiliare-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' -d '{"startUrls": ["https://www.immobiliare.it/vendita-case/roma/roma-70/?mapCenter=41.834456%2C12.517035&zoom=15"], "maxItemsPerSearch": 50}'

AI agents and MCP

Apify's MCP server offers this Actor as a tool to Claude, Cursor, VS Code and any other MCP client. Connect https://mcp.apify.com?tools=hyperbach/immobiliare-scraper and ask, for example: "Get 50 homes for sale in Rome from Immobiliare.it with the price, surface, rooms and agency". The agent fills the input from the table above and reads the rows from the run's dataset. The input names are the ones in the table above. An agent or a person can add feedback to any run and say what was needed and not delivered: a missing field, a wrong or empty result, the Actor switched from or to, and why. The run returns the same rows at the same price, and a person reads every note.

n8n, Make and Zapier

The Apify node in n8n, the Apify app in Make and the Apify integration in Zapier run this Actor on a schedule or from a trigger and read its dataset. A webhook on the run's end (Integrations on the Actor page) sends the rows on to your own endpoint. Nothing to install on our side.

Support

Disagree with a charge? Write to apify@hyperbach.com with the run ID. We will ask Apify to compensate you, and the charge comes back to your Apify account as platform credit.

Did it do the job? A short review on the Store, at any rating, helps the next buyer choose.

See also

  • Zillow Scraper — Zillow listings for sale, for rent and sold, by ZIP, city or search URL, with the Zestimate, and a property's price history.
  • Redfin Scraper — Redfin homes for sale, sold and for rent by search URL, city or ZIP code, with the price, beds, baths, square feet, days on market and the MLS id.
  • Fotocasa Scraper — Fotocasa.es homes for sale and for rent in Spain by place name or search URL, with the price, surface, rooms, the coordinates and the agency.
  • StreetEasy Scraper — StreetEasy NYC rentals and sales by search link, listing link or neighborhood, with the price, net effective rent, beds, baths, square feet, days on market, the building and the agents.
  • Rightmove Scraper — Rightmove UK homes to buy or to rent by search link, listing link or place name, with the price, beds, baths, type, tenure, size, key features, floorplans and the agent branch.

This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.