# Subito.it Real Estate Scraper (Italy) (`frances_api/subito-it-real-estate-scraper`) Actor

Scrape property listings from Subito.it: price, location, surface, rooms, photos and seller details. Export to JSON, CSV or Excel.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🏠 Subito.it Real Estate Scraper

**Turn Subito.it property ads into clean, structured data in a few clicks.**
Paste a search link, press **Start**, and get prices, locations, surfaces, rooms, photos and seller details, ready to export.

> 🇮🇹 Built for the Italian market: apartments, villas, land, garages and commercial premises for sale.

***

### ✨ Why use this Actor?

- ⚡ **Zero setup:** paste a Subito.it search URL and run. No code needed.
- 🧹 **Clean data:** numbers are real numbers (`197000`, not `"197.000 €"`), missing values are `null`.
- 🔎 **Rich details:** 35+ fields per listing, from price and surface to energy class and seller type.
- 🖼️ **Photos included:** full gallery URLs for every ad.
- 🧭 **Any search you like:** filter on Subito.it first (area, price, keywords), then copy the link.
- 📦 **Export anywhere:** JSON, CSV, Excel or XML, or use the Apify API and integrations.

***

### 🎯 What can you do with it?

| 📈 Market analysis | 🏢 Lead research | 🤖 Data projects |
|---|---|---|
| Track prices by area and property type | Find listings from private sellers and agencies | Feed dashboards and valuation models |
| Spot new listings as they appear | Screen investment opportunities | Build your own property database |

***

### 📋 What data do you get?

| Group | Fields |
|---|---|
| 🏷️ **Basics** | `url`, `title`, `description`, `price`, `category`, `property_type`, `publication_date`, `scraped_at` |
| 🛋️ **Features** | `state`, `surface`, `rooms`, `bathrooms`, `floor`, `parking`, `furnished`, `elevator`, `balcony`, `terrace`, `garden`, `top_floor`, `air_conditioning`, `heating`, `energy_class`, `immediate_availability`, `cin` |
| 📍 **Location** | `city`, `province`, `region`, `address` |
| 👤 **Seller** | `advertiser`, `advertiser_type`, `advertiser_address`, `advertiser_website`, `advertiser_online_ads`, `phone` |
| 🖼️ **Media** | `images` (list of photo URLs) |

**Formats at a glance**

- 💶 `price` is a number in euros.
- 📐 `surface` is in square meters.
- 🕒 `publication_date` is the date shown on the ad, in Italian local time.
- 🧾 `scraped_at` is an ISO timestamp in UTC.
- ➖ Fields the ad does not provide are `null`.

***

### 🚀 How to use it

1. 🔗 **Copy a search link** from Subito.it (for example, apartments for sale in Verona).
2. 📥 **Paste it** in **Start URLs**. You can add several searches, or single ads (links ending in `.htm`).
3. 🔢 **Set the maximum number of listings.**
4. ▶️ **Click Start**, then download your dataset as JSON, CSV or Excel.

#### 🔗 Search link examples

| What you want | Example link |
|---|---|
| Apartments in Verona province | `https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/` |
| Villas and houses | `https://www.subito.it/annunci-veneto/vendita/ville-singole-e-a-schiera/verona/` |
| Land and farmhouses | `https://www.subito.it/annunci-veneto/vendita/terreni-e-rustici/verona/` |
| Offices and commercial premises | `https://www.subito.it/annunci-veneto/vendita/uffici-locali-commerciali/verona/` |
| All real estate in a region | `https://www.subito.it/annunci-veneto/vendita/immobili/` |

> 💡 **Tip:** apply your filters on Subito.it first (price range, private sellers, keywords), then copy the resulting link.

#### ⚙️ Input example

