# Casa.it Scraper — Italy Real Estate Listings (`bovi/casa-properties-scraper`) Actor

Collect Casa.it property listings from search-result URLs. Get price, surface, rooms, energy class, geography, publisher, and media. Run with your Apify account; no Casa.it login or buyer API key. Free pricing: $0.0012 per dataset item.

- **URL**: https://apify.com/bovi/casa-properties-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 8 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.16 / 1,000 casa.it scraper — italy real estate 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

## Casa.it Real Estate Properties Scraper

Scrape Casa.it search-result URLs for Italian real-estate listings and return structured property, price, geo, publisher, and media data; each URL is limited to 50 pages. Run with your Apify account; no Casa.it login, API key, or cookies are required.

- Extract sale or rent listings with price, surface, rooms, energy class, availability, and property type.
- Compare inventory by district, block, city, province, region, and coordinates.
- Research listings and agencies using publisher, contact, title, description, and media fields.
- Export structured results for property-market analysis, monitoring, or downstream processing.

### What you get

Each result is a Casa.it listing. Missing scalar values are `null`; list fields can be empty.

| Field family | Fields | Type | Description |
|---|---|---|---|
| Identity | `id`, `partner_id`, `ref_publisher`, `uri`, `from_url` | integer; string | Listing IDs, publisher reference, path, and source URL. |
| Classification | `channel`, `category`, `property_type_group`, `property_type`, `idl_property_type`, `depth`, `is_project_profile`, `is_auction` | string; integer; boolean | Channel, category, property classification, tier, project, and auction flags. |
| Listing content and state | `description`, `highlight`, `labels`, `show_mortgage`, `propose_generic`, `show_mq_price`, `project_data`, `recent_ads_title`, `units` | string; boolean; array of strings; nested object | Text, labels, display flags, and project or unit data. |
| Features | `features.mq`, `features.rooms`, `features.bathrooms`, `features.parkings`, `features.parking_offer`, `features.price`, `features.energy_class`, `features.availability`, `features.level`, `features.rent_price` | nested object | Size, rooms, bathrooms, parking, price, energy, availability, level, and rent price. |
| Geography | `geo_infos.show_address`, `geo_infos.has_street`, `geo_infos.street`, `geo_infos.district_name`, `geo_infos.block_name`, `geo_infos.city`, `geo_infos.province`, `geo_infos.region`, `geo_infos.lat`, `geo_infos.lon`, `geo_infos.geo_visibility_level` | nested object | Address, district/block rollup, hierarchy, coordinates, and visibility. |
| Title | `title.main`, `title.additional` | nested object | Main and additional title values. |
| Media | `media.floorplan`, `media.has_video`, `media.has360`, `media.has3dtour`, `media.photos` | nested object | Floorplan, video/tour flags, and photos. |
| Publisher | `publisher.publisher_id`, `publisher.publisher_type`, `publisher.publisher_name`, `publisher.publisher_logo`, `publisher.publisher_address`, `publisher.publisher_phone`, `publisher.publisher_website`, `publisher.subscription_code` | nested object | Agency or publisher identity and contact data. |
| Leads | `leads_data.listing_id`, `leads_data.partner_id`, `leads_data.channel`, `leads_data.category` | nested object | Listing and partner data used for leads. |
| Run metadata | `scraped_at`, `parse_confidence`, `warnings` | ISO 8601 string; number; array of strings | UTC scrape time, parser confidence, and warnings. |

### Sample output

Shortened sample: one record is shown, and the `media.photos` array contains one complete item.

