# Mascus Scraper — Global Heavy Equipment Marketplace (`rastriq/mascus-scraper`) Actor

Scrape used machinery listings from Mascus, the world's largest marketplace for heavy equipment. Extract price, make, model, year, hours, location, dealer info, and specs across construction, agriculture, forestry, and material handling categories. Covers 50+ countries.

- **URL**: https://apify.com/rastriq/mascus-scraper.md
- **Developed by:** [Rastriq — Structured data from the world](https://apify.com/rastriq) (community)
- **Categories:** E-commerce, Other
- **Features:** Limited permissions
- **Stats:** 15 total users, 2 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.90 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Mascus Scraper — Global Heavy Equipment & Machinery Data

![Heavy equipment listings normalised to comparable rows: price converted to EUR, year, country and category](https://www.rastriq.es/readme/equip.png)

Extract structured listings from Mascus, the largest international marketplace for used heavy equipment, agricultural machinery and trucks. **Mascus Scraper** returns clean, normalized records with price, make, model, year, hours, location and seller details — across six equipment categories and dozens of countries.

### 🔎 What is Mascus Scraper?

Mascus lists hundreds of thousands of machines from dealers and private sellers across Europe, North America and beyond. The catalogue is spread over six top-level categories and hundreds of machine types, each paginated, each with its own filters. Collecting it by hand is impractical, and the site's own search does not give you a comparable table.

**Mascus Scraper** turns that catalogue into a dataset. It walks the category tree, extracts every listing it finds, normalizes the fields into a consistent schema and hands you back one row per machine — with prices converted to euros alongside the original currency, so listings from Poland, Sweden and Spain can sit in the same comparison.

Typical uses:

- 📊 **Price benchmarking** — what a 2018 Caterpillar wheel loader with 11,000 hours actually sells for, by country
- 🏗️ **Market sizing** — how much inventory exists in a given category and region
- 🔄 **Fleet valuation** — residual value curves built from real asking prices
- 🛒 **Sourcing** — finding machines matching a spec across every dealer at once

### 📦 What data does Mascus Scraper extract?

Each result is one listing, with 37 fields. The core ones:

| Field | Description |
|---|---|
| 🏷️ `marca` · `modelo` | Manufacturer and model, as listed |
| 📅 `anio` | Year of manufacture |
| 💶 `valor` · `moneda` | Asking price in the listing's own currency |
| 💱 `precio_eur` | Same price converted to euros — makes cross-border comparison possible |
| ⏱️ `tiempo_uso` | Hours or kilometres of use |
| 📍 `ubicacion` · `pais` | City/region and ISO country code |
| 🏢 `compania` · `telefono` | Seller name and contact number as published |
| 🗂️ `categoria` · `tipo` | Category and machine type |
| 🔗 `url` · `ref_anuncio` | Listing URL and stable identifier |
| 🖼️ `imagenes` · `num_imagenes` | Image URLs and how many the listing has |
| 🔨 `es_subasta` · `es_alquiler` | Whether the listing is an auction or a rental |
| 📆 `fecha_publicacion` | When the listing was published |

### 🚀 How to use Mascus Scraper

1. **Open the Actor** and leave `data_freshness` on `preloaded` for an instant result from the current monthly snapshot, or switch it to `live` to scrape Mascus in real time.
2. **Pick your categories.** Five are enabled by default: construction, agriculture, forestry, material handling and groundcare.
3. **Enable `cat_transport` if you want trucks and trailers.** It is off by default — see the warning below.
4. **Set `maxItems`.** Leave it at `0` for the whole catalogue, or cap it while you test.
5. **Run it**, then download the dataset as JSON, CSV, XLSX or XML.

> ⚠️ **The one setting people miss.** `cat_transport` defaults to `false`. On the August 2026 catalogue that single flag is the difference between 405,744 listings and 335,849 — **69,895 records, 17.2% of the total, silently absent**. The run still ends in `SUCCEEDED`. If you want transport, switch it on explicitly.

### ⚙️ Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `data_freshness` | string | `preloaded` | `preloaded` serves the current snapshot instantly; `live` scrapes Mascus now |
| `cat_construction` | boolean | `true` | Excavators, loaders, dozers, cranes |
| `cat_agriculture` | boolean | `true` | Tractors, harvesters, implements |
| `cat_forestry` | boolean | `true` | Forwarders, harvesters, chippers |
| `cat_material_handling` | boolean | `true` | Forklifts, telehandlers, aerial platforms |
| `cat_groundcare` | boolean | `true` | Mowers, turf and municipal equipment |
| `cat_transport` | boolean | `false` | Trucks, trailers, vans — **off by default** |
| `catalogs` | array | `[]` | Restrict to specific catalogue paths |
| `maxItems` | integer | `0` | `0` means no limit |
| `maxPages` | integer | `9999` | Page cap per category |
| `delaySeconds` | number | `2.0` | Politeness delay between requests |

### 📄 Output example

```json
{
  "source": "mascus",
  "item_id": "6vdxhx8l",
  "categoria": "construction",
  "tipo": "frontshovelexcavators",
  "marca": "Terex",
  "modelo": "TRACKED UNDERCARRIAGES FOR EXCAVATORS",
  "anio": "2020",
  "valor": "140000",
  "moneda": "PLN",
  "precio_eur": "32508",
  "ubicacion": "Wojkowice, śląskie",
  "pais": "PL",
  "compania": "STELMAX",
  "telefono": "+48 509487129",
  "fecha_publicacion": "2026-05-03T07:36:00",
  "num_imagenes": 7,
  "es_subasta": false,
  "es_alquiler": false,
  "url": "https://www.mascus.com/construction/front-shovel-excavators/terex-tracked-undercarriages-for-excavators/6vdxhx8l.html"
}
```

### 💰 How much does it cost to use Mascus Scraper?

**Mascus Scraper** uses pay-per-event pricing: **$0.0019 per result**, plus a small Actor-start charge.

| What you pull | Approximate cost |
|---|---:|
| 1,000 listings — a test slice | $1.90 |
| 50,000 listings — one large category | $95 |
| The full catalogue (~400,000) | ~$760 |

> 💡 **Run a capped test first.** Set `maxItems` to 500, check the fields you care about are populated for your categories, then scale up. Note that the full catalogue exceeds a $200 per-run spend cap — raise the cap before pulling everything, or the run will stop mid-way and still report success.

**Deduplication note:** running the Actor returns 397,240 unique listings, because it deduplicates as it serves. Downloading the underlying dataset by direct link gives 405,744 rows including 8,504 duplicates. Apply `DISTINCT` on `item_id` if you take the direct route.

### Copy to your AI assistant

```
rastriq/mascus-scraper on Apify. Used heavy machinery from Mascus across 40+ markets, with currency converted to EUR and category mapped so comparables hold across borders. Call ApifyClient("TOKEN").actor("rastriq/mascus-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Full spec: GET https://api.apify.com/v2/acts/rastriq~mascus-scraper/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations
```

### About the data

This actor is part of Rastriq's heavy equipment coverage. See the normalised output fields, the full source list and the use cases behind it: [used machinery market data](https://www.rastriq.es/en/heavy-equipment/#campos).

### 🔗 Related Actors

Part of the Rastriq heavy-equipment portfolio — the same normalized schema across all of them, so one integration reads any of them:

- [MachineryTrader Scraper](https://apify.com/rastriq/machinerytrader-discovery) — the US market
- [MachineryZone Scraper](https://apify.com/rastriq/machineryzone-scraper) — France and southern Europe
- [Machineseeker Scraper](https://apify.com/rastriq/machineseeker-scraper) — the German-speaking market
- [Ritchie Bros Scraper](https://apify.com/rastriq/rbauction-scraper) — auction results with hammer prices
- [Truck1 Scraper](https://apify.com/rastriq/truck1-scraper) — European commercial vehicles

### ❓ FAQ

**Is scraping Mascus legal?**
Mascus Scraper collects publicly visible listing data — no login, no paywall, no personal accounts. It respects `robots.txt` and rate-limits itself. Seller phone numbers appear because sellers publish them on the listing as business contact details; if your use case falls under GDPR, review your own basis for processing them before you store them.

**How fresh is the data?**
In `preloaded` mode you get the current monthly snapshot instantly. In `live` mode you get the marketplace as it is right now, at the cost of a longer run.

**Why are some fields empty?**
Because the listing left them empty. Mascus does not require sellers to fill in hours, serial number or engine data, so coverage varies by category — construction listings are richer than groundcare.

**Can I get only one country or one manufacturer?**
Not through a dedicated input yet. Pull the categories you need and filter on `pais` or `marca` afterwards.

**Something looks wrong.** Open an issue on the Actor page. Please include the run ID.

# Changelog

This Actor's version history is a separate document: https://apify.com/rastriq/mascus-scraper/changelog.md

# Actor input Schema

## `data_freshness` (type: `string`):

Preloaded: returns the last monthly snapshot in seconds. Live: scrapes Mascus.com in real time.

## `cat_construction` (type: `boolean`):

Excavadoras, grúas, compactadoras, hormigoneras... (~240K listings)

## `cat_agriculture` (type: `boolean`):

Tractores, cosechadoras, remolques agrícolas... (~78K listings)

## `cat_forestry` (type: `boolean`):

Harvesters, forwarders, astilladoras... (~25K listings)

## `cat_material_handling` (type: `boolean`):

Carretillas elevadoras, transpaletas, plataformas... (~28K listings)

## `cat_groundcare` (type: `boolean`):

Cortacésped, tractores de jardín, motoazadas... (~9K listings)

## `cat_transport` (type: `boolean`):

Camiones, furgonetas, semirremolques. Desactivado por defecto (fuera del scope habitual de Cyclica).

## `catalogs` (type: `array`):

Opcional. REGLA DE PRECEDENCIA: si se rellena con al menos un slug, los checkboxes de arriba son ignorados. Slugs válidos: construction, agriculture, forestry, material-handling, groundcare, transport.

## `sortOrder` (type: `string`):

Orden de clasificación en modo live. 'Más recientes primero' es útil para actualizaciones incrementales.

## `maxItems` (type: `integer`):

Número máximo de items a emitir. 0 = sin límite (extracción completa del catálogo o snapshot).

## `maxPages` (type: `integer`):

40 items por página. Usa 1-2 para tests rápidos, 9999 para extracción completa.

## `delaySeconds` (type: `number`):

Pausa base entre peticiones. Se añade un margen aleatorio de ±1s automáticamente.

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

Proxy de Apify recomendado. El actor rota IP automáticamente por subcategoría para evitar bloqueos.

## `outputSchema` (type: `string`):

Field naming of the emitted records. 'ftp28' returns the 31 canonical fields; 'english' returns English field names. In preloaded mode the default is ftp28.

## `searchUrls` (type: `array`):

URLs de listado con filtros ya aplicados, copiadas de la web. Útil para explorar o extraer resultados filtrados a medida. Se recorren todas las páginas de cada URL.

## `facetPass` (type: `object`):

Configuración de pasada de faceta. Formato: {"field": "antique", "values": \["100","106"], "catalogs": \["construction"], "targetDataset": "mascus-facetas-2026-09"}. Para rangos: {"field": "grossweight", "bands": \[\[1,5000],\[5001,20000]], ...}. Si se omite 'catalogs' se usan los checkboxes/catálogos activos.

## `_facet_datasets` (type: `array`):

Nombres de Named Datasets con registros de faceta ({item_id, campo, valor}) para enriquecer el snapshot durante la consolidación. Se usa junto con \_consolidate=true.

## Actor input object example

```json
{
  "data_freshness": "live",
  "cat_construction": true,
  "cat_agriculture": true,
  "cat_forestry": true,
  "cat_material_handling": true,
  "cat_groundcare": true,
  "cat_transport": false,
  "catalogs": [],
  "sortOrder": "relevance",
  "maxItems": 10,
  "maxPages": 1,
  "delaySeconds": 0.5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "outputSchema": "ftp28"
}
```

# 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 = {
    "data_freshness": "live",
    "cat_construction": true,
    "cat_agriculture": true,
    "cat_forestry": true,
    "cat_material_handling": true,
    "cat_groundcare": true,
    "cat_transport": false,
    "maxItems": 10,
    "maxPages": 1,
    "delaySeconds": 0.5,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "outputSchema": "ftp28"
};

// Run the Actor and wait for it to finish
const run = await client.actor("rastriq/mascus-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 = {
    "data_freshness": "live",
    "cat_construction": True,
    "cat_agriculture": True,
    "cat_forestry": True,
    "cat_material_handling": True,
    "cat_groundcare": True,
    "cat_transport": False,
    "maxItems": 10,
    "maxPages": 1,
    "delaySeconds": 0.5,
    "proxyConfiguration": { "useApifyProxy": True },
    "outputSchema": "ftp28",
}

# Run the Actor and wait for it to finish
run = client.actor("rastriq/mascus-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 '{
  "data_freshness": "live",
  "cat_construction": true,
  "cat_agriculture": true,
  "cat_forestry": true,
  "cat_material_handling": true,
  "cat_groundcare": true,
  "cat_transport": false,
  "maxItems": 10,
  "maxPages": 1,
  "delaySeconds": 0.5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "outputSchema": "ftp28"
}' |
apify call rastriq/mascus-scraper --silent --output-dataset

```

## MCP server setup

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