# Landwirt.com API — live agricultural machinery and tractor listings from Austria, Germany and Switzerland's farm-machinery marketplace: ~1,300 dealers plus private classified ads. Search by manufacturer, model, category, year of construction, operating hours, horsepower, price band, condition (used / demo / new / rental) and seller country and region; then pull one listing in full: price net and gross with its VAT rate, the equipment list, the dealer's technical fields, every photo, the description, and the dealer's address, rating and profile. Plus the live category tree with exact counts, manufacturer lists and the dealer directory. No login, no key.

> 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`.
> ReefAPI engine `landwirt` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/landwirt/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/landwirt/v1/search — 2 credits
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`.

**Parameters:**
- `listing_type` (enum, optional, default "dealer") — Which side of the marketplace to read. 'dealer' = the machinery market of ~1,300 commercial dealers (used, demo, new and rental machines; the bulk of the machinery). 'private' = private classified ads; that index also carries livestock, feed and jobs, so pass group_id=1 for farm machinery only. [one of: dealer, private]
- `query` (string, optional) — Free text as typed into the site's search box: a manufacturer, a model, a machine type ('Mähdrescher', 'Rundballenpresse') or any word in the listing.
- `group_id` (enum, optional) — Top-level market group. Use 1 (agricultural machinery) to keep livestock, feed and jobs out of a private-index search. [one of: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
- `category_id` (integer, optional) — Category id from the `categories` action (e.g. 1 = Traktoren / tractors).
- `subcategory_id` (integer, optional) — Sub-category id from the `categories` action (e.g. 24 = Standard Traktoren).
- `manufacturer_id` (integer, optional) — Manufacturer id from the `manufacturers` action (e.g. 385 = Fendt). Search rows carry the same id as `manufacturer_id`.
- `condition` (enum, optional) — Dealer listings only: used, demo, new or rental. Private ads have no such field and the parameter is rejected for listing_type=private. [one of: used, demo, new, rental]
- `year_min` (integer, optional) — Earliest year of construction (inclusive).
- `year_max` (integer, optional) — Latest year of construction (inclusive).
- `operating_hours_min` (integer, optional) — Fewest operating hours (inclusive).
- `operating_hours_max` (integer, optional) — Most operating hours (inclusive). Any hours filter returns only listings that state their hours (the source stores 'not given' as 0).
- `power_hp_min` (integer, optional) — Lowest engine power in horsepower (PS), inclusive.
- `power_hp_max` (integer, optional) — Highest engine power in horsepower (PS), inclusive. Any power filter returns only listings that state their power.
- `price_min` (integer, optional) — Lowest price in EUR (inclusive). 🔴 The source compares the price as the dealer typed it — net for dealers who enter net prices — so a row's gross `price` can exceed a bound by up to the VAT rate (measured: price_max=9 returned 3 rows at 9.52 gross / 8 net out of 11).
- `price_max` (integer, optional) — Highest price in EUR (inclusive), compared like price_min. Any price filter excludes price-on-request listings (the source stores them as 0 and would otherwise mix them in); placeholder prices of 1 € stay in, flagged price_symbolic.
- `country` (string, optional) — Seller country, ISO-3166 two-letter code (AT, DE, CH, IT, SI, …). A code with no listings is an honest empty answer (total 0), never the whole catalogue.
- `region` (string, optional) — Region / federal state NAME as the source spells it (Bayern, Oberösterreich, Steiermark, Bern …), together with `country`. The `categories` action lists the regions per country with counts.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, newest, oldest, price_asc, price_desc, year_desc, year_asc, hours_asc, hours_desc, power_desc, power_asc]
- `page` (integer, optional, default 1) — Page number. The source serves at most 10,000 rows per query (page × limit ≤ 10,000; page 501 at limit 20 is refused), so narrow instead of paging deeper.
- `limit` (integer, optional, default 20) — Rows per page, 6-100 (the source refuses fewer than 6).
- `include_facets` (boolean, optional, default false) — Also return the live facet counts for this query (manufacturers, categories, countries/regions, condition). Adds ~30 KB.
- `language` (enum, optional, default "de") — Language of the category, condition and VAT labels the source returns. The listing itself (title, description) is the seller's own text in the seller's language. [one of: de, en, fr, it]

