Immobiliare.it Scraper - Properties, Prices & Agents
Pricing
from $1.00 / 1,000 results
Immobiliare.it Scraper - Properties, Prices & Agents
From $1/1K. Extract property listings from Immobiliare.it with clean structured data including prices, descriptions, GPS coordinates, agency details, photos, and property attributes such as condition, heating, garage, floor, and features. Search by city, filters, or URL. Blazing fast, reliable.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
7 days ago
Last modified
Categories
Share
Immobiliare.it Scraper: Property Listings, Prices and Agency Contacts for Italy
Immobiliare.it Scraper turns Italy's largest property portal into clean structured data. Get prices, full Italian descriptions, GPS coordinates, agency names and phone numbers, every photo, and a deep set of attributes such as condition, heating, garage and floor, for both sale and rental listings. Search by city with filters, or paste any Immobiliare.it search-page link and let the run walk it forward, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Two ways to search. Build searches from city names and filters (price, surface, rooms, property type, sort order), or paste one or more Immobiliare.it search-page links and let the run walk them forward.
- Fully populated on the first pass. Every listing already carries price, the full Italian description, GPS coordinates, agency name and phone numbers, and every photo, straight from the same response that lists it, with no separate lookup per listing.
- 35+ named fields. Condition, heating, garage, floor, features, and multi-unit ranges for new-construction listings that span several units.
- Buy or rent, any city. Sale and rental listings across the Italian cities the site covers, filtered by property type, price, surface and room count.
- Built for schedules. Incremental mode returns only new and changed listings on recurring runs, classifying each one NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED, and a fully blocked run fails loudly instead of returning an empty dataset.
- Resume without re-paying. Paste a previous run or dataset id and the actor skips every listing it already collected. This works cleanly when the search result order hasn't shifted since the interrupted run; if new listings pushed older ones down in the meantime, the resumed walk can stop once it hits a page made entirely of already-collected listings, before reaching genuinely new ones further down (see "Resume and recurring updates" below).
Use Cases
- Real estate agencies and PropTech platforms: track competitor listings and pricing across Italian cities.
- Market and investment research: build price-per-square-metre datasets by city, zone or property type for sale and rental segments.
- Lead generation: collect agency names, phone numbers and listing links tied to active properties.
- Price-tracking apps and alert bots: schedule Incremental mode to catch new listings and price changes as they happen.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | 10000001 |
url | "https://www.immobiliare.it/annunci/10000001/" |
title | "Trilocale in Via Esempio, zona Zona Esempio" |
contract | "sale" (also "rent") |
propertyType | "Appartamento" |
category | "Residenziale" |
price / priceFormatted | 245000 / "€ 245.000" |
priceRange | "200.001 - 300.000 €" |
surface / rooms | 85 / 3 |
bathrooms / bedrooms | 2 / 2 |
floor | "2° piano con ascensore" |
elevator | true |
condition | "Ottimo / Ristrutturato" |
heating | "Centralizzato" |
garage | "1 posto auto" |
features | ["balcone", "porta blindata"] |
latitude / longitude | 41.9000 / 12.5000 |
address | "Via Esempio 12" |
city / macrozone | "Roma" / "Zona Esempio" |
description | "Full listing description text appears here." |
photos | ["https://pwm.im-cdn.it/image/000000000/xxl.jpg"] |
agencyName | "Agenzia Demo Srl" |
agencyPhones | ["+39 06 0000000"] |
agencyUrl | "https://www.immobiliare.it/agenzie-immobiliari/900001/agenzia-demo/" |
Multi-unit new-construction listings also carry isProject, unitCount, and surfaceMin/surfaceMax plus roomsMin/roomsMax ranges for the cases where a single scalar surface or room count would be misleading; on those records the plain surface/rooms fields are left empty. Every record also carries a uuid, propertyTypeId, the original site wording in surfaceLabel/floorAbbreviation, region/province/microzone/nation, view tags, isNew/luxury/visibility flags, priceVisible and currency, agency extras (agencyType, agencyLogo, agencyIsPaid, hasCallNumbers), a verbatim agencyRaw/locationRaw passthrough of the source objects, and a photoCount. When Incremental mode is on, four extra fields are added to each record: changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a mode:
search(build searches from city names and filters) orurl(paste one or more Immobiliare.it search-page links). - For search mode, add city names and any filters; for url mode, paste the search URLs (the city, buy or rent, price, surface, room count, auction and sort filters are read straight from the URL; a zone or sub-area segment, or any other query filter in the pasted link, is not, though the Property type input still applies).
- Set Max listings (and optionally Max pages per search) to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search a single city:
{"mode": "search","locations": ["Roma"],"contract": "sale","maxPages": 5,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "IT" }}
Search with filters:
{"mode": "search","locations": ["Milano"],"contract": "rent","category": "apartments","minPrice": 800,"maxPrice": 1500,"minRooms": 2,"sortBy": "price-asc","maxPages": 10}
Multiple cities at once:
{"mode": "search","locations": ["Torino", "Bologna", "Firenze"],"contract": "sale","minSurface": 80,"maxListings": 300}
Paste search-page URLs:
{"mode": "url","urls": ["https://www.immobiliare.it/vendita-case/torino/","https://www.immobiliare.it/vendita-case/bologna/"],"maxPages": 1}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/immobiliare-it-scraper").call(run_input={"mode": "search", "locations": ["Roma"]})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["priceFormatted"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/immobiliare-it-scraper').call({ mode: 'search', locations: ['Roma'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How Max pages and Max listings shape a run
Max pages per search caps how many result pages are walked per city or URL (roughly 25 listings per page); leave it empty, or set it to 0, to walk every page the site reports. Max listings caps the total across the whole run; when a run searches several cities or URLs at once, that cap is divided evenly across them, so a single city cannot use up the entire budget while the others go unwalked.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips every listing already collected there. The walk still starts over from page 1 of each search and stops the first time it hits a page made entirely of ids already in that already-collected set; if the search's result order was stable since the interrupted run, that page is genuinely the end and Resume works cleanly, but if new listings shifted the order in the meantime, that stop can happen before the walk reaches genuinely new listings further down, so a resumed run isn't guaranteed to reach every remaining listing. Combining Resume with Incremental mode is only safe as the very first (bootstrap) run of a new tracked search; once a real Incremental-mode baseline exists for that search, the run refuses to combine them and fails immediately with a clear message. - Incremental mode (
incrementalMode) is for scheduling this actor on the SAME search repeatedly (e.g. daily). Each listing is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED.EXPIREDandREAPPEAREDare meant to be rare: a listing is only supposed to flip to "not present" (and, withemitExpiredon, be reported asEXPIRED) after a run that scans its entire tracked search end to end, uncapped and without Resume or a mid-run checkpoint restart in the way; amaxListings/maxPagescap, an unresolved location, or a resumed run are all meant to block that. In practice, the same early-stop condition described under Resume above can also end a search early inside a single run that tracks more than one city or URL: if one search's walk collects at least one new listing and then hits a page made entirely of listings a different search in that same run already collected, it stops there and is still counted as a complete scan, which can wrongly mark still-live listings further down asEXPIRED. Keep each tracked scope (city or URL) to its own run, or verify results carefully, if you rely onemitExpiredacross overlapping searches.REAPPEAREDonly fires on a later run that reads a listing id back after an earlier run had already flipped it to "not present"; withemitExpiredleft off, no listing is ever flipped, soREAPPEAREDcannot occur either.stateKeynames or shares the stored baseline; leave it empty to let the actor derive the tracked scope automatically from your search filters. With Incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search by city and filters, or url to read pasted search-page URLs. |
locations | array | prefill: ["Roma"] | City names to search. Only applies when mode = search. |
contract | string | sale | sale (vendita) or rent (affitto). Only applies when mode = search. |
category | string | all | Property type: all, apartments, or villas. Only applies when mode = search. |
minPrice | integer | (none) | Minimum price in euro. Only applies when mode = search. |
maxPrice | integer | (none) | Maximum price in euro. Only applies when mode = search. |
minSurface | integer | (none) | Minimum surface in square metres. Only applies when mode = search. |
maxSurface | integer | (none) | Maximum surface in square metres. Only applies when mode = search. |
minRooms | integer | (none) | Minimum number of rooms (locali). Only applies when mode = search. |
maxRooms | integer | (none) | Maximum number of rooms (locali). Only applies when mode = search. |
excludeAuctions | boolean | false | Hide auction listings (aste). Only applies when mode = search. |
sortBy | string | relevance | relevance, price-asc, price-desc, newest, or surface-desc. Only applies when mode = search. |
urls | array | prefill: sample URL | Immobiliare.it search-page URLs to read. The city, buy/rent, price, surface, room, auction and sort filters are read straight from the URL itself, not from the fields above; a zone/sub-area segment or any other query parameter in the pasted link is dropped, so a URL for one Rome neighborhood walks all of Rome. Property type still applies from the input above. Pagination starts at the page in the URL. Only applies when mode = url. |
maxPages | integer | prefill: 0 (unlimited) | Optional bound on result pages walked per city/URL. Leave empty to walk every page. |
maxListings | integer | 20 | Hard cap on total listings across every city/URL in the run (0 = unlimited). |
resumeFromRunId | string | (none) | Paste a previous run/dataset id from this actor to skip listings it already collected. |
incrementalMode | boolean | false | Track this same search across scheduled runs and classify each listing NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED. |
stateKey | string | (none) | Only used when Incremental mode is on. Names or shares the stored baseline; leave empty to derive it automatically. |
emitUnchanged | boolean | false | Only used when Incremental mode is on. Also return (and bill) a row for every unchanged listing. |
emitExpired | boolean | false | Only used when Incremental mode is on. Also return (and bill) a tombstone row for listings that dropped out of a fully scanned search. |
proxy | object | prefill: Residential (IT) | Connection settings. Residential proxy is recommended; the run defaults the exit country to Italy and rotates across other EU pools when needed. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"id": 10000001,"uuid": "00000000-0000-0000-0000-000000000000","url": "https://www.immobiliare.it/annunci/10000001/","title": "Trilocale in Via Esempio, zona Zona Esempio","contract": "sale","propertyType": "Appartamento","category": "Residenziale","price": 245000,"priceFormatted": "€ 245.000","priceRange": "200.001 - 300.000 €","currency": "EUR","surface": 85,"surfaceMin": 85,"surfaceMax": 85,"rooms": 3,"roomsMin": 3,"roomsMax": 3,"isProject": false,"unitCount": 1,"bathrooms": 2,"bedrooms": 2,"floor": "2° piano con ascensore","elevator": true,"condition": "Ottimo / Ristrutturato","heating": "Centralizzato","garage": "1 posto auto","features": ["balcone", "porta blindata"],"latitude": 41.9,"longitude": 12.5,"address": "Via Esempio 12","region": "Lazio","province": "Roma","city": "Roma","macrozone": "Zona Esempio","description": "Full listing description text appears here.","photos": ["https://pwm.im-cdn.it/image/000000000/xxl.jpg"],"photoCount": 1,"agencyName": "Agenzia Demo Srl","agencyType": "agency","agencyPhones": ["+39 06 0000000"],"agencyUrl": "https://www.immobiliare.it/agenzie-immobiliari/900001/agenzia-demo/","agencyRaw": {},"locationRaw": {}}
Plan Requirement
This actor is prefilled to use the residential proxy group, which is recommended for reliable results, with the exit country set to Italy; the run also rotates to other EU residential pools automatically when needed, and retries automatically with a different connection whenever one is refused.
FAQ
How much does it cost?
You pay per listing returned. Every listing record already includes price, the full description, agency contacts and photos, there is no separate toggle that changes what a record contains. The Pricing tab shows the current rates. Use Max listings and Max pages per search to cap the cost of any run.
Is it legal to scrape Immobiliare.it?
This actor collects only publicly available real estate listing data. You are responsible for how you use it: follow Immobiliare.it's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Property details are generally facts, but photos, descriptions and agency-provided contact details may be subject to third-party rights and data-protection rules in your jurisdiction.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings, and unchanged ones are not billed unless you switch on Emit unchanged listings.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted run, once, from a pasted run or dataset id. Incremental mode is for scheduling the actor on the same search repeatedly; it remembers the previous run itself, so you never paste an id. They solve different problems and, once a real Incremental-mode baseline exists, the actor refuses to run them together.
Why did my run fail instead of returning an empty dataset?
If every request to the source is refused, the run stops with a clear failure message so "this search has zero listings" is never confused with "nothing could be read". Run it again in a few minutes. If only part of a run's cities or pages were blocked, you still get what was found from the rest.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more real estate data?
Pair this actor with these related scrapers from the same team:
| 🏷️ Subito.it Scrape Subito.it listings across cars, real estate, marketplace, jobs, and more. Search... | 🏠 Idealista Scraper From $1/1K. Scrape Idealista properties across Spain, Italy, and Portugal. Extract 35+... |
| 🏠 iProperty MY Scraper Scrape property listings from iProperty.com.my for sale or rent: price, PSF, bedrooms... | 🏠 Properstar Extract property listings from Properstar across global domains like .com, .co.uk, .ch... |
| 🏠 ImmobilienScout24.de Scraper $0.9💰/1K for Gold discount. Extract property listings from immobilienscout24.de... | 🏠 SeLoger Scraper Scrape SeLoger.com properties for sale and rent. Search by location with price, room and... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.