Immobiliare.it Scraper at a glance
Immobiliare.it Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, contract, type and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Automation, Developer Tools
- Region
- Europe
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 26 options
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.
What Immobiliare.it Scraper can do
- 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).
Choose what to collect
These inputs let you configure Immobiliare.it Scraper - Properties, Prices & Agents. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | search = build searches from city names + filters. url = paste one or more listing-search URLs and walk them forward. |
locationsarray | Place names to search: cities or provinces, e.g. Roma, Milano, Torino (region names such as Lombardia are not supported and are skipped with a warning; a pasted immobiliare.it search URL also works). Slugification is automatic; accents are stripped. Only applies when mode = search. |
contractstring | Listing contract type. Only applies when mode = search. |
categorystring | Property category. 'All residential' covers every home type; 'Apartments' and 'Villas' narrow by building type. In url mode it applies to /vendita-case/ and /affitto-case/ links; a /vendita-appartamenti/ or /vendita-ville/ link carries its own type. |
minPriceinteger | Minimum price in euro. Only applies when mode = search. |
maxPriceinteger | Maximum price in euro. Only applies when mode = search. |
minSurfaceinteger | Minimum surface in square metres. Only applies when mode = search. |
Show 19 more inputs
| Input | What it controls |
|---|---|
maxSurfaceinteger | Maximum surface in square metres. Only applies when mode = search. |
minRoomsinteger | Minimum number of rooms (locali). Only applies when mode = search. |
maxRoomsinteger | Maximum number of rooms (locali). Only applies when mode = search. |
excludeAuctionsboolean | Hide auction listings (aste). Only applies when mode = search. |
sortBystring | Result ordering. Only applies when mode = search. |
urlsarray | Paste immobiliare.it search URLs: city, province (-provincia), national, category (apartments, villas), paginated and filtered/sorted searches. The property type comes from the path when it names apartments or villas; for a /vendita-case/ or /affitto-case/ link the Property type input applies. Region links such as /vendita-case/lombardia/ are not supported and are skipped with a warning. A neighbourhood URL under a city (for example /vendita-case/milano/affori-bovisa/) returns only that neighbourhood; if it cannot be matched exactly the URL is skipped with a warning and the whole city is never scraped instead. A single listing URL (/annunci//) returns that one listing (it needs the backup connection, see the README). Agency directory and market-statistics pages are not listing pages and are skipped with a warning. Left untouched, url mode scrapes one example of each shape, capped by Max listings. Pagination starts at the page in the URL. |
startUrlstring | Alternative to Search URLs for one search page: paste a single immobiliare.it search URL. When set it switches the run to URL mode and replaces the Search URLs list. |
maxPagesinteger | Optional bound on result pages walked per keyword/category/URL. Leave empty to walk every result page. |
maxListingsinteger | Hard cap on total listings across all searches. 0 means no cap (bounded by maxPages). |
maxItemsinteger | Alias of Max listings. When set it takes precedence over Max listings. 0 = no cap. |
resumeFromRunIdstring | Optional: paste a previous run ID (or dataset ID) from this actor. Listings already collected there are skipped, so this run only returns new ones. Leave empty for a normal run. Not for recurring monitoring of the same search, use Incremental mode below for that. |
incrementalModeboolean | For scheduling this actor on the SAME search (e.g. daily). The actor remembers the previous run itself and tags every listing NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, no need to paste a run ID. Distinct from Resume from run ID above, which continues one specific interrupted run. |
stateKeystring | Only used when Incremental mode is on. Leave empty to let the actor derive the tracked scope automatically from your search/filters. Set your own text to manually control which runs share a baseline (e.g. to split two schedules that use the same filters). |
emitUnchangedboolean | Only used when Incremental mode is on. Off by default: UNCHANGED listings are not pushed (saving cost). Turn on to also receive a row for every listing that has not changed since the last run, this returns and BILLS extra rows. |
emitExpiredboolean | Only used when Incremental mode is on. Off by default. Turn on to also receive a tombstone row (changeType=EXPIRED) for listings that were tracked before but no longer appear, only emitted after a run that scanned the full tracked search with no cap/resume in the way. This returns and BILLS extra rows. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection (they stay in the output). Use it when a field is noisy for your use case, for example the agency fields (agencyName, agencyPhones, agencyLogo, agencyIsPaid, agencyType, agencyUrl, agencyRaw), which are shared by every listing of an agency and would mark all of them UPDATED when the agency edits its profile. Use a dotted name such as agencyRaw.phones for a nested field. Changing this list never causes a one-time wave of UPDATED rows. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleTitle (text)contractContract (text)propertyTypeType (text)pricePrice (number)priceFormattedPrice (label) (text)surfaceSurface m² (number)roomsRooms (number)bathroomsBaths (number)cityCity (text)macrozoneZone (text)latitudeLat (number)Show 11 more fields
longitudeLng (number)agencyNameAgency (text)urlURL (link)agencyTypeType (text)agencyPhonesPhones (array)agencyUrlAgency URL (link)agencyIsPaidPaid (boolean)changeTypeChange (text)changedFieldsChanged fields (array)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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": {}
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Immobiliare.it Scraper return?
The documented output for Immobiliare.it Scraper includes id, title, contract, type, price, price (label), surface m² and rooms. Availability of each field depends on the source page and the selected mode.
How much does Immobiliare.it Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
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.
