Subito.it Real Estate Scraper
Pricing
from $1.80 / 1,000 results
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
Maintained by CommunityActor stats
4
Bookmarked
189
Total users
38
Monthly active users
a day ago
Last modified
Categories
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 (
maxTotalChargeUsdvia the API).
🔗 How to get a start URL
- Go to Subito.it and search in the Immobili category — for example, apartments for rent in Milan.
- Apply the filters you need on the site: area, price, rooms, size.
- 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) | Type | Description |
|---|---|---|
Start URLs (startUrls) | string[] | Subito.it Real Estate URLs: search pages or individual listings. |
Maximum number of results (maxResultItems) | number | Maximum listings to extract (0 = no limit). |
Private sellers only (onlyPrivate) | boolean | Private sellers only — no agencies, and no professionals. An advertiser filter already in your URL is kept as is. |
Extract phone numbers (extractPhoneNumber) | boolean | Phone number of private sellers, when published. Paid, only when found. If omitted: true. |
Result format (resultFormat) | string | flat (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
extractPhoneNumberis not sent, extraction is on, so tasks created before the option existed keep receiving numbers as before. WhenresultFormatis not sent, the Actor returnslegacy, 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:
| Field | Content |
|---|---|
listing_id, listing_url | Listing ID and URL |
title, published_at | Title and publication date (Italian time, ISO 8601 with offset, e.g. +02:00) |
contract_type, category, office_type | Sale/rent (e.g. In affitto), category (e.g. Appartamenti), and for offices and shops the type (e.g. Negozio) |
price_eur, price_per_sqm_eur | Price and price per square metre, in euros |
size_sqm, rooms, bathrooms | Size in m², rooms, bathrooms |
floor, floor_number | Floor as shown on Subito (e.g. Rialzato) and, when numeric, as a number |
city, province, province_code, region, latitude, longitude | Location, province code (e.g. RM) and coordinates |
advertiser_type, advertiser_name | privato or azienda, and the name (the agency's for businesses) |
advertiser_phone, phone_extraction_status | Phone number (private sellers only) and its status |
no_agencies | The advertiser does not want to be contacted by agencies |
advertiser_id, advertiser_shop_id | Subito's advertiser ID and, for shops, the shop ID |
is_*, has_* | Yes/no features (furnished, short-term rental, balcony, elevator…) |
parking | Parking (e.g. Posto auto libero, Posto bici) |
building_condition, energy_class, heating | Building condition, energy class, heating |
other_features | Every other feature Subito lists, as Label: value; … |
description | Full listing text |
cover_image, image_count, images | First image, number of images, and every image URL |
category_id, category_parent_id, city_istat | Subito's category ID, its parent category ID, and the town's ISTAT code |
search_url, page_number, scraped_at | The 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
| Value | Meaning |
|---|---|
success | Number found and included — charged |
no_number_published | This private advertiser published no number |
business_advertiser | Agency or professional: numbers are never extracted for them |
failed | The request failed after retries; the listing is still included |
not_requested | Extraction 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 (
maxTotalChargeUsdvia API).
🔗 Come ottenere l'URL di partenza
- Vai su Subito.it e cerca nella categoria Immobili, per esempio appartamenti in affitto a Milano.
- Applica i filtri che ti servono sul sito: zona, prezzo, locali, superficie.
- 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) | Tipo | Descrizione |
|---|---|---|
Start URLs (startUrls) | string[] | URL di Subito.it Immobili: pagine di ricerca o singoli annunci. |
Maximum number of results (maxResultItems) | number | Numero massimo di annunci da estrarre (0 = nessun limite). |
Private sellers only (onlyPrivate) | boolean | Solo annunci di privati, senza agenzie né professionisti. Un filtro inserzionista già presente nell'URL viene mantenuto. |
Extract phone numbers (extractPhoneNumber) | boolean | Numero di telefono dei privati, se pubblicato. A pagamento, solo se trovato. Se omesso: true. |
Result format (resultFormat) | string | flat (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
extractPhoneNumbernon viene inviato, l'estrazione è attiva, così le task create prima che l'opzione esistesse continuano a ricevere i numeri come sempre. SeresultFormatnon viene inviato, l'Actor restituiscelegacy, 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.