# Milanuncios Scraper (`parsebird/milanuncios-scraper`) Actor

Scrape Milanuncios.com classified listings — cars, real estate, jobs, electronics, phones and more. Filter by keyword, category, price, seller type, and shipping. Export full listing, seller, and shop data as JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/milanuncios-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Milanuncios Scraper

Scrape classified listings from [Milanuncios.com](https://www.milanuncios.com) — Spain's largest second-hand marketplace for cars, real estate, jobs, electronics, phones, fashion and more. Search by keyword and category, filter by price and seller type, and export full listing and seller data as JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #FE5000;padding:12px 16px;font-weight:600">
Search any keyword or one of nine top categories, filter by price range, seller type (professional / private), transaction type, and shipping — and get the complete listing for every result: full description, typed attributes, all photos, seller profile with rating, and engagement stats.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Actor.

```
Actor: parsebird/milanuncios-scraper (Apify). Scrapes Milanuncios.com (Spanish classifieds). Call with ApifyClient.
Input: { "text": "bmw x5", "category": "1", "sort": "cheap", "sellerType": "professional",
         "transaction": "supply", "priceFrom": 15000, "priceTo": 40000, "isShippable": false,
         "fetchDetails": true, "maxResults": 200 }
`text` and/or `category` required. category ids: 1 Motor, 32 Inmobiliaria, 3 Empleo, 2 Informática, 83 Telefonía,
39 Juegos, 30 Casa y Jardín, 43 Moda, 31 Deportes; "" = all. sort: relevance|newest|cheap|expensive.
sellerType: professional|private. transaction: supply|demand. fetchDetails=false is a faster search-only mode.
Output: one item per listing — id, title, description, url, listingUrl, price{value,label,includeTaxes}, previousPrice,
location{city,province,region}, categories[], category, attributes{name:{raw,formatted}}, photos[], photosCount,
authorId, authorName, author{id,userName,score,reviewCount,location{lat,long,city,province,zipCode},avatarSrc},
stats{views,favorites,shares,listings}, type, sellerType, transaction, shippingType, contactMethods,
publicationDate, updateDate, sortDate, scrapedAt.
Requires Apify Proxy RESIDENTIAL group, country ES (the default). Pricing: pay-per-result.
```

### What does Milanuncios Scraper do?

Milanuncios has no public API and blocks automated access. This Actor renders the site like a real browser from a Spanish residential IP and returns clean, structured data.

- 🚗 **Every category** — Motor, Inmobiliaria, Empleo, Informática, Telefonía, Juegos, Casa y Jardín, Moda, Deportes, or all at once.
- 🔎 **Keyword + filter search** — price range, professional vs. private sellers, for-sale vs. wanted, shipping availability, and four sort orders.
- 📋 **Full listing detail** — description, all photos at full resolution, and typed attributes (kilometres, year, fuel, transmission, hp, doors, warranty for cars; condition, colour for phones; and so on).
- 🧑 **Seller data** — seller type, rating (score and review count), and location with latitude/longitude.
- 📈 **Engagement stats** — favourites, shares, and the seller's total listing count.
- ⚡ **Fast search-only mode** — set `fetchDetails: false` to skip the per-listing pages when you only need the search summary.

### Input parameters

`text` and/or `category` is required.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| text | string | — | Search query, e.g. `"iphone 15"`, `"bmw x5"`. |
| category | string | `""` (all) | Category id: `1` Motor, `32` Inmobiliaria, `3` Empleo, `2` Informática, `83` Telefonía, `39` Juegos, `30` Casa y Jardín, `43` Moda, `31` Deportes. |
| sort | string | `relevance` | `relevance`, `newest`, `cheap`, `expensive`. |
| sellerType | string | — | `professional` or `private`. |
| transaction | string | — | `supply` (for sale) or `demand` (wanted). |
| priceFrom | integer | — | Minimum price in EUR. |
| priceTo | integer | — | Maximum price in EUR. |
| isShippable | boolean | false | Only listings that offer shipping. |
| fetchDetails | boolean | true | Open each listing for full detail. Turn off for a faster, lighter run. |
| maxResults | integer | 100 | Maximum listings to extract (1–2000). |
| proxyConfiguration | object | Apify Proxy RESIDENTIAL / ES | Required. Milanuncios blocks non-residential traffic. |

#### Input examples

**Basic search**

```json
{ "text": "iphone 15", "maxResults": 100 }
```

**Category filter**

```json
{ "category": "1", "sort": "newest", "maxResults": 500 }
```

**Advanced filtering**

```json
{ "text": "bmw x5", "category": "1", "sellerType": "professional", "priceFrom": 15000, "priceTo": 40000, "sort": "cheap", "maxResults": 200 }
```

### Output example

```json
{
  "id": "578414171",
  "title": "BMW - XM",
  "description": "Bienvenido a gtcars premium ...",
  "url": "/bmw-de-segunda-mano/bmw-xm-578414171.htm",
  "listingUrl": "https://www.milanuncios.com/bmw-de-segunda-mano/bmw-xm-578414171.htm",
  "price": { "value": 124900, "label": "124.900 €", "includeTaxes": true },
  "previousPrice": { "value": 129900, "label": "129.900 €" },
  "location": {
    "city": { "id": 54264, "name": "San Miguel de Abona", "slug": "san-miguel-de-abona" },
    "province": { "id": 38, "name": "Tenerife", "slug": "tenerife" },
    "region": { "id": 62, "name": "Canarias", "slug": "canarias" }
  },
  "categories": [
    { "id": 1, "name": "Motor", "slug": "motor" },
    { "id": 13, "name": "Coches", "slug": "coches-de-segunda-mano" },
    { "id": 805, "name": "BMW", "slug": "bmw-de-segunda-mano" }
  ],
  "attributes": {
    "kilometers": { "raw": "25800", "formatted": "25.800 kms" },
    "year": { "raw": "2023", "formatted": "2023" },
    "fuel": { "raw": "other", "formatted": "otro" },
    "transmission": { "raw": "automatic", "formatted": "automático" },
    "hp": { "raw": "653", "formatted": "653 CV" }
  },
  "authorId": "207754224",
  "authorName": "GT Cars Premium Tenerife",
  "author": {
    "id": "207754224",
    "userName": "GT Cars Premium Tenerife",
    "score": 4.6,
    "reviewCount": 38,
    "isEmailVerified": true,
    "avatarSrc": "https://images.milanuncios.com/api/v1/ma-user-profile-pro/images/...",
    "location": { "city": "San Miguel de Abona", "province": "Tenerife", "zipCode": "38620", "latitude": 28.024078, "longitude": -16.624159 }
  },
  "photos": ["https://images.milanuncios.com/api/v1/ma-ad-media-pro/images/327b7ea8-...", "..."],
  "photosCount": 18,
  "stats": { "favorites": 0, "shares": 1, "listings": 75 },
  "publicationDate": "2026-01-28T12:05:37Z",
  "updateDate": "2026-02-02T09:06:33Z",
  "sortDate": "2026-02-02T10:04:53Z",
  "type": "professional",
  "sellerType": "PROFESSIONAL",
  "transaction": "supply",
  "shippingType": "maexpress",
  "contactMethods": { "chat": false, "form": true, "phone": true },
  "scrapedAt": "2026-02-02T09:52:28.762592+00:00"
}
```

Fields present depend on the category and on what the seller filled in. Vehicle listings carry vehicle attributes, phone listings carry phone attributes, and so on.

### Use cases

- **Price research & arbitrage** — track asking prices for a car model, phone, or property type across Spain.
- **Dealer intelligence** — map professional sellers, their rating, inventory size, and locations.
- **Market monitoring** — schedule the Actor and watch new listings for a saved search.
- **Lead generation** — collect professional-seller names, ratings, and locations for outreach.
- **Data sets** — build a structured second-hand-market dataset for analysis or ML.

### How it works

1. The Actor builds a Milanuncios search URL from your `text`, `category`, and filters.
2. It loads each results page from a Spanish residential IP, passing the site's anti-bot check, and reads the embedded listing data.
3. It paginates until `maxResults` is reached.
4. When `fetchDetails` is on, it opens each listing page and merges the full description, seller profile, stats, photos, and attributes.
5. Each listing is pushed to the dataset. Export as JSON, CSV, Excel, XML, or RSS, or wire it into Make, Zapier, Google Sheets, and Slack.

### Using the Actor via API

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("parsebird/milanuncios-scraper").call(run_input={
    "text": "bmw x5",
    "category": "1",
    "priceFrom": 15000,
    "priceTo": 40000,
    "sort": "cheap",
    "maxResults": 200,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "—", item.get("price"))
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/milanuncios-scraper').call({
    category: '32',
    sort: 'newest',
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

The Actor runs on the [Apify platform](https://apify.com): schedule it, call it over the REST API, trigger webhooks, and export to JSON, CSV, Excel, XML, or RSS.

### Pricing

This Actor uses the **pay-per-result** pricing model — you are charged per listing, regardless of compute time.

| Plan | Price per listing | Price per 1,000 listings |
|------|-------------------|--------------------------|
| Free | $0.0012 | **$1.20** |
| Bronze | $0.0011 | **$1.10** |
| Silver | $0.0010 | **$1.00** |
| Gold | $0.0009 | **$0.90** |

Scraping 1,000 listings on the Free plan costs about $1.20.

### FAQ

**Do I need a proxy?**
Yes. Milanuncios blocks datacenter traffic, so the Actor requires Apify Proxy with the RESIDENTIAL group and country ES — this is the default; just keep Proxy Configuration enabled.

**How do I find a category id?**
Use the table above. Set `category: ""` to search every category at once.

**What is `fetchDetails`?**
When on (the default), the Actor opens each listing for the full description, seller profile, stats, and every photo. When off, it returns only the search-results summary — faster and cheaper.

**Why are some fields missing on a listing?**
Milanuncios only stores what the seller entered. Some listings have no price, no attributes, or no photos, and only sellers with reviews carry a `score` / `reviewCount`.

**How many listings can I get per run?**
Up to 2,000. For a bigger crawl, split the work by category, price band, or region and schedule multiple runs.

**Can I schedule recurring runs?**
Yes — use Apify's [scheduler](https://docs.apify.com/platform/schedules) and route new listings to a webhook or integration.

### Related Actors

- [Wallapop Scraper](https://apify.com/parsebird) and other marketplace scrapers on the [ParseBird publisher page](https://apify.com/parsebird).
- [Fotocasa Scraper](https://apify.com/parsebird/fotocasa-scraper) — Spanish real estate listings.
- [InfoJobs / Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) — job listings.

### Legal and compliance

This Actor collects only publicly available listing and seller information from Milanuncios — data any visitor can see without logging in. It does not access private data or defeat authentication. You are responsible for using the output in line with Milanuncios' terms and applicable law, including the GDPR where personal data (seller names, locations, contact routes) is involved. Do not use the data to spam sellers. Seek legal advice before large-scale or commercial redistribution.

# Actor input Schema

## `text` (type: `string`):

Keyword to search for, e.g. "iphone 15", "bmw x5". Optional if a category is set.

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

Restrict the search to one Milanuncios top category.

## `sort` (type: `string`):

Order the results.

## `sellerType` (type: `string`):

Keep only professional or only private sellers.

## `transaction` (type: `string`):

`supply` = items for sale, `demand` = wanted ads.

## `priceFrom` (type: `integer`):

Only listings priced at or above this amount.

## `priceTo` (type: `integer`):

Only listings priced at or below this amount.

## `isShippable` (type: `boolean`):

Only include listings that offer shipping.

## `fetchDetails` (type: `boolean`):

Open each listing to collect the full description, seller profile, stats, photos and attributes. Turn off for a faster, lighter search-only run.

## `maxResults` (type: `integer`):

Maximum listings to extract. Start low for a quick test.

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

Milanuncios uses anti-bot protection — a residential proxy in Spain is required. The default is Apify Proxy, RESIDENTIAL group, country ES.

## Actor input object example

```json
{
  "text": "iphone 15",
  "category": "",
  "sort": "relevance",
  "sellerType": "",
  "transaction": "",
  "isShippable": false,
  "fetchDetails": true,
  "maxResults": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "text": "iphone 15",
    "maxResults": 40,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ES"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/milanuncios-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 = {
    "text": "iphone 15",
    "maxResults": 40,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ES",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/milanuncios-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 '{
  "text": "iphone 15",
  "maxResults": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}' |
apify call parsebird/milanuncios-scraper --silent --output-dataset

```

## MCP server setup

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