# Machinio Scraper — Used Equipment Listings & Price Monitor (`crawloop/machinio-scraper`) Actor

Scrape Machinio used equipment listings worldwide for dealers and buyers: asking prices, make/model/year, hours, serials, seller profiles, and images. Monitor mode tracks new inventory and price changes.

- **URL**: https://apify.com/crawloop/machinio-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 scraped machinio listings

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

## Machinio Scraper — Used Equipment Listings & Price Monitor

> **Crawloop Used Machinery Marketplace Suite** — Global Machinio aggregator listings, asking prices, and inventory change alerts. Pair with Machineryline / Exapro / auction Actors for cross-market comps.

| Machineryline (EU) | Machinio (Global) | Exapro | Troostwijk | Surplex |
| :--- | :--- | :--- | :--- | :--- |
| [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | Machinio Scraper ◄── you are here | [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper) | [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) |

| TractorHouse | MachineryTrader | IronPlanet | Ritchie Bros | EquipmentTrader |
| :--- | :--- | :--- | :--- | :--- |
| [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) | [MachineryTrader Scraper](https://apify.com/crawloop/machinerytrader-scraper) | [IronPlanet Scraper](https://apify.com/crawloop/ironplanet-scraper) | [Ritchie Bros Auction Scraper](https://apify.com/crawloop/rbauction-scraper) | [EquipmentTrader Scraper](https://apify.com/crawloop/equipmenttrader-scraper) |

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Machinio, Liquidity Services, or their brands. Data is read from publicly accessible pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

### What this Machinio scraper does

Extract **Machinio** used equipment listings into clean JSON on Apify: asking price (when published or enrichable), make, model, year, hours, serial/stock numbers, seller company profile, location, specs, and images. Built for equipment dealers, appraisers, fleet buyers, and data teams who need a **Machinio API alternative** in **Python**, **Node.js**, or **MCP** workflows — export to dataset / CSV / Excel without manual browsing.

Use this Actor to scrape Machinio category pages, keyword searches, manufacturer filters, and listing detail pages at scale, then join results with other Used Machinery suite Actors for global price comps.

### When to use

- Monitor competitor stock and price changes on Machinio categories or keyword searches
- Build global comps across construction, agriculture, machine tools, material handling, trucks, and more
- Enrich shortlists with serials, stock numbers, and seller profile URLs (details mode)
- Join Machinio rows with EU dealer boards via make/model/year

For US dealer asking prices, use [MachineryTrader Scraper](https://apify.com/crawloop/machinerytrader-scraper) or [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper). For auction comps, use [IronPlanet Scraper](https://apify.com/crawloop/ironplanet-scraper) or [Ritchie Bros Auction Scraper](https://apify.com/crawloop/rbauction-scraper). For European dealer contacts, use [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper).

### Key features

- **Category browse** — excavators, forklifts, CNC, tractors, trucks, and dozens of equipment types
- **Keyword search** — manufacturer / model / free-text with optional location
- **Manufacturer & country filters** — slice inventory (Machinio caps broad category browse around 50 pages)
- **Listings or details mode** — fast cards, or PDP enrichment (serial, stock, seller, full gallery)
- **Price enrichment** — numeric prices when shown; Contact-for-price rows flagged via `priceOnRequest`
- **Monitor mode** — seed once, then emit only new listings and price changes (optional Telegram alerts)
- **No artificial 500-item hard cap** — set `maxItems` for your job size

### Input

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | array | category excavators | Category, search, manufacturer, or listing URLs / bare IDs |
| `searchQuery` | string | — | Keyword search (`/listings?search=...`) |
| `location` | string | — | Location string for keyword search |
| `category` | select | — | Category slug (e.g. `excavators`) |
| `manufacturer` | string | — | Brand filter (e.g. `caterpillar`) |
| `country` | string | — | Country slug (e.g. `united-states`) |
| `condition` | select | `any` | `any` / `used` / `new` / `refurbished` / `salvage` |
| `yearMin` / `yearMax` | integer | — | Year range filter |
| `priceMin` / `priceMax` | integer | — | Client-side USD price range |
| `runMode` | select | `listings` | `listings` or `details` |
| `pricedOnly` | boolean | `false` | Skip rows without a numeric price |
| `maxItems` | integer | `100` | Max dataset rows (or seed fingerprints) |
| `maxPagesPerUrl` | integer | `10` | Pagination cap per start URL (site ~50 max) |
| `monitorMode` | boolean | `false` | Delta tracking across scheduled runs |
| `monitorStoreName` | string | `machinio-monitor-state` | Distinct name per watch target |

#### Example: category + manufacturer

```json
{
  "category": "excavators",
  "manufacturer": "caterpillar",
  "country": "united-states",
  "runMode": "listings",
  "maxItems": 50,
  "maxPagesPerUrl": 5
}
```

#### Example: keyword search

```json
{
  "searchQuery": "komatsu wheel loader",
  "location": "Texas",
  "runMode": "details",
  "maxItems": 30
}
```

#### Example: specific listings

```json
{
  "startUrls": [
    { "url": "https://www.machinio.com/listings/117337992-2026-hyundai-hx25az-mini-excavator-7t-41077-in-germany" },
    { "url": "109097207" }
  ],
  "runMode": "details"
}
```

#### Example: monitor new stock and price changes

```json
{
  "category": "excavators",
  "manufacturer": "komatsu",
  "runMode": "listings",
  "monitorMode": true,
  "monitorStoreName": "machinio-komatsu-excavators",
  "maxItems": 200,
  "maxPagesPerUrl": 10
}
```

### Output

| Field | Description |
| :--- | :--- |
| `id` | Machinio listing id |
| `title` | Listing title |
| `make`, `model`, `year` | Brand, model, manufacture year |
| `price`, `currency`, `priceFormatted` | Numeric / display price when available |
| `priceOnRequest` | `true` when seller hides public price |
| `hours`, `serialNumber`, `stockNumber` | Usage and identifiers (serial/stock on details) |
| `condition`, `category`, `subcategory` | Classification (details enrich) |
| `location`, `city`, `state`, `country` | Geography |
| `sellerName`, `sellerProfileUrl`, `sellerRating` | Seller / company (details) |
| `images`, `imageCount` | Photo URLs |
| `specs` | Spec table key/value map |
| `changeType`, `previousPrice`, `monitoredAt` | Monitor deltas only |

```json
{
  "id": "117337992",
  "url": "https://www.machinio.com/listings/117337992-2026-hyundai-hx25az-mini-excavator-7t-41077-in-germany",
  "title": "2026 Hyundai HX25AZ Mini Excavator < 7t 41077",
  "make": "Hyundai",
  "model": "HX25AZ",
  "year": "2026",
  "hours": "6 h",
  "price": 39701.0,
  "currency": "USD",
  "priceOnRequest": false,
  "location": "Germany",
  "sellerName": "Equippo",
  "images": ["https://i.machinio.com/medium/example.jpg"]
}
```

### Use cases

- **Cross-market comps** — join make/model/year with [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper)
- **Inventory watch** — schedule `monitorMode` on a manufacturer/category slice
- **Fleet sourcing** — filter by year and price, export shortlist CSV / Excel
- **Market research** — track asking-price coverage by category and country
- **Seller discovery** — details mode for company profile URLs (phones are lead-gated on Machinio)

### Global ↔ regional machinery workflow

```text
Machinio Scraper ◄── you are here (global aggregator)
        │
        ├── Machineryline Scraper ──► EU heavy equipment + contacts
        ├── Exapro / Machineseeker ──► EU industrial boards
        └── Surplex / Troostwijk ──► industrial auction lots
```

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/machinio-scraper').call({
  category: 'excavators',
  manufacturer: 'caterpillar',
  runMode: 'listings',
  maxItems: 40,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 3));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/machinio-scraper").call(
    run_input={
        "searchQuery": "caterpillar excavator",
        "runMode": "details",
        "maxItems": 25,
    }
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(items[:3])
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~machinio-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"category":"excavators","manufacturer":"komatsu","maxItems":20,"runMode":"listings"}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by its Store ID / name (`crawloop/machinio-scraper`).

