
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape Milanuncios.com classified ads in Spain from search URLs, ad URLs or keywords with filters: price, attributes, km, year, seller name and type, location, photos and dates. Any category: cars, property, jobs, items.
Turn Milanuncios.com, one of Spain's biggest classifieds sites, into clean, structured data. Paste any search URL, or type keywords and pick a category, location and filters, and get the price, attributes (km, year, fuel, bedrooms, m² and more), seller name and type, location, every photo and the dates for each ad, in any category: cars, motorbikes, property, jobs, electronics, furniture and everything else. No Milanuncios account needed, and it costs $1.00 per 1,000 ads.
| Field | What it does |
|---|---|
startUrls | Milanuncios search pages (category, location, keywords, filters and sort kept, pages followed automatically) or single ad pages. |
searchQueries | Keywords, one search each. The filters below apply to every keyword. |
maxItems | Total ads to save. Default 20. 0 means no limit. |
category | A category name, URL slug or id (Coches, motos-de-segunda-mano, alquiler-de-pisos, 13). |
location | A province, autonomous community or town (Valencia, Andalucía, Pinto, Madrid). |
| Filters | minPrice, maxPrice, sellerType, adType (offers / wanted), sortBy, shippableOnly, brand, model, minYear, maxYear, minKm, maxKm, fuel, transmission, minBedrooms, maxBedrooms, minSurface, maxSurface. |
fetchDetails | Adds seller map position, postcode, member-since date, email-verified flag, avatar, favourites count and shipping carriers. |
maxItemsPerSearch | Optional cap for each URL or keyword. |
{
"category": "Coches",
"location": "Madrid",
"brand": "SEAT",
"minYear": 2018,
"maxKm": 120000,
"fuel": ["gasoline", "hybrid"],
"sellerType": "private",
"sortBy": "cheapest",
"maxItems": 200
}
One row per ad. Fields that do not apply to the ad (for example km on a sofa) are null.
| Field | Description |
|---|---|
id, url, title, description | The ad and its text. |
price, priceText, financedPrice, previousPrice, priceDropText, priceIncludesTaxes | Price in euros, the price as shown, the financed price for dealer cars, and any price drop. |
categoryId, categoryName, categorySlug, categoryPath | The ad's category and its full path. |
sellerType, sellerName, sellerId | private or professional, the seller's public name and id. |
transaction | offer or wanted. |
city, cityId, province, provinceId, region, latitude, longitude | Location (coordinates when the ad or seller shares them). |
km, year, fuel, transmission, horsepower, doors, seats, color, warranty, environmentalLabel, engineCc | Vehicle attributes. |
bedrooms, bathrooms, surfaceM2, pricePerM2, floor, energyCertificate, heating, hotWater | Property attributes. |
itemCondition, attributes, extras | Item condition, every attribute as shown on the site, and extras such as furnished or lift. |
photos, photoCount, thumbnail | Full-size photo URLs. |
publishedAt, updatedAt, sortDate | Dates (UTC). |
isHighlighted, isNew, isCertified, reserveStatus, isShippable, shippingType | Ad flags. |
contactPhone, contactChat, contactForm | Which contact options the seller offers. |
sellerLatitude, sellerLongitude, sellerZipCode, sellerCity, sellerProvince, sellerMemberSince, sellerEmailVerified, sellerAvatar, favorites, shippingCarriers | With Add seller details on. |
{
"id": "619978062",
"url": "https://www.milanuncios.com/fiat-de-segunda-mano/fiat-tipo-619978062.htm",
"title": "Fiat - Tipo",
"price": 10900,
"priceText": "10.900 €",
"currency": "EUR",
"categoryName": "Fiat",
"categoryPath": ["Motor", "Coches", "Fiat"],
"sellerType": "private",
"sellerName": "Laura G.",
"transaction": "offer",
"city": "Madrid",
"province": "Madrid",
"region": "Madrid",
"km": 50000,
"year": 2020,
"fuel": "diesel",
"transmission": "manual",
"horsepower": 95,
"doors": 5,
"color": "rojo",
"environmentalLabel": "C",
"attributes": { "kilometers": "50.000 kms", "year": "2020", "fuel": "diesel", "hp": "95 CV", "seats": "5 plazas" },
"photos": ["https://images.milanuncios.com/api/v1/ma-ad-media-pro/images/13f66773-692a-448f-9534-7db3cf21b71b"],
"photoCount": 9,
"publishedAt": "2026-10-15T23:50:04Z",
"isHighlighted": false,
"reserveStatus": "RELEASED",
"contactPhone": true,
"sellerZipCode": "28030",
"sellerMemberSince": "2017-05-02T10:11:12Z",
"favorites": 4
}
You pay $1.00 per 1,000 ads saved ($0.001 per ad), plus a small amount of platform usage (compute and datacenter proxy), which is a few cents for thousands of ads. 1,000 ads ≈ $1.01 in total. Seller details are included at no extra charge. Empty searches and errors cost nothing.
Is it legal to scrape Milanuncios? The actor collects only publicly visible ad data, the same as any visitor sees. You are responsible for how you use it: respect personal-data rules (GDPR) and Milanuncios' terms, especially for seller names.
Do I need a Milanuncios account or my own proxy? No. No login or cookies are used, and the built-in datacenter proxy works out of the box. If datacenter addresses are ever refused, the run switches to Spanish residential addresses by itself.
How many ads can I get? Milanuncios pages through about 8,200 ads per search. For bigger sets, split the search by province, price range or category; the run tells you when a search has more ads than that.
Why is a field empty? Ads only carry the attributes that fit their category and that the seller filled in. Coordinates appear when the ad or seller shares them; turn on Add seller details for the seller's position and postcode.
Can I schedule it or use the API? Yes. Schedule a run (for example hourly with Sort by: Newest first) and read the dataset through the API, or connect it to Make, Zapier or n8n.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalMilanuncios URLs
Search result pages (any category, location, keyword, filters and sort as you set them on milanuncios.com) or single ad pages. Example: https://www.milanuncios.com/coches-de-segunda-mano-en-madrid/?desde=3000&hasta=12000
searchQueriesarrayOptionalSearch keywords
Keywords to search for, one search per keyword (e.g. 'iphone 15', 'bicicleta eléctrica', 'golf gti'). The filters below apply to every keyword.
maxItemsintegerOptionaldefault 20Max ads
Maximum number of ads to save in total. 0 = no limit.
categorystringOptionalCategory
Category name, URL slug or id, for example 'Coches', 'motos-de-segunda-mano', 'alquiler-de-pisos', 'Móviles' or 13. Leave empty for all categories.
locationstringOptionalLocation
Province (Madrid, Barcelona, Valencia...), autonomous community (Andalucía, Cataluña...) or town ('Pinto' or 'Pinto, Madrid'). Leave empty for all of Spain.
minPriceintegerOptionalMin price (€)
Only ads priced at or above this amount.
maxPriceintegerOptionalMax price (€)
Only ads priced at or below this amount.
sellerTypeenumOptionalSeller type
Private sellers, professionals (dealers, agencies, shops) or both.
adTypeenumOptionalAd type
Offers (things for sale or rent, the site default), wanted ads, or both.
sortByenumOptionalSort by
Order of the results. Year and kilometre sorts apply to vehicles.
shippableOnlybooleanOptionalShippable only
Only ads with Milanuncios shipping.
brandstringOptionalVehicle make
Car or motorbike make, e.g. BMW, SEAT, Toyota. Use with the Coches or Motos category.
modelstringOptionalVehicle model
Model name as Milanuncios writes it, e.g. 'SERIE 3', 'IBIZA', 'GOLF'. Needs a make.
minYearintegerOptionalMin year
Vehicles from this year or newer.
maxYearintegerOptionalMax year
Vehicles from this year or older.
minKmintegerOptionalMin kilometres
Vehicles with at least this many km.
maxKmintegerOptionalMax kilometres
Vehicles with at most this many km.
fuelarrayOptionalFuel
One or more fuel types.
transmissionenumOptionalGearbox
Manual or automatic gearbox.
minBedroomsintegerOptionalMin bedrooms
Property ads with at least this many bedrooms.
maxBedroomsintegerOptionalMax bedrooms
Property ads with at most this many bedrooms.
minSurfaceintegerOptionalMin surface (m²)
Property ads with at least this surface.
maxSurfaceintegerOptionalMax surface (m²)
Property ads with at most this surface.
fetchDetailsbooleanOptionaldefault falseAdd seller details
One extra light request per ad adds the seller's map position and postcode, member-since date, email-verified flag, avatar, the ad's favourites count and shipping carriers. Same price per ad.
maxItemsPerSearchintegerOptionalMax ads per search
Cap for each URL or keyword, so one big search does not use the whole budget. 0 = no cap.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter addresses are used first; if Milanuncios refuses them, the run switches to Spanish residential addresses.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | |
| url | string | null | |
| title | string | null | |
| description | string | null | |
| priceText | string | null | |
| currency | string | null | |
| categoryName | string | null | |
| categorySlug | string | null | |
| sellerType | string | null | |
| sellerName | string | null | |
| sellerId | string | null | |
| transaction | string | null | |
| city | string | null | |
| province | string | null | |
| region | string | null | |
| fuel | string | null | |
| transmission | string | null | |
| color | string | null | |
| warranty | string | null | |
| environmentalLabel | string | null | |
| floor | string | null | |
| energyCertificate | string | null | |
| heating | string | null | |
| hotWater | string | null | |
| itemCondition | string | null | |
| thumbnail | string | null | |
| publishedAt | string | null | |
| updatedAt | string | null | |
| sortDate | string | null | |
| reserveStatus | string | null | |
| shippingType | string | null | |
| origin | string | null | |
| scrapedAt | string | null | |
| priceDropText | string | null | |
| sellerZipCode | string | null | |
| sellerCity | string | null | |
| sellerProvince | string | null | |
| sellerMemberSince | string | null | |
| sellerAvatar | string | null | |
| price | number | null | |
| financedPrice | number | null | |
| previousPrice | number | null | |
| categoryId | number | null | |
| cityId | number | null | |
| provinceId | number | null | |
| latitude | number | null | |
| longitude | number | null | |
| km | number | null | |
| year | number | null | |
| horsepower | number | null | |
| doors | number | null | |
| seats | number | null | |
| engineCc | number | null | |
| bedrooms | number | null | |
| bathrooms | number | null | |
| surfaceM2 | number | null | |
| pricePerM2 | number | null | |
| photoCount | number | null | |
| sellerLatitude | number | null | |
| sellerLongitude | number | null | |
| favorites | number | null | |
| priceIncludesTaxes | boolean | null | |
| isHighlighted | boolean | null | |
| isNew | boolean | null | |
| isCertified | boolean | null | |
| isShippable | boolean | null | |
| contactPhone | boolean | null | |
| contactChat | boolean | null | |
| contactForm | boolean | null | |
| sellerEmailVerified | boolean | null | |
| categoryPath | array | null | |
| extras | array | null | |
| photos | array | null | |
| shippingCarriers | array | null | |
| attributes | object | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One Milanuncios ad saved to the dataset | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/milanuncios-scraper').call({
"startUrls": [
{
"url": "https://www.milanuncios.com/coches-de-segunda-mano-en-madrid/"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/milanuncios-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/milanuncios-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Keyword search with a minimum price and private sellers only.
Ads from a Milanuncios URL with full details.
Car ads filtered by brand and model year.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.