# Subito Real Estate Scraper — Sale, Rent & Private Sellers (`crawloop/subito-real-estate-scraper`) Actor

Extract Italian property listings for sale or rent: apartments, houses, and commercial space. Get price, size, rooms, energy class, address, and private versus agency. Optional phone lookup and a new-listing monitor.

- **URL**: https://apify.com/crawloop/subito-real-estate-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 property listings

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?

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 Real Estate Scraper — Sale, Rent & Private Sellers

> **Disclaimer:** Unofficial tool. Not affiliated with, sponsored by, or endorsed by the classifieds site or its affiliates. Listings are read from publicly available search results. No login. You are responsible for complying with applicable law (including GDPR where a phone number or a private name appears) and the site’s terms. No warranty on accuracy or availability.

> **Phone numbers** stay empty unless you turn on **Include phone number**. Enable that only for numbers the listing already publishes and only when you have a lawful basis to store them.

**Subito real estate scraper** for Italian property: apartments, houses, offices, land, and rooms **for sale or for rent**. Each row has price, m², €/m², rooms, energy class, address, and **private seller vs agency**. Use it as a **Subito API alternative** from **Python**, **Node.js**, **cURL**, or **Apify MCP**.

**Best for:** Italy sale and rent comps, agency lead lists (private owners only), and a scheduled check that saves only new ads.

