# Subito.it Scraper - Italy Real Estate Data (`parsebird/subito-it-scraper`) Actor

Scrape real-estate listings from Subito.it by region, province, city, transaction, and property type. Get price, area, rooms, energy class, location, advertiser, and images. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/subito-it-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Subito.it Scraper - Italy Real Estate Data

Scrape real-estate listings from **[Subito.it](https://www.subito.it/immobili)** — Italy's largest classifieds marketplace — into clean, structured JSON. The Subito.it Scraper pulls the price, price per m², area, rooms, bathrooms, floor, energy class, location, province code, advertiser, and images for any region, province, city, transaction type, and property type, with no login and no Subito API.

<table><tr>
<td style="border-left:4px solid #F92F00;padding:12px 16px;font-weight:600">
Pick a region (and optionally province and city), a transaction (sale, rent, or vacation) and a property type — then filter by price, area, rooms, and private vs. agency — and get a structured record per Subito property listing.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/subito-it-scraper (Apify). Scrapes real-estate listings from subito.it (Italy). Call with ApifyClient.
Input JSON fields:
  regionSlug: string — Italian region slug, "italia" = nationwide (default "italia")
  provinceSlug: string — optional province slug, e.g. "roma", "milano"
  citySlug: string — optional city (comune) slug; requires provinceSlug
  transaction: "sale" | "rent" | "vacation" (default "sale")
  propertyType: "apartment"|"villa"|"land"|"garage"|"loft"|"commercial"|"room"|"vacation_home" (default "apartment")
  keyword: string — optional free-text query
  priceMin/priceMax: int (EUR, 0 = no bound) — applied after fetching
  areaMin/areaMax: int (m², 0 = no bound) — applied after fetching
  roomsMin/roomsMax: int (locali, 0 = no bound) — applied after fetching; a studio = 1
  advertiserType: "all" | "private" | "agency" (default "all")
  maxListings: int (default 200, 0 = unlimited) — number of billed rows
  maxPagesPerTask: int (default 10) — ~30 listings per page
  requestDelay: int ms (default 1500) · maxRetries: int (default 3)
  proxyConfiguration: { "useApifyProxy": true } (recommended)
Output: one dataset item per listing — adId, detailUrl, title, shortDescription, transactionType, propertyType,
  advertType, price, priceCurrency, pricePerSqm, areaSqm, rooms, bathrooms, floor, energyClass, country, region,
  province, provinceCode, city, microLocation, fullAddress, mainImageUrl, imageCount, advertiserId, advertiserName,
  advertiserType, isFeatured, isUrgent, datePosted, searchRegion, scrapedAt.
Example: { "regionSlug": "lazio", "provinceSlug": "roma", "citySlug": "roma", "transaction": "sale", "priceMax": 400000, "maxListings": 300, "proxyConfiguration": { "useApifyProxy": true } }
API: https://api.apify.com/v2/acts/parsebird~subito-it-scraper  ·  Token: https://console.apify.com/account/integrations
```

### What does the Subito.it Scraper do?

[Subito.it](https://www.subito.it) is Italy's biggest classifieds site, with hundreds of thousands of live property ads from both private sellers and agencies. There is no public Subito API — this Subito scraper reads the site's own listing data instead. For every property in a region, province, or city listing it extracts:

- 🏷️ **Identity** — ad ID, title, short description, and the direct listing URL.
- 💶 **Pricing** — asking price, currency, and price per m².
- 📐 **Size** — surface area, room count (locali), bathrooms, and floor.
- ⚡ **Energy** — the energy-efficiency class (APE).
- 📍 **Location** — region, province, province code, city, micro-location, and a formatted address.
- 👤 **Advertiser** — private or agency, advertiser ID, and name.
- 🖼️ **Media** — the primary image and the total image count.
- 📅 **Freshness** — the posting date and featured / urgent flags.

Common uses: Italian real-estate market research, price monitoring, private-seller lead generation, and building a property dataset for a portal or valuation model.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| regionSlug | string | No | `italia` | Italian region slug. `italia` = nationwide. |
| provinceSlug | string | No | — | Province slug after the region (`roma`, `milano`). |
| citySlug | string | No | — | City (comune) slug after the province. Requires `provinceSlug`. |
| transaction | string | No | `sale` | `sale` (vendita), `rent` (affitto), or `vacation` (affitto-vacanze). |
| propertyType | string | No | `apartment` | `apartment`, `villa`, `land`, `garage`, `loft`, `commercial`, `room`, `vacation_home`. |
| keyword | string | No | — | Optional free-text query. |
| priceMin / priceMax | integer | No | 0 | Price range in EUR (0 = no bound). Applied after fetching. |
| areaMin / areaMax | integer | No | 0 | Surface-area range in m² (0 = no bound). |
| roomsMin / roomsMax | integer | No | 0 | Room-count (locali) range (0 = no bound). |
| advertiserType | string | No | `all` | `all`, `private`, or `agency`. |
| maxListings | integer | No | 200 | Total cap on listings (0 = unlimited). Billed rows. |
| maxPagesPerTask | integer | No | 10 | Pagination depth (~30 listings per page). |
| requestDelay | integer | No | 1500 | Delay in ms between page requests. |
| maxRetries | integer | No | 3 | Retries per request on errors. |
| proxyConfiguration | object | No | Apify Proxy | Datacenter usually works; Residential country IT is a fallback. |

> `priceMin/Max`, `areaMin/Max`, `roomsMin/Max` and `advertiserType` are applied after fetching, because Subito does not expose price or area as URL parameters. Rooms follow the Italian *locali* convention — a studio appears as `rooms: 1`. `room` is available for rent only; `vacation` implies `vacation_home`.

#### Example inputs

Apartments for sale in Rome (filtered):

```json
{
  "regionSlug": "lazio",
  "provinceSlug": "roma",
  "citySlug": "roma",
  "transaction": "sale",
  "propertyType": "apartment",
  "priceMin": 150000,
  "priceMax": 400000,
  "areaMin": 60,
  "roomsMin": 2,
  "maxListings": 300,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "IT" }
}
```

Private-seller rentals in Milan (lead generation):

```json
{
  "regionSlug": "lombardia",
  "provinceSlug": "milano",
  "citySlug": "milano",
  "transaction": "rent",
  "propertyType": "apartment",
  "advertiserType": "private",
  "maxListings": 500,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Vacation homes in Sardinia:

```json
{
  "regionSlug": "sardegna",
  "transaction": "vacation",
  "propertyType": "vacation_home",
  "maxListings": 300,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### What data can you extract from Subito.it?

| Field | Description |
|-------|-------------|
| adId | Subito listing identifier |
| detailUrl | Direct link to the listing |
| title / shortDescription | Ad title and a trimmed description |
| transactionType / propertyType | Normalised transaction and property category |
| price / priceCurrency / pricePerSqm | Asking price, currency, and price per m² |
| areaSqm / rooms / bathrooms / floor | Size, locali, bathrooms, and floor |
| energyClass | Energy-efficiency class (APE) |
| region / province / provinceCode / city / microLocation / fullAddress | Location breakdown |
| advertType / advertiserType / advertiserId / advertiserName | Private vs. agency and advertiser details |
| mainImageUrl / imageCount | Primary image and image count |
| isFeatured / isUrgent / datePosted | Promotion flags and posting date |
| searchRegion / scrapedAt | Run context |

### Output example

```json
{
  "adId": "512345678",
  "detailUrl": "https://www.subito.it/appartamenti/appartamento-roma-512345678.htm",
  "title": "Trilocale ristrutturato zona Prati",
  "shortDescription": "Appartamento luminoso di 85 m², 3 locali, 2° piano con ascensore…",
  "transactionType": "sale",
  "propertyType": "apartment",
  "advertType": "agency",
  "price": "320000",
  "priceCurrency": "EUR",
  "pricePerSqm": "3765",
  "areaSqm": "85",
  "rooms": "3",
  "bathrooms": "1",
  "floor": "2",
  "energyClass": "D",
  "country": "Italia",
  "region": "Lazio",
  "province": "Roma",
  "provinceCode": "RM",
  "city": "Roma",
  "microLocation": null,
  "fullAddress": "Roma (RM)",
  "latitude": null,
  "longitude": null,
  "mainImageUrl": "https://images.sbito.it/api/v1/.../image?rule=gallery-desktop-2x-auto",
  "imageCount": "12",
  "advertiserId": "9981234",
  "advertiserName": "Immobiliare Roma Centro",
  "advertiserType": "agency",
  "isFeatured": "true",
  "isUrgent": "false",
  "datePosted": "2026-07-02",
  "searchRegion": "lazio",
  "scrapedAt": "2026-07-06T12:00:00.000Z"
}
```

Download the dataset as **JSON, CSV, Excel, HTML, or XML** from the Storage tab or the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Market research** — track asking prices and price per m² by city, zone, and property type.
- **Lead generation** — collect private-seller listings for a buyer's agent or a home-flipping pipeline.
- **Portal seeding** — feed a property portal or price-comparison site with Subito inventory.
- **Valuation models** — build a training set of area, rooms, floor, energy class, and price.
- **Trend monitoring** — schedule daily runs and watch supply and pricing move.

### How it works

1. **URL** — the scraper builds a Subito listing URL from your region, province, city, transaction, and property type.
2. **Listing** — it reads each results page's server-side data (about 30 listings per page).
3. **Paginate** — it walks through pages until `maxListings`, `maxPagesPerTask`, or the end of the listing.
4. **Filter** — price, area, room, and advertiser filters run in memory over the fetched listings.
5. Rows stream to the dataset.

### How much does it cost to scrape Subito.it?

This actor is **pay per result** — charged once per listing saved to the dataset.

| Plan | Price per 1,000 listings |
|------|--------------------------|
| Free | **$1.79** |
| Bronze | **$1.69** |
| Silver | **$1.59** |
| Gold | **$1.49** |

A small platform **Actor start** fee also applies per run. `maxListings` is the exact number of billed rows. Scraping 1,000 listings on the Free plan costs about **$1.79**. Apify's monthly free platform usage covers small runs.

### How to scrape Subito.it

1. Click **Try for free** and sign in to Apify.
2. Choose a **region**, and optionally paste a **province** and **city** slug from a Subito URL.
3. Pick a **transaction** and **property type**.
4. Add price, area, room, or advertiser filters if you need them.
5. Set **max listings** (start low, e.g. 100) and **max pages**.
6. Click **Start**, then watch rows appear in the **Output** tab.
7. Export from **Storage**, or pull results via the API.

#### Run it via API

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/subito-it-scraper").call(run_input={
    "regionSlug": "lazio",
    "provinceSlug": "roma",
    "citySlug": "roma",
    "transaction": "sale",
    "priceMax": 400000,
    "maxListings": 300,
    "proxyConfiguration": {"useApifyProxy": True},
})
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(ad["title"], "-", ad["price"], "-", ad["city"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/subito-it-scraper').call({
    regionSlug: 'lombardia',
    provinceSlug: 'milano',
    citySlug: 'milano',
    transaction: 'rent',
    advertiserType: 'private',
    maxListings: 500,
    proxyConfiguration: { useApifyProxy: true },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Schedule recurring runs, add webhooks, or push results to Google Sheets, Slack, Zapier, and Make with [Apify integrations](https://docs.apify.com/platform/integrations).

### FAQ

**Do I need a Subito account or API key?**
No. The scraper reads public Subito listing pages only. Subito has no public API — this actor is the alternative.

**How current is the data?**
Live. Each run reads Subito at that moment. Use Apify's scheduler to keep a dataset fresh.

**Where do I find province and city slugs?**
Open the location on Subito and copy the slug from the URL — for example `.../annunci-lazio/vendita/appartamenti/roma/roma/` gives `provinceSlug: roma`, `citySlug: roma`.

**Why are latitude and longitude empty?**
Subito's listing pages do not expose coordinates; the scraper returns the region, province, and city instead.

**Why did my filters return fewer results than the page count suggests?**
Price, area, and room filters run after fetching, so a listing that omits its price or area is dropped by a min/max bound. Widen the bounds or set them to 0.

**Something's not working.**
Open an issue on the **Issues** tab with your input and the run link — we respond quickly.

### Is it legal to scrape Subito.it?

Subito.it listing pages are public information that any visitor can see without logging in. Scraping publicly available pages is legal in most jurisdictions, and this actor does not access private data or bypass any login. You are responsible for how you use the data — follow Subito's Terms of Service and the GDPR when handling any personal data, and consult a lawyer if you are unsure. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related actors

- [Daraz.pk Ecommerce Scraper](https://apify.com/parsebird/daraz-pk-ecommerce-scraper) — products from Daraz.pk.
- [Jobbird Jobs Scraper](https://apify.com/parsebird/jobbird-jobs-scraper) — vacancies from Jobbird.com (Netherlands).
- [Jobs.ie Scraper](https://apify.com/parsebird/jobs-ie-scraper) — job listings from Ireland's Jobs.ie.
- [Trulia Property Scraper](https://apify.com/parsebird/trulia-property-scraper) — US real-estate listings from Trulia.

Browse all [ParseBird actors](https://apify.com/parsebird) on Apify Store.

# Actor input Schema

## `regionSlug` (type: `string`):

Italian region. `italia` searches nationwide.

## `provinceSlug` (type: `string`):

Optional province slug, taken from a Subito URL (for example `roma`, `milano`, `napoli`).

## `citySlug` (type: `string`):

Optional city (comune) slug. Requires a province slug.

## `transaction` (type: `string`):

Sale (vendita), rent (affitto), or vacation rental (affitto-vacanze).

## `propertyType` (type: `string`):

Property category. `room` is available for rent only; `vacation_home` is used automatically for vacation rentals.

## `keyword` (type: `string`):

Optional free-text query (for example a neighbourhood name).

## `priceMin` (type: `integer`):

0 = no lower bound. Applied after fetching.

## `priceMax` (type: `integer`):

0 = no upper bound.

## `areaMin` (type: `integer`):

0 = no lower bound.

## `areaMax` (type: `integer`):

0 = no upper bound.

## `roomsMin` (type: `integer`):

0 = no lower bound. A studio counts as 1.

## `roomsMax` (type: `integer`):

0 = no upper bound.

## `advertiserType` (type: `string`):

Filter by who posted the listing.

## `maxListings` (type: `integer`):

Total cap on listings to save (0 = unlimited). This is the number of billed rows.

## `maxPagesPerTask` (type: `integer`):

Pagination depth (about 30 listings per page).

## `requestDelay` (type: `integer`):

Delay between page requests, in milliseconds.

## `maxRetries` (type: `integer`):

Retries per request on errors.

## `proxyConfiguration` (type: `object`):

Proxy settings. Datacenter usually works; use Residential with country IT as a fallback on larger runs.

## Actor input object example

```json
{
  "regionSlug": "lazio",
  "provinceSlug": "roma",
  "citySlug": "roma",
  "transaction": "sale",
  "propertyType": "apartment",
  "advertiserType": "all",
  "maxListings": 100,
  "maxPagesPerTask": 10,
  "requestDelay": 1500,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "regionSlug": "lazio",
    "provinceSlug": "roma",
    "citySlug": "roma",
    "keyword": "",
    "priceMin": 0,
    "priceMax": 0,
    "areaMin": 0,
    "areaMax": 0,
    "roomsMin": 0,
    "roomsMax": 0,
    "maxListings": 100,
    "maxPagesPerTask": 10,
    "requestDelay": 1500,
    "maxRetries": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/subito-it-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "regionSlug": "lazio",
    "provinceSlug": "roma",
    "citySlug": "roma",
    "keyword": "",
    "priceMin": 0,
    "priceMax": 0,
    "areaMin": 0,
    "areaMax": 0,
    "roomsMin": 0,
    "roomsMax": 0,
    "maxListings": 100,
    "maxPagesPerTask": 10,
    "requestDelay": 1500,
    "maxRetries": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/subito-it-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "regionSlug": "lazio",
  "provinceSlug": "roma",
  "citySlug": "roma",
  "keyword": "",
  "priceMin": 0,
  "priceMax": 0,
  "areaMin": 0,
  "areaMax": 0,
  "roomsMin": 0,
  "roomsMax": 0,
  "maxListings": 100,
  "maxPagesPerTask": 10,
  "requestDelay": 1500,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/subito-it-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/subito-it-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KQB6VKRd2XDnPLJjo/builds/8M9PAYCgVNWSfByWF/openapi.json
