Subito.it Real Estate Scraper avatar

Subito.it Real Estate Scraper

Pricing

from $1.80 / 1,000 results

Go to Apify Store
Subito.it Real Estate Scraper

Subito.it Real Estate Scraper

Extract real estate data from Subito.it: houses, apartments, offices, and more. Supports search pages and individual ads. Filter for private sellers and get phone numbers. Ideal for lead generation, market analysis, and CRM integration.

Pricing

from $1.80 / 1,000 results

Rating

5.0

(1)

Developer

Emiliano Mastragostino

Emiliano Mastragostino

Maintained by Community

Actor stats

4

Bookmarked

189

Total users

38

Monthly active users

a day ago

Last modified

Share

🇬🇧 English version first — you're reading it. 🇮🇹 Per la versione italiana, scorri in basso.

Subito.it Real Estate Scraper 🏘️

Extract structured data from the Immobili section of Subito.it: apartments, houses, offices and shops, for sale and for rent, from private sellers and agencies. Built for agencies, investors, property finders and proptech teams.

  • ✅ Direct leads from private sellers — name and phone number, when published.
  • ✅ Only real private sellers — Subito's own "Privato" filter still includes some professionals; this scraper can leave them out.
  • ✅ Phone numbers charged only when found — nothing to pay for listings without a number.
  • ✅ Flat output — one column per value, ready for CSV, Excel, Google Sheets or a database.
  • ✅ Search URLs or single listings, and scheduled runs for daily monitoring.
  • ✅ Existing tasks keep working — saved tasks and integrations need no changes.

💶 Pricing

You pay per result. You'll find the prices for each Apify plan on the Pricing tab.

  • Each listing saved to the dataset is one result.
  • Phone numbers are an optional extra. You're charged only when a number is found, never for agencies or for private sellers who didn't publish one. In our tests, about half of private sellers publish a number.
  • Apify subscribers pay less for both, from Bronze up.

Keep costs under control

  • Untick Extract phone numbers if you don't need contacts: you pay for listings only.
  • Set Maximum number of results, and Maximum cost per run in the run options (maxTotalChargeUsd via the API).

🔗 How to get a start URL

  1. Go to Subito.it and search in the Immobili category — for example, apartments for rent in Milan.
  2. Apply the filters you need on the site: area, price, rooms, size.
  3. Copy the URL from the address bar and paste it into Start URLs.

No need to pick "Privato" on the site: tick Private sellers only in the scraper instead, which also leaves out professionals. To include professionals, see Private sellers, professionals and agencies under Input below.

⚙️ Input

Console field (API key)TypeDescription
Start URLs (startUrls)string[]Subito.it Real Estate URLs: search pages or individual listings.
Maximum number of results (maxResultItems)numberMaximum listings to extract (0 = no limit).
Private sellers only (onlyPrivate)booleanPrivate sellers only — no agencies, and no professionals. An advertiser filter already in your URL is kept as is.
Extract phone numbers (extractPhoneNumber)booleanPhone number of private sellers, when published. Paid, only when found. If omitted: true.
Result format (resultFormat)stringflat (recommended) or legacy (original, nested). If omitted: legacy.

Private sellers, professionals and agencies

Subito's "Privato" advertiser filter also includes some professionals — agents who aren't registered on Subito as an agency. Private sellers only leaves them out, so you get real private sellers only. To include them, leave the option off and use Subito's own "Privato" filter in your search URL instead; phone numbers aren't extracted for those listings. Looking for agencies? Use the Subito Company Scraper, built for complete business data.

Defaults for existing integrations

When extractPhoneNumber is not sent, extraction is on, so tasks created before the option existed keep receiving numbers as before. When resultFormat is not sent, the Actor returns legacy, so existing exports keep their columns. API integrations must pass "resultFormat": "flat" explicitly to get the new structure.

📦 Output

Flat ("resultFormat": "flat", recommended) — every field on one level:

