# 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
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 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?

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

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

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Landwirt or its affiliates. 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.

> **Contact-data controls:** Phone/WhatsApp/fax fields are omitted from the dataset by default. Enable `includePhones` only for numbers already published on public pages and only when you have a lawful basis. Any contact-field examples below assume that explicit opt-in; otherwise those fields are absent.

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

| TractorHouse | Machineryline | Nettikone |
| :--- | :--- | :--- |
| [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 |

### 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 [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) or [Traktorpool Scraper](https://apify.com/crawloop/traktorpool-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 [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) or [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper)
- 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 [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-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 |
| [TractorHouse Scraper](https://apify.com/crawloop/tractorhouse-scraper) | US + EU Sandhills farm equipment |
| [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 |
| [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/QBIr0hB4A7qrkXBzu/openapi.json
