# Casa Property Search Scraper (`solidcode/casa-property-search-scraper`) Actor

\[💰 $1.5 / 1K] Scrape comprehensive property listings from Casa.it with detailed features, pricing, locations, and agency contact information.

- **URL**: https://apify.com/solidcode/casa-property-search-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 29 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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?

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 Property Search Scraper

Extract Italian residential and commercial property listings from Casa.it at scale, complete with prices, floor areas, exact coordinates, photo galleries, and agency contact details. Built for real estate investors, buying agents, and market analysts who need current Italian listing data without clicking through hundreds of result pages by hand.

### Why This Scraper?

- **Six property categories that actually filter** — apartments, detached houses, villas, land, commercial premises, or every residential listing in one sweep. Each maps to Casa.it's own category path, so "villas in Toscana" returns villas, not a generic result page
- **Up to 1,600 properties per search** — that is Casa.it's own ceiling, 80 pages deep, collected in a single run with no manual paging
- **Exact coordinates on 100% of listings** — latitude and longitude alongside city and region, measured across a 2,400-listing sample, ready for mapping and geospatial joins
- **Full photo galleries on every listing** — a card thumbnail plus full-resolution image URLs for each property, not just a single cover shot
- **Agency name and phone on 100% of listings** — plus a website URL on roughly 7 to 9 listings in 10, for lead lists and agent outreach
- **Accented Italian text arrives intact** — "può", "Città Giardino", and "Engel & Völkers" come through exactly as Casa.it published them, so your descriptions and agency names are searchable and presentable
- **"Price on request" listings are labelled, not blank** — properties sold under *trattativa riservata* ship a readable price label instead of an unexplained empty cell
- **Location filters that survive a price range** — Casa.it occasionally drops the geography when a price filter is applied and quietly serves nationwide results. This actor detects that, re-pins the location, and returns properly filtered listings
- **Two independent result ceilings** — cap each search separately, cap the whole run, or set either to zero to lift it entirely

### Use Cases

**Investment & Portfolio Analysis**

- Build price-per-square-meter comparison matrices across 20 Italian cities
- Track fresh inventory in target regions and flag properties priced below the local median
- Compare villa, apartment, and land pricing within the same region and time window

**Real Estate Lead Generation**

- Compile agency call lists from active listings, filtered by city and price band
- Rank agencies by listing volume to find the dominant players in a local market
- Build targeted outreach lists for a single property category, such as commercial premises in Milano

**Market Research & Competitive Intelligence**

- Benchmark Casa.it inventory levels against other Italian property portals
- Monitor supply shifts by region, category, and price tier over repeated runs
- Detect emerging micromarkets where listing volume or asking prices move first

**Relocation & Buyer Services**

- Assemble shortlists filtered by budget, floor area, and room count for relocating clients
- Export neighbourhood comparables for valuations and appraisal reports
- Produce sortable property catalogs with photos for client presentations

**Data Enrichment & Analytics**

- Join listings with flood risk, transport, or school catchment datasets using the supplied coordinates
- Plot supply clusters on a map without a separate geocoding step
- Feed historical asking prices into demand and pricing models

**CRM & Workflow Automation**

- Push new listings into Google Sheets, Airtable, or your CRM on a schedule
- Trigger Slack or email alerts when properties match a saved search
- Sync listing photos and agency contacts straight into a deal pipeline

### Getting Started

#### Basic City Search

Search one Italian city and collect 20 properties:

```json
{
    "searchLocation": "Roma",
    "maxResultsPerUrl": 20
}
```

#### Filtered by Category and Price

Villas in Toscana between €300k and €900k:

```json
{
    "searchLocation": "Toscana",
    "propertyType": "villa",
    "priceMin": 300000,
    "priceMax": 900000,
    "maxResultsPerUrl": 100
}
```

#### Everything a Search Offers

Set both ceilings to zero to collect the full result set, up to Casa.it's own limit:

```json
{
    "searchLocation": "Milano",
    "propertyType": "appartamento",
    "maxResultsPerUrl": 0,
    "maxResults": 0
}
```

#### Multiple Searches From Casa.it URLs

Filter on Casa.it itself, then paste the result page URLs. Each URL gets its own ceiling:

```json
{
    "startUrls": [
        "https://www.casa.it/vendita/ville/toscana/",
        "https://www.casa.it/vendita/terreni/umbria/"
    ],
    "maxResultsPerUrl": 200,
    "maxResults": 400,
    "ignoreUrlFailures": true
}
```

### Input Reference

#### What to Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchLocation` | string | Roma | Italian city or region name, such as "Roma", "Milano", or "Toscana". Must be the Italian name. |
| `startUrls` | array | — | Casa.it search result page URLs, pasted straight from the site. Leave empty to use Search Location instead. |

#### Filters