**Returns:** listings[]: listing_id, listing_type (dealer|private), url, title, manufacturer, manufacturer_id, model, group, group_id, category, category_id, subcategory, subcategory_id, condition (used|demo|new|rental|private_classified), condition_label, year, operating_hours, operating_hours_unit, power_hp, power_kw, mileage, mileage_unit, price (the gross price the site prints as its headline), currency, price_net, price_gross, price_entered_as (net|gross — which one the dealer typed), vat (included|not_applicable), vat_text, vat_rate_pct, price_on_request, price_previous, discount_pct, price_symbolic (true when the price is below 10 — dealers type 1 € as 'ask us'), price_converted (true when a non-euro dealer's price was converted to EUR by the source), reserved, auction, seller_id, seller_name, seller_is_dealer, location_postcode, location_city, location_country_code, location_lat, location_lng, image, image_count, has_video, description_preview, created_at (private ads; null for dealer rows) and price_option (private ads: 'Preis', 'VB', 'Preis auf Anfrage'). meta: total, total_is_capped, pagination{page, limit, last_page, has_more, retrievable_max}, filters_applied, warnings, facets (when include_facets).

**Example request body:**
```json
{
  "query": "fendt",
  "subcategory_id": 24,
  "year_min": 2015,
  "sort": "newest"
}
```

### POST https://api.reefapi.com/landwirt/v1/detail — 1 credit
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.

**Parameters:**
- `listing_id` (string, required) — The `listing_id` of a search row, passed as is.
- `listing_type` (enum, optional) — The `listing_type` of the search row. If omitted, the dealer market is tried first and then the private index (one extra request when the id is a private ad). [one of: dealer, private]
- `language` (enum, optional, default "de") — Language of the category, condition and VAT labels the source returns. The listing itself (title, description) is the seller's own text in the seller's language. [one of: de, en, fr, it]

**Returns:** listing{} with the search-row fields plus model_series, reference_number, description, equipment[{group, value}], specs[{key, label, value}], images[], location{}, seller{}, contact{} (dealer listings), services[], and for private ads price_eur, price_option, created_at, updated_at.

**Example request body:**
```json
{
  "listing_id": "7652733",
  "listing_type": "dealer"
}
```

### POST https://api.reefapi.com/landwirt/v1/categories — 2 credits
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.

**Parameters:**
- `listing_type` (enum, optional, default "dealer") — Which side of the marketplace to read. 'dealer' = the machinery market of ~1,300 commercial dealers (used, demo, new and rental machines; the bulk of the machinery). 'private' = private classified ads; that index also carries livestock, feed and jobs, so pass group_id=1 for farm machinery only. [one of: dealer, private]
- `query` (string, optional) — Free text as typed into the site's search box: a manufacturer, a model, a machine type ('Mähdrescher', 'Rundballenpresse') or any word in the listing.
- `country` (string, optional) — Seller country, ISO-3166 two-letter code (AT, DE, CH, IT, SI, …). A code with no listings is an honest empty answer (total 0), never the whole catalogue.
- `language` (enum, optional, default "de") — Language of the category, condition and VAT labels the source returns. The listing itself (title, description) is the seller's own text in the seller's language. [one of: de, en, fr, it]

**Returns:** categories[] (tree: id, name, slug, level, parent_id, count, children[]), conditions[], countries[{country_code, name, count, regions[]}].

**Example request body:**
```json
{
  "listing_type": "dealer"
}
```

### POST https://api.reefapi.com/landwirt/v1/manufacturers — 2 credits
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.

**Parameters:**
- `listing_type` (enum, optional, default "dealer") — Which side of the marketplace to read. 'dealer' = the machinery market of ~1,300 commercial dealers (used, demo, new and rental machines; the bulk of the machinery). 'private' = private classified ads; that index also carries livestock, feed and jobs, so pass group_id=1 for farm machinery only. [one of: dealer, private]
- `category_id` (integer, optional) — Category id from the `categories` action (e.g. 1 = Traktoren / tractors).
- `subcategory_id` (integer, optional) — Sub-category id from the `categories` action (e.g. 24 = Standard Traktoren).
- `query` (string, optional) — Free text as typed into the site's search box: a manufacturer, a model, a machine type ('Mähdrescher', 'Rundballenpresse') or any word in the listing.
- `country` (string, optional) — Seller country, ISO-3166 two-letter code (AT, DE, CH, IT, SI, …). A code with no listings is an honest empty answer (total 0), never the whole catalogue.
- `language` (enum, optional, default "de") — Language of the category, condition and VAT labels the source returns. The listing itself (title, description) is the seller's own text in the seller's language. [one of: de, en, fr, it]

**Returns:** manufacturers[{manufacturer_id, name, slug, count}]

**Example request body:**
```json
{
  "category_id": 1
}
```

### POST https://api.reefapi.com/landwirt/v1/dealer — 1 credit
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.

**Parameters:**
- `dealer_id` (string, required) — Dealer id: `seller_id` of a dealer search row, `seller.dealer_id` of a detail, or `dealer_id` of `dealers`.
- `language` (enum, optional, default "de") — Language of the category, condition and VAT labels the source returns. The listing itself (title, description) is the seller's own text in the seller's language. [one of: de, en, fr, it]

**Returns:** dealer{dealer_id, name, url, street, postcode, city, region, country, country_code, lat, lng, homepage, phone_masked, description, on_landwirt_since, listings_online, review_rating, reviews[], opening_hours[], services[], other_branches[], contacts[], awards[], logo, more_listings[]}

**Example request body:**
```json
{
  "dealer_id": "3561"
}
```

### POST https://api.reefapi.com/landwirt/v1/dealers — 1 credit
The dealer directory, 1-100 dealers a page, optionally by country or by part of the name, with address, coordinates and listings online.

**Parameters:**
- `country` (enum, optional) — Dealer country, ISO-3166 two-letter code (the countries the directory itself lists). [one of: AT, BA, BE, BG, CH, CZ, DE, DK, EE, FR, GB, HR, HU, IT, LV, NL, NO, PL, RO, RS, SE, SI, SK, UA]
- `query` (string, optional) — Part of the dealer's name.
- `page` (integer, optional, default 1) — Page number. The source serves at most 10,000 rows per query (page × limit ≤ 10,000; page 501 at limit 20 is refused), so narrow instead of paging deeper.
- `limit` (integer, optional, default 20) — Rows per page, 6-100 (the source refuses fewer than 6).
- `language` (enum, optional, default "de") — Language of the category, condition and VAT labels the source returns. The listing itself (title, description) is the seller's own text in the seller's language. [one of: de, en, fr, it]

**Returns:** dealers[{dealer_id, name, url, street, postcode, city, region, country, country_code, lat, lng, listings_online, on_landwirt_since, is_premium, logo}]; meta.total, meta.pagination.

**Example request body:**
```json
{
  "country": "AT"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=landwirt
- Human docs page: https://reefapi.com/docs/landwirt
- Overview page: https://reefapi.com/landwirt-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
