# Subito Real Estate Scraper (`lowlanddata/subito-real-estate-scraper`) Actor

Italian property listings from Subito.it as clean JSON: surface, rooms, bathrooms, condition, energy class and computed price per square meter as first-class columns. Agency-free flag included - advertiser identity never collected. Pay per result.

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

## Pricing

from $1.79 / 1,000 results

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 Real Estate Scraper — Italian property data with price per m²

Extract property listings from **Subito.it** — Italy's largest classifieds marketplace — as clean, structured JSON. Where the general [Subito.it Scraper](https://apify.com/lowlanddata/subito-scraper) gives you title, price and location, this real-estate edition turns property specs into first-class columns: size in m², **computed price per m²**, rooms, bathrooms, floor, building condition, energy class, heating, and boolean flags for balcony, garden, elevator, furnished and air conditioning.

**No advertiser personal data, ever.** Built GDPR-first: advertiser names, user IDs and phone numbers never appear in the output — not as an option, by design. The only advertiser information kept is business-vs-private and whether the listing is agency-free.

### Quick start (30 seconds)

1. Click **Start**. With the defaults you get the newest apartment listings from all of Italy — no input needed.
2. Optionally narrow it: a keyword in **searchQuery** (e.g. `trilocale ristrutturato`), a price band in euros, a town name as the query.
3. When the run finishes, open the dataset's **Overview** tab for a spec-by-spec table, or **Export** it as CSV/Excel/JSON — with `pricePerM2Eur` already computed per row.

Any input works on a daily Schedule for monitoring.

### What you can build with it

- **Screen deals by price per m².** `pricePerM2Eur` is computed for every listing that carries both a price and a size — sort the exported table and the outliers surface immediately, no spreadsheet formulas.
- **Hunt renovation projects.** Filter `buildingCondition` for `Da ristrutturare` and combine with a low price per m² — the classic flipper screen, straight from structured attributes.
- **Watch supply in a market you serve.** Agencies and investors can schedule a daily run per town or region and see new stock, asking prices and the agency-free share as it moves.
- **Find a rental that fits.** `furnished`, `rooms`, `elevator` and `balcony` are structured booleans and numbers — filter the dataset instead of reading Italian ad text.

### What you get

Each listing is one dataset item:

```json
{
  "listingId": "612345678",
  "url": "https://www.subito.it/vendita-appartamenti/trilocale-ristrutturato-torino-612345678.htm",
  "title": "Trilocale ristrutturato zona Santa Rita",
  "description": "Trilocale al terzo piano, doppia esposizione, ristrutturato nel 2023.",
  "priceEur": 179000,
  "currency": "EUR",
  "category": "Appartamenti",
  "sizeM2": 85,
  "pricePerM2Eur": 2106,
  "rooms": 3,
  "bathrooms": 1,
  "floor": "3",
  "buildingCondition": "Ottimo - ristrutturato",
  "energyClass": "D",
  "heating": "Autonomo",
  "parking": "Posto auto",
  "furnished": false,
  "balcony": true,
  "garden": false,
  "elevator": true,
  "airConditioning": true,
  "agencyFree": false,
  "town": "Torino",
  "province": "Torino",
  "region": "Piemonte",
  "sellerType": "business",
  "postedAt": "2026-08-24 09:41:12",
  "imageUrls": ["https://images.sbito.it/api/v1/sbt-ads-images-pro/images/12/example"]
}
```

Field notes, so you know exactly what you are buying:

- `pricePerM2Eur` is `priceEur / sizeM2`, rounded to the euro — the headline column. It is `null` when either input is missing.
- Property specs are the seller's own form entries: `rooms`, `bathrooms`, `floor` and the boolean flags are only as complete as sellers fill them. Missing values are `null`, never guessed.
- `priceEur` is `null` on listings without a stated price — trades (permuta) and rent-on-request listings, typically.
- `agencyFree: true` means the seller listed without an agency (Subito's "no agente" flag).
- `town`, `province` and `region` are municipality-level — no street addresses, no coordinates.
- `description` is delivered with Subito's contact-data placeholders stripped: the site masks phone numbers and emails in ad text with placeholder tokens, and we remove the tokens.
- `sellerType` separates agencies and businesses from private sellers. Advertiser identity is never collected.

### How much does it cost to scrape Subito real estate listings?

$1.99 per 1,000 listings delivered, pay-as-you-go — no subscription, no charge for empty or failed runs. In plain euros:

- **100 listings ≈ $0.20** — a daily watch on one town.
- **500 listings ≈ $1.00** — a market snapshot with specs and price per m².

The price is all-inclusive — platform usage is covered, with no separate compute or proxy charges. Runs are fast: Subito serves its search results as plain JSON, datacenter proxies are sufficient, and a scoped run typically finishes in seconds.

Free-plan runs are limited to a sample of 25 items, enough to evaluate the columns against your real query.

### Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:

```text
Help me set up the "Subito Real Estate Scraper" actor on Apify
(https://apify.com/lowlanddata/subito-real-estate-scraper). Guide me one step at a time.

What I want to watch: [E.G. "apartments in Torino under 200,000 euros"]

Guide me to:
1. Propose my input values: an optional searchQuery (a town or keyword — empty
   browses the whole apartments category), an optional priceMinEur/priceMaxEur
   band, sortBy "date" for newest-first monitoring, and maxItems.
2. Create a free Apify account (apify.com), open the actor page, paste the values
   into the Input form, and start a run.
3. Set up a daily Schedule in the Apify Console with the same input, plus an email
   or Slack integration so new listings reach me automatically.
4. Show me how to export results as CSV/Excel — including the pricePerM2Eur
   column — or read them from the API if I code.
5. If the results are what I wanted, remind me at the end to leave a quick rating
   on the actor page, and to report anything broken or missing on its Issues tab.
```

### Input

| Field                | Description                                                                                        |
| -------------------- | -------------------------------------------------------------------------------------------------- |
| `searchQuery`        | Optional keyword — a town, a neighbourhood, `trilocale`. Leave empty to browse the whole category. |
| `categoryId`         | Subito category id. Default `7` (Appartamenti). Other Subito category ids are accepted.            |
| `priceMinEur`        | Only listings costing at least this many euros.                                                    |
| `priceMaxEur`        | Only listings costing at most this many euros.                                                     |
| `sortBy`             | `date` (newest first, default) or `relevance`.                                                     |
| `postedAfter`        | Only listings posted on or after this date (YYYY-MM-DD). Stops early with newest-first sorting.    |
| `postedBefore`       | Only listings posted on or before this date (YYYY-MM-DD).                                          |
| `maxItems`           | Stop after this many listings (default 500).                                                       |
| `proxyConfiguration` | Proxy settings; keep Apify proxy enabled. Datacenter proxies are enough.                           |

No field is required — the defaults browse the newest apartments across Italy. Invalid combinations (like an inverted price band) fail immediately with the reason in the run's status message.

### Use it from your code

Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):

```bash
curl "https://api.apify.com/v2/acts/lowlanddata~subito-real-estate-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -X POST -H "Content-Type: application/json" \
  -d '{"searchQuery": "torino", "priceMaxEur": 200000, "maxItems": 100}'
```