Filters apply to Search Location. When you supply Start URLs, the filters already built into those URLs are used instead.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `propertyType` | select | All Homes | All Homes (apartments, houses and villas together), Apartment, House (detached), Villa, Land, or Commercial Space. |
| `priceMin` | integer | — | Only include properties at or above this price in euros. Leave empty for no minimum. |
| `priceMax` | integer | — | Only include properties at or below this price in euros. Leave empty for no maximum. |

#### Result Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResultsPerUrl` | integer | 20 | Maximum properties from each search or URL, applied to every one separately. Set to 0 to take everything a search offers, up to about 1,600. |
| `maxResults` | integer | 0 | Budget for the whole run, added up across every search. Set to 0 for no overall limit. Raising it does not lift the per-search limit above. |
| `ignoreUrlFailures` | boolean | true | Skip a search that fails and carry on with the rest, rather than stopping the run. |

### Output

A sample property listing:

```json
{
    "id": 52159867,
    "title": "Bilocale in Piazzale di Ponte Milvio",
    "subtitle": "Ponte Milvio-Foro Italico",
    "description": "Appartamento ristrutturato al secondo piano, con balcone da cui si può godere di una splendida vista sul quartiere. Vicino a negozi e trasporti, la zona è servita da...",
    "category": "residenziale",
    "propertyType": "appartamento",
    "price": 430000,
    "priceLabel": "430.000",
    "location": {
        "city": "Roma",
        "region": "Lazio",
        "coordinates": {
            "lat": 41.9351,
            "lon": 12.4712
        }
    },
    "features": {
        "rooms": 2,
        "bathrooms": 1,
        "squareMeters": 65
    },
    "media": {
        "thumbnailUrl": "https://images-1.casa.it/360x265/listing/0/a6/d4/e5/502438488.jpg",
        "photoUrls": [
            "https://images-1.casa.it/800x600/listing/0/a6/d4/e5/502438488.jpg",
            "https://images-1.casa.it/800x600/listing/0/a6/d4/e5/502438489.jpg"
        ]
    },
    "publisherName": "Engel & Völkers Roma",
    "publisherPhone": "+39 06 1234 5678",
    "publisherEmail": "",
    "publisherWebsite": "https://www.engelvoelkers.com/it/roma/",
    "url": "https://www.casa.it/immobili/52159867/"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | integer | Casa.it property ID, unique per listing |
| `title` | string | Property headline, such as "Bilocale in Piazzale di Ponte Milvio" |
| `subtitle` | string | Neighbourhood and comune shown under the headline |
| `description` | string | Listing summary exactly as Casa.it prints it on the result card, around 400 characters. Longer texts are cut off there by the site and end in `...` |
| `category` | string | Broad category, such as `residenziale` or `commerciale` |
| `propertyType` | string | Specific type: `appartamento`, `casa`, `villa`, `terreno`, `locale` |
| `url` | string | Direct link to the listing on Casa.it |

#### Pricing Fields

| Field | Type | Description |
|-------|------|-------------|
| `price` | integer | Asking price in euros. Empty when the seller withholds it. |
| `priceLabel` | string | The price exactly as Casa.it displays it, including `Tratt. ris.` for price-on-request listings |

#### Location & Coordinates

| Field | Type | Description |
|-------|------|-------------|
| `location.city` | string | City or comune name |
| `location.region` | string | Italian region, such as "Lazio" or "Lombardia" |
| `location.coordinates.lat` | number | Latitude |
| `location.coordinates.lon` | number | Longitude |

#### Property Features

| Field | Type | Description |
|-------|------|-------------|
| `features.rooms` | integer | Room count. Reported as 0 on land and commercial listings, where it does not apply. |
| `features.bathrooms` | integer | Bathroom count. Also 0 on most land listings. |
| `features.squareMeters` | integer | Floor area, or plot area for land, in square meters |

#### Agency & Photos

| Field | Type | Description |
|-------|------|-------------|
| `publisherName` | string | Listing agency name |
| `publisherPhone` | string | Agency phone number |
| `publisherWebsite` | string | Agency website, published for roughly 7 to 9 agencies in 10 |
| `publisherEmail` | string | Always empty. Casa.it does not publish agency email addresses. |
| `media.thumbnailUrl` | string | Card-sized listing image |
| `media.photoUrls` | array | Full-resolution photo URLs for the listing gallery |

### Tips for Best Results

- **Use Italian place names only** — "Roma" not "Rome", "Milano" not "Milan", "Toscana" not "Tuscany". English names return nothing at all. City, comune, and region names all work; neighbourhood names usually do not, so search the city and filter the `subtitle` field afterwards.
- **Search a region, not just a city, to catch the whole market** — "Lombardia" or "Puglia" surfaces the suburban and rural inventory that a city search misses entirely, which is where most below-median pricing sits.
- **Set both ceilings to 0 when you want everything** — leaving `maxResultsPerUrl` at its default of 20 caps every search at 20 no matter how high you set the overall budget. They are separate limits and both must be lifted.
- **Split large regions into several searches to get past 1,600** — a single search tops out around 1,600 properties. Run one search per province, or add price bands, to work through inventory larger than that.
- **Check `priceLabel` before treating an empty `price` as missing data** — high-end villas in particular are often listed as *trattativa riservata*, price on request. That is a deliberate seller choice, not a gap.
- **Ignore rooms and bathrooms on land and commercial listings** — Casa.it reports them as 0 there rather than leaving them blank, so filter those categories out before averaging room counts.
- **Agency phone numbers are the reliable contact route** — phone and name are present on every listing, websites on most. Casa.it does not publish agency email addresses, so build outreach around calls rather than mail merges.

### Pricing

**From $1.50 per 1,000 results** — one flat rate per property returned, whatever the category. No compute or time-based charges, just a per-result price plus a small fixed start fee each time a run begins. Until October 25, 2026, every plan pays $1.50 per 1,000; from that date the discount tiers below apply, and Bronze, Silver, and Gold subscribers pay progressively less.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.175 | $0.17 | $0.16 | $0.15 |
| 1,000 | $1.75 | $1.70 | $1.60 | $1.50 |
| 10,000 | $17.50 | $17.00 | $16.00 | $15.00 |
| 100,000 | $175.00 | $170.00 | $160.00 | $150.00 |

A "result" is one property row in your dataset.

### Integrations

Export as JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps through:

- **Zapier** / **Make** / **n8n** — trigger workflows when new listings appear
- **Google Sheets** — send results straight to a shared spreadsheet
- **Slack** / **Email** — get notified when a run finishes
- **Webhooks** — call your own service on completion
- **Apify API** — full programmatic access for custom pipelines

### Legal & Ethical Use

This actor is intended for personal research, business intelligence, and licensed real estate professional use. Respect Casa.it's terms of service and Italian and EU data protection law, including GDPR. Do not use it to infringe copyright, resell data without permission, or misuse Casa.it's intellectual property. Property listings can contain personal information, so handle the output responsibly and in line with local regulations. For questions about permitted use, consult Casa.it or your own legal counsel.

# Actor input Schema

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

Paste Casa.it search result page URLs directly. You can copy URLs directly from Casa.it search results (e.g., results for property searches in Roma, Milano, etc.). Leave empty if using Search Location below.

## `searchLocation` (type: `string`):

Italian city or region name to search (e.g., 'Roma', 'Milano', 'Napoli', 'Toscana'). Must be the Italian name — English names like 'Rome' or 'Milan' will return no results. Leave empty if using Start URLs above.

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

Type of property to search for. 'All Homes' covers every residential listing (apartments, houses, villas). Land and Commercial Space are separate categories on Casa.it, so pick them explicitly. Only applies when using Search Location — ignored when using URLs.

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

Only include properties at or above this price in euros. Leave empty for no minimum. Only applies to Search Location.

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

Only include properties at or below this price in euros. Leave empty for no maximum. Only applies to Search Location.

## `maxResultsPerUrl` (type: `integer`):

Maximum number of properties to collect from each URL or search, applied to every one separately. Starts at 20, which is a single page of Casa.it results — raise it to 50-100 for larger result sets, or set it to 0 to collect everything a search offers (Casa.it serves about 1,600 properties per search). This is the field to change if a run returns fewer properties than you expected.

## `maxResults` (type: `integer`):

Budget for the whole run, added up across every URL or search. Raising it does NOT raise the per-search limit: with Max Properties Per URL left at 20, one search returns 20 properties however high you set this. Raise that field too. Set this to 0 for no overall limit.

## `ignoreUrlFailures` (type: `boolean`):

When enabled, the scraper will skip failed URLs and continue with the remaining ones. When disabled, the entire run stops if any URL fails.

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

How this run connects to Casa.it. The default works well and needs no change. If a run finishes with no properties at all, or the log says the connection was refused, come back here, pick Residential under Apify Proxy, and run it again — that usually clears it.

## Actor input object example

```json
{
  "startUrls": [],
  "searchLocation": "Roma",
  "propertyType": "all",
  "maxResultsPerUrl": 20,
  "maxResults": 0,
  "ignoreUrlFailures": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of extracted properties with key fields: ID, title, price, location, features, and agency contact.

## `detail` (type: `string`):

Every field collected per property: the listing summary shown on the result card, media URLs, and agency contact details.

# 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": [],
    "searchLocation": "Roma",
    "propertyType": "all",
    "maxResultsPerUrl": 20,
    "maxResults": 0,
    "ignoreUrlFailures": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/casa-property-search-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": [],
    "searchLocation": "Roma",
    "propertyType": "all",
    "maxResultsPerUrl": 20,
    "maxResults": 0,
    "ignoreUrlFailures": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/casa-property-search-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": [],
  "searchLocation": "Roma",
  "propertyType": "all",
  "maxResultsPerUrl": 20,
  "maxResults": 0,
  "ignoreUrlFailures": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call solidcode/casa-property-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/casa-property-search-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/nWZY4zNctsEXaGRy0/builds/xqVXiOJHJtzLpDv2k/openapi.json