```json
[
  {
    "id": 54845714, "partner_id": 36975504, "ref_publisher": "6/206", "channel": "vendita", "category": "casa", "property_type_group": "case", "property_type": "appartamento", "idl_property_type": 1, "is_project_profile": false, "project_data": null, "uri": "/immobili/54845714/", "depth": "platinum", "highlight": null, "labels": [], "is_auction": false,
    "description": "VISTA MARE E FASCINO D’EPOCA NEL CUORE DI STELLA POLARE  Ci sono immobili che non si distinguono soltanto per ciò che offrono, ma soprattutto per il contesto in cui si trovano e per l’atmosfera che riescono a trasmettere.  Questa elegante residenza in Via delle Isole Sanguinarie, nel cuore della ricercatissima Stella Polare, rappresenta perfettamente questo concetto: una casa...",
    "show_mortgage": true, "propose_generic": true, "show_mq_price": false, "recent_ads_title": null, "from_url": "https://www.casa.it/vendita/residenziale/roma",
    "features": {"mq": 92, "rooms": 3, "bathrooms": 2, "parkings": null, "parking_offer": {"available": false}, "price": {"value": "359.000", "min": "359.000", "max": "359.000", "show": true, "marker": {"price": "359", "unit": "k", "originalPrice": 359000, "hasPriceRange": false}, "mortgage": "1.039"}, "energy_class": null, "availability": "libero", "level": null, "rent_price": null},
    "geo_infos": {"show_address": true, "has_street": true, "street": "Via Isole Sanguinarie", "district_name": "Lido di Ostia, Ostia Antica, Castel Fusano", "block_name": "Ostia Levante", "city": "Roma", "province": "RM", "region": "Lazio", "lat": 41.726667, "lon": 12.289488, "geo_visibility_level": 2},
    "title": {"main": "Trilocale in Via Isole Sanguinarie", "additional": ["Ostia Levante"]},
    "media": {"floorplan": 30, "has_video": true, "has360": true, "has3dtour": false, "photos": [{"uri": "/listing/0/8e/39/f0/842503515.jpg", "alt": "Piscina", "hasFotoplano": false}]},
    "publisher": {"publisher_id": 478744, "publisher_type": "Agency", "publisher_name": "MARCO ROCCHI RES IMMOBILIARE", "publisher_logo": "logo/3658a3c341a5ebb6fd92e1b502d116d2", "publisher_address": {"street": "Via Diego Simonetti 78", "town": "Roma", "province": "RM", "state": "Lazio", "country": "IT", "postcode": "00122", "display": "Roma, Via Diego Simonetti 78"}, "publisher_phone": "0685870914", "publisher_website": "https://www.resimmobiliare.com/", "subscription_code": "AR-4_PK-529"},
    "units": null, "leads_data": {"listing_id": 54845714, "partner_id": 36975504, "channel": "buy", "category": "casa"}, "scraped_at": "2026-10-29T04:30:28Z", "parse_confidence": 1, "warnings": []
  }
]
```

### Pricing

You pay for one Actor Start event per run and one dataset-item event per result.

| Plan | Actor Start (per event) | Dataset item (per event) |
|---|---:|---:|
| Free | $0.00005 | $0.0012 |

On the Free plan, 1,000 results cost $1.20 plus one Actor Start event ($0.00005), or $1.20005 total. 10,000 results cost $12.00 plus one Actor Start event ($0.00005), or $12.00005 total on the Free plan. The Actor Start event is charged once per GB of run memory, with a minimum of one event; this example uses one event. Check your run memory in its options.

The Apify Free plan includes $5 of monthly platform usage credit; that credit covers 4,166 results with one Actor Start event. Compute, proxy traffic, and storage are not billed separately to you for this Actor.

### How to use

1. **Add** one or more full Casa.it search-result URLs for sale or rent listings.
2. **Set** `max_items_per_url` to a maximum, or use `0` for no per-URL result limit; collection still stops at page 50.
3. **Choose** failure handling with `ignore_url_failures`; the default skips failed URLs and continues.
4. **Configure** `proxyConfiguration` when needed; if absent, the Actor uses Apify `RESIDENTIAL` proxy in Italy.
5. **Run** the Actor and inspect the dataset. If the first attempt shows no listings, it retries with browser-based fetching.
6. **Repeat** runs through Apify Schedules; daily is a reasonable starting point for listing collection.

```json
{
  "urls": ["https://www.casa.it/vendita/residenziale/roma"],
  "ignore_url_failures": true,
  "max_items_per_url": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "IT"
  }
}
```

Export the dataset as JSON or CSV, or read it through the Apify dataset API.

### Input parameters

| Parameter | What it does | Default |
|---|---|---|
| `urls` | Required array of full Casa.it search-result URLs; each is one listing search page. | No default; required |
| `ignore_url_failures` | If `true`, a failed URL is skipped and the run continues. If `false`, processing stops at the first failed URL. | `true` |
| `max_items_per_url` | Maximum listings per URL. `0` means no per-URL listing limit; collection still stops at page 50. | `50` |
| `proxyConfiguration` | Apify proxy configuration for the fetch pipeline. If absent, the Actor uses an Apify `RESIDENTIAL` proxy in Italy. | If absent, an Apify `RESIDENTIAL` proxy configuration for Italy |
| `disableUsageStats` | Set to `true` to turn off the run summary described in Usage statistics. | `false` |

### Limits and edge cases

