Subito.it Scraper - Listings, Prices, Sellers & 60+ Fields
Pricing
from $0.50 / 1,000 listing results
Subito.it Scraper - Listings, Prices, Sellers & 60+ Fields
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.
Pricing
from $0.50 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
15
Total users
3
Monthly active users
8 days ago
Last modified
Categories
Share
Subito.it Scraper: Cars, Real Estate, Marketplace and Job Listings
Subito.it Scraper turns Italy's largest classifieds site into clean structured data. Search by keyword with vertical-specific filters, or paste any subito.it search or listing URL, and get cars, real estate, marketplace goods and job listings with price, full description, every photo, vehicle or property specs, seller contact and precise location. Turn on optional seller reputation and full vehicle detail enrichment, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- One actor, four verticals. Cars & motors, real estate, marketplace goods and jobs each have their own filter set, all sharing one consistent output shape.
- Two ways in. Search by keyword and filters, or paste subito.it search and listing URLs and let the actor read the filters straight from them.
- Region, province and town by name. Type "Roma" or "Milano" instead of hunting for numeric location ids; the actor resolves the name for you.
- Seller reputation on demand. Optionally attach each seller's public reputation, overall score, feedback counts, verification and reply rate, fetched once per unique seller and shared across their listings.
- Deeper vehicle data on demand. Turn on full vehicle details to add engine size, power, cylinders, gears, dimensions, weight and the full equipment list for cars. It applies to cars only; other verticals are not affected and are not charged for it.
- Built for monitoring. Incremental mode returns only new and changed listings on repeat runs, and a genuinely blocked run fails loudly instead of quietly returning an empty dataset.
- Resume without re-paying. Continue one interrupted run from its run or dataset id and skip every listing already collected there.
Use Cases
- Car and property market research: track asking prices, mileage or surface across a region to spot trends.
- Lead generation for dealers and agents: collect new listings in a category or area as they are posted.
- Job market monitoring: watch a sector or contract type for newly posted openings.
- Marketplace price tracking: follow a product category or keyword and catch price drops with Incremental mode.
- Seller due diligence: check a seller's public reputation and verification before responding to a listing.
- Data feeds for apps and dashboards: pipe structured listings into your own site, bot or alerting tool through the API.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | "655595345" |
url | "https://www.subito.it/auto/sample-listing-655595345.htm" |
title | "Sample listing title" |
description | "Full listing description text appears here." |
price | 12500 |
priceRaw | "12.500 โฌ" |
currency | "EUR" |
adType | "Vendita" |
category | "Auto" |
condition | "Ottimo" (marketplace listings) |
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/655595345/0.jpg"] |
sellerName | "Sample Seller" |
sellerType | "private" |
isCompany | false |
sellerPhone | "+390000000000" |
reference | "ABC12345" |
New fields, one line each: powerKw and powerHp are the engine power split into kilowatts and horsepower numbers; warrantyMonths is the seller warranty length in months; vehicleType is the vehicle kind the site reports (for example a van); provinceCode is the two-letter province code of the listing; cityIstat is the ISTAT municipality code; coverImage is the first image URL; searchUrl is the subito.it search page this row came from (the URL you pasted, or the equivalent search for your keyword and filters); pageNumber is the results page it was found on.
Vertical-specific specs travel on the same record. Cars carry maker, model, version, yearOfRegistration, mileage, power, fuelType, transmission, bodyType and color, plus (with Fetch full vehicle details on) engineSizeCc, horsepower, cylinders, gears, driveWheel, lengthM/widthM/heightM, weightKg and an equipment list. Real estate carries size, rooms, bathrooms, floor, heating, energyClass, buildingCondition, parking, airConditioning, balcony, elevator, garden and furnished. Jobs carry jobCategory, contractType, workHours, workLevel and educationDegree. Marketplace listings also carry shippingAvailable, shippingType, shippingCost and shippingPackageSize. Fields outside the active vertical come back null, and every raw feature the site exposes is kept, keyed by its own code, in a features object. Turning on Fetch seller reputation attaches a sellerReputation block (overall score, feedback counts, verification, member-since year and reply-rate/reply-time text) to every listing from that seller; individual written review texts are not publicly available on subito.it, only the aggregate reputation is returned. In Incremental mode, every record also carries changeType, changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a vertical: Cars & motors, Real estate, Marketplace, or Jobs, and add a keyword if you have one.
- Add the filters for that vertical (price, location, condition, vehicle or property specs, job sector), or paste subito.it search or listing URLs instead of building a keyword search (clear the prefilled Start URL when searching by keyword).
- Turn on Fetch seller reputation and, for vehicles, Fetch full vehicle details if you want those extras, then set Max items to size and cap the run.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search marketplace goods by keyword:
{"category": "marketplace","searchQuery": "iphone 15","condition": ["10", "20"],"priceMin": 200,"priceMax": 600,"maxItems": 100}
Search cars with vehicle filters:
{"category": "auto","searchQuery": "golf","yearMin": 2017,"mileageMax": 100000,"fuelType": ["2"],"gearbox": "1","sort": "priceasc","maxItems": 200}
Search real estate to rent, in one province:
{"category": "realestate","adType": "u","city": "Roma","sizeMin": 60,"roomsMin": 2,"priceMax": 1500,"maxItems": 150}
Search jobs, with seller reputation attached:
{"category": "jobs","searchQuery": "magazziniere","workHours": "fulltime","scrapeReviews": true,"maxItems": 100}
URL mode
URL mode with the Start URLs field untouched runs one example of each supported shape below (the field is pre-filled with all of them). Max items is shared across those searches: each one gets an equal share of what is left of the cap (about five or six listings each at the default of 100), so every shape runs. Raise Max items, or set Max items per search, for deeper pages. If you change any keyword, location, filter, vertical or enrichment input while leaving the example list untouched, the actor runs that keyword or filter search instead of the examples. Clear the list to run a keyword search with the default inputs. Changed: earlier versions ran a plain marketplace browse when Start URLs was omitted and no keyword or filter was set. Such runs (an API call or saved task that sends no Start URLs, for example only a Max items value) now scrape one example of each URL shape instead. Incremental runs set up that way without a State key now track a new baseline, so the first run after the update returns those listings as NEW. To get the old behaviour, set a keyword or filter, or clear Start URLs.
| URL shape | Example path | Notes |
|---|---|---|
| Keyword search | /annunci-italia/vendita/usato/?q=bici | |
| Paginated search | ...?q=bici&o=2 | Starts at that page; counts as a partial scope for expired detection |
| Filtered and sorted | ...?q=bici&sort=priceasc&ps=10&pe=100 | Price and sort are read from the URL |
| Seller type | ...?q=bici&advt=1 | |
| Shippable | ...?q=bici&shp=true | |
| Region and town | /annunci-lombardia/vendita/usato/milano/?q=bici | Names are resolved to ids |
| Top-level category | /annunci-italia/vendita/usato/ | |
| Marketplace sub-category | /annunci-italia/vendita/biciclette/ | Applied as a keyword search |
| Cars, region scoped | /annunci-lombardia/vendita/auto/ | |
| Cars brand and model | /annunci-italia/vendita/auto/toyota/corolla/ | Brand and model are applied as keywords |
| Motorbikes | /annunci-italia/vendita/moto-e-scooter/ | Returns motorbike listings only (the motorbikes category) |
| Commercial vehicles | /annunci-italia/vendita/veicoli-commerciali/ | Returns commercial vehicle listings only |
| Real estate sale | /annunci-italia/vendita/immobili/, /annunci-italia/vendita/appartamenti/ | /immobili/ returns all real estate (apartments, garages, offices, villas, land). /appartamenti/ returns apartment listings only. Other real estate sub-category paths (garage-e-box, uffici-locali-commerciali, ville-singole-e-a-schiera, terreni-e-rustici, loft-mansarde, case-vacanza) return that sub-category only. An unrecognised real estate sub-category path searches all real estate and logs a warning |
| Real estate rent | /annunci-lazio/affitto/appartamenti/roma/?ps=500&pe=1200, /annunci-italia/affitto/appartamenti/, /annunci-italia/affitto/camere-posti-letto/ | Returns that sub-category only (apartments, or rooms and beds) |
| Jobs | /annunci-italia/vendita/offerte-lavoro/ | Searches job offers. A cerco-lavoro (job seekers) path also searches job offers and logs a warning |
| Wanted ads | /annunci-italia/cerco/usato/?q=bici | |
| Free ads | /annunci-italia/regalo/usato/ | |
| Listing page | /<category>/<title>-<id>.htm (marketplace and cars) | Fetches that single ad |
| Seller profile | /utente/<id> | Not supported: skipped with a warning in the log |
| Mobile host | m.subito.it/... | Normalised to the www host |
Output views
The dataset has seven ready-made tabs: Listings Overview (all verticals), Cars & Motors, Real Estate, Jobs, Sellers & Contacts, Changes (incremental) (change type, changed fields, first and last seen) and Vehicle details (scrapeDetail). Each run also stores a short summary in the OUTPUT record of the run's key-value store.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/subito-it-scraper").call(run_input={"category": "auto", "searchQuery": "golf", "maxItems": 50})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/subito-it-scraper').call({ category: 'auto', searchQuery: 'golf', maxItems: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Vertical-specific filters
A filter that does not belong to the selected vertical (for example fuelType while category is realestate) is ignored rather than causing an error. Check the run log for a warning naming the ignored filter, then move it to a run with the matching vertical.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted or previous run: paste its run or dataset id and this run skips every listing already collected there, so you never pay twice for the same listing. - Incremental mode (
incrementalMode) is for scheduling the same search again and again and getting only what changed. The first run returns everything asNEW. Later runs returnNEWandUPDATEDby default. Turn on Emit unchanged to also get (and pay for) listings that have not changed, and Emit expired to also get listings that were tracked before but are no longer found.EXPIREDrows are produced only once a run has scanned the tracked search completely, never when Max items capped it or when Resume was used, since neither proves the rest of the search is actually gone.REAPPEAREDonly appears for a listing that an earlier, complete, Emit-expired run had already markedEXPIRED, and that has since been seen again; it does not appear on a plain rerun without that history. Ignore fields when detecting changes (ignoreFieldsForChanges) lets you name fields that must not turn a listing intoUPDATED;scrapedAt,detailFetched,searchUrlandpageNumberare always left out. Editing the list never causes a one-time wave ofUPDATEDrows, because the saved baseline is compared again with your current list. State is tracked automatically, keyed by the vertical, query, filters, URLs and enrichment settings you used, or by State key if you set one. - Resume and Incremental mode can be combined only to start a new monitoring campaign: when the state key has no tracked listings yet, the resumed run's listings seed the baseline. The actor refuses Resume when that state key already holds tracked listings. Use a different State key, or drop Resume, to avoid the conflict.
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 up to the first 50 listings pushed in the run, 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.
- Authorize a connector once under Apify โ Settings โ Integrations.
- Select it in the "Pipe results into your apps" input field. If the picker is empty, you haven't authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where items should be created.maxNotifyListings(default 50) caps how many listings are written to each connector; the dataset is never affected.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
category | string | marketplace | Vertical to scrape: auto, realestate, marketplace, or jobs. |
searchQuery | string | none (empty) | Free-text keyword. Empty browses all listings in the vertical. Ignored as a separate search when Start URLs are given (it only fills in search URLs that carry no keyword of their own). |
subjectOnly | boolean | false | Match the keyword against the ad title only, not the description. |
region | string | none (empty) | Region name or numeric region id. Leave empty for all of Italy. |
city | string | none (empty) | Province (provincia) name or numeric id. |
town | string | none (empty) | Town (comune) name or numeric id; only applied once its region and province are resolved. |
priceMin | integer | none | Minimum price in euro. |
priceMax | integer | none | Maximum price in euro. |
sellerType | string | any | any, private, or company. |
sort | string | datedesc | Newest first. relevance and price options work for every vertical; year, mileage, power and length options apply to cars only. |
adType | string | s | Offer (vendita). Wanted applies broadly; Rent and Holiday rental apply to real estate; Free applies to marketplace; cars and jobs only support Offer. |
condition | array | none | Marketplace only. Item condition, one or more of new, like new, excellent, good, damaged. |
shippableOnly | boolean | false | Marketplace only. Show only ads offering shipping. |
brand | string | none (empty) | Cars only. Numeric brand id; a non-numeric value is folded into the keyword search instead. |
model | string | none (empty) | Cars only. Numeric model id, same fallback as brand. |
yearMin | integer | none | Cars only. Earliest registration year. |
yearMax | integer | none | Cars only. Latest registration year. |
mileageMin | integer | none | Cars only. Minimum kilometres. |
mileageMax | integer | none | Cars only. Maximum kilometres. |
fuelType | array | none | Cars only. One or more fuel types. |
gearbox | string | none | Cars only. Transmission type. |
bodyType | array | none | Cars only. One or more body styles. |
vehicleStatus | array | none | Cars only. Used, zero km, or new. |
sizeMin | integer | none | Real estate only. Minimum surface in mยฒ. |
sizeMax | integer | none | Real estate only. Maximum surface in mยฒ. |
roomsMin | integer | none | Real estate only. Minimum rooms. |
roomsMax | integer | none | Real estate only. Maximum rooms. |
bathroomsMin | integer | none | Real estate only. Minimum bathrooms. |
buildingCondition | array | none | Real estate only. One or more property conditions. |
jobCategory | array | none | Jobs only. One or more job sectors. |
contractType | array | none | Jobs only. One or more contract types. |
workHours | string | none | Jobs only. Full time, part time, shift, or other. |
educationDegree | string | none | Jobs only. Required education level. |
startUrls | array | one example of every supported URL shape (see the URL mode table) | subito.it search URLs, or listing URLs ending in .htm. When any URL is given, the keyword search is not run separately: each search URL runs with its own filters, falling back to the keyword/filter fields for anything the URL does not set. A listing URL fetches that single ad. Changed: earlier versions ran a plain marketplace browse when this field was omitted and no keyword or filter was set; such runs now scrape one example of each URL shape, and incremental runs without a State key track a new baseline (the first run returns those listings as NEW). Clear the list for a plain keyword search; any changed keyword, location, filter, vertical or enrichment input with the untouched example list also runs as a keyword or filter search. With the untouched list, Max items is split across the example searches. |
scrapeDetail | boolean | false | Vehicles only (category auto). Fetch each vehicle's page for full technical specs and the equipment list. Adds one request per vehicle. |
scrapeReviews | boolean | false | Fetch each unique seller's public reputation once and attach it to their listings. Adds one request per unique seller. |
maxItems | integer | 100 (maximum 100000) | Hard cap on the total number of listings across all searches and URLs. The cap always applies, so a run cannot grow without bound. Changed: earlier versions treated an empty Max items as unlimited; it now defaults to 100. Incremental users who want EXPIRED detection must set it high enough to cover the whole search, because a run that stops at the cap never reports EXPIRED. |
maxItemsPerQuery | integer | none (unbounded, still capped by Max items) | Per-search / per-URL cap for multi-search runs. |
resumeFromRunId | string | none | Continue one specific previous run or dataset without re-collecting or re-charging listings already gathered there. |
incrementalMode | boolean | false | Turn on for recurring monitoring of the same search; later runs return only new and changed listings by default. |
stateKey | string | none (auto-derived from the search scope) | Name or share a monitoring campaign's state. |
emitUnchanged | boolean | false | Also return (and bill) listings that have not changed since the last run. |
emitExpired | boolean | false | Also return (and bill) listings that were tracked before but are no longer found; only produced after a complete scan of the tracked search. |
ignoreFieldsForChanges | array | none | Incremental mode only: field names (or dotted paths such as sellerReputation.replyTime) left out of change detection and changedFields. They still appear in the output. |
proxyConfiguration | object | Apify Proxy, Residential group, country IT | Connection settings. Required. See Plan Requirement for what happens when the selected connection is unavailable. |
mcpConnectors | array | none | Optional: send a summary of each listing to apps you authorized under Integrations (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | string | none | Notion connector only: URL or id of the parent page for the item pages. |
maxNotifyListings | integer | 50 | Cap on listings written to each connector per run (1 to 1000). Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"id": "655595345","url": "https://www.subito.it/auto/sample-listing-655595345.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/655595345/0.jpg"],"sellerId": "00000000","sellerName": "Sample Seller","sellerType": "private","isCompany": false,"sellerPhone": "+390000000000","sellerVat": null,"shopId": null,"shopName": null,"condition": null,"shippingAvailable": null,"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": {"/color": { "label": "Colore", "type": "single", "values": [{ "key": "1", "value": "Bianco" }] }},"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"}}
Plan Requirement
This actor needs proxy access, and Connection & proxy is required. It defaults to Apify Proxy's Residential group with the country set to Italy. The search pages themselves were also readable through the standard Apify Proxy pool in our measurements, so if your plan does not include residential proxies the actor falls back to a backup connection instead of stopping.
What you will see in the run log and status:
- Selected connection unavailable (for example a free plan without residential access): the log prints "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." and, when pages are then served, "Served over the backup connection (the default connection was unavailable)."
- No page could be read, plan has no proxy access: the run fails with "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required". If you entered your own proxy URLs, check their credentials.
- Backup connection also failed: the run fails with "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Subito pages." Upgrade your plan or supply your own proxy URLs.
- Ordinary request failures: the run fails with "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."
A failed run pushes nothing to the dataset and is not billed per listing.
Pricing
You pay per event, shown on the Pricing tab of the actor page (rates are not repeated here so they never go stale). The actor charges four events:
| Event | Unit | When it is charged |
|---|---|---|
| Actor start | one per run | Once when the run starts. |
Result (apify-default-dataset-item) | one per listing row written to the dataset | Per row pushed, including NEW/UPDATED rows in Incremental mode. Unchanged and expired rows are charged only when you turn on Emit unchanged / Emit expired. |
Vehicle detail enrichment (detail-enrichment) | one per car whose full technical details were fetched | Only with Fetch full vehicle details on, only for cars (category auto), and only for rows that are pushed. Other verticals are never charged this event. |
Seller reputation (seller-reputation-scraped) | one per unique seller | Only with Fetch seller reputation on, once per seller per run, and only when the row carrying it is pushed. |
Use Max items to cap the size and cost of a run.
FAQ
How much does it cost?
See the Pricing section above: each run has a start event, each listing row is a result event, and vehicle details and seller reputation are separate events charged only where you turned them on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Subito.it?
This actor collects only publicly available classifieds data. You are responsible for how you use it: follow subito.it's terms and the laws that apply to you, take particular care with personal data such as seller names and phone numbers, and get legal advice if you plan commercial redistribution.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only NEW and UPDATED listings by default; unchanged ones are not billed unless you turn on Emit unchanged.
What is the difference between Resume and Incremental mode?
Resume continues one specific interrupted or previous run, using its run or dataset id, so a large crawl does not restart from scratch. Incremental mode is for a recurring schedule against the same search: it remembers its own baseline and classifies each listing as new, updated, unchanged, reappeared or expired. They can combine, but the actor refuses to start Incremental mode with Resume when that state key already holds tracked listings, since resuming does not prove a complete scan.
Why did my run fail instead of returning an empty dataset?
The run fails with a clear message when it returned no listings and at least one page could not be read, so "no listings match" is never confused with "nothing could be read". If some listings were collected before pages started failing, the run succeeds with the listings it got. See Plan Requirement for the exact messages. If a search genuinely has no matching listings, the run still succeeds with an empty dataset.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of the first 50 listings into the apps you authorized under Integrations.
๐ Want more classifieds data?
Pair this actor with these related scrapers from the same team:
| ๐ท๏ธ Mudah.my Cars, Property, Jobs & Marketplace Scraper Scrape Mudah.my listings across every category: cars, motorcycles, property, mobiles... | ๐ Trade Me NZ Scraper Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property... |
| ๐ท๏ธ Leboncoin FR Pull public leboncoin.fr listings across cars, property, jobs, electronics, furniture... | ๐ท๏ธ Gumtree.com Scraper Scrape Gumtree.com classifieds across motors, property, jobs, services, pets and goods... |
| ๐ Willhaben.at Scraper From $1/1K. Scrape Willhaben.at listings into clean JSON with 40+ structured fields... | ๐ Craigslist Scraper Scrape Craigslist postings in any of 700+ cities worldwide: price, title, posting text... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.