# Subito.it – Italy Listings, Cars, Property & Jobs (`abotapi/subito-it-scraper`) Actor

Scrape Subito.it listings across cars, real estate, marketplace, jobs, and more. Search by keyword and filters or use Subito URLs. Returns prices, descriptions, photos, specs, seller details, location, 60+ fields, and optional seller reputation.

- **URL**: https://apify.com/abotapi/subito-it-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, E-commerce, Jobs
- **Stats:** 9 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 listing 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/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

## Subito.it Listings Scraper

Extract classified listings from subito.it, Italy's biggest classifieds marketplace, across **cars & motors, real estate, marketplace goods, and jobs** — all from one actor. Search by keyword with vertical-specific filters, or paste any subito.it search or listing URL, and get clean structured records: prices, full Italian descriptions, every photo, vehicle and property specs, job details, seller contact and shop info, precise location, and optional seller reputation. Quick to run and dependable at any volume.

### Why this scraper

- **One actor, four verticals.** Cars & motors, real estate, marketplace goods, and jobs — each with its own filter set, sharing one consistent output shape.
- **60+ fields per listing**, with the full description, every photo, condition, seller details and location on every record.
- **Vertical-specific specs.** Make / model / year / mileage / fuel / gearbox for cars, surface / rooms / bathrooms / floor / energy class for property, sector / contract / hours / education for jobs, condition / shipping for marketplace goods.
- **Seller reputation, on demand.** Optionally attach each seller's public reputation — overall score, feedback counts, reply rate, member-since and verification — fetched once per unique seller.
- **Two ways in.** Search by keyword + filters, or paste subito.it search and listing URLs and let it walk forward.
- **Rich by default, deeper on demand.** Search results are already complete; turn on full details to also pull each vehicle's technical specs (engine size, kW/HP, cylinders, gears, drive, dimensions, weight) and full equipment/optionals list.
- Italian residential connection support with automatic rotation for reliable, large runs.

### Data you get

> Sample shape, values are illustrative placeholders, not from a live listing.

| Field | Example |
| --- | --- |
| id | 000000000 |
| url | https://www.subito.it/auto/sample-listing-000000000.htm |
| title | Sample listing title |
| description | Full listing description text appears here. |
| price | 12500 |
| currency | EUR |
| adType | Vendita |
| category | Auto |
| condition | Ottimo |
| region | Lombardia |
| city | Milano |
| town | Milano |
| imageCount | 8 |
| images | \["https://images.example-cdn/000000000/0.jpg"] |
| sellerName | Sample Seller |
| sellerType | private |
| isCompany | false |
| sellerPhone | +390000000000 |
| shopName | Sample Shop |
| postedAt | 2026-01-01T10:00:00+01:00 |
| maker | Volkswagen |
| model | Golf |
| yearOfRegistration | 2019 |
| mileage | 65000 |
| fuelType | Diesel |
| transmission | Manuale |
| size | 90 |
| rooms | 3 |
| energyClass | C |
| jobCategory | Amministrazione |
| contractType | Tempo indeterminato |

### How to use

Search marketplace goods by keyword:

```json
{
  "category": "marketplace",
  "searchQuery": "iphone 15",
  "condition": ["10", "20"],
  "priceMin": 200,
  "priceMax": 600,
  "maxItems": 100
}
```

Search cars with vehicle filters:

```json
{
  "category": "auto",
  "searchQuery": "golf",
  "yearMin": 2017,
  "mileageMax": 100000,
  "fuelType": ["2"],
  "gearbox": "1",
  "sort": "priceasc",
  "maxItems": 200
}
```

Search real estate to rent, in one province:

```json
{
  "category": "realestate",
  "adType": "u",
  "city": "Roma",
  "sizeMin": 60,
  "roomsMin": 2,
  "priceMax": 1500,
  "maxItems": 150
}
```

Search jobs, with seller reputation attached:

```json
{
  "category": "jobs",
  "searchQuery": "magazziniere",
  "workHours": "fulltime",
  "scrapeReviews": true,
  "maxItems": 100
}
```

Paste search and listing URLs (filters are read from each URL):