| Condition | What the buyer sees | What to do |
|---|---|---|
| `max_items_per_url` is a positive integer | Collection stops at the requested listing count or page 50, whichever comes first. | Increase the value or use `0`. |
| `max_items_per_url` is `0` | Collection stops at page 50, with no per-URL listing limit before then. | Use narrower Casa.it filters or a positive limit. |
| A URL returns 404 | The Actor logs that the page is gone, returns no listings, continues, and does not list it in `failedUrls`, even when `ignore_url_failures` is `false`. | Correct the URL. |
| A page is blocked or cannot be fetched after all fetch modes | If it has no records, it is added to `failedUrls`. With `true`, it is skipped; with `false`, processing stops. The run ends as Succeeded, and earlier URL rows remain. `OUTPUT` contains `totalItems`, `failedUrls`, `urls`, and `scrapedAt`. | Correct the URL or enable failure ignoring for multi-URL runs. |
| A later page fails after earlier pages produced records | Earlier records remain; the failed page contributes none. The URL is not marked failed and `OUTPUT` does not flag the shortfall. | Retry or use a narrower search URL. |
| A search page returns no rows in any fetch mode | On page 1, the URL is counted as failed. On a later page, collected rows are kept and the URL ends. | Check the URL path, city, and filters, then try again. |
| Rows are collected for an input URL | Rows are pushed after the URL finishes, in batches of 100. A failure, timeout, or abort before then leaves no rows from that URL; earlier URLs remain. | Use a positive limit or several narrower URLs. |
| The same listing ID appears more than once during pagination | Duplicate IDs are skipped within one input URL. A listing found through different input URLs appears twice. | No action is required unless different filters are needed. |
| A source field is absent from a listing | The record uses `null` or an empty list where appropriate, with `parse_confidence` and `warnings`. | Check the nested field and warning metadata. |
| `urls` is empty or missing | The Actor writes `{"error":"urls_required"}` to `OUTPUT` and the run ends as Succeeded. | Supply at least one non-empty Casa.it search-result URL. |

### FAQ

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

On the Free plan, an Actor Start event costs $0.00005 and each dataset item costs $0.0012. 1,000 results plus one Actor Start event cost $1.20005 on the Free plan.

#### Why did my run return no listings?

The URL may return 404, be blocked, or show no rows in all fetch modes. Check `OUTPUT` in the default key-value store for `totalItems` and `failedUrls`; an empty `urls` input writes `{"error":"urls_required"}`.

#### Is it legal to use data scraped from Casa.it?

The Actor collects public listing data from Casa.it search-result URLs. Casa.it’s source terms and applicable law depend on your use case, so review the relevant ToS and legal requirements before using the data; this Actor does not provide a legal determination.

### Related actors

- [Immoweb Scraper](https://apify.com/bovi/immoweb-properties-scraper) — related Belgium real-estate listings scraper, including prices and EPC.
- [OnTheMarket Scraper](https://apify.com/bovi/onthemarket-properties-scraper) — related UK property listings scraper with prices and days-listed data.
- [Zoopla Scraper](https://apify.com/bovi/zoopla-properties-scraper) — related UK property listings scraper with prices and agent data.

### Usage statistics

This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.

A copy of the exact record for your run is saved as `USAGE_STATS` in your own Apify key-value store.

To opt out, set `disableUsageStats` to `true` in the input. Nothing is sent then.

[Full list of collected fields](https://api.apify.com/v2/key-value-stores/v9rgHjMKLDGtHf8tD/records/index.html)

# Actor input Schema

## `urls` (type: `array`):

Full Casa.it search-result URLs, one listing search page per entry. Example: https://www.casa.it/vendita/residenziale/roma

## `ignore_url_failures` (type: `boolean`):

If true, a URL that 404s/errors is skipped and the run continues with the remaining URLs. If false, the run aborts on the first failed URL.

## `max_items_per_url` (type: `integer`):

Maximum number of listings to return per input URL (0 = no limit, scrapes all pages). Default 50.

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

Apify proxy configuration. RESIDENTIAL (Italy) recommended for reliability.

## `disableUsageStats` (type: `boolean`):

See the README Usage statistics section for details.

## Actor input object example

```json
{
  "urls": [
    "https://www.casa.it/vendita/residenziale/roma"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  },
  "disableUsageStats": false
}
```

# Actor output Schema

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

Dataset containing Casa.it listing records (id, partner_id, channel, category, property_type, features, geo_infos, title, media, publisher, leads_data, from_url, scraped_at, parse_confidence).

# 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 = {
    "urls": [
        "https://www.casa.it/vendita/residenziale/roma"
    ],
    "max_items_per_url": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/casa-properties-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 = {
    "urls": ["https://www.casa.it/vendita/residenziale/roma"],
    "max_items_per_url": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/casa-properties-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 '{
  "urls": [
    "https://www.casa.it/vendita/residenziale/roma"
  ],
  "max_items_per_url": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}' |
apify call bovi/casa-properties-scraper --silent --output-dataset

```

## MCP server setup

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