Landwirt.com API & Scraper
The Landwirt.com API turns the Austrian, German and Swiss farm-machinery marketplace into JSON in six actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search reads either the dealer market (about 85,000 listings from roughly 1,300 dealers on 2026-10-14) or the private classified ads, with the filters the source applies itself: free text, category and sub-category, manufacturer, condition (used, demo, new, rental), year of construction, operating hours, horsepower, price band, seller country and region, sorted by date, price, year, hours or power, 6 to 100 rows a page. detail returns one listing in full: manufacturer, model and model series, year, hours, hp and kW, the gross price the site shows with the net price and VAT rate beside it, the full equipment list, every technical field the dealer typed such as tyre sizes and tread depth, every photo, the description and the dealer's address, rating and homepage. categories returns the live category tree with exact counts, manufacturers the manufacturer ids the filters take, and dealer and dealers cover the supply side. The fields are named for what they are: price is the gross number the page prints, price_net is the net, price_entered_as says which one the dealer typed, and placeholder prices like 1 euro are flagged instead of averaged. One ReefAPI key, the standard { ok, data, meta, error } envelope, no Landwirt.com account.
One price, four numbers — what a Landwirt.com listing actually publishes
Dealers on this marketplace type their price either net or gross, and the page always shows the gross. These are real listings read on 2026-10-14; the right-hand columns are what the API returns.
| listing | what the page shows | price / price_net | price_entered_as · vat_rate_pct |
|---|---|---|---|
| New Holland T6.160, 2016, 2,077 h (DE dealer) | 75,565 € incl. 19 % VAT | 75565 / 63500 | net · 19 |
| Lindner 520 SA, 1978, 52 PS (AT dealer) | 1 €, VAT not reclaimable | 1 / 1, price_symbolic: true | — · null (vat: not_applicable) |
| Case IH MX 135, 1997 (CH dealer) | 36,397 € incl. 8.1 % VAT | 36397 / 33669.75, price_converted: true | gross · 8.1 |
| Fendt 314 Vario Gen5, 2026, 5 h (AT dealer) | Price on request | null / null, price_on_request: true | — · null |
On 5 of 8 priced listings checked against their own page, the dealer had typed a net price and the page printed the gross. price is always that printed gross, so it matches what a buyer sees; price_net stays beside it. Swiss dealers are converted to euros by the marketplace itself, which is why their net carries odd cents.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/landwirt/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "fendt",
"subcategory_id": 24,
"year_min": 2015,
"sort": "newest"
}
}{
"ok": true,
"meta": {
"api": "landwirt",
"endpoint": "search",
"mode": "live",
"latency_ms": 629,
"record_count": 20,
"bytes": 42167,
"cache_hit": false,
"total": 997,
"total_is_capped": false,
"pagination": {
"page": 1,
"limit": 20,
"last_page": 50,
"has_more": true,
"retrievable_max": 10000
},
"filters_applied": {
"query": "fendt",
"subcategory_id": 24,
"year": "2015,2026",
"sort": "newest"
},
"listing_type": "dealer",
"warnings": [],
"charged_credits": 2,
"version": "1.0.0",
"request_id": "cf6ce11730d740f1",
"queue_ms": 1.7,
"fetched_at": "2026-10-14T18:57:24.779Z"
},
"data": {
"listings": [
{
"listing_id": "7658723",
"listing_type": "dealer",
"url": "https://www.landwirt.com/detail/fendt-314-vario-gen5-profi-setting2-7658723",
"title": "Fendt 314 Vario Gen5 Profi Setting2",
"manufacturer": "Fendt",
"manufacturer_id": 385,
"model": null,
"group": "Landtechnik",
"group_id": 1,
"category": "Traktoren",
"category_id": 1,
"subcategory": "Standard Traktoren",
"subcategory_id": 24,
"condition": "new",
"condition_label": "Neumaschinen",
"year": 2026,
"operating_hours": 5,
"operating_hours_unit": "h",
"power_hp": 142,
"power_kw": 104.44,
"mileage": null,
"mileage_unit": null,
"price": null,
"currency": null,
"price_net": null,
"price_gross": null,
"price_entered_as": null,
"vat": null,
"vat_text": null,
"vat_rate_pct": null,
"price_on_request": true,
"price_previous": null,
"discount_pct": null,
"price_symbolic": false,
"price_converted": false,
"reserved": false,
"auction": false,
"seller_id": "3318",
"seller_name": "BayWa Vorarlberg HandelsGmbH BayWa Technik",
"seller_is_dealer": true,
"location_postcode": "6820",
"location_city": "Frastanz",
"location_country_code": "AT",
"location_lat": 47.210452,
"location_lng": 9.6575659,
"image": "https://static.landwirt.com/3318-5941d958b83b8dc49d588385a386c0eb-7658723-0vb.jpg",
"image_count": 18,
"has_video": false,
"description_preview": "Antrieb: Allrad, Getriebeart Landmaschine: Stufenloses Getriebe, Plattform: Kabine, Zapfwellendrehzahl: 540/540E/1000, Höchstgeschwindigkeit in km/h: 40 km/h, Aufladung:",
"created_at": null
},
{
"listing_id": "7658622",
"listing_type": "dealer",
"url": "https://www.landwirt.com/detail/fendt-718-vario-s4-7658622",
"title": "Fendt 718 VARIO S4",
"manufacturer": "Fendt",
"manufacturer_id": 385,
"model": null,
"group": "Landtechnik",
"group_id": 1,
"category": "Traktoren",
"category_id": 1,
"subcategory": "Standard Traktoren",
"subcategory_id": 24,
"condition": "used",
"condition_label": "Gebrauchtmaschinen",
"year": 2021,
"operating_hours": 4966,
"operating_hours_unit": "h",
"power_hp": 181,
"power_kw": 133.13,
"mileage": null,
"mileage_unit": null,
"price": 130781,
"currency": "EUR",
"price_net": 109900,
"price_gross": 130781,
"price_entered_as": "net",
"vat": "included",
"vat_text": "inkl. 19% MwSt",
"vat_rate_pct": 19,
"price_on_request": false,
"price_previous": null,
"discount_pct": null,
"price_symbolic": false,
"price_converted": false,
"reserved": false,
"auction": false,
"seller_id": "6540",
"seller_name": "AGRAVIS Technik Lenne-Lippe GmbH",
"seller_is_dealer": true,
"location_postcode": "59872",
"location_city": "Meschede-Remblinghausen",
"location_country_code": "DE",
"location_lat": 51.30668,
"location_lng": 8.30585,
"image": "https://static.landwirt.com/platzhalter.png",
"image_count": 0,
"has_video": false,
"description_preview": "Klimaanlage, Fronthydraulik 718 VARIO S4 (0010) Fendt Schlepper (0020) T740 Fendt 718 Vario Grundschlepper (0030) C332 ProfiPlus Version (0040) M038 Kraftstoffvorfilt",
"created_at": "2026-10-14 12:11:20"
},
{
"listing_id": "7655517",
"listing_type": "dealer",
"url": "https://www.landwirt.com/detail/fendt-826-vario-s4-7655517",
"title": "Fendt 826 Vario S4",
"manufacturer": "Fendt",
"manufacturer_id": 385,
"model": null,
"group": "Landtechnik",
"group_id": 1,
"category": "Traktoren",
"category_id": 1,
"subcategory": "Standard Traktoren",
"subcategory_id": 24,
"condition": "used",
"condition_label": "Gebrauchtmaschinen",
"year": 2019,
"operating_hours": 4805,
"operating_hours_unit": "h",
"power_hp": 260,
"power_kw": 191.23,
"mileage": null,
"mileage_unit": null,
"price": null,
"currency": null,
"price_net": null,
"price_gross": null,
"price_entered_as": null,
"vat": null,
"vat_text": null,
"vat_rate_pct": null,
"price_on_request": true,
"price_previous": null,
"discount_pct": null,
"price_symbolic": false,
"price_converted": false,
"reserved": false,
"auction": false,
"seller_id": "5479",
"seller_name": "ZG Raiffeisen Technik GmbH - Gebrauchtmaschinenzentrum",
"seller_is_dealer": true,
"location_postcode": "77815",
"location_city": "Bühl",
"location_country_code": "DE",
"location_lat": 48.7197553,
"location_lng": 8.1194207,
"image": "https://static.landwirt.com/5479-205a5f821a900b9174ae1190a98d52d5-7655517-0vb.jpg",
"image_count": 22,
"has_video": false,
"description_preview": "Frontzapfwelle, gefederte Vorderachse, Zapfwellendrehzahl: 540/540E/1000/1000E Reifendruckregelanlage - Abgassystem: SCR / AdBlue - automatische Anhängekupplung - hydr",
"created_at": "2026-10-14 06:08:49"
}
]
}
}What the Landwirt.com API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search the dealer market or the private classifieds with the filters the source applies natively: free text, category, sub-category, manufacturer, condition, year of construction, operating hours, horsepower, price band, seller country and region. 1-100 rows a page. 🔴 The source's total stops at 10,000 (`total_is_capped`) and it serves at most 10,000 rows per query; exact per-category counts come from `categories`. | Pricing teams call search to search the dealer market or the private classifieds with the filters the source applies natively. | listing_type, query, group_id, category_id, subcategory_id, ... |
| detail | One listing in full by its id: manufacturer, model and series, year, operating hours, hp and kW, price net and gross with the VAT rate and the previous price, the full equipment list grouped the way the source groups it, every technical field the dealer typed (tyres, tread depth, spool valves …), all photos, the description, the location, and the seller block (dealer address, homepage, rating, contact person, phone as the source masks it). Private ads return the seller's own price in the seller's own currency next to the source's EUR value. | Marketplace operators call detail to get one listing in full by its id. | listing_id, listing_type, language |
| categories | The live category tree (group → category → sub-category) with exact listing counts for the dealer market or the private index — these counts are NOT capped at 10,000 like a search total — plus the condition split and the countries with their regions and counts. Ids feed `search`'s category_id / subcategory_id / group_id / region. | Catalog enrichment teams call categories to get the live category tree (group → category → sub-category) with exact listing counts for the de…. | listing_type, query, country, language |
| manufacturers | Manufacturers with live listing counts, optionally inside one category or sub-category — the ids `search` takes as manufacturer_id. 🔴 The source lists at most the 69 biggest manufacturers for a scope (`meta.truncated`); narrow by category to reach the long tail. | Retail analysts call manufacturers to get manufacturers with live listing counts, optionally inside one category or sub-category. | listing_type, category_id, subcategory_id, query, country, ... |
| dealer | One dealer's profile: address, region, country, coordinates, homepage, phone as the source masks it, year on Landwirt.com, listings online, rating and the reviews the page shows, opening hours, contact persons, other branches and awards. | Pricing teams call dealer to get one dealer's profile. | dealer_id, language |
| dealers | The dealer directory, 1-100 dealers a page, optionally by country or by part of the name, with address, coordinates and listings online. | Marketplace operators call dealers to get the dealer directory, 1-100 dealers a page, optionally by country or by part of the name, wit…. | country, query, page, limit, language |
Call search from your stack
curl -X POST https://api.reefapi.com/landwirt/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"fendt","subcategory_id":24,"year_min":2015,"sort":"newest"}'import requests
r = requests.post(
"https://api.reefapi.com/landwirt/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "fendt",
"subcategory_id": 24,
"year_min": 2015,
"sort": "newest"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/landwirt/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "fendt",
"subcategory_id": 24,
"year_min": 2015,
"sort": "newest"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.landwirt.search with {"query":"fendt","subcategory_id":24,"year_min":2015,"sort":"newest"}.Who uses this API and why
- Price a used tractor: narrow to a sub-category and manufacturer, a year window and an hours band, drop price_symbolic rows, and compare gross prices that all mean the same thing.
- Watch new stock: sort by newest inside a category and country and poll — every row carries the dealer, the town and coordinates.
- Source across borders: the same filters over Austrian, German, Swiss and Italian dealers, with the VAT rate on every row so net and gross never get mixed.
- Build a filter UI from live data: categories returns the group, category and sub-category tree with exact counts, manufacturers the ids, and both are what the search filters take.
- Map the dealer network: dealers lists dealers by country with address, coordinates and listings online, and dealer adds their rating, reviews, contacts and other branches.
Questions developers ask before integrating
Is the price net or gross?
price is the gross — the number the listing page prints as its headline and in its structured data — on every row, whatever the dealer typed. price_net is the net, price_gross repeats the gross, vat_rate_pct is the rate (19 for Germany, 20 for Austria, 8.1 for Switzerland in the rows measured) and price_entered_as says whether the dealer typed net or gross. Checked against the listing's own page on 12 listings across seven categories and both indexes: 48 of 48 comparisons agreed.
Why do some machines cost 1 euro?
Because the dealer typed 1 as a stand-in for 'ask us', and the marketplace prints it as 1 €. These listings sort first when you order by price: 8 of the first 100 tractors by ascending price were under 10 euros. They are returned as published with price_symbolic: true, so you can drop them from an average without losing the listing. Real 'price on request' listings come back with price null and price_on_request: true.
Does a price filter include price-on-request listings?
No. The marketplace stores 'price on request' as 0, so a price range starting at 0 would quietly mix every one of them in — for tractors, a 0 to 50,000 range is 6,058 listings and 1 to 50,000 is 3,762. A price filter here always starts at 1. Hours and horsepower filters work the same way: they return only listings that state hours or horsepower. One thing to know: the marketplace compares the price the way the dealer typed it, so a dealer who typed a net price can appear slightly above your price_max in gross terms; every price-filtered call says so in meta.warnings.
How many results can one query return?
Up to 10,000 rows, 6 to 100 per page. The marketplace's own total also stops at 10,000 — an unfiltered tractor search says 10,000 while the category tree says 10,862 — so search marks that with total_is_capped and categories gives the exact per-category counts. A call that would page past 10,000 rows is refused with a clear message rather than returning nothing.
What is the difference between dealer and private listings?
listing_type=dealer reads the machinery market of commercial dealers, with a condition (used, demo, new or rental), net and gross price and a full dealer profile. listing_type=private reads private classified ads, which carry the seller's own price and currency, a price option such as 'Preis auf Anfrage', and the date the ad went up. The private index also holds livestock, feed and jobs, so pass group_id=1 to keep to agricultural machinery. detail takes the listing_id and listing_type from any search row as they are.
Which countries are covered?
Mostly Austria and Germany, then Switzerland, Italy, Slovenia and a long tail across Europe; the directory lists dealers in 24 countries. Filter with country (ISO code such as AT, DE or CH) and region by its own name (Bayern, Oberösterreich, Bern). categories lists the countries and their regions with live counts for any query.
Are Swiss prices in francs?
The marketplace shows Swiss dealer prices in euros, converted by itself, and does not offer the original franc figure. Those rows carry price_converted: true. The search index and the listing page can hold slightly different conversions — on six Swiss listings the search row was exactly 1 euro below the detail record — so use detail when you need the figure to the euro. Private ads do carry the seller's own currency, with price_eur beside it.
How fast is it?
One upstream request per call — two only for a private ad looked up without its listing_type. Over two identical runs of 27 calls across all six actions, every call returned what it should, with a median of 1.2 seconds and the slowest single call 2.4 seconds.
What is the Landwirt.com API?
Landwirt.com API is a ReefAPI endpoint group for the austrian, german and swiss farm-machinery market as json: ~85,000 dealer listings and ~50,000 private ads with manufacturer, model, year, operating hours, horsepower, the gross and net price with its vat rate, and the dealer behind every machine. It returns live JSON through POST requests under /landwirt/v1.
Is the Landwirt.com API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Landwirt.com calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Landwirt.com login or account?
No login to Landwirt.com is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Landwirt.com data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Landwirt.com API use?
Landwirt.com actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Landwirt.com from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call landwirt actions with the same key, credit pool and JSON envelope used by normal REST requests.