```json
{
  "startUrls": [
    { "url": "https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/" }
  ],
  "maxResultItems": 100,
  "onlyPrivate": false,
  "maxConcurrency": 1,
  "maxRequestsPerCrawl": 300,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### 🎛️ Input options

| Option | What it does |
|---|---|
| `startUrls` | Search pages or single ads from Subito.it. |
| `maxResultItems` | Maximum number of listings to save. Use `0` for no limit. |
| `onlyPrivate` | Save only listings from private sellers. |
| `maxConcurrency` | Pages downloaded in parallel. Higher is faster, with a higher risk of blocking. |
| `maxRequestsPerCrawl` | Total pages the Actor may download. It also counts search pages and skipped ads, so keep it well above the number of listings you want. |
| `proxyConfiguration` | Proxy settings. If Subito blocks requests, try residential proxies with country Italy. |

***

### 📦 Output example

```json
{
  "url": "https://www.subito.it/appartamenti/bilocale-verona-664889640.htm",
  "title": "Bilocale",
  "price": 197000,
  "category": "Appartamenti",
  "property_type": "Appartamento",
  "state": "Buono - abitabile",
  "surface": 65,
  "rooms": 2,
  "bathrooms": 1,
  "floor": "1° Piano",
  "parking": true,
  "furnished": true,
  "balcony": true,
  "garden": true,
  "air_conditioning": true,
  "heating": "Autonomo",
  "energy_class": "C",
  "city": "Valeggio sul Mincio",
  "province": "VR",
  "region": "Veneto",
  "advertiser": "arturo",
  "advertiser_type": "Privato",
  "images": ["https://images.sbito.it/..."],
  "publication_date": "2026-10-19T17:30:57",
  "scraped_at": "2026-10-20T09:49:03.682Z"
}
```

***

### 🔍 Data quality and known limits

We prefer an honest `null` to a wrong value. Please keep these points in mind:

- 🏘️ **Listings covered:** built and tested on real estate ads **for sale**. Rental ads may work but are not officially supported.
- 💶 **Price:** returned only when the ad shows a price in its price field. "Negotiable" ads, or ads with the price only in the description, return `null`.
- 📄 **Page data first:** when the ad page lists a feature (state, floor, rooms, bathrooms, furnished, air conditioning and so on), that value is used. When it does not, some values are inferred from the description and can occasionally be inaccurate.
- 👤 **Seller type:** `advertiser_type` is inferred from the page and may be less reliable when the page gives no clear signal.
- 🗓️ **Publication date:** it is the date shown on the ad. Sellers and agencies can renew ads, so it may not be the first publication date.
- 📍 **Property address:** agencies sometimes publish their own office address. In that case it goes in `advertiser_address` and `address` stays empty.
- 📷 **Ads without photos:** some ads have none, so `images` can be an empty list.
- 🧭 **Search depth:** Subito.it may limit how many result pages one search can reach. For large volumes, split the work into several searches (by region, province or price range).

***

### ⚡ Performance tips

- 🐢 Start with `maxConcurrency` at `1`, then raise it to `3` to `5` if the log shows no blocking.
- 🧠 Give the Actor more memory in the run options for faster runs on large jobs.
- 🛡️ If you see many failed requests (403 or 429), switch to residential proxies with country Italy.

***

### 💳 Pricing

This Actor uses **pay-per-event** pricing: you pay for each listing saved to the dataset. See the **Pricing** tab for the current price per result.

> 🧪 Try a small run first (for example `maxResultItems: 10`) to check the output before launching large jobs.

***

### ❓ FAQ

**Can I scrape only private sellers?**
Yes, turn on **Only private sellers**. The seller type is inferred from the page, so check a sample if this filter is critical for you.

**Can I scrape a single ad?**
Yes. Paste the ad link (it ends in `.htm`) in **Start URLs**.

**Why is `price` empty for some ads?**
The ad does not show a price in its price field, for example when the seller writes "negotiable" or puts the price only in the description.

**Why do I get fewer listings than I asked for?**
Check `maxRequestsPerCrawl`: it also counts search pages and skipped ads. Raise it, or split your search into smaller ones.

**Are phone numbers included?**
Subito.it hides phone numbers behind a button, so `phone` is usually empty.

**Can I schedule it to run every day?**
Yes. Use Apify **Schedules** to run it at the times you choose, and combine it with integrations or the API to send the data where you need it.

***

### ⚖️ Legal notice

This Actor collects publicly available data from Subito.it. You are responsible for how you use the data, including compliance with Subito.it's terms of use and with data protection laws such as the GDPR, especially when handling names or other details of private individuals. This Actor is not affiliated with or endorsed by Subito.it. This notice is general information and not legal advice.

***

### 💬 Support

Found a bug, a wrong field or a missing feature? Open a ticket in the **Issues** tab of this Actor page, including the run link and an example ad link, and it will be reviewed.

# Actor input Schema

## `startUrls` (type: `array`):

Pagine di ricerca di Subito.it (es. https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/) oppure singoli annunci (URL che finiscono in .htm).

## `maxResultItems` (type: `integer`):

Quanti annunci salvare al massimo. Usa 0 per nessun limite.

## `onlyPrivate` (type: `boolean`):

Se attivo, salva solo gli annunci di privati. Il tipo di venditore è dedotto dalla pagina e può non essere certo.

## `maxConcurrency` (type: `integer`):

Numero di pagine scaricate contemporaneamente. Valori alti sono più veloci ma aumentano il rischio di blocchi.

## `maxRequestsPerCrawl` (type: `integer`):

Limite totale di pagine scaricate. Conta anche le pagine di ricerca e gli annunci scartati, quindi mettilo ben sopra il numero di annunci desiderato.

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

Proxy da usare. Se Subito blocca le richieste, prova i proxy residenziali con paese Italia.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/"
    }
  ],
  "maxResultItems": 5,
  "onlyPrivate": false,
  "maxConcurrency": 1,
  "maxRequestsPerCrawl": 15,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/"
        }
    ],
    "maxResultItems": 5,
    "maxRequestsPerCrawl": 15,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("frances_api/subito-it-real-estate-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 = {
    "startUrls": [{ "url": "https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/" }],
    "maxResultItems": 5,
    "maxRequestsPerCrawl": 15,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("frances_api/subito-it-real-estate-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 '{
  "startUrls": [
    {
      "url": "https://www.subito.it/annunci-veneto/vendita/appartamenti/verona/"
    }
  ],
  "maxResultItems": 5,
  "maxRequestsPerCrawl": 15,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call frances_api/subito-it-real-estate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,frances_api/subito-it-real-estate-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/ehmGFEOmAWwH67hMU/builds/obr4cvcUb7b3z4X8m/openapi.json
