# Italy AsteAnnunci Judicial Auctions Scraper (`signalflow/italy-asteannunci`) Actor

Scrape asteannunci.it — Italian property auctions (aste giudiziarie): prezzo base, offerta minima, court, sale date, address, surface and PDF documents, plus next-round price projections (asta deserta) and estimated additional costs. Filter by region, type and price. Export to JSON/CSV/Excel.

- **URL**: https://apify.com/signalflow/italy-asteannunci.md
- **Developed by:** [SignalFlow](https://apify.com/signalflow) (community)
- **Categories:** Real estate, MCP servers
- **Stats:** 8 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## 🇮🇹 Italy AsteAnnunci Judicial Auctions Scraper

Extract structured data for **Italian judicial real-estate auctions** from [AsteAnnunci.it](https://www.asteannunci.it) — the country's largest aggregator of court-ordered property sales. Get base prices, minimum bids, court details, sale dates, addresses, surface areas and **smart investment calculations** — ready for CRM import, spreadsheet analysis, mapping or automated alerting.

***

### 🎯 Why use this Scraper?

The AsteAnnunci portal lists thousands of auctions, but there's no built-in export. Digging through pages one-by-one is slow and error-prone. This Actor solves that by:

- **Bulk extraction** of every auction in a region — or the whole country.
- **Clean, structured output** (JSON / Excel / CSV) instead of manual copy-paste.
- **Smart, Italy-specific fields** — the projected next-round base price and minimum bid if the auction goes deserted (−25% per Art. 571 c.p.c.), plus an estimate of the *spese accessorie* (~15%) the buyer pays on top of the bid.
- **Every listing shown** — unscheduled auctions (no base price yet) appear with `N/A` for the price rather than being hidden, so nothing is missed.
- **💎 Premium perizia extraction (optional)** — enable `extract_from_perizia` to read the appraisal PDF and recover the **appraised market value** for those unpriced listings — turning empty rows into priced, actionable data. *(Note: works only on text-based perizia PDFs; scanned/image-only PDFs cannot be read and are charged nothing.)*
- **GPS coordinates on every record**, so you can map properties or calculate distances.
- **Court and procedure data** (tribunale, RGE number, sale type) for legal due-diligence.

***

### 🏢 Use Cases

- **Real-estate investment:** build watch-lists of undervalued properties by region and price bracket.
- **Legal services:** track auctions by court, procedure number or custodian for client advisory.
- **Market research:** analyse auction volume, price trends and surface-area metrics across Italy.
- **Data enrichment:** append auction data and coordinates to an existing property database.

***

### 📦 Output Data

Each result is a structured record with the following fields:

`id_inserzione`, `tipo`, `prezzo_base`, `prezzo_base_fmt`, `valore_perizia`, `valore_perizia_fmt`, `offerta_minima`, `offerta_minima_fmt`, `rilancio_minimo`, `rilancio_minimo_fmt`, `tribunale`, `numero_procedura`, `data_vendita`, `tipo_vendita`, `indirizzo`, `comune`, `provincia`, `categoria`, `superficie_mq`, `descrizione`, `custode`, `detail_url`, `pdf_url`, `photos`, `lat`, `lng`, `google_maps_url`, `status`, `proiezione_prossimo_prezzo_base`, `proiezione_prossima_offerta_minima`, `stima_spese_accessorie`, `price_per_mq`.

#### Example output

> ℹ️ The values below are **illustrative samples**, not a real auction.

```json
{
  "id_inserzione": "1234567",
  "tipo": "Appartamento",
  "prezzo_base": 88000.0,
  "prezzo_base_fmt": "€ 88.000,00",
  "offerta_minima": 66000.0,
  "offerta_minima_fmt": "€ 66.000,00",
  "rilancio_minimo": 1000.0,
  "rilancio_minimo_fmt": "€ 1.000,00",
  "tribunale": "Milano",
  "numero_procedura": "302/2024",
  "data_vendita": "09/06/2026 - 14:30",
  "tipo_vendita": "Senza Incanto",
  "indirizzo": "Via Roma 1",
  "comune": "Milano",
  "provincia": "Milano",
  "categoria": "residenziale",
  "superficie_mq": 75.0,
  "descrizione": "Appartamento al primo piano composto da due vani...",
  "custode": "Mario Rossi",
  "detail_url": "https://www.asteannunci.it/aste/1234567/1001/appartamento-milano",
  "pdf_url": "N/A",
  "photos": [],
  "lat": "45.4642",
  "lng": "9.1900",
  "google_maps_url": "https://www.google.com/maps/search/?api=1&query=Via+Roma+1%2C+Milano%2C+Milano",
  "status": "active",
  "proiezione_prossimo_prezzo_base": "€ 66.000,00",
  "proiezione_prossima_offerta_minima": "€ 49.500,00",
  "stima_spese_accessorie": "€ 9.900,00",
  "price_per_mq": 1173.33
}
```

> **About the calculated fields (Italian auction law, Art. 571 c.p.c.):** the *offerta minima* is
> already the legal floor — a bidder may offer up to **25% below** the *prezzo base*. The smart fields
> help you decide whether to bid now or wait for the next round:
>
> - **`proiezione_prossimo_prezzo_base`** — if the auction goes deserted (*asta deserta*), the judge
>   relists at a base price ~**25% lower**. This is that projected next base price.
> - **`proiezione_prossima_offerta_minima`** — the minimum bid for that next round (a further −25%).
> - **`stima_spese_accessorie`** — estimated *spese accessorie* (transfer tax, notary and delegate fees)
>   the buyer pays **on top** of the bid, ~15% of the *offerta minima*.

***

### ⚙️ Input

| Field | Type | Default | Description |
|---|---|---|---|
| `regione` | `string` | `"lombardia"` | Italian region slug (e.g. `lombardia`, `lazio`, `toscana`). |
| `provincia` | `string` | `""` | Optional province filter (e.g. `Milano`, `Brescia`). |
| `categoria` | `string` | `""` | Optional category: `residenziale`, `commerciale`, `terreni`, `box/garage`. |
| `min_prezzo` | `integer` | `0` | Minimum base price in €. `0` = no filter. |
| `max_prezzo` | `integer` | `0` | Maximum base price in €. `0` = no filter. |
| `max_items` | `integer` | `100` | Maximum auctions to scrape. `0` = unlimited. |
| `download_pdf` | `boolean` | `true` | Save perizia/ordinanza PDFs to permanent storage. Set `false` to keep only source links. |
| `include_unpriced` | `boolean` | `true` | Include unscheduled listings (price shown as `N/A`). Set `false` to keep only priced auctions. |
| `extract_from_perizia` | `boolean` | `false` | **Premium:** for unpriced listings, read the perizia PDF and extract the appraised market value into `valore_perizia`. Adds a premium charge per value successfully extracted. Works only on text-based PDFs (not scanned/image-only). |
| `concurrency` | `integer` | `6` | How many auction pages to fetch in parallel. |

***

### 💡 Tips

- **Target a region** with the `regione` filter for a focused, fast export (e.g. all Lombardia auctions).
- **Combine filters:** use `provincia` + `categoria` to narrow down to apartments in Milan.
- **Price scouting:** set `min_prezzo` and `max_prezzo` to find auctions in your investment bracket.
- **PDF documents are saved by default** to permanent storage, so the perizia/ordinanza is never lost if the source link expires. Set `download_pdf: false` to keep only the source links for slightly faster runs.
- **Full region export:** set `max_items: 0` and run it on the Apify scheduler to keep the dataset fresh.

***

### 💎 Premium: appraised value from the perizia

Many Italian auctions are listed before a sale date and price are set — these show `N/A` for the base
price. Enable **`extract_from_perizia`** and the Actor opens the official *perizia* (court appraisal) PDF
for each such listing and extracts the **appraised market value** into `valore_perizia`, turning an empty
row into a priced, actionable one.

- **Charged only on success** — you pay the premium per value actually extracted; failures cost nothing.
- **⚠️ Text-based PDFs only.** Some perizie are **scanned images** (no text layer); these cannot be read
  and return `N/A` (and are not charged). Typically a majority of perizie are text-based and work.
- Slower than a standard run, since it downloads and parses a PDF per unpriced listing.

***

### 🤖 Use it as an AI Tool (MCP)

This Actor is **Model Context Protocol (MCP) compatible**, so AI assistants like Claude can call it directly through the [Apify MCP Server](https://mcp.apify.com/). The input is described so an assistant can fill it in from a natural-language request, for example:

> *"Find 20 active judicial auctions in Lombardia under €150,000 and return their addresses, sale dates and minimum bids."*

The assistant maps that to `regione: "lombardia"`, `max_prezzo: 150000`, `max_items: 20` and reads the structured results — no manual configuration needed.

***

### 🇮🇹 Per investitori e professionisti italiani

Questo Actor estrae le **aste giudiziarie immobiliari** pubblicate su
[AsteAnnunci.it](https://www.asteannunci.it). Ideale per investitori immobiliari, agenzie, avvocati e
"astisti" che cercano immobili sotto il valore di mercato.

#### 🚀 Perché usarlo?

- **Estrazione massiva** di tutte le aste di una regione — o di tutta Italia.
- **Dati strutturati** (JSON / Excel / CSV) invece di sfogliare gli annunci uno per uno.
- **Documenti ufficiali**: download di perizia, ordinanza e avviso (PDF) salvati in modo permanente.

#### 💰 Campi intelligenti (conformi all'art. 571 c.p.c.)

Il *prezzo base* è fissato dal giudice; l'*offerta minima* è già il minimo legale (fino al −25%). Per
aiutarti a decidere se rilanciare ora o aspettare il prossimo turno forniamo:

- **`proiezione_prossimo_prezzo_base`** — prezzo base del prossimo turno in caso di asta deserta (−25%).
- **`proiezione_prossima_offerta_minima`** — offerta minima del prossimo turno (ulteriore −25%).
- **`stima_spese_accessorie`** — stima delle spese accessorie (imposte, notaio, delegato), ~15% in più.

#### 🎯 Casi d'uso

- **Investitori** — individuare immobili sotto il valore di mercato prima dell'asta.
- **Ricerca di mercato** — analizzare prezzi base, superfici e prezzo al m² per regione.
- **Lead generation** — costruire liste di aste per servizi immobiliari.

I dati possono essere esportati in JSON, CSV, Excel o XML.

***

### 📜 Disclaimer

This Actor extracts **publicly available judicial auction data** from AsteAnnunci.it. You are responsible for using the data in compliance with applicable laws. Do not use the data for unsolicited marketing. Auction details change frequently — always verify critical information (dates, prices, terms) directly on the source page before making decisions.

# Actor input Schema

## `regione` (type: `string`):

Italian region slug, e.g. 'lombardia', 'lazio', 'toscana'. Use the URL-friendly form (lowercase, hyphens for spaces).

## `provincia` (type: `string`):

Filter by province name, e.g. 'Milano', 'Brescia'. Leave empty to scrape all provinces in the region.

## `categoria` (type: `string`):

Property category filter.

## `min_prezzo` (type: `integer`):

Minimum base price filter. 0 = no filter.

## `max_prezzo` (type: `integer`):

Maximum base price filter. 0 = no filter.

## `max_items` (type: `integer`):

Maximum number of auctions to scrape. 0 = unlimited.

## `download_pdf` (type: `boolean`):

Save each perizia/ordinanza PDF to permanent storage and return a stable URL, so the document is never lost even if the source link expires. On by default; turn off to only keep the original source links (slightly faster).

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

Proxy settings. This Actor automatically uses the Apify RESIDENTIAL proxy for the (small) listing pages — the source throttles datacenter IPs — and the cheaper datacenter proxy for the (large) PDF downloads, to keep runs both fast and low-cost. Residential proxy usage is billed by Apify.

## `include_unpriced` (type: `boolean`):

Include unscheduled listings (no base price). On by default — they are shown with a price of 0. Turn off to keep only listings that have a base price.

## `concurrency` (type: `integer`):

How many auction pages to fetch in parallel. Lower = gentler on the site (fewer rate-limits); higher = faster. The Actor also paces requests automatically to avoid throttling.

## `extract_from_perizia` (type: `boolean`):

PREMIUM: for unscheduled listings with no base price, read the perizia (appraisal) PDF and extract the appraised market value. Adds a per-document premium charge for each value successfully extracted. Slower, but turns empty listings into priced ones.

## Actor input object example

```json
{
  "regione": "lombardia",
  "provincia": "",
  "categoria": "",
  "min_prezzo": 0,
  "max_prezzo": 0,
  "max_items": 100,
  "download_pdf": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "include_unpriced": true,
  "concurrency": 4,
  "extract_from_perizia": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

All scraped items in a table you can view, filter and export (JSON, CSV, Excel, XML).

## `documents` (type: `string`):

Auction PDF documents saved to the key-value store (permanent links).

# 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 = {
    "regione": "lombardia"
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalflow/italy-asteannunci").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 = { "regione": "lombardia" }

# Run the Actor and wait for it to finish
run = client.actor("signalflow/italy-asteannunci").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "regione": "lombardia"
}' |
apify call signalflow/italy-asteannunci --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=signalflow/italy-asteannunci",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OUQvgf81GeFNRAtGJ/builds/HqPUfiRYkPce9SDoO/openapi.json
