# 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
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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/platform/actors/running/actors-in-store#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

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

> **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. You are responsible for complying with applicable law and site terms. No warranty on accuracy or availability.

### 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 European dealer contacts, use [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper). For industrial auction lots, use [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) or [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper). For farm machinery in Europe, see [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-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 European dealer stock and contacts with [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper), or industrial auction lots with [Surplex Scraper](https://apify.com/crawloop/surplex-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 |
| [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) | European farm machinery |
| [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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawloop/machinio-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6Wh5HZhfL8Edcq2cH/builds/FCY6fpdHZWtTK6cBw/openapi.json