| Actor | Role |
| :--- | :--- |
| Subito Real Estate Scraper ◄── you are here | Italy property: sale, rent, private vs agency |
| [Immobiliare.it Scraper](https://apify.com/crawloop/immobiliare-it-scraper) | Italy portal: sale, rent, auctions |
| [SeLoger Scraper](https://apify.com/crawloop/seloger-scraper) | France sale and rent |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany rent and buy |
| [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper) | UK sale and rent |
| [Realtor.com Scraper](https://apify.com/crawloop/realtor-com-scraper) | US sold comps |
| [realestate.com.au Scraper](https://apify.com/crawloop/realestate-com-au-scraper) | Australia sold comps and listing monitor |
| [Yad2 Scraper](https://apify.com/crawloop/yad2-scraper) | Israel listings |
| [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) | French classifieds, including real estate |

### When to use this Actor

- **Search URL in, rows out** — Paste a filtered sale or rent results page (region, province, town, price).
- **One listing** — Paste a single ad URL when you already have the page.
- **Private sellers only** — Drop agency inventory and keep `advertiserType: private`.
- **New-listing monitor** — Schedule the same search. The next run saves ads that appeared after the previous newest one. A quiet tick writes zero rows.
- **Public phone, opt-in** — Turn on phone lookup when you need the number the contact endpoint returns.

### When not to use this Actor

- **Cars, jobs, or general marketplace ads** — Those categories are rejected. This Actor is property only.
- **Hidden contacts** — The phone field is filled only when you opt in and the endpoint returns a number. There is no login and no messaging.
- **A full Italy dump in one run** — Cap `maxItems`. Page through with filters (city, price) instead of one unbounded crawl.

### Key features

- **Search JSON** — One HTTP call per results page. No browser. Default **256 MB**.
- **Sale, rent, and wanted** — Apartments, houses, offices, land, garages, rooms, holiday homes, lofts.
- **Structured property fields** — Price, surface, €/m², rooms, bathrooms, floor, energy class, coordinates.
- **Private vs agency** — `isPrivate` on every row. Optional private-only filter before the row is saved.
- **Monitor cursor** — A named key-value store remembers the newest ad. The next scheduled run checks for anything newer.
- **Proxy off by default** — Enable Apify Proxy only if a run is blocked. Try datacenter before residential.

### Input

| Field | What it does |
| :--- | :--- |
| **Start URLs** | Search pages or a single listing URL. When set, the builder fields are ignored. |
| **Sale or rent** / **Property type** | Builder used when Start URLs is empty. |
| **Region / province / town** | Slugs such as `lazio`, `roma`, `pomezia`. Empty region means all of Italy. |
| **Keyword / min / max price** | Extra search filters, euros. |
| **Maximum listings** | Cap on dataset rows. Default 30. |
| **Private sellers only** | Skip agencies. |
| **Include phone number** | Off by default. One extra request per saved row. |
| **Monitor mode** | Save only ads newer than the stored cursor. |
| **Monitor state store** | Named store so scheduled runs share the cursor. |
| **Proxy** | Off unless you enable it. |

```json
{
  "startUrls": [
    { "url": "https://www.subito.it/annunci-italia/vendita/appartamenti/" }
  ],
  "maxItems": 30,
  "onlyPrivate": false,
  "includePhone": false,
  "monitorMode": false,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

Rent in one province, private sellers only, no URL:

```json
{
  "transaction": "rent",
  "propertyType": "apartments",
  "region": "lombardia",
  "province": "milano",
  "priceMax": 1500,
  "onlyPrivate": true,
  "maxItems": 40
}
```

### Output

| Field | Meaning |
| :--- | :--- |
| `title`, `url`, `description` | Headline, link, full text |
| `transaction`, `category` | `sale`, `rent`, or `wanted`, plus the property type |
| `price`, `surfaceSqm`, `pricePerSqm` | Euros, square meters, euros per m² |
| `rooms`, `bathrooms`, `floor`, `energyClass` | Locali, bagni, piano, classe energetica |
| `region`, `province`, `town`, `address` | Location. `latitude` / `longitude` when the ad has a map point |
| `advertiserType`, `isPrivate`, `advertiserName`, `shopName` | Private person or agency |
| `phone` | Null unless phone lookup is on and a number came back |
| `publishedAt`, `imageUrls` | Display time and photo URLs |

```json
{
  "id": "661739933",
  "title": "Bilocale con terrazzo",
  "transaction": "sale",
  "category": "Appartamenti",
  "price": 250000,
  "currency": "EUR",
  "surfaceSqm": 65,
  "pricePerSqm": 3846.15,
  "rooms": 2,
  "bathrooms": 1,
  "energyClass": "C",
  "town": "Roma",
  "province": "Roma",
  "advertiserType": "private",
  "isPrivate": true,
  "phone": null,
  "url": "https://www.subito.it/appartamenti/bilocale-con-terrazzo-roma-661739933.htm"
}
```

### Use cases

- Pull apartments for sale in one region and compare €/m² in a spreadsheet.
- Build a private-seller list for a city and a price band, then review names before any outreach.
- Schedule a morning run in monitor mode and export only the ads that were not in yesterday’s file.
- Feed price, size, and energy class into an internal comps sheet. Chain French inventory with [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) when the brief is not Italy-only.

### Integration examples

Replace `APIFY_TOKEN` and the actor id after you open the Actor in Apify Console. The slug below is the Store name once the Actor is public.

#### Node.js

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("crawloop/subito-real-estate-scraper").call({
  transaction: "sale",
  propertyType: "apartments",
  region: "lazio",
  maxItems: 20,
  includePhone: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("crawloop/subito-real-estate-scraper").call(run_input={
    "transaction": "rent",
    "propertyType": "apartments",
    "region": "lombardia",
    "province": "milano",
    "onlyPrivate": True,
    "maxItems": 20,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items))
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~subito-real-estate-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"propertyType":"apartments","transaction":"sale","region":"lazio","maxItems":10}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by its Store name.

Example prompts:

- "Run Subito Real Estate Scraper for apartments for sale in Lazio, max 20 rows, and return price, m², town, and seller type as JSON."
- "Run Subito Real Estate Scraper in monitor mode for rentals in Milano under 1500 euros, private sellers only, and list any new ads."
- "After the Italy rows, run Leboncoin Scraper for Paris apartments so I can compare the two markets."

### Suite next step

Italy classifieds stay in this Actor. For the other Italy portal (sale, rent, auctions), run [Immobiliare.it Scraper](https://apify.com/crawloop/immobiliare-it-scraper). For France property, run [SeLoger Scraper](https://apify.com/crawloop/seloger-scraper). For Germany, run [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper). For Australia sold comps, run [realestate.com.au Scraper](https://apify.com/crawloop/realestate-com-au-scraper).

### FAQ

**Does an empty monitor run still return rows?**
No. When nothing newer than the stored cursor is found, the dataset stays empty.

**Why is phone null?**
Phone lookup is off by default. The search card does not include a usable number. Turn on **Include phone number** to request it.

**What if the run is blocked?**
Enable Apify Proxy and try the datacenter pool before residential. The Actor does not launch a browser.

**Can I scrape cars or jobs with this Actor?**
No. Non-property categories are rejected so the dataset stays real estate.

# Actor input Schema

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

Subito real-estate search pages or single listing URLs. When this list is set, the builder fields below are ignored.

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

Used only when Start URLs is empty.

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

Used only when Start URLs is empty.

## `region` (type: `string`):

Region slug, for example lazio or lombardia. Leave empty for all of Italy.

## `province` (type: `string`):

Province slug, for example roma or milano. Requires a region.

## `town` (type: `string`):

Town slug, for example pomezia. Requires a province.

## `query` (type: `string`):

Optional keyword sent with the search.

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

Minimum price in euros.

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

Maximum price in euros.

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

Keep rows where the advertiser is a private person and skip agencies.

## `includePhone` (type: `boolean`):

Request the public phone for each saved listing. Off by default. Use only when you have a lawful basis to process that contact.

## `maxItems` (type: `integer`):

Maximum dataset rows for this run.

## `monitorMode` (type: `boolean`):

Remember the newest listing and, on the next run, save only listings that appeared after it. An empty tick saves nothing.

## `monitorStateStore` (type: `string`):

Named key-value store that keeps the monitor cursor across scheduled runs.

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

Leave proxy off unless the run is blocked. If it is blocked, enable Apify Proxy and try datacenter before residential.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.subito.it/annunci-italia/vendita/appartamenti/"
    }
  ],
  "transaction": "sale",
  "propertyType": "apartments",
  "onlyPrivate": false,
  "includePhone": false,
  "maxItems": 30,
  "monitorMode": false,
  "monitorStateStore": "subito-real-estate-monitor",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items — one property listing per row.

# 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-italia/vendita/appartamenti/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/subito-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-italia/vendita/appartamenti/" }] }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/subito-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-italia/vendita/appartamenti/"
    }
  ]
}' |
apify call crawloop/subito-real-estate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/subito-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/JGY3xQpJLMEIuk8nb/builds/fSPLZgB2DBD1PDvvk/openapi.json
