# Landwirt Scraper — Farm Classifieds & Used Machinery (`crawloop/landwirt-scraper`) Actor

Scrape landwirt.com Kleinanzeigen and Maschinenmarkt listings: title, price when published, brand/hours/PS when on the card, seller type, location, images. Listings or details. Optional new-ad / price-change monitor.

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

## Pricing

from $1.00 / 1,000 listing cards

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

## Landwirt Scraper — Farm Classifieds & Used Machinery AT/DE

> **Crawloop Used Machinery Marketplace Suite** — DACH agricultural classifieds (private + dealer) alongside Agriaffaires / TractorHouse / Machineryline for European farm equipment comps.

| Agriaffaires | TractorHouse | Machineryline | Nettikone |
| :--- | :--- | :--- | :--- |
| [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) | [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) | [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | [Nettikone Scraper](https://apify.com/crawloop/nettikone-scraper) |

| Agrofy | Mascus | Traktorpool | Landwirt |
| :--- | :--- | :--- | :--- |
| [Agrofy Scraper](https://apify.com/crawloop/agrofy-scraper) | [Mascus Scraper](https://apify.com/crawloop/mascus-scraper) | [Traktorpool Scraper](https://apify.com/crawloop/traktorpool-scraper) | Landwirt Scraper ◄── you are here |

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Landwirt.com GmbH or its brands. Data is read from publicly accessible pages only. You are responsible for complying with applicable law (including GDPR/DSGVO) and site terms. No warranty on accuracy or availability. Phone numbers are **off by default**.

### What this Landwirt scraper does

This **Landwirt scraper** turns public landwirt.com search, category, and detail pages into a structured Apify dataset. From listing cards it reads title, asking price (when published), brand/model/year/hours/PS when the card has them, seller type (private vs commercial), location, and image. `details` mode adds description, gallery, specs map, and dealer homepage when the PDP publishes them. Use it as a Landwirt API alternative in **Python**, **Node.js**, or **MCP**.

Paste Kleinanzeigen URLs (`/kleinanzeigen/…`) and/or Maschinenmarkt URLs (`/traktoren/…`, `/maschinenmarkt`, `/detail/…`). The Actor does not add extra filters (region, breed, hectares, job title) beyond what is already in the URL. Run `listings` for catalog cards or `details` for PDP enrichment. Enable **`monitorMode`** on an Apify Schedule to emit only **new ads** and **price changes** after the seed run.

### When to use

- Asking-price comps for tractor and implement cards that already show brand, hours, and PS
- Private vs commercial seller split from Kleinanzeigen and Maschinenmarkt start URLs
- Scheduled `monitorMode` on a category or search URL you paste (new ads / price changes)
- Join Landwirt asking prices with [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) or [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) by brand + model + year when those fields are present

#### When not to use

- You need a generic German/Austrian marketplace beyond agriculture — use [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper)
- You only need pan-EU dealer machinery catalogs — start with Agriaffaires / Machineryline
- You need authenticated dealer XML import/export (that is a Landwirt partner interface, not this Actor)

### Key features

- **Two inventories** — Kleinanzeigen (`source: classifieds`) and Maschinenmarkt (`source: usedmachines`) from the URLs you paste
- **Search URL or query** — paste a category / filtered URL, or set `searchQuery` when `startUrls` is empty (builds `/kleinanzeigen?q=`)
- **Two modes** — `listings` (card fields) and `details` (PDP description, gallery, specs, dealer `website` when present)
- **Monitor mode** — first run seeds fingerprints (no rows); later runs emit `new` / `price_change`; optional Telegram
- **HTTP-first** — Nuxt `_payload.json` via `curl_cffi` Chrome TLS (no headless browser)
- **Phones opt-in** — `includePhones` default false; the site often masks numbers (`****`) and those are not emitted

### Input

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | Tractors Kleinanzeigen sample | Category, search, or detail URLs |
| `searchQuery` | String | — | Builds `/kleinanzeigen?q=` when startUrls is empty |
| `runMode` | String | `listings` | `listings` or `details` |
| `includePhones` | Boolean | `false` | Public phones + private street on details (GDPR) |
| `maxItems` | Integer | `10` | Cap (`0` = unlimited) |
| `maxPagesPerUrl` | Integer | `1` | Pagination (`?page=`) |
| `concurrencyLimit` | Integer | `5` | Parallel PDP workers |
| `proxyConfiguration` | Object | Residential AT | Apify Proxy |
| `monitorMode` | Boolean | `false` | Delta tracking |
| `monitorStoreName` | String | `landwirt-monitor-state` | Named KV store |
| `telegramToken` / `telegramChatId` | String | — | Monitor alerts |
| `resetMonitorState` | Boolean | `false` | Force a new seed run |

#### Input example

```json
{
  "startUrls": [
    { "url": "https://www.landwirt.com/kleinanzeigen/traktoren" }
  ],
  "runMode": "listings",
  "includePhones": false,
  "maxItems": 50,
  "maxPagesPerUrl": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "AT"
  }
}
```

Dealer Maschinenmarkt example:

```json
{
  "startUrls": [
    { "url": "https://www.landwirt.com/traktoren/standard-traktoren" }
  ],
  "runMode": "details",
  "maxItems": 25
}
```

### Output

| Field | Description |
| :--- | :--- |
| `id` | Listing ID |
| `url` | Canonical ad URL |
| `source` | `classifieds` or `usedmachines` |
| `title` | Headline |
| `brand` / `model` / `year` / `hours` / `powerHp` | Machine attributes when published |
| `price` / `priceNet` / `priceGross` / `currency` | Asking price; `priceOnRequest` when unpublished |
| `category` / `subcategory` / `group` | Taxonomy (e.g. Traktoren / Landtechnik) |
| `location` / `zipCity` / `countryCode` | When the card/PDP publishes them |
| `sellerName` / `sellerType` | `private` or `commercial` |
| `imageUrl` / `images` | Gallery |
| `description` / `specs` | Details mode |
| `website` | Dealer homepage (Maschinenmarkt details) |
| `phoneNumbers` | Only when `includePhones=true` and the site does not mask the number |
| `changeType` | `new` or `price_change` in monitor mode |

#### Output example

```json
{
  "id": "6499559",
  "url": "https://www.landwirt.com/detail/fendt-724-vario-6499559",
  "source": "usedmachines",
  "title": "Fendt 724 Vario",
  "brand": "Fendt",
  "model": "724 Vario",
  "year": 2025,
  "hours": 30,
  "powerHp": 240,
  "price": 259000,
  "currency": "EUR",
  "sellerType": "commercial",
  "sellerName": "MAUCH Gesellschaft m.b.H. & Co.KG",
  "countryCode": "AT",
  "zipCity": "5274 Burgkirchen"
}
```

### Use cases

- **Used tractor pricing** — Kleinanzeigen or Maschinenmarkt tractor URLs; hours and PS only when the listing publishes them
- **Dealer stock watch** — schedule `monitorMode` on a Maschinenmarkt category URL
- **Keyword scan** — empty `startUrls` + `searchQuery` (Kleinanzeigen `q=`)
- **MCP** — run listings mode and return title, brand, hours, price, location from the dataset

### 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/landwirt-scraper').call({
  startUrls: [{ url: 'https://www.landwirt.com/kleinanzeigen/traktoren' }],
  runMode: 'listings',
  maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/landwirt-scraper").call(
    run_input={
        "startUrls": [{"url": "https://www.landwirt.com/kleinanzeigen/traktoren"}],
        "runMode": "listings",
        "maxItems": 50,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~landwirt-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.landwirt.com/kleinanzeigen/traktoren"}],
    "runMode": "listings",
    "maxItems": 50,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"],
      "apifyProxyCountry": "AT"
    }
  }'
```

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

Example prompts:

- "Run Landwirt Scraper for the default tractors Kleinanzeigen URL in listings mode, max 40, and return title, brand, hours, price, location"
- "Scrape Landwirt Maschinenmarkt standard tractors in details mode and list dealer name, year, PS, and price"
- "Run Landwirt Scraper with monitorMode on a tractor category URL and return only new or price-changed rows"

### Suite next step

For pan-European dealer machinery (hours, HT prices, tire wear), run [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) next and join on brand + model + year. For DACH dealer portals, use [Traktorpool Scraper](https://apify.com/crawloop/traktorpool-scraper). For US + Sandhills Europe stock, use [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper).

### FAQ

**Does this scrape Kleinanzeigen.de?** No. This Actor is site-exact for landwirt.com. Use [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) for eBay Kleinanzeigen.

**Private vs dealer ads?** Kleinanzeigen URLs under `/kleinanzeigen/` are mostly private + small commercial (`source: classifieds`). `/traktoren/...` and `/maschinenmarkt` are dealer Maschinenmarkt (`source: usedmachines`).

**Are phone numbers included?** Only if you set `includePhones: true` in details mode **and** the site publishes an unmasked number. Masked values are dropped.

**How do I paginate?** Set `maxPagesPerUrl` (query `page=`). `maxItems` caps dataset rows.

### Related Actors

| Actor | What it covers |
| :--- | :--- |
| **Landwirt Scraper** ◄── you are here | AT/DE agrar classifieds + dealer machinery |
| [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) | Used farm machinery Europe |
| [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) | US + EU Sandhills farm equipment |
| [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | EU heavy equipment & Agroline |
| [Nettikone Scraper](https://apify.com/crawloop/nettikone-scraper) | Finland used machinery |
| [Agrofy Scraper](https://apify.com/crawloop/agrofy-scraper) | Brazil + Argentina farm marketplace |
| [Mascus Scraper](https://apify.com/crawloop/mascus-scraper) | Global used machinery classifieds |
| [Traktorpool Scraper](https://apify.com/crawloop/traktorpool-scraper) | DACH / Central Europe farm machinery |
| [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) | General DE classifieds |

# Actor input Schema

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

Category, search, or detail URLs on landwirt.com. Kleinanzeigen examples: /kleinanzeigen/traktoren, /kleinanzeigen/rindermarkt, /kleinanzeigen?q=Fendt. Dealer Maschinenmarkt: /traktoren/standard-traktoren, /maschinenmarkt. Detail: /kleinanzeigen/detail/{slug}-{id} or /detail/{slug}-{id}.

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

If startUrls is empty, builds a Kleinanzeigen search URL (e.g. Fendt 724). Ignored when startUrls are set.

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

listings = fast card-level catalog from search/category pages. details = open each ad for description, gallery, seller, specs. Default listings keeps Store QA fast.

## `includePhones` (type: `boolean`):

When true and runMode is details, include publicly published phone numbers and private-seller street when the site does not mask them. Off by default (GDPR / responsible use). You are responsible for lawful processing of any personal data.

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

Maximum listings to return. 0 = unlimited. Keep low for Store QA; raise for production runs.

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

Pagination depth per category/search URL (?page=). 0 = until exhausted.

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

Parallel detail-page workers in details mode.

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

Apify Proxy. Residential AT is recommended for stable catalog pulls.

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

Delta tracking for a category or search URL. First run seeds a named Key-Value store (no dataset rows). 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 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.landwirt.com/kleinanzeigen/traktoren"
    }
  ],
  "runMode": "listings",
  "includePhones": false,
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  },
  "monitorMode": false,
  "monitorStoreName": "landwirt-monitor-state",
  "resetMonitorState": false
}
```

# Actor output Schema

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

Default dataset items.

# 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.landwirt.com/kleinanzeigen/traktoren"
        }
    ],
    "monitorStoreName": "landwirt-monitor-state"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/landwirt-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.landwirt.com/kleinanzeigen/traktoren" }],
    "monitorStoreName": "landwirt-monitor-state",
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/landwirt-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.landwirt.com/kleinanzeigen/traktoren"
    }
  ],
  "monitorStoreName": "landwirt-monitor-state"
}' |
apify call crawloop/landwirt-scraper --silent --output-dataset

```

## MCP server setup

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