```json
{
  "category": "marketplace",
  "startUrls": [
    "https://www.subito.it/annunci-italia/vendita/usato/?q=bici",
    "https://www.subito.it/auto/sample-listing-000000000.htm"
  ],
  "maxItems": 200
}
```

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| category | string | marketplace | Vertical to scrape: auto, realestate, marketplace, jobs |
| searchQuery | string | empty | Free-text keyword (empty browses all listings in the vertical) |
| subjectOnly | boolean | false | Match the keyword against the title only |
| region / city / town | string | none | Narrow by region, province, or town |
| priceMin / priceMax | integer | none | Price range in euro |
| sellerType | string | any | any, private, or company |
| sort | string | newest | Newest, relevance, price, plus year / mileage / power / length for cars |
| adType | string | offer | Offer, wanted, rent, holiday rental, or free (by vertical) |
| condition / shippableOnly | array / boolean | none | Marketplace: item condition and shipping filter |
| brand / model / yearMin / yearMax / mileageMin / mileageMax / fuelType / gearbox / bodyType / vehicleStatus | mixed | none | Cars: vehicle filters |
| sizeMin / sizeMax / roomsMin / roomsMax / bathroomsMin / buildingCondition | mixed | none | Real estate: property filters |
| jobCategory / contractType / workHours / educationDegree | mixed | none | Jobs: sector, contract, hours, education filters |
| startUrls | array | empty | Search or listing URLs (take precedence per entry) |
| scrapeDetail | boolean | false | Vehicles only — fetch full vehicle specs, dimensions and equipment list |
| scrapeReviews | boolean | false | Attach each unique seller's public reputation |
| maxItems | integer | 100 | Total cap across all searches and URLs |
| maxItemsPerQuery | integer | none | Per-search / per-URL cap for multi-search runs |
| resumeFromRunId | string | empty | Continue one specific previous run/dataset — see "Resume & recurring updates" below |
| incrementalMode | boolean | false | Daily/recurring monitoring of the same search — see "Resume & recurring updates" below |
| stateKey | string | auto | Incremental mode only. Name or share a monitoring campaign's state |
| emitUnchanged | boolean | false | Incremental mode only. Also return (and bill) unchanged listings |
| emitExpired | boolean | false | Incremental mode only. Also return (and bill) listings no longer found |
| proxy | object | IT residential | Connection configuration |
| mcpConnectors | array | empty | Pipe results into your apps via MCP connectors (see below) |

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape — the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record — not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations**.
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Output example

> Sample shape, values are illustrative placeholders, not from a live listing.

```json
{
  "id": "000000000",
  "url": "https://www.subito.it/auto/sample-listing-000000000.htm",
  "title": "Sample listing title",
  "description": "Full listing description text appears here.",
  "price": 12500,
  "priceRaw": "12.500 €",
  "currency": "EUR",
  "adType": "Vendita",
  "category": "Auto",
  "categorySlug": "auto",
  "reference": "ABC12345",
  "postedAt": "2026-01-01T10:00:00+01:00",
  "expiresAt": "2026-03-01T10:00:00+01:00",
  "region": "Lombardia",
  "city": "Milano",
  "town": "Milano",
  "imageCount": 8,
  "images": ["https://images.example-cdn/000000000/0.jpg"],
  "sellerId": "00000000",
  "sellerName": "Sample Seller",
  "sellerType": "private",
  "isCompany": false,
  "sellerPhone": "+390000000000",
  "sellerVat": null,
  "shopId": null,
  "shopName": null,
  "condition": "Ottimo",
  "shippingAvailable": false,
  "maker": "Volkswagen",
  "model": "Golf",
  "version": "1.6 TDI",
  "yearOfRegistration": "2019",
  "mileage": 65000,
  "power": "85 kW",
  "fuelType": "Diesel",
  "transmission": "Manuale",
  "bodyType": "Berlina",
  "size": null,
  "rooms": null,
  "bathrooms": null,
  "energyClass": null,
  "jobCategory": null,
  "contractType": null,
  "features": [],
  "sellerReputation": {
    "overallScore": 4.9,
    "receivedCount": 120,
    "sellerFeedbackCount": 95,
    "buyerFeedbackCount": 25,
    "verified": true,
    "memberSince": "2018",
    "replyRateText": "Risponde quasi sempre",
    "replyTimeText": "Risponde in poche ore",
    "profileUrl": "https://www.subito.it/utente/00000000"
  }
}
```