Node.js:

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lowlanddata/subito-real-estate-scraper').call({
  searchQuery: 'torino',
  priceMaxEur: 200000,
  maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lowlanddata/subito-real-estate-scraper").call(
    run_input={"searchQuery": "torino", "priceMaxEur": 200000, "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

Schedules, webhooks and the Make/Zapier/n8n integrations all work out of the box — this is a standard Apify actor.

### Use it with AI agents (MCP)

Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results — no glue code.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/subito-real-estate-scraper"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/subito-real-estate-scraper
```

Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

Prompts that work once connected:

- "Get the newest apartments in Bologna under 250,000 euros and rank them by price per square meter."
- "Find listings in Milano marked 'Da ristrutturare' and flag the cheapest per m²."
- "Compare the median price per m² of apartments in Torino and Genova from today's listings."

### Is it legal to scrape Subito real estate listings?

Public listing data — asking prices, property specs, municipalities — is public commercial information, and this scraper is built so that the hard part of the question never arises: **no personal data enters your dataset in the first place.** The GDPR and Italy's Garante set strict rules on personal data; an output that carries none of the advertiser's identity is the point of this actor, not an afterthought.

Structurally, the extractor maps a fixed whitelist of fields out of the site's search data. The advertiser block — names, user IDs, phone numbers — is never read into the output; only the business-vs-private flag and the agency-free flag survive. Location stops at the municipality: exact addresses and coordinates are never collected. Requests are paced, load on the site is kept negligible, and no anti-bot protection is bypassed.

One honest limit: titles and descriptions are the seller's own words. Subito itself masks contact details typed into ad text with placeholders, and this actor strips those placeholders — but the guarantee covers the data fields, not every word sellers publish about themselves.

### Is there a Subito real estate API alternative?

Subito publishes no public API for listings. This actor is the practical alternative: the same property listings as structured JSON — with specs and price per m² as columns — through one HTTP call (`run-sync-get-dataset-items`), on a schedule, or as an MCP tool for AI agents, with the privacy question already answered in the data itself.

### Does Subito block scrapers?

Subito serves its search results openly as plain JSON to ordinary requests — and this actor stays inside that welcome: paced requests, standard datacenter proxies, load kept negligible. The apartments category alone serves over 126,000 listings this way. No CAPTCHA fights, no bot-wall cat-and-mouse — which is also why scoped runs finish in seconds and hold up on daily schedules.

### How do I monitor new property listings on Subito?

Set `sortBy: "date"` with your query and price band, cap `maxItems` to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs — every new listing lands with price, size and price per m² already parsed. Even tighter: set `postedAfter` to yesterday's date — the dataset then contains only the new listings, nothing to dedupe on your side. The AI-assistant prompt above walks a non-technical user through exactly this setup.

### FAQ

**How do I get Subito real estate listings as JSON?** Run this actor — every listing becomes one JSON object with price, size, price per m², rooms, condition, energy class and location as separate fields. Export as JSON, CSV or Excel, or read the dataset from the API.

**Can I filter by price per square meter?** Yes, on the output: `pricePerM2Eur` is a column in every export, so sorting or filtering it is one click in Excel or one line of code. The source search cannot filter on it, so pull your area and screen the dataset.

**How is price per m² computed?** `priceEur` divided by `sizeM2`, rounded to the euro. If a listing lacks either the price or the size, the field is `null` — nothing is imputed.

**What does `agencyFree` mean?** It is Subito's "no agente" flag: `true` means the advertiser states the property is listed without an agency. Combined with `sellerType`, it separates private direct sales from agency stock.

**What is in the `energyClass` field?** The energy performance class the seller declared, `A` through `G`, as a structured attribute — no parsing of ad text. Sellers who skip the field yield `null`.

**Does it cover rentals as well as sales?** The actor scrapes whatever the chosen Subito category serves. The default apartments category is dominated by sales; for rentals, pass the matching Subito category id in `categoryId` and read `priceEur` as the listed rent. Fields like `furnished` and `rooms` matter most there.

**Can I scrape other property types than apartments?** Yes — `categoryId` accepts any Subito category id. The default `7` is the apartments category; houses, rooms and commercial categories work the same way, though which specs sellers fill varies by category.

**Are `rooms` and `bathrooms` always filled?** No — they are the seller's own form entries and are only as complete as sellers make them. Missing specs come through as `null` so you can see exactly what was and wasn't declared.

**Why is `priceEur` null on some listings?** Some sellers list without a stated price — trades (permuta) or rent-on-request. The field is `null` honestly, and `pricePerM2Eur` is `null` with it.

**What does `buildingCondition` contain?** Subito's structured condition attribute, e.g. `Ottimo - ristrutturato` or `Da ristrutturare`. Filtering for `Da ristrutturare` plus a low price per m² is the fastest renovation-project screen.

**Can I compare property prices between towns?** Yes, from a single run: every listing carries `town`, `province` and `region` alongside `pricePerM2Eur`, so a median-per-town comparison is one pivot table away.

**How do I get alerted when a new listing appears in my town?** Put the town in `searchQuery`, set `sortBy: "date"` and `postedAfter` to yesterday, and schedule the run daily with an email or Slack integration — each run delivers only what is new.

**Can I get the seller's name or phone number?** No — by design. Advertiser names, user IDs and phone numbers are structurally unreachable; only business-vs-private and the agency-free flag survive. That is the product: data you can store and process without a privacy review.

**Can I get the exact address of a property?** No — location stops at `town`, `province` and `region`. Street addresses and coordinates are never collected.

**Can I export to Excel or CSV?** Yes — every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API, with the property specs and price per m² as columns.

**Can I schedule daily runs?** Yes — this is a standard Apify actor: Schedules, webhooks and the Make/Zapier/n8n integrations all apply.

**Does Subito have an official real estate API?** No public one exists. This actor stands in for it — the same listings as structured JSON over one HTTP call, on a schedule, or as an MCP tool.

**What does it cost to pull Subito property listings?** $1.99 per 1,000 delivered listings, all-inclusive; a 100-listing daily town watch is roughly $0.20, and you pay nothing for failed or empty runs.

**Why did I receive only 25 listings?** Free-plan runs return a 25-item sample so you can check the columns against your query. Full results come with any paid Apify plan.

**Can an AI assistant search Italian property listings for me?** Yes — through Apify's hosted MCP server, agents such as Claude or Cursor can run a search like "apartments in Bologna ranked by price per m²" and read the dataset themselves.

### Related scrapers

The same clean-output guarantee, at home and across Europe:

- [Subito.it Scraper](https://apify.com/lowlanddata/subito-scraper) — the parent actor: every Subito category, from bikes to furniture.
- [Immoweb Scraper](https://apify.com/lowlanddata/immoweb-scraper) — Belgium's main property portal.
- [Otodom Scraper](https://apify.com/lowlanddata/otodom-scraper) — Poland's leading real-estate site.
- [Rightmove Scraper](https://apify.com/lowlanddata/rightmove-scraper) — the UK's biggest property portal.

### Troubleshooting

The actor fails fast with the reason in the run's status message:

- **"priceMinEur must not be higher than priceMaxEur."** — swap the two values.
- **"Subito blocked the run before any results could be fetched. This is usually temporary - retry in a few minutes."** — a temporary block on the first request; a retry usually lands on a clean proxy session. A block mid-run keeps the items collected so far and says so in the status message.
- **Fewer items than requested on a free plan** — the 25-item free sample cap; run on a paid Apify plan for full results.

### Support

Found an issue or missing a field you need? Open an issue on the actor's **Issues tab** — reports get fixed, this actor is actively maintained.

Working well for you? A **rating on this page** takes ten seconds and helps other buyers find a privacy-clean option among the lookalikes — it is also the clearest signal of what we should build next.

# Actor input Schema

## `searchQuery` (type: `string`):

Optional keyword, e.g. "trilocale" or "attico terrazzo". Leave empty to browse the whole category, newest first.

## `categoryId` (type: `integer`):

Subito real-estate category. 7 = Appartamenti (default). Other Subito category ids work too - the id is in the category page URL.

## `priceMinEur` (type: `integer`):

Only properties costing at least this much.

## `priceMaxEur` (type: `integer`):

Only properties costing at most this much.

## `sortBy` (type: `string`):

date (newest first, best for monitoring) or relevance.

## `postedAfter` (type: `string`):

Only listings posted on or after this date (YYYY-MM-DD or ISO timestamp). With newest-first sorting the run stops early once it reaches older listings.

## `postedBefore` (type: `string`):

Only listings posted on or before this date (YYYY-MM-DD or ISO timestamp).

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

Stop after this many properties. Free-plan runs are capped at 25 items.

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

Proxy settings. Keep Apify proxy enabled.

## Actor input object example

```json
{
  "searchQuery": "trilocale",
  "categoryId": 7,
  "sortBy": "date",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Scraped Subito property listings, one JSON object per listing.

# 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 = {
    "searchQuery": "trilocale",
    "categoryId": 7,
    "sortBy": "date",
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/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 = {
    "searchQuery": "trilocale",
    "categoryId": 7,
    "sortBy": "date",
    "maxItems": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/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 '{
  "searchQuery": "trilocale",
  "categoryId": 7,
  "sortBy": "date",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call lowlanddata/subito-real-estate-scraper --silent --output-dataset

```

## MCP server setup

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