FieldContent
listing_id, listing_urlListing ID and URL
title, published_atTitle and publication date (Italian time, ISO 8601 with offset, e.g. +02:00)
contract_type, category, office_typeSale/rent (e.g. In affitto), category (e.g. Appartamenti), and for offices and shops the type (e.g. Negozio)
price_eur, price_per_sqm_eurPrice and price per square metre, in euros
size_sqm, rooms, bathroomsSize in m², rooms, bathrooms
floor, floor_numberFloor as shown on Subito (e.g. Rialzato) and, when numeric, as a number
city, province, province_code, region, latitude, longitudeLocation, province code (e.g. RM) and coordinates
advertiser_type, advertiser_nameprivato or azienda, and the name (the agency's for businesses)
advertiser_phone, phone_extraction_statusPhone number (private sellers only) and its status
no_agenciesThe advertiser does not want to be contacted by agencies
advertiser_id, advertiser_shop_idSubito's advertiser ID and, for shops, the shop ID
is_*, has_*Yes/no features (furnished, short-term rental, balcony, elevator…)
parkingParking (e.g. Posto auto libero, Posto bici)
building_condition, energy_class, heatingBuilding condition, energy class, heating
other_featuresEvery other feature Subito lists, as Label: value; …
descriptionFull listing text
cover_image, image_count, imagesFirst image, number of images, and every image URL
category_id, category_parent_id, city_istatSubito's category ID, its parent category ID, and the town's ISTAT code
search_url, page_number, scraped_atThe search and page the listing came from, and when it was scraped

Legacy ("resultFormat": "legacy", or the field left out) — the original nested structure, unchanged, so existing exports keep their columns. It carries the phone number under advertiser.phone_number but has no phone_extraction_status. One thing to know: in legacy the private/business label follows the original logic, so with Private sellers only off a few agencies can appear as privato; flat classifies them correctly.

phone_extraction_status

ValueMeaning
successNumber found and included — charged
no_number_publishedThis private advertiser published no number
business_advertiserAgency or professional: numbers are never extracted for them
failedThe request failed after retries; the listing is still included
not_requestedExtraction switched off

In Apify Console the Output tab shows the columns in the order above (Results view; Results (legacy format) is for legacy). Downloading through the API or an integration, add view=results to keep that order — e.g. …/items?format=csv&view=results — otherwise columns come out alphabetically.

Example

A private-seller listing in flat format, based on a real one; name, phone number and advertiser ID are placeholders. Description and image gallery are abridged here for readability; actual results carry the full text and every URL.

{
"listing_id": "654070660",
"listing_url": "https://www.subito.it/appartamenti/bilocale-50mq-piazzale-loreto-mm1-2-milano-654070660.htm",
"title": "Bilocale 50mq Piazzale Loreto MM1/2",
"published_at": "2026-09-30T15:21:52+02:00",
"contract_type": "In affitto",
"category": "Appartamenti",
"office_type": null,
"price_eur": 1200,
"price_per_sqm_eur": 21.82,
"size_sqm": 55,
"rooms": 2,
"bathrooms": 1,
"floor": "1",
"floor_number": 1,
"city": "Milano",
"province": "Milano",
"province_code": "MI",
"region": "Lombardia",
"latitude": 45.4877613,
"longitude": 9.2184946,
"advertiser_type": "privato",
"advertiser_name": "Marco",
"advertiser_phone": "+39 333 1234567",
"phone_extraction_status": "success",
"no_agencies": true,
"advertiser_id": "102938475",
"advertiser_shop_id": null,
"is_immediately_available": true,
"is_last_floor": false,
"is_multi_level": false,
"is_furnished": true,
"is_short_term_rental": false,
"has_balcony": false,
"has_garden": false,
"has_air_conditioning": true,
"has_elevator": false,
"has_reception": false,
"has_virtual_tour": null,
"parking": "Posto bici",
"building_condition": "Ottimo - ristrutturato",
"energy_class": "F",
"heating": "Autonomo",
"other_features": null,
"description": "Grazioso e funzionale bilocale, termo autonomo, climatizzato, composto da: zona living con soggiorno e cucina a vista, ripostiglio/lavanderia, camera […]",
"cover_image": "https://images.sbito.it/api/v1/sbt-ads-images-pro/images/3a/3a827caa-3139-43c0-9691-1f3a4f21fb80?rule=fullscreen-1x-auto",
"image_count": 12,
"images": [
"https://images.sbito.it/api/v1/sbt-ads-images-pro/images/3a/3a827caa-3139-43c0-9691-1f3a4f21fb80?rule=fullscreen-1x-auto",
"https://images.sbito.it/api/v1/sbt-ads-images-pro/images/12/12c1f445-4cfa-4cb1-9d50-0c300d4e1098?rule=fullscreen-1x-auto",
"…"
],
"category_id": "7",
"category_parent_id": "6",
"city_istat": "015146",
"search_url": "https://www.subito.it/annunci-lombardia/affitto/appartamenti/milano/",
"page_number": 2,
"scraped_at": "2026-10-01T09:12:45+02:00"
}

🧑‍💻 Using the API

{
"startUrls": ["https://www.subito.it/annunci-lombardia/affitto/appartamenti/milano/"],
"maxResultItems": 200,
"onlyPrivate": true,
"extractPhoneNumber": true,
"resultFormat": "flat"
}

Synchronous run with curl, returning the listings directly. maxTotalChargeUsd caps the cost of the run.

curl -X POST "https://api.apify.com/v2/actors/SGoCVHB6LrAW8kWHo/run-sync-get-dataset-items?maxTotalChargeUsd=2" \
-H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["https://www.subito.it/annunci-lombardia/affitto/appartamenti/milano/"], "maxResultItems": 200, "onlyPrivate": true, "extractPhoneNumber": true, "resultFormat": "flat"}'