Fields outside the active vertical come back empty — a car listing leaves the property and job specs `null`, and vice versa — so every record keeps the same predictable shape. `sellerReputation` is present only when **Fetch seller reputation** is on. Individual written review texts are not publicly available on subito.it; only the aggregate reputation is returned.

### Seller reputation

Turn on **Fetch seller reputation** to attach a `sellerReputation` block to every listing. Each unique seller is fetched once and cached, so multiple listings from the same seller share one lookup. The block carries the overall score, total and seller/buyer feedback counts, member-since year, verification status, and reply-rate and reply-time indicators.

### Resume & recurring updates

Two different features, both optional:

- **Resume from a previous run** (`resumeFromRunId`) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips listings already collected there, returning only the remaining new ones.
- **Incremental mode** (`incrementalMode`) is for scheduling this same search daily or weekly and getting only what changed. The first run returns everything as `NEW`; later runs return only `NEW`, `UPDATED` and `REAPPEARED` listings by default — turn on **Emit unchanged** or **Emit expired** to also get (and pay for) the rest. State is tracked automatically, keyed by the search/filters/URLs/enrichment settings you used (or by **State key**, if you set one).

When `incrementalMode` is on, every returned record also carries `changeType` (`NEW` / `UPDATED` / `UNCHANGED` / `REAPPEARED` / `EXPIRED`), `changedFields`, `firstSeenAt` and `lastSeenAt`. `EXPIRED` rows (only with **Emit expired** on) are produced once a run has fully scanned the tracked search — not when Max items capped it, and not when Resume was used, since neither proves the rest of the catalogue is actually gone.

These two features are independent and can combine: resuming into a fresh incremental baseline seeds it so those listings don't look `NEW` again next time.

### Pricing

This actor is billed **pay per result**: **$0.80 per 1,000 listings**, plus a small **per-run start fee** ($0.02 on the Free tier, less on higher plans). The total cap (`maxItems`) lets you size every run precisely. Full vehicle-detail lookups (vehicles only) and seller-reputation lookups are each billed separately — per vehicle and per unique seller respectively — only when those options are enabled.

### Plan requirement

An Apify plan that includes Residential proxy (Starter or higher) is recommended, with the country set to IT for the most reliable results. A free plan without Residential proxy may return few or no results.

# Actor input Schema

## `category` (type: `string`):

Which Subito.it vertical to scrape. This drives the default landing section and decides which vertical-specific filters below apply. Cars, real estate and jobs each expose their own filter set; marketplace covers all the consumer-goods categories.

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

Free-text keyword. Leave empty to browse all listings in the chosen vertical. Used together with the filters below. If a Start URL is also given, the URL takes precedence for that entry.

## `subjectOnly` (type: `boolean`):

Match the keyword only against the ad title (not the description).

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

Region name or region id. Leave empty for all of Italy.

## `city` (type: `string`):

Province (provincia) name or id to narrow results.

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

Town (comune) name or id to narrow results further.

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

Minimum price in euro. For jobs this maps to the advertised salary when present.

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

Maximum price in euro.

## `sellerType` (type: `string`):

Filter by advertiser. Any = both, Private = individuals, Company = businesses/dealers.

## `sort` (type: `string`):

Result ordering. Relevance / newest / price options work for every vertical; the year, mileage, power and length options only apply to cars & motors.

## `adType` (type: `string`):

Transaction type. Offer (vendita) and Wanted (cercasi) apply broadly; Rent and Holiday rental apply to real estate; Free (in regalo) applies to marketplace. Cars and jobs only support Offer.

## `condition` (type: `array`):

Marketplace only. Filter by item condition. Choose one or more.

## `shippableOnly` (type: `boolean`):

Marketplace only. Show only ads that offer shipping.

## `brand` (type: `string`):

Cars only. Brand id (e.g. 000101 = Volkswagen).

## `model` (type: `string`):

Cars only. Model id (depends on the chosen brand).