Example prompts:

- "Run Machinio Scraper for Caterpillar excavators in the United States, max 40, and return title, price, hours, location as JSON"
- "Monitor Machinio category excavators manufacturer komatsu and list only new or price-changed rows"
- "Scrape Machinio for used forklifts, then compare asking prices with Machineryline Scraper for the same make and model"

### Suite next step

After global Machinio comps, pull US dealer stock with [MachineryTrader Scraper](https://apify.com/crawloop/machinerytrader-scraper) or [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper), auction comps with [IronPlanet Scraper](https://apify.com/crawloop/ironplanet-scraper) or [Ritchie Bros Auction Scraper](https://apify.com/crawloop/rbauction-scraper), or European dealer contacts with [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper).

### FAQ

**Is this a Machinio API?**\
No — it reads publicly available listing and category pages and returns structured dataset items. It is an unofficial Machinio scraper / API alternative for Python, Node.js, and MCP workflows.

**Why do some listings have no price?**\
Many sellers use Contact Seller for Price. Those rows set `priceOnRequest: true`. When Machinio exposes a numeric signal, the Actor fills `price` / `currency`.

**Why is pagination limited?**\
Machinio caps broad category browse around 50 pages. Use manufacturer, country, or keyword slices for deeper coverage.

**Are seller phone numbers included?**\
Machinio gates contact details behind a lead form. This Actor returns public seller name and company profile URL in details mode — not private phone/email.

**Can I monitor inventory changes?**\
Yes — enable `monitorMode`, run once to seed, then schedule. Only new listings and price changes are pushed (optional Telegram).

**How do I export results?**\
Every run writes to the Apify default dataset — download as JSON, CSV, or Excel, or pull via the Apify API / client.

### Related Actors

| Actor | Role |
| :--- | :--- |
| [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | EU heavy equipment + dealer contacts + monitor |
| [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | European used industrial machinery |
| [Machineseeker Scraper](https://apify.com/crawloop/machineseeker-scraper) | Machineseeker / Maschinensucher listings |
| [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) | Industrial auction lots |
| [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper) | Troostwijk auction lots |
| [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) | US and EU Sandhills farm equipment |
| [MachineryTrader Scraper](https://apify.com/crawloop/machinerytrader-scraper) | US Sandhills heavy equipment |
| [EquipmentTrader Scraper](https://apify.com/crawloop/equipmenttrader-scraper) | US construction and farm classifieds |
| [IronPlanet Scraper](https://apify.com/crawloop/ironplanet-scraper) | US weekly online equipment auctions |
| [Ritchie Bros Auction Scraper](https://apify.com/crawloop/rbauction-scraper) | Sold hammer prices and regional auctions |
| [GovPlanet Scraper](https://apify.com/crawloop/govplanet-scraper) | US government and military surplus |
| [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper) | Used lab & analytical equipment |

# Actor input Schema

## `startUrls` (type: `array`):

Category pages, keyword search URLs, manufacturer pages, or direct listing URLs / bare numeric IDs. Example: https://www.machinio.com/categories/excavators

## `searchQuery` (type: `string`):

Free-text search across manufacturer, model, and title (builds /listings?search=...). Example: caterpillar excavator.

## `location` (type: `string`):

Optional city/state/country string for keyword search (location= query param).

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

Machinio category slug for browse mode (e.g. excavators, forklifts, cnc-lathes, tractors).

## `manufacturer` (type: `string`):

Brand slug or name when browsing a category (e.g. caterpillar, komatsu, john-deere, hyundai).

## `country` (type: `string`):

Country slug filter for category browse (e.g. united-states, germany, united-kingdom).

## `condition` (type: `string`):

Optional condition filter for built browse/search URLs.

## `yearMin` (type: `integer`):

Minimum manufacture year (URL filter when supported + client-side filter).

## `yearMax` (type: `integer`):

Maximum manufacture year (URL filter when supported + client-side filter).

## `priceMin` (type: `integer`):

Client-side minimum numeric price filter (skips contact-for-price rows).

## `priceMax` (type: `integer`):

Client-side maximum numeric price filter.

## `keywordFilter` (type: `string`):

Extra client-side substring filter on title / make / model / description.

## `baseUrl` (type: `string`):

Site origin for built search URLs.

## `runMode` (type: `string`):

listings = fast card fields (price, make, hours, images). details = also visit each listing page for serial, stock, seller profile, full specs and gallery.

## `pricedOnly` (type: `boolean`):

Skip Contact-Seller-for-Price rows that have no numeric price (including FB pixel enrichment).

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

Maximum dataset rows to emit (in monitor seed runs: max listings to fingerprint). No artificial 500 cap.

## `maxPagesPerUrl` (type: `integer`):

Maximum pagination pages per search/category URL. Machinio caps category browse around 50 pages — use manufacturer/country/keyword slices for deeper coverage.

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

Optional. Direct Chrome-TLS requests often work; enable Apify Residential if you see Access Denied blocks.

## `concurrencyLimit` (type: `integer`):

Parallel PDP fetches in details mode.

## `monitorMode` (type: `boolean`):

Delta tracking for category, search, or manufacturer URLs. First run seeds a named Key-Value store (no dataset rows / alerts). Later runs output only new listings and price changes. Pair with an Apify Schedule.

## `monitorStoreName` (type: `string`):

Named Key-Value store for fingerprints across scheduled runs. Use a distinct name per watch target.

## `telegramToken` (type: `string`):

Bot token for real-time alerts on new listings and price changes (monitorMode only).

## `telegramChatId` (type: `string`):

Telegram user or group chat ID that receives monitor alerts.

## `resetMonitorState` (type: `boolean`):

Clear stored listing fingerprints before this run (forces a fresh seed run).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.machinio.com/categories/excavators"
    }
  ],
  "searchQuery": "caterpillar excavator",
  "location": "Texas",
  "manufacturer": "caterpillar",
  "country": "united-states",
  "condition": "any",
  "yearMin": 2015,
  "yearMax": 2024,
  "baseUrl": "https://www.machinio.com",
  "runMode": "listings",
  "pricedOnly": false,
  "maxItems": 100,
  "maxPagesPerUrl": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "concurrencyLimit": 5,
  "monitorMode": false,
  "monitorStoreName": "machinio-monitor-state",
  "resetMonitorState": false
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items: Machinio listings with prices, hours, specs, and seller profiles.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.machinio.com/categories/excavators"
        }
    ],
    "baseUrl": "https://www.machinio.com",
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "monitorStoreName": "machinio-monitor-state"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/machinio-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 = {
    "startUrls": [{ "url": "https://www.machinio.com/categories/excavators" }],
    "baseUrl": "https://www.machinio.com",
    "proxyConfiguration": { "useApifyProxy": False },
    "monitorStoreName": "machinio-monitor-state",
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/machinio-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 '{
  "startUrls": [
    {
      "url": "https://www.machinio.com/categories/excavators"
    }
  ],
  "baseUrl": "https://www.machinio.com",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "monitorStoreName": "machinio-monitor-state"
}' |
apify call crawloop/machinio-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/machinio-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/6Wh5HZhfL8Edcq2cH/builds/WuZQQZolGwjdq7h0C/openapi.json