The synchronous endpoint returns a 408 if the run takes longer than 300 seconds. For large extractions use the JavaScript client, which waits for the run to finish:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('SGoCVHB6LrAW8kWHo').call({
startUrls: ['https://www.subito.it/annunci-lombardia/affitto/appartamenti/milano/'],
maxResultItems: 1000,
onlyPrivate: true,
extractPhoneNumber: true,
resultFormat: 'flat',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Your API token is in the Integrations section of Apify Console.

❓ FAQ

Why do some private sellers have no phone number? Not every private seller publishes one. In that case phone_extraction_status is no_number_published, and you are not charged for it.

Can I get only new listings every day? Create a task with your search and run it on a schedule with Apify Schedules. Use a search sorted by date with a suitable result limit, and merge results on listing_id to skip the ones you've already seen.

How do I limit spending? Set Maximum number of results, and Maximum cost per run in the run options (maxTotalChargeUsd via the API). Switch off Extract phone numbers if you don't need contacts.

💬 Support



🇬🇧 English version above.

Scraper Subito.it Immobili 🏘️

Estrai dati strutturati dalla sezione Immobili di Subito.it: appartamenti, case, uffici e negozi, in vendita e in affitto, da privati e agenzie. Pensato per agenzie immobiliari, investitori, property finder e piattaforme proptech.

  • ✅ Lead diretti da privati — nome e numero di telefono, quando pubblicato.
  • ✅ Solo veri privati — il filtro «Privato» di Subito include anche alcuni professionisti: questo scraper può lasciarli fuori.
  • ✅ Numeri di telefono addebitati solo se trovati — nessun costo per gli annunci senza numero.
  • ✅ Output flat — una colonna per dato, pronto per CSV, Excel, Google Sheets o un database.
  • ✅ URL di ricerca o singoli annunci, con esecuzioni programmate per il monitoraggio quotidiano.
  • ✅ Le task esistenti continuano a funzionare — nessuna modifica alle integrazioni già attive.

💶 Prezzi

Si paga per risultato. I prezzi per ogni piano Apify sono nella scheda Pricing.

  • Ogni annuncio salvato nel dataset è un risultato.
  • I numeri di telefono sono un extra opzionale. Si pagano solo quando il numero viene trovato, mai per le agenzie né per i privati che non ne hanno pubblicato uno. Nei nostri test, circa la metà dei privati pubblica un numero.
  • Gli abbonati Apify pagano meno per entrambi, a partire dal piano Bronze.

Tieni sotto controllo la spesa

  • Togli la spunta a Extract phone numbers se non ti servono i contatti: paghi solo gli annunci.
  • Imposta Maximum number of results, e Maximum cost per run nelle opzioni di esecuzione (maxTotalChargeUsd via API).

🔗 Come ottenere l'URL di partenza

  1. Vai su Subito.it e cerca nella categoria Immobili, per esempio appartamenti in affitto a Milano.
  2. Applica i filtri che ti servono sul sito: zona, prezzo, locali, superficie.
  3. Copia l'URL dalla barra degli indirizzi e incollalo in Start URLs.

Non serve selezionare «Privato» sul sito: spunta invece Private sellers only nello scraper, che esclude anche i professionisti. Per includerli, vedi Privati, professionisti e agenzie nella sezione Input qui sotto.

⚙️ Input

Campo nella Console (chiave API)TipoDescrizione
Start URLs (startUrls)string[]URL di Subito.it Immobili: pagine di ricerca o singoli annunci.
Maximum number of results (maxResultItems)numberNumero massimo di annunci da estrarre (0 = nessun limite).
Private sellers only (onlyPrivate)booleanSolo annunci di privati, senza agenzie né professionisti. Un filtro inserzionista già presente nell'URL viene mantenuto.
Extract phone numbers (extractPhoneNumber)booleanNumero di telefono dei privati, se pubblicato. A pagamento, solo se trovato. Se omesso: true.
Result format (resultFormat)stringflat (consigliato) o legacy (originale, annidato). Se omesso: legacy.

Privati, professionisti e agenzie

Il filtro inserzionista «Privato» di Subito include anche alcuni professionisti, per esempio agenti che su Subito non sono registrati come agenzia. Con Private sellers only l'Actor li lascia fuori: ricevi solo annunci di veri privati. Per includerli, lascia l'opzione disattivata e usa il filtro «Privato» di Subito nell'URL di ricerca; per quegli annunci il numero di telefono non viene comunque estratto. Cerchi le agenzie? Usa il Subito Company Scraper, pensato per i dati completi delle aziende.

Default per le integrazioni esistenti

Se extractPhoneNumber non viene inviato, l'estrazione è attiva, così le task create prima che l'opzione esistesse continuano a ricevere i numeri come sempre. Se resultFormat non viene inviato, l'Actor restituisce legacy, così i file già in uso mantengono le stesse colonne. Chi integra via API deve passare esplicitamente "resultFormat": "flat" per ottenere la nuova struttura.

📦 Output

I nomi dei campi sono in inglese: l'elenco completo, la tabella di phone_extraction_status e un esempio di risultato sono nella sezione Output della versione inglese, qui sopra.

In breve: il formato flat (consigliato) ha tutti i campi su un solo livello; il formato legacy è la struttura annidata originale, invariata, con il numero sotto advertiser.phone_number e senza phone_extraction_status. Una cosa da sapere: in legacy l'etichetta privato/azienda segue la logica originale, quindi con Private sellers only disattivato qualche agenzia può comparire come privato; il formato flat le classifica correttamente.

🧑‍💻 Uso via API

Gli esempi con curl e con il client JavaScript sono nella sezione Using the API della versione inglese.

💬 Supporto