## `yearMin` (type: `integer`):

Cars only. Earliest registration year.

## `yearMax` (type: `integer`):

Cars only. Latest registration year.

## `mileageMin` (type: `integer`):

Cars only. Minimum kilometres.

## `mileageMax` (type: `integer`):

Cars only. Maximum kilometres.

## `fuelType` (type: `array`):

Cars only. Filter by fuel. Choose one or more.

## `gearbox` (type: `string`):

Cars only. Transmission type.

## `bodyType` (type: `array`):

Cars only. Filter by body style. Choose one or more.

## `vehicleStatus` (type: `array`):

Cars only. Used, zero-km or new. Choose one or more.

## `sizeMin` (type: `integer`):

Real estate only. Minimum surface in square metres.

## `sizeMax` (type: `integer`):

Real estate only. Maximum surface in square metres.

## `roomsMin` (type: `integer`):

Real estate only. Minimum number of rooms.

## `roomsMax` (type: `integer`):

Real estate only. Maximum number of rooms.

## `bathroomsMin` (type: `integer`):

Real estate only. Minimum number of bathrooms.

## `buildingCondition` (type: `array`):

Real estate only. Filter by property condition. Choose one or more.

## `jobCategory` (type: `array`):

Jobs only. Filter by job sector. Choose one or more.

## `contractType` (type: `array`):

Jobs only. Filter by contract type. Choose one or more.

## `workHours` (type: `string`):

Jobs only. Filter by working hours.

## `educationDegree` (type: `string`):

Jobs only. Filter by required education level.

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

Paste subito.it search URLs (/annunci-italia/...) or listing detail URLs (ending in .htm). Search URLs are parsed into search parameters; a detail URL enriches that single ad. Can be combined with a keyword search — the URL wins for each entry it covers.

## `scrapeDetail` (type: `boolean`):

Vehicles only (category Cars & motors). When on, opens each vehicle's page to add full technical specs (engine size, kW/HP, cylinders, gears, drive, dimensions, weight) and the complete equipment/optionals list. Adds one request per vehicle. Other categories already return their full data from search and are unaffected.

## `scrapeReviews` (type: `boolean`):

When on, fetch each unique seller's public reputation once and attach it to their listings. Adds one request per unique seller. Individual written review texts are not publicly available; only the aggregate reputation is returned.

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

Hard cap on the total number of listings across all searches and URLs.

## `maxItemsPerQuery` (type: `integer`):

Per-search / per-URL cap for multi-search runs. Leave empty for no per-search limit (still bounded by Max items).

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue an interrupted crawl without re-collecting or re-charging for listings already gathered there. For recurring daily/weekly monitoring of the same search instead, use Incremental mode below.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring of the same search. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those returned (and billed). State is kept separately per vertical/query/filter/URL/enrichment setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the vertical/query/filters/URLs/enrichment settings -- different searches then never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max items capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking.

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

Residential proxy is required for reliable access; the actor defaults the country to Italy.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Apify (https://mcp.apify.com).

## Actor input object example

```json
{
  "category": "marketplace",
  "subjectOnly": false,
  "sellerType": "any",
  "sort": "datedesc",
  "adType": "s",
  "shippableOnly": false,
  "startUrls": [],
  "scrapeDetail": false,
  "scrapeReviews": false,
  "maxItems": 100,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "category": "marketplace",
    "searchQuery": "",
    "region": "",
    "city": "",
    "town": "",
    "brand": "",
    "model": "",
    "startUrls": [],
    "maxItems": 100,
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/subito-it-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 = {
    "category": "marketplace",
    "searchQuery": "",
    "region": "",
    "city": "",
    "town": "",
    "brand": "",
    "model": "",
    "startUrls": [],
    "maxItems": 100,
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/subito-it-scraper").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 '{
  "category": "marketplace",
  "searchQuery": "",
  "region": "",
  "city": "",
  "town": "",
  "brand": "",
  "model": "",
  "startUrls": [],
  "maxItems": 100,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}' |
apify call abotapi/subito-it-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/efIpQU5NkpFaBLAAk/builds/wZpNvcCLcKg2msPOp/openapi.json
