# Subito.it Scraper (`datascrapers/subito-scraper`) Actor

Scrape classified ads from Subito.it by search query or URL, with website-matching filters and optional listing-detail enrichment.

- **URL**: https://apify.com/datascrapers/subito-scraper.md
- **Developed by:** [Data Scrapers](https://apify.com/datascrapers) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

**Subito.it Scraper** creates a structured dataset of classified ads collected from Subito.it. Each dataset item can include the listing id, title, price, category, town, region, publication time, image, advertiser or shop name, and, when details are enabled, condition and shop hours. Query the source with a Subito search or listing URL, or with keywords plus category, region, and price filters. Control the result limit with `maxItems`. Retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

[![Subito.it Scraper — search query to classified ads](https://raw.githubusercontent.com/faizanalii/apify-actor-assets/main/subito-scraper/subito-scraper-value-demo.gif)](https://apify.com/datascrapers/subito-scraper)

### Dataset at a glance

| Property | Value |
|---|---|
| Source | subito.it |
| Record unit | One classified ad |
| Input methods | `startUrls` or `searchQueries` |
| Main identifiers | `listingId`, `url` |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML |
| Update model | Fresh records per Actor run |
| Pricing | $1.00 per 1,000 listings and $1.50 per 1,000 detail enrichments on the Free plan. Platform usage is not billed separately. |

### Coverage and available records

`startUrls` accepts Subito search, category, and listing URLs. When start URLs are set, keyword and form filters are not applied. Otherwise the Actor searches `searchQueries` or the single `searchQuery`. `category` defaults to all categories. `adType` defaults to for sale. Region, sort, price, title-only, shipping, urgent, and seller-type filters match the website controls. Car filters such as brand, mileage, year, fuel, and gearbox apply when the category is vehicles.

`includeListingDetails` opens the ad page and charges `listing-details` when enrichment succeeds. `detailsFetched` is true on those rows. `maxItems` of 0 means no explicit item cap. Vehicle-only fields stay empty on other categories.

### Data dictionary

| Field | Type | Nullable | Description | Example |
|---|---|---:|---|---|
| listingId | string | no | Subito ad id. Deduplication key. | 661178635 |
| url | string | yes | Public ad page | https://www.subito.it/informatica/ipad-pro-13-m4-1-tb-wifi-cell-nanotexture-in-gar-brescia-661178635.htm |
| title | string | yes | Ad title | IPAD PRO 13" M4 1 TB WIFI+CELL NANOTEXTURE -IN GAR |
| price | number | yes | Numeric price | 1899.0 |
| currency | string | yes | Currency code | EUR |
| category | string | yes | Category label | Informatica |
| town | string | yes | Town | Brescia |
| province | string | yes | Province | Brescia |
| region | string | yes | Region | Lombardia |
| publishedAt | string | yes | Publication time | 2026-09-18T10:53:03.444+0200 |
| imageUrl | string | yes | Primary image | https://images.sbito.it/api/v1/sbt-ads-images-pro/images/88/884d7636-ce70-4ca0-85b0-6c7290c48f2c?rule=fullscreen-1x-auto |
| advertiserName | string | yes | Advertiser or shop label | Monte Alto SRL |
| shopName | string | yes | Shop name when the seller is a shop | Monte Alto SRL |
| condition | string | yes | Condition from the detail page | Nuovo - mai usato in confezione originale |
| detailsFetched | boolean | yes | True when the detail page was saved | true |
| sourceQuery | string | yes | Query or URL that produced the row | iphone |

### Example dataset record

```json
{
  "listingId": "661178635",
  "url": "https://www.subito.it/informatica/ipad-pro-13-m4-1-tb-wifi-cell-nanotexture-in-gar-brescia-661178635.htm",
  "title": "IPAD PRO 13\" M4 1 TB WIFI+CELL NANOTEXTURE -IN GAR",
  "price": 1899.0,
  "currency": "EUR",
  "category": "Informatica",
  "town": "Brescia",
  "province": "Brescia",
  "region": "Lombardia",
  "publishedAt": "2026-09-18T10:53:03.444+0200",
  "advertiserName": "Monte Alto SRL",
  "shopName": "Monte Alto SRL",
  "condition": "Nuovo - mai usato in confezione originale",
  "detailsFetched": true,
  "sourceQuery": "iphone"
}
```

This row came from the keyword `iphone` with listing details enabled. The matching ad is a computer listing in Brescia.

### Query and input reference

| Input | Type | Required | Default | Accepted values | Description |
|---|---|---:|---|---|---|
| startUrls | array | no | empty | Subito URLs | Search, category, or ad URLs. Overrides filters. |
| searchQueries | array | no | empty | Keywords | Search terms. Ignored when start URLs are set. |
| searchQuery | string | no | empty | Keyword | Single keyword. Prefer `searchQueries`. |
| category | string | no | 0 | Schema enum | Category. 0 is all categories. |
| adType | string | no | s | Schema enum | For sale or other ad types. |
| region | string | no | empty | Schema enum | Italian region. |
| sortBy | string | no | datedesc | Schema enum | Sort order. |
| minPrice | integer | no | empty | EUR | Minimum price. |
| maxPrice | integer | no | empty | EUR | Maximum price. |
| titleOnly | boolean | no | false | true, false | Match the title only. |
| shippingAvailable | boolean | no | false | true, false | Shipping available. |
| urgentOnly | boolean | no | false | true, false | Urgent ads only. |
| advertiserType | string | no | empty | Schema enum | Private or shop. |
| carBrand | string | no | empty | Schema enum | Vehicle brand. |
| carModel | string | no | empty | Text | Vehicle model. |
| vehicleStatus | string | no | empty | Schema enum | Vehicle condition. |
| minMileage | integer | no | empty | Kilometers | Minimum mileage. |
| maxMileage | integer | no | empty | Kilometers | Maximum mileage. |
| minYear | integer | no | empty | Year | Oldest registration year. |
| maxYear | integer | no | empty | Year | Newest registration year. |
| newDriversOnly | boolean | no | false | true, false | Suitable for new drivers. |
| minPowerCv | integer | no | empty | CV | Minimum power. |
| maxPowerCv | integer | no | empty | CV | Maximum power. |
| fuel | array | no | empty | Schema enum | Fuel types. |
| emissionClass | array | no | empty | Schema enum | Emission classes. |
| bodyType | string | no | empty | Schema enum | Body type. |
| color | string | no | empty | Schema enum | Color. |
| gearbox | string | no | empty | Schema enum | Gearbox. |
| doors | string | no | empty | Schema enum | Door count. |
| minSeats | integer | no | empty | Integer | Minimum seats. |
| maxSeats | integer | no | empty | Integer | Maximum seats. |
| equipment | array | no | empty | Schema enum | Equipment. |
| vatDeductible | boolean | no | false | true, false | VAT exposed. |
| qualityCertified | boolean | no | false | true, false | Quality certified. |
| includeListingDetails | boolean | no | false | true, false | Fetch ad pages. Charges `listing-details`. |
| detailsConcurrency | integer | no | 10 | Integer | Parallel detail fetches. |
| maxItems | integer | no | 0 | Integer | Maximum ads saved. 0 does not add a cap. |
| proxyConfiguration | object | no | Apify residential, Italy | Apify proxy input | Proxy used for Subito requests. |

Minimal request:

```json
{
  "searchQueries": ["iphone"],
  "maxItems": 5
}
```

### Retrieve the data through the API

Start the Actor with JSON input, wait for the run, then read the default dataset. Other languages are on the Actor API tab.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("datascrapers/subito-scraper").call(run_input={
    "searchQueries": ["iphone"],
    "maxItems": 5,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["listingId"], item.get("price"))
```

### Data quality and record handling

Use `listingId` as the deduplication key. `price` is a number in euros. `publishedAt` keeps the offset returned by Subito. Detail fields such as `condition` and `shopHours` are present when `detailsFetched` is true. An ad page that fails is still saved from the search card, with `detailsFetched` false. The example advertiser is a shop name.

### Pricing and cost examples

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| dataset-item | $1.00 | $0.99 | $0.98 | $0.97 |
| listing-details | $1.50 | $1.40 | $1.30 | $1.20 |

Prices are per 1,000 events. Platinum and Diamond use the Gold price. Platform usage is not billed on top of these events. A Free-plan run that saves 1,000 ads costs $1.00. Enabling details adds $1.50 per 1,000 successful detail pages.

### Limitations and responsible data use

Subito can change search filters, require an Italian residential proxy, or omit shop fields on private ads. Vehicle filters do not apply to other categories. Use the data under Subito's terms and applicable privacy rules.

### Dataset questions

#### Do start URLs ignore the category filter?

Yes. When `startUrls` is set, the Actor follows those URLs and does not apply `searchQueries` or the form filters.

#### What does maxItems 0 mean?

The run keeps paging until the search ends or the platform stops it. Set a positive `maxItems` to cap the dataset.

#### Which field should I store as the key?

Store `listingId`. It is the numeric id at the end of the ad URL.

### Related datasets from Data Scrapers

- [MediaMarkt Germany Product Scraper](https://apify.com/datascrapers/mediamarkt-de-scraper) for German electronics products.
- [Cdiscount Scraper](https://apify.com/datascrapers/cdiscount) for French retail products.
- [Carrefour Scraper](https://apify.com/datascrapers/carrefour) for Carrefour products.
- [Chargefinder Scraper](https://apify.com/datascrapers/chargefinder-scraper) for public charging stations.
- [Company Services Finder](https://apify.com/datascrapers/company-service-finder) for company service labels.

### Data Scrapers support

Questions about this dataset: stardustspotlight@gmail.com

# Actor input Schema

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

Subito search, category, or listing URLs. When set, these are used instead of search queries and form filters. e.g. https://www.subito.it/annunci-italia/vendita/usato/?q=iphone or a listing .htm URL.

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

Keywords to search on Subito (e.g. iPhone, Audi Q3). Ignored when Start URLs are provided.

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

Optional single keyword. Prefer Search queries for multiple terms. Ignored when Start URLs are provided.

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

Subito category, matching the website. Leave as Tutte le categorie to search everything.

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

Tipo di annuncio.

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

Italian region. Leave empty for all of Italy.

## `sortBy` (type: `string`):

Result order.

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

Minimum price in euros.

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

Maximum price in euros.

## `titleOnly` (type: `boolean`):

Ricerca solo nel titolo.

## `shippingAvailable` (type: `boolean`):

Only ads with shipping (Spedizione disponibile).

## `urgentOnly` (type: `boolean`):

Only urgent ads.

## `advertiserType` (type: `string`):

Inserzionista: private or verified dealer.

## `carBrand` (type: `string`):

Marca (Auto category). Matches the website brand list.

## `carModel` (type: `string`):

Modello. Enter the model name or Subito model code (e.g. Q3).

## `vehicleStatus` (type: `string`):

Condizioni del veicolo.

## `minMileage` (type: `integer`):

Minimum kilometers. Mapped to Subito's mileage dropdown.

## `maxMileage` (type: `integer`):

Maximum kilometers. Mapped to Subito's mileage dropdown.

## `minYear` (type: `integer`):

Anno di immatricolazione da.

## `maxYear` (type: `integer`):

Anno di immatricolazione a.

## `newDriversOnly` (type: `boolean`):

Per neopatentati.

## `minPowerCv` (type: `integer`):

Potenza minima in CV.

## `maxPowerCv` (type: `integer`):

Potenza massima in CV.

## `fuel` (type: `array`):

Carburante. Select one or more fuels.

## `emissionClass` (type: `array`):

Classe emissioni.

## `bodyType` (type: `string`):

Carrozzeria.

## `color` (type: `string`):

Colore.

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

Cambio.

## `doors` (type: `string`):

Porte.

## `minSeats` (type: `integer`):

Posti da.

## `maxSeats` (type: `integer`):

Posti a.

## `equipment` (type: `array`):

Equipaggiamento. Select extras such as ABS, Bluetooth, or parking sensors.

## `vatDeductible` (type: `boolean`):

Iva esposta.

## `qualityCertified` (type: `boolean`):

Only cars with a quality certificate.

## `includeListingDetails` (type: `boolean`):

Visit each ad page to extract shop address, hours, website, and extra attributes. Charges a second pay-per-event (listing-details) per successful enrichment. Requests run in parallel and rotate the proxy.

## `detailsConcurrency` (type: `integer`):

How many listing-detail requests to run at once (each uses a rotated proxy).

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

Maximum number of listings to scrape (0 = unlimited).

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

Optional. European / Italian residential proxies are recommended. Leave Apify Proxy off to run without a proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.subito.it/annunci-italia/vendita/usato/?q=iphone"
    }
  ],
  "searchQueries": [
    "iphone"
  ],
  "category": "0",
  "adType": "s",
  "region": "",
  "sortBy": "datedesc",
  "titleOnly": false,
  "shippingAvailable": false,
  "urgentOnly": false,
  "advertiserType": "",
  "carBrand": "",
  "vehicleStatus": "",
  "newDriversOnly": false,
  "bodyType": "",
  "color": "",
  "gearbox": "",
  "doors": "",
  "vatDeductible": false,
  "qualityCertified": false,
  "includeListingDetails": false,
  "detailsConcurrency": 10,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}
```

# Actor output Schema

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

Dataset containing scraped Subito ads

## `runStats` (type: `string`):

Record counts and timestamps for this run

# 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": [
        {
            "url": "https://www.subito.it/annunci-italia/vendita/usato/?q=iphone"
        }
    ],
    "searchQueries": [
        "iphone"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascrapers/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 = {
    "startUrls": [{ "url": "https://www.subito.it/annunci-italia/vendita/usato/?q=iphone" }],
    "searchQueries": ["iphone"],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("datascrapers/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 '{
  "startUrls": [
    {
      "url": "https://www.subito.it/annunci-italia/vendita/usato/?q=iphone"
    }
  ],
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IT"
  }
}' |
apify call datascrapers/subito-scraper --silent --output-dataset

```

## MCP server setup

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