Milanuncios Scraper
Scrape Milanuncios listings in Spain. Price in EUR, category, province, city, seller type, photos, publish date and URL. $1.00 per 1,000 listings.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
query,searchUrls,provinces(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.001 per listing = $1 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Listing scraped | One Milanuncios listing returned in the dataset. Sample rows, diagnostics and listings dropped by the province filter are not charged. | $0.001 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-08, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
query | What to search for, in Spanish - for example "sofa cama", "iphone 15", "piso alquiler". Leave empty to browse a whole category. | string |
searchUrls | Optional. Paste Milanuncios search or category URLs instead of filling in the fields above, e.g. https://www.milanuncios.com/coches-de-segunda-mano/?desde=5000&vendedor=part. The category, search text, price range, seller type and order in the URL are all read. | array |
provinces | Optional. Restrict to one or more Spanish provinces by name ("Madrid", "Barcelona", "A Coruña", "Valencia") or INE code 1-52. Milanuncios' own province filter also returns neighbouring provinces, so this actor filters the results exactly - listings outside your provinces are dropped and never charged. | array |
sellerType | Return only private sellers (particulares) or only professional sellers (dealers, agencies, shops). | string |
transaction | Milanuncios carries both offers (someone selling) and wanted ads (someone looking to buy). | string |
category | Optional. Milanuncios category by name, slug or id. Sections: Motor, Inmobiliaria, Empleo, Telefonía, Informática, Casa y Jardín, Moda y complementos, Deportes y náutica, Mascotas y agricultura, Aficiones y ocio, Imagen y Sonido, Juegos, Bebés, Formación y libros, Servicios, Negocios, Comunidad. Sub-categories work too (Coches, Motos, Furgonetas, Viviendas, Móviles, Portátiles). 2302 categories are recognised. | array |
sort | Newest first and Oldest first only work inside the Motor section - Milanuncios returns nothing for them in other categories, so the actor falls back to Most relevant and says so in the log. | string |
minPrice | Optional lower price bound. | integer |
maxItems | How many listings to return in total across all searches. Each returned listing is one charged result. Milanuncios caps any single search at 8300 results; add provinces, price bands or sub-categories to go past that. | integer |
maxPrice | Optional upper price bound. | integer |
What you get
A structured dataset — each result includes fields like:
titlepricecurrencycategoryNamesectionNamesellerTypeprovincecitypublishedAturlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Milanuncios Scraper: Spanish classified ads by search term, category, province or a URL you paste
Type a Spanish search term, pick a category, or paste a Milanuncios results page, and every ad comes back as a row: id, title, full description, price in euros, category path, province and city, seller type, photos, publish date and the link. No account, nothing to install.
The awkward part first. Rows are written at the end, not as they arrive. Everything is collected first and pushed when the searches finish, so a run that hits its time limit delivers nothing at all. Keep Maximum listings sensible and take a big job in several runs rather than one.
| Input | Spanish search terms, categories and provinces, or Milanuncios search URLs |
| Output | One row per listing |
| Ceiling | 50,000 listings per run. About 8,300 per search is Milanuncios' own limit |
| Account needed | None, and nothing to install |
| Price | $1.00 per 1,000 listings, flat on every plan |
🏷️ What Milanuncios Scraper does
Fill in the form or paste links. The form is a Spanish search term plus any mix of category, province, seller type, price band and sort order. A pasted URL carries its own category, search text, price range and seller type across.
Provinces are filtered here, not by Milanuncios. Milanuncios treats a province as a nudge and happily returns neighbouring ones, so the run checks each ad against the provinces you asked for and drops the rest before they reach the dataset. Those never get billed. The side effect is that deep pages of a province-narrowed search thin out, and the search stops once a long stretch turns up nothing in your provinces.
Categories take a name, a slug or an id, at section level like Motor and Inmobiliaria or leaf level like Coches and Portátiles. 2,302 of them are recognised, and anything else comes back as an uncharged BAD_INPUT row rather than being quietly ignored.
Two things to know about sorting. Newest first and oldest first only work inside Motor. Everywhere else Milanuncios returns nothing for them, so the run falls back to most relevant and says so in the log. And a pasted URL's own sort is not used: whatever is set in the Sort order field wins, so set it to match your link.
📥 What you give it
{
"query": "sofa cama",
"provinces": ["Madrid", "Barcelona"],
"sellerType": "private",
"minPrice": 100,
"maxPrice": 800,
"maxItems": 200
}
| Field | Default | What it is |
|---|---|---|
query | box starts at sofa cama | What to search for, in Spanish. Leave it empty to browse a whole category. |
searchUrls | none | Milanuncios search or category pages pasted from the site. |
provinces | all of Spain | Spanish provinces by name or INE code 1 to 52. Ads outside them are dropped uncharged. |
category | all categories | By name, slug or id. Section or leaf level both work. |
sellerType | any | private for particulares, professional for dealers, agencies and shops. |
transaction | supply | Things for sale. demand gives you wanted ads instead. |
sort | relevance | Also cheap and expensive everywhere, newest and oldest inside Motor only. |
minPrice, maxPrice | none | Price bounds in euros. |
maxItems | 100 | Total listings across every search in the run, up to 50,000. |
proxyConfiguration | leave it alone | Optional, under Advanced. Only if you want the run to go out through a particular network of your own. |
Provinces on their own are not a search. Pair them with a term, a category or a URL, or the run comes back with just the sample row.
📤 What you get back
A real row from a run on 14 September 2026:
{
"listingId": "614581290",
"title": "sofá cama",
"description": "se vende sofá cama a estrenar con transporte gratis y garantía ",
"price": 545,
"priceText": "545 €",
"currency": "EUR",
"previousPrice": null,
"priceIncludesTaxes": null,
"sellerType": "private",
"sellerId": "239560870",
"sellerName": "MUEBLES OUTLET GRD ",
"categoryId": 486,
"categoryName": "Sillas sofás sillones",
"categorySlug": "sillas-sofas-y-sillones",
"sectionId": 30,
"sectionName": "Casa y Jardín",
"categoryPath": "Casa y Jardín > Muebles > Sillas sofás sillones",
"province": "Navarra",
"provinceId": 31,
"city": "Arguedas",
"cityId": 36089,
"region": "Navarra",
"latitude": null,
"longitude": null,
"publishedAt": "2026-09-13T13:24:28Z",
"updatedAt": "2026-09-13T13:24:28Z",
"transaction": "supply",
"isHighlighted": false,
"isNew": false,
"reserveStatus": "RELEASED",
"contactByPhone": false,
"contactByChat": true,
"attributes": { "itemCondition": "BRAND_NEW" },
"images": [
"https://images.milanuncios.com/api/v1/ma-ad-media-pro/images/66204d16-99b8-4c69-b4e9-1ae01217930f?rule=hw396_70",
"https://images.milanuncios.com/api/v1/ma-ad-media-pro/images/ee28db46-af9d-4000-a761-44c930483247?rule=hw396_70"
],
"imageCount": 2,
"url": "https://www.milanuncios.com/sillas-sofas-y-sillones/sofa-cama-614581290.htm",
"scrapedAt": "2026-09-14T05:45:45.026Z",
"searchUrl": null
}
| Field | What it is |
|---|---|
description | The full ad text, not a preview. |
sellerType | private or professional, taken from Milanuncios' own classification of the ad. |
categoryPath | The readable trail, with sectionName and categoryName split out for grouping. |
latitude, longitude | Usually null. Very few ads carry coordinates. province and city are the reliable location fields. |
contactByPhone, contactByChat | Flags saying how the seller accepts contact. No phone number is included. |
attributes | Milanuncios' raw per-category map, so a car ad and a sofa ad carry different keys. |
images | Photo URLs at 396 px, which is the size Milanuncios serves here. |
searchUrl | The pasted URL that produced this row, or null when it came from the form. |
🧾 Reading the output
| Row | How to spot it | Billed |
|---|---|---|
| A listing | No _sample or _diagnostic key on it | yes |
| The sample row | _sample: true and charged: false | no |
| A diagnostic | _diagnostic: true, charged: false and an errorCode | no |
Listing rows carry no charged field. The flag is only on the sample and diagnostic rows, to mark them as not real results.
| Code | What it means |
|---|---|
BAD_INPUT | A province, category or URL Milanuncios does not recognise. |
NO_RESULTS | That search matched nothing. |
BLOCKED | Milanuncios refused a page of results. |
BAD_RESPONSE | Milanuncios answered with something this run could not read. |
▶️ How to run it
1. Open Milanuncios Scraper and click Try for free. 2. Type your Spanish search into Search terms, or paste links into Milanuncios search URLs. 3. Open Narrow it down to set provinces, a category, the seller type or a price band. 4. Set Maximum listings under Limits. Start around 25 to see what the rows look like. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$1.00 per 1,000 listings. Flat on every Apify plan, with no volume tiers.
One billed row per listing delivered. The sample row is not billed, diagnostic rows are not billed, and an ad dropped because it sits outside your provinces never reaches the dataset and is not billed.
💡 What people use it for
- Used car pricing across provinces, using
attributesfor the per-model specs Milanuncios carries. - Property research in one region, where
categoryPathseparates sale from rental cleanly. - Building a dealer list by keeping rows where
sellerTypeisprofessional. - Watching what is new in Motor with
sortonnewestand a small cap, diffing onlistingId. - Reading demand instead of supply: switch
transactiontodemandfor what people are looking for.
🚧 What it does not do
- No phone numbers. The row says whether a seller accepts calls or chat, and nothing more.
- No coordinates worth relying on. They are almost always
null. Useprovinceandcity. - Photos come at 396 px. That is the size served here, and no larger version is available.
- About 8,300 listings per search is Milanuncios' ceiling, not ours. Add provinces, price bands
or sub-categories to get past it.
- Newest and oldest sorting only works in Motor. Elsewhere the run quietly uses most relevant.
- A pasted URL's own sort is ignored. Set the sort field to match your link.
- Rows arrive at the end. A run that times out delivers nothing, so keep big jobs split.
- Provinces alone will not start a search. Pair them with a term, a category or a URL.
🧭 Which classifieds scraper do you need?
| If you want | Use |
|---|---|
| Spanish classified ads from Milanuncios | This one |
| Homes in Spain, Italy and Portugal from Idealista | Idealista Scraper |
| Homes in Spain from Fotocasa | Fotocasa Scraper |
| Russian classified ads from Avito | Avito Listings Scraper |
| Brazilian classified ads from OLX | OLX Brazil Scraper |
❓ Questions people ask
Can I search in English? The term goes to Milanuncios as you typed it and its index is Spanish, so English returns very little. Province names have to be Spanish too, or use the INE code.
Why are there listings from a neighbouring province? There should not be. Milanuncios itself mixes them in, and they are dropped here before billing. If you see one, send the run ID.
How do I get more than 8,300 for one search? Split it. Several provinces, several price bands, or narrower categories, all in the same run.
Why did my newest-first sort not work? Outside Motor, Milanuncios returns nothing for that order, so the run falls back to most relevant. The log says when that happens.
Can I get wanted ads rather than things for sale? Yes. Set Offers or wanted ads to wanted.
Is this legal? These are public ads. They carry personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search term or URL you used and the run ID. The errorCode on the diagnostic row usually names the problem on its own.