# Machineryline Scraper — Heavy Equipment & Dealer Contacts (`crawloop/machineryline-scraper`) Actor

Scrape Machineryline, Autoline, and Agroline listings: specs, prices, company phones, WhatsApp when published, website, address, and map coordinates. Listings or details mode. Lightweight HTTP scraper on Apify.

- **URL**: https://apify.com/crawloop/machineryline-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** Automation, Integrations, Developer tools
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 scraped machinery full details

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

## Machineryline Scraper — Heavy Equipment & Dealer Contacts

> **Crawloop Used Machinery Marketplace Suite** — Structured extraction for heavy machinery, commercial vehicles, and agricultural equipment. Built for market research, inventory monitoring, and pricing workflows.

| Exapro | Resale.info | Machineseeker | Machineryline | Troostwijk | Surplex |
| :--- | :--- | :--- | :--- | :--- | :--- |
| [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | [Resale.info Scraper](https://apify.com/crawloop/resale-scraper) | [Machineseeker Scraper](https://apify.com/crawloop/machineseeker-scraper) | Machineryline Scraper ◄── you are here | [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper) | [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) |

> **Disclaimer:** This is an unofficial integration developed independently of Linemedia Sp. z o.o. It is not affiliated with, sponsored by, or endorsed by Machineryline, Autoline, Agroline, or any of their subsidiaries.
>
> **Machineryline**, **Autoline**, **Agroline**, and related names are trademarks of their respective owners. Listing data is read from publicly accessible web sources only; no proprietary databases are redistributed.
>
> This Actor is provided **for informational and research purposes only** (e.g. market research, dealer outreach, inventory monitoring). You are solely responsible for ensuring your use complies with applicable laws, platform terms of use, and your organization's policies.
>
> No warranty is given as to accuracy, completeness, or continued availability of third-party data. Use at your own risk.

Extract heavy equipment listings from Machineryline regional domains into clean JSON datasets on Apify. Also works on **Autoline** (trucks) and **Agroline** (agriculture) via the same layout engine.

Supports category URLs, keyword `searchQuery`, company inventory pages, and direct product pages. Use `listings` mode for fast catalog scans and `details` mode for product specs, images, and **company-level** dealer contacts (phones, WhatsApp when published, website, address, map coordinates). Enable `monitorMode` with an Apify Schedule to track **new listings** and **price changes**, optionally via Telegram.

### When to use this Actor

Use this Actor when you need excavators, loaders, cranes, trucks, or agricultural equipment with pricing, specs, images, and company dealer context for market dashboards or outreach workflows.

For used CNC and metalworking on Exapro, use the [Exapro Scraper](https://apify.com/crawloop/exapro-scraper). For Resale.info, use the [Resale.info Scraper](https://apify.com/crawloop/resale-scraper). For Machineseeker / Maschinensucher, use the [Machineseeker Scraper](https://apify.com/crawloop/machineseeker-scraper). For industrial auctions, see [Troostwijk](https://apify.com/crawloop/troostwijk-scraper) and [Surplex](https://apify.com/crawloop/surplex-scraper).

### Used Machinery Marketplace Workflow

```
Multi-platform intelligence          Per-platform enrichment
──────────────────────────          ─────────────────────────

  Exapro Scraper        ──────────────────► European listings & technical specs
  Resale.info Scraper   ──────────────────► European listings & categories
  Machineseeker Scraper ──────────────────► regional CNC & metalworking
  Machineryline Scraper ◄── you are here ──► heavy equipment & dealer contacts
  Troostwijk / Surplex ─────────────────────► auction lots & bids

  Join datasets by manufacturer + model ──► price comparison & inventory routing
```

### Key Features

- **Regional domains and sister platforms** — Any Machineryline TLD plus Autoline and Agroline URLs in `startUrls`; `platform` is set automatically.
- **Two extraction modes** — `listings` for card-level specs and pricing; `details` for images, full spec tables, and company contacts.
- **Company-level dealer contacts (details)** — Public phones (`sellerPhone` / `sellerPhones`), WhatsApp when the dealer publishes a messenger button (`sellerWhatsapp`), website (`sellerWebsite`), company address, and map coordinates. Personal contact-person names are not collected.
- **Seller inventory pages** — Pass a dealer profile URL (e.g. company slug page) in `startUrls` to crawl that seller’s stock with pagination.
- **Keyword search** — Optional `searchQuery` (+ `baseUrl`) without hand-building search URLs.
- **Normalized model & brand** — Separate `brand` / `model` fields for cross-marketplace joins.
- **Lightweight and concurrent** — HTTP extraction with `curl_cffi`; `concurrencyLimit` parallelizes PDP fetches in details mode.
- **Monitor mode** — Schedule the Actor on category, search, or dealer inventory URLs; only **new** listings and **price changes** go to the dataset, with optional Telegram alerts.

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | `[]` | Category, search, dealer inventory, or product page URLs. |
| `searchQuery` | String | — | Optional keyword search appended as a start URL on `baseUrl`. |
| `baseUrl` | String | `https://machineryline.info` | Origin used with `searchQuery` (regional TLD / Autoline / Agroline). |
| `runMode` | String | `"listings"` | `"listings"` for catalog cards or `"details"` for PDP enrichment + contacts. |
| `maxItems` | Integer | `100` | Maximum equipment items to scrape (or emit in monitor mode). |
| `maxPagesPerUrl` | Integer | `10` | Pagination depth per start URL. |
| `concurrencyLimit` | Integer | `5` | Parallel PDP workers in details mode. |
| `monitorMode` | Boolean | `false` | Delta tracking: first run seeds state; later runs output new / price-changed rows only. |
| `monitorStoreName` | String | `machineryline-monitor-state` | Named KV store so fingerprints survive Apify Schedules. Use one name per watch target. |
| `telegramToken` | String | — | Telegram bot token for monitor alerts. |
| `telegramChatId` | String | — | Telegram chat ID for monitor alerts. |
| `resetMonitorState` | Boolean | `false` | Clear stored fingerprints and force a fresh seed run. |
| `proxyConfiguration` | Object | `{}` | Apify Proxy settings (residential recommended). |

Provide at least one of `startUrls` or `searchQuery`.

#### Input Example

```json
{
  "startUrls": [
    { "url": "https://machineryline.info/-/crawler-cranes--c123" }
  ],
  "searchQuery": "Liebherr crawler crane",
  "runMode": "details",
  "maxItems": 50,
  "maxPagesPerUrl": 3,
  "concurrencyLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

#### Seller inventory example

```json
{
  "startUrls": [
    { "url": "https://machineryline.info/kiesel/" }
  ],
  "runMode": "details",
  "maxItems": 100,
  "maxPagesPerUrl": 20
}
```

#### Monitor mode example (Schedule + Telegram)

```json
{
  "startUrls": [
    { "url": "https://machineryline.info/-/crawler-cranes--c123" }
  ],
  "runMode": "listings",
  "monitorMode": true,
  "monitorStoreName": "machineryline-monitor-cranes",
  "maxItems": 200,
  "maxPagesPerUrl": 15,
  "telegramToken": "123456:ABC...",
  "telegramChatId": "123456789",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

With `monitorMode: true`, listing fingerprints are stored in a **named** Key-Value store (`monitorStoreName`, key `MONITOR_STATE`) so Apify Schedules keep state across runs. The first run seeds the cache and writes no dataset rows. Later scheduled runs emit only `changeType: "new"` or `"price_change"` (and send Telegram when token + chat ID are set). Use a distinct `monitorStoreName` per category/dealer watch. Use `resetMonitorState: true` to wipe the cache.

### Output Format

Schema depends on `runMode`:

- **`listings`** — card fields: `id`, `title`, `brand`, `model`, `platform`, price, year, location, `sellerName` / `sellerUrl` when present on the card. No phones or website (not published on listing cards).
- **`details`** — merges the card with the PDP: `technicalSpecs`, description, images, plus company-level contacts when the dealer card publishes them (`sellerPhone`, `sellerPhones`, `sellerWhatsapp`, `sellerWebsite`, `sellerAddress`, `sellerLatitude` / `sellerLongitude`).
- **`monitorMode`** — same fields as above, plus delta metadata: `changeType` (`new` | `price_change`), `previousPrice` / `previousCurrency` / `previousPriceFormatted`, `monitoredAt`.

```json
{
  "id": "25112614422468508400",
  "title": "Liebherr LR 1400-2 crawler crane",
  "url": "https://machineryline.info/-/sale/crawler-cranes/Liebherr/LR-1400-2--25112614422468508400",
  "platform": "machineryline",
  "brand": "Liebherr",
  "model": "LR 1400-2 crawler crane",
  "category": "Crawler crane",
  "price": 1255000,
  "currency": "USD",
  "year": "2000",
  "runningHours": "2,100 m/h",
  "location": "USA, Miami",
  "country": "US",
  "sellerName": "Omnia Machinery",
  "sellerUrl": "https://machineryline.info/omnia_machinery/",
  "sellerPhone": "+13054818056",
  "sellerPhones": ["+13054818056", "+447718654899"],
  "sellerWhatsapp": "+13054818056",
  "sellerWebsite": "https://www.omniamachinery.com",
  "sellerAddress": "USA, Florida, 33129, MIAMI, OMNIA MACHINERY USA, INC.,151 SE 15th ROAD",
  "sellerLatitude": 25.757885,
  "sellerLongitude": -80.191978,
  "isVerifiedSeller": false,
  "technicalSpecs": {
    "Load capacity": "400,000 kg",
    "Condition": "used"
  },
  "changeType": "price_change",
  "previousPrice": 1290000,
  "previousCurrency": "USD",
  "previousPriceFormatted": "$1,290,000",
  "monitoredAt": "2026-07-28T11:24:00+00:00"
}
```

### Typical Workflow

1. Filter or search on Machineryline in your browser, **or** set `searchQuery` / a company inventory URL.
2. Put category, search, or dealer URLs into `startUrls`.
3. Set `runMode` to `listings` (bulk index) or `details` (specs + company phones / website / WhatsApp when published).
4. Export the Apify dataset as JSON, CSV, or Excel.

#### Inventory / price monitoring

1. Set `startUrls` to a category, search, or dealer inventory page.
2. Enable `monitorMode` (prefer `runMode: "listings"` for cheaper scans).
3. Set a distinct `monitorStoreName` per watch target (category vs dealer).
4. Add Telegram bot token + chat ID if you want alerts.
5. Create an Apify Schedule (e.g. every 1–6 hours). The named KV store keeps fingerprints across runs; the first run is a silent seed.

### Use cases

| Use case | What you get |
| :--- | :--- |
| **Dealer outreach** | Company phones, WhatsApp, website, address from details mode |
| **Price benchmarking** | Asking prices + brand/model for excavators, trucks, ag equipment |
| **Inventory monitoring** | New listing / price-change deltas with optional Telegram |
| **Cross-platform joins** | Normalized `brand` / `model` for Exapro, Resale, Surplex comps |
| **AI / MCP workflows** | Run via Apify API, clients, or MCP and summarize dealer stock |

### 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/machineryline-scraper').call({
  searchQuery: 'Liebherr crawler crane',
  runMode: 'details',
  maxItems: 50,
  proxyConfiguration: { useApifyProxy: true },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/machineryline-scraper").call(
    run_input={
        "startUrls": [{"url": "https://machineryline.info/-/crawler-cranes--c123"}],
        "runMode": "listings",
        "maxItems": 100,
        "proxyConfiguration": {"useApifyProxy": True},
    }
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items), items[:3])
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~machineryline-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "Liebherr",
    "runMode": "listings",
    "maxItems": 50,
    "proxyConfiguration": {"useApifyProxy": true}
  }'
```

### 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 `crawloop/machineryline-scraper`.

Example prompts:

- "Run Machineryline Scraper for Liebherr crawler cranes in details mode, max 30, and return title, price, sellerPhone, and url"
- "Scrape Machineryline listings for excavators and summarize the median asking price by brand"
- "Chain Machineryline Scraper then Surplex Scraper for similar models and compare dealer ask vs auction starts"

### Suite next step

For industrial auctions, run [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) or [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper). For farm equipment, use [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper).

### Related Actors

| Actor | Apify Store |
| :--- | :--- |
| **Machineryline Scraper** ◄── you are here | heavy equipment & dealer contacts |
| [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | European CNC & metalworking |
| [Resale.info Scraper](https://apify.com/crawloop/resale-scraper) | European listings & categories |
| [Machineseeker Scraper](https://apify.com/crawloop/machineseeker-scraper) | regional CNC & metalworking |
| [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper) | multi-country industrial auctions |
| [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) | plant closures & Surplex lots |
| [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) | used farm machinery Europe |
| [Truck1 Scraper](https://apify.com/crawloop/truck1-scraper) | commercial trucks |

# Actor input Schema

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

Category pages, search results, company inventory pages (e.g. https://machineryline.info/kiesel/), or direct product detail pages. Autoline and Agroline URLs work with the same layout.

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

Optional keyword search. Builds a search URL on baseUrl and appends it to startUrls (e.g. Liebherr crane).

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

Site origin used when searchQuery is set. Use a regional Machineryline / Autoline / Agroline domain.

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

listings = fast card fields. details = visit each PDP for full specs, images, and company-level dealer contacts (phones, website, address, coordinates when published).

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

Maximum number of equipment items to scrape in total.

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

Maximum number of pagination pages to crawl per category, search, or company inventory URL.

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

Proxy settings. Apify Residential Proxies are recommended for stable runs at scale.

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

Maximum parallel PDP requests in details mode. Keep moderate to avoid rate limits.

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

Delta tracking for category, search, or dealer inventory 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 (e.g. dealer or category).

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

Bot token for real-time alerts on new listings and price changes (monitorMode only). Create a bot via @BotFather.

## `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://machineryline.info/-/crawler-cranes--c123"
    }
  ],
  "searchQuery": "Liebherr crawler crane",
  "baseUrl": "https://machineryline.info",
  "runMode": "listings",
  "maxItems": 100,
  "maxPagesPerUrl": 10,
  "concurrencyLimit": 5,
  "monitorMode": false,
  "monitorStoreName": "machineryline-monitor-state",
  "resetMonitorState": false
}
```

# Actor output Schema

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

Default dataset items: equipment listings with specs, prices, and company-level dealer contacts (details mode).

# 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://machineryline.info/-/crawler-cranes--c123"
        }
    ],
    "baseUrl": "https://machineryline.info",
    "monitorStoreName": "machineryline-monitor-state"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/machineryline-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://machineryline.info/-/crawler-cranes--c123" }],
    "baseUrl": "https://machineryline.info",
    "monitorStoreName": "machineryline-monitor-state",
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/machineryline-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://machineryline.info/-/crawler-cranes--c123"
    }
  ],
  "baseUrl": "https://machineryline.info",
  "monitorStoreName": "machineryline-monitor-state"
}' |
apify call crawloop/machineryline-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawloop/machineryline-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/hDQcprb8fjrcFVjIs/builds/iTWldWAQEdF2KPZcD/openapi.json
