# Subito.it Scraper: Italian Classifieds Listings (`reventadata/subito-scraper`) Actor

Scrape Subito.it ads by keyword, category, region and province: title, description, price, condition, region, province and town, whether shipping is offered, shipping cost when listed, images, private or company seller and posting time. Filter by price. Unofficial.

- **URL**: https://apify.com/reventadata/subito-scraper.md
- **Developed by:** [reventadata](https://apify.com/reventadata) (community)
- **Categories:** E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Subito.it Scraper: Italian classifieds, any category

> **Unofficial.** This Actor is not affiliated with, authorised by, endorsed by, or in any
> way officially connected to Subito.it. "Subito" is a trademark of its respective owner and is
> used here only to describe what this tool reads. It reads the same public pages a browser does.

Subito.it Scraper extracts public classified listings from Subito.it, Italy's second-hand marketplace, as structured rows: price, category, place, seller, photos and the attributes each category carries.

### What does it do?

- Searches by keyword, category, region and province and returns one dataset row per listing.
- Works across every category (the default is all categories; real estate and vehicles are supported with their own fields).
- Pages through results, up to 300 pages of 30 listings per keyword (9,000 rows), and removes duplicates by listing id.
- Optional minimum and maximum price, applied after the results are read.

### Why use it?

- **Structured columns:** price as a number, place split into region, province and town, rooms, area and energy class for real estate, year, mileage, fuel and gearbox for vehicles.
- **No browser, no proxy needed.**
- **Public data only:** seller and business names and public profile fields the site shows are in the rows when the listing has them (`sellerName` was empty in all 10 rows of a 2026-11-11 platform run); nothing from behind a login.

### How to use it

1. Enter one or more keywords, or leave the list empty to list a whole category.
2. Optionally set a category (`usato` for all, `immobili`, `appartamenti`, `moto-e-scooter`, `telefonia`, `auto`), a region (for example `lombardia`) and a province (for example `milano`), the slugs you see in a subito.it search URL.
3. Set the maximum number of rows and pages, then run.

#### Input

| Field | Meaning |
|---|---|
| `searchQueries` | Keywords, one search each. Empty = the category and place without a keyword. |
| `category`, `region`, `province` | Slugs from a subito.it search URL. An unknown slug stops the run with a clear error. |
| `minPrice`, `maxPrice` | Optional, in euros. Listings without a price are dropped while a limit is set. |
| `includeSponsored` | Each result page carries 12 gallery listings that look sponsored; off by default. |
| `maxItems`, `maxPages` | Caps on rows and on pages per keyword (30 listings per page, 300 pages at most). |
| `proxyConfiguration` | Optional. Off by default. |

### Output

One row per listing. The columns are listed in the dataset schema. Sample row (a real row from a platform run on 2026-11-11, keyword `iphone`; the description is shortened to 90 characters here and the image list and carrier list are cut to 2 entries):

```json
{
  "id": "666668218",
  "url": "https://www.subito.it/telefonia/iphone-xs-64-rigenerato-padova-666668218.htm",
  "title": "iPhone XS 64 rigenerato ",
  "description": "Perfettamente funzionante. \nBatteria nuova. Ancora in garanzia.\nColore: grigio siderale\nCo...",
  "price": 170,
  "currency": "EUR",
  "category": "Telefonia",
  "categoryId": "12",
  "parentCategoryId": "9",
  "categorySlug": "telefonia",
  "listingType": "In vendita",
  "condition": "Come nuovo - perfetto o ricondizionato",
  "region": "Veneto",
  "province": "Padova",
  "provinceCode": "PD",
  "town": "Abano Terme",
  "sellerName": null,
  "sellerId": "12652808",
  "isCompany": false,
  "postedAt": "2026-11-11T07:37:58",
  "shippable": true,
  "shippingCost": 0.99,
  "imageUrls": [
    "https://images.sbito.it/api/v1/sbt-ads-images-pro/images/61/618d532b-f12a-4526-961f-849b879b9c03?rule=gallery-desktop-2x-auto",
    "https://images.sbito.it/api/v1/sbt-ads-images-pro/images/b4/b42af55b-3f54-4458-9236-6305586ca644?rule=gallery-desktop-2x-auto"
  ],
  "imageCount": 5,
  "rooms": null,
  "bathrooms": null,
  "areaM2": null,
  "floor": null,
  "energyClass": null,
  "buildingCondition": null,
  "vehicleBrand": null,
  "vehicleYear": null,
  "mileageKm": null,
  "fuel": null,
  "gearbox": null,
  "features": {
    "item_shippable": "Sì",
    "item_shipping_package_size": "Piccolo - fino a 2kg",
    "shipping_carriers": [
      "poste_italiane",
      "ups"
    ],
    "price": "170 €",
    "item_shipping_allowed": "Sì",
    "item_shipping_type": "Spedizione con TuttoSubito",
    "item_shipping_cost_tuttosubito": "0,99 €",
    "phone_type": "Cellulari e Smartphone",
    "item_condition": "Come nuovo - perfetto o ricondizionato"
  },
  "isSponsored": false,
  "searchQuery": "iphone",
  "searchUrl": "https://www.subito.it/annunci-italia/vendita/usato/?q=iphone"
}
```

`features` holds every attribute the listing carries, keyed by the site's own attribute name, so category-specific details that have no dedicated column are still there.

### Limits and notes

- The site serves at most 300 pages per search (9,000 listings). Narrow a large search by region, province or category to go beyond it.
- A listing without a price has `price` null. A listing with a seller name left blank by the site has `sellerName` null.
- `postedAt` is the date and time the site gives, without a time zone.
- Phone numbers are not part of the search results and are not returned.
- A search that matches nothing ends successfully with a message saying so.

### Pricing

The current price is on the Actor's Pricing tab.

### Support

Open an issue on the Actor page with the input you used and the run link.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search for, one search per keyword (for example "iphone"). Leave empty to list the chosen category and place without a keyword. Rows are deduplicated by listing id across keywords.

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

Subito category slug as it appears in a subito.it search URL: "usato" (all categories), "immobili", "appartamenti", "moto-e-scooter", "telefonia", "auto". An unknown slug stops the run with an error.

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

Region slug as it appears in a subito.it search URL, for example "lombardia" or "valle-d-aosta"; "italia" searches the whole country.

## `province` (type: `string`):

Optional province slug placed after the category in the search URL, for example "milano" with region "lombardia" and category "appartamenti". Only this form was tested; towns are not offered.

## `minPrice` (type: `integer`):

Optional. Rows priced below this are dropped after fetching; rows without a listed price are dropped too while a price limit is set.

## `maxPrice` (type: `integer`):

Optional. Rows priced above this are dropped after fetching; rows without a listed price are dropped too while a price limit is set.

## `includeSponsored` (type: `boolean`):

Each result page also carries 12 gallery listings that look sponsored. They are skipped unless this is on; kept rows have isSponsored true.

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

Hard cap on rows pushed, across all keywords.

## `maxPages` (type: `integer`):

Optional cap on result pages per keyword (30 listings each). The site stops serving results after page 300, so a keyword yields at most 9,000 rows.

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

Optional. Left off by default; turn it on only if you see request failures.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "category": "usato",
  "region": "italia",
  "includeSponsored": false,
  "maxItems": 10,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Items scraped from the target website.

# 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 = {
    "searchQueries": [
        "iphone"
    ],
    "category": "usato",
    "region": "italia",
    "maxItems": 10,
    "maxPages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/subito-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 = {
    "searchQueries": ["iphone"],
    "category": "usato",
    "region": "italia",
    "maxItems": 10,
    "maxPages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("reventadata/subito-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 '{
  "searchQueries": [
    "iphone"
  ],
  "category": "usato",
  "region": "italia",
  "maxItems": 10,
  "maxPages": 1
}' |
apify call reventadata/subito-scraper --silent --output-dataset

```

## MCP server setup

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