Milanuncios Scraper API 🇪🇸 Condition & Price Drops avatar

Milanuncios Scraper API 🇪🇸 Condition & Price Drops

Pricing

from $1.00 / 1,000 ads

Go to Apify Store
Milanuncios Scraper API 🇪🇸 Condition & Price Drops

Milanuncios Scraper API 🇪🇸 Condition & Price Drops

Searches Milanuncios by keyword across 17 categories — motor, property, fashion, pets and more — filtering by price, condition, seller type and province. For phones, also parses storage and battery health from the description. Reads the page's own embedded JSON, no browser.

Pricing

from $1.00 / 1,000 ads

Rating

0.0

(0)

Developer

reventadata

reventadata

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Unofficial. This Actor is not affiliated with, authorised by, endorsed by, or in any way officially connected to Milanuncios. "Milanuncios" 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.

Milanuncios Scraper searches Milanuncios, Spain's biggest classifieds site, and returns priced listings with structured condition tags, storage and battery health parsed out of the text, and duplicate-safe keyword matching.

What does it do?

Milanuncios server-renders its result pages, but the listings themselves are not in the markup — they live in one inline JSON blob. This Actor reads that blob directly with a browser-impersonating HTTP client, pages at the site's own 100-per-page ceiling, applies price, seller-type, ad-type, category and province filters server-side where the site supports them, and applies condition, storage, battery health and damage-word filters client-side. Unlike a peer-to-peer marketplace where "condition" is whatever the seller typed, Milanuncios attaches a structured condition tag to most ads — estado del producto — picked from a form field, not written as free text.

Why use it?

  • Structured condition, not a seller's prose. Filter on estado del producto directly.
  • 100 results per request instead of 41. Cuts a 1,248-ad sweep from 31 requests to 13.
  • Battery health and storage, parsed from free text, the same way the sibling Wallapop Actor does it, so results are comparable across both sites.
  • Duplicate-safe multi-keyword search. An ad is only marked "seen" once it is kept, so a near-miss under one keyword can still be picked up by a broader one later in the run.

How to use it

  1. Put one or more search terms in searchQueries. There is no default.
  2. Optionally narrow with category, province, a price range, sellerType, adType, conditions, minStorageGb or minBatteryHealth.
  3. Run it. Results land in the dataset.

Input

FieldTypeMeaning
searchQueriesarrayOne search per keyword. Required, no default.
categorystringOptional category slug (telefonia, informatica-segunda-mano, motor…). Validated; an unknown slug fails the run. Combines with province, not exclusive with it.
provincestringOptional, picked from a dropdown of all 52 provinces (50 + Ceuta + Melilla). Combines with category, not exclusive with it.
minPrice / maxPriceintegerOptional. Omitted from the request entirely when left empty — never defaulted.
sellerTypestringany | private | professional.
adTypestringany | offer | wanted.
onlyShippablebooleanOnly listings the seller will ship. Off by default.
onlyPriceDroppedbooleanOnly listings currently marked down. Off by default.
conditionsarraySubset of sin estrenar, prácticamente nuevo, en buen estado, aceptable. Empty means any.
minStorageGbintegerParsed from title and description; TB is converted, so 1TB counts as 1024. Rejects ads that never state storage at all, not just ads below the floor.
minBatteryHealthintegerParsed from the description. Only meaningful for phones. Rejects ads that never state a battery figure at all, not just ads below the floor.
excludeDamagedbooleanDrops listings matching known damage wording. Default on.
requireKeywordMatchbooleanDrop items whose title lacks the query. Default on.
sortBystringrelevance | date | baratos | caros. Order only — changes nothing about which ads exist.
maxItemsintegerHard cap on rows pushed. Default 1000.
proxyConfigurationobjectOptional. Sustained scraping earns the requesting IP a silent block; a rotating proxy is what keeps a large run alive.
{
"searchQueries": ["iphone 15"],
"category": "telefonia",
"sellerType": "private",
"conditions": ["prácticamente nuevo", "en buen estado"],
"minPrice": 200,
"maxPrice": 400,
"maxItems": 200
}

Output

{
"id": "600000001",
"title": "Iphone 15",
"description": "Iphone 15 Negro\nLibre para cualquier compañía",
"url": "https://www.milanuncios.com/telefonos-inalambricos/iphone-15-600000001.htm",
"imageUrls": ["https://images.milanuncios.com/api/v1/abc123"],
"price": 440,
"currency": "EUR",
"previousPrice": 470,
"priceDropPercent": 6,
"condition": "en buen estado",
"color": "negro",
"sellerType": "private",
"adType": "offer",
"sellerId": null,
"sellerName": null,
"city": "Las Palmas de Gran Canaria",
"province": "Las Palmas",
"region": "Canarias",
"category": "Teléfonos inalámbricos",
"categoryPath": "telefonia/telefonos-inalambricos",
"publishDate": "2026-08-15T18:15:55Z",
"updateDate": "2026-08-21T08:18:09Z",
"isHighlighted": true,
"isReserved": false,
"storageGb": 128,
"batteryHealth": null,
"matchedKeyword": "iphone 15"
}
FieldMeaning
price / previousPrice / priceDropPercentEuros and a parsed percentage. price is null, never 0, when the ad has no comparable price at all — roughly 45 in 1,248 on a sampled search.
condition / colorThe ad's own structured tags — facts, not seller claims. null when a tag is absent.
isReservedA real boolean — the site's own field is a string enum, derived here into true/false.
storageGb / batteryHealthParsed from free text, since Milanuncios carries neither as a structured field. null when not stated.

Why this can undercut the competition

Existing Milanuncios Actors charge $1.25 to $4.99 per 1,000 listings. This one reads the page's own embedded JSON at 100 results per request, so 1,000 listings is 10 requests, not 10 browser sessions. Measured platform cost is about $0.02 per 1,000 listings. The price is $1 per 1,000.

Notes and limits

  • Category and province combine into one path segment, not two, and four province slugs use an underscore instead of a hyphen. An invalid slug silently redirects to the unfiltered results rather than erroring, so this Actor validates before requesting.
  • Several query parameters look like they work and do nothing, including the full-word vendedor=, precio_desde, envio=si, orden=fecha, categoryIds and categoria — all return a plausible 200 with an unchanged result count, and this Actor never sends them.
  • No API key needed. Milanuncios answers Apify's datacenter IPs with HTTP 405, so this Actor routes its fetches through a commercial unblocking service that the developer pays for. Nothing to configure, no second account to open, and no proxy cost added to your run.
  • Seller identity is withheld for private sellers. sellerName and sellerId are returned only when sellerType is professional — a shop or dealer. For private individuals both come back null. sellerType itself is always returned, so you can still tell dealer stock from private stock.
  • Ad descriptions are reproduced exactly as the seller wrote them and are not filtered. Sellers sometimes put a phone number or messaging handle in that free text. Handle the description field accordingly.
  • Reads the same public page a browser does. See the disclaimer at the top.