Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Maschinensucher API page →
E-commerce & Marketplaces

Maschinensucher API & Scraper

The Maschinensucher API turns Europe's largest used industrial machinery marketplace into JSON in seven actions.

7 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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 walks the whole catalogue with the filters the source itself supports: machine type, manufacturer, model, year of construction, hour meter, condition, functionality, seller country and region, price band, rental-only and whether a price is published at all, sorted by cheapest, newest year, newest listing or latest update. detail returns one listing in full, including every further property the dealer filled in, each with its own label, parsed number and unit. categories returns the 41 sectors and their children with live counts, facets returns the source's own counts for every manufacturer, country, region and condition that has stock for your query, suggest turns a half-typed word into values the filters will accept, and dealers and seller cover the supply side: company name, street, postcode, town, country, region, how long they have been on the marketplace and how many listings they have online, 100 a page. The field that makes this worth an API rather than a scraper is the price, because here a price is three facts and not one: price, currency, incoterm, price_type and vat come back as separate fields with the source's own wording beside them, so EXW VB zzgl. MwSt. is readable instead of being a string. An auction's opening bid is returned as auction_start_price and never as an asking price, and price on request is its own state, price_on_request true with price null, because 122 of 313 listings in one measured sweep carry no price and treating that as missing loses the fact that there is a machine there to ask about. Two things the site prints are deliberately not returned: the distance, because it is computed from the location of whoever made the call and is therefore a property of our server rather than of the machine, and one machine-generated line injected into every description and re-randomised on every render, which is removed with description_decoy_lines_removed saying how many lines were taken out. One ReefAPI key, the standard { ok, data, meta, error } envelope, no Maschinensucher account.

Reference

The five price fields, and why one number would be wrong

A used-machine price on this marketplace is not comparable until you know its VAT treatment and its incoterm. Measured 2026-10-08.

fieldwhat it holdswhy it is separate
pricethe number, or nullnull is not missing data: see price_on_request
currencythe currency the dealer quotedthe source does not convert; the same listing is the same number on all six hosts
incotermEXW and the rest, as the dealer set ita price ex works and a delivered price are not the same offer
price_typeasking, negotiable, auction startan auction opening bid is never an asking price
vatwhether VAT is included, excluded or not applicablethe single biggest source of false comparables

price_on_request is its own boolean, true on 122 of 313 listings in one measured sweep, with price null beside it. auction_start_price is a separate field so an opening bid cannot be read as an asking price.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/maschinensucher/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "bagger",
    "market": "de",
    "page": 1
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "maschinensucher",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 657.3,
    "record_count": 25,
    "bytes": 810289,
    "cache_hit": false,
    "market": "de",
    "host": "www.maschinensucher.de",
    "label_language": "de",
    "total": 1155,
    "total_is_rounded": false,
    "rows": 25,
    "pagination": {
      "page": 1,
      "page_size": 25,
      "last_page": 8,
      "retrievable_max": 200,
      "has_more": true,
      "note": "the source serves at most 8 pages (200 rows) per query however large `total` is, and answers HTTP 404 past that rather than repeating the last page"
    },
    "filters_applied": {
      "query": "bagger",
      "sort": "relevance"
    },
    "charged_credits": 3,
    "version": "1.0.0",
    "request_id": "b9f1100eb48044d3",
    "queue_ms": 1.2,
    "fetched_at": "2026-10-08T11:33:18.644Z"
  },
  "data": {
    "listings": [
      {
        "listing_id": "22841195",
        "url": "https://www.maschinensucher.de/o%26k+mh+plus--mit+diversem+zubeh%C3%B6r/i-22841195",
        "listing_type": "classified",
        "machine_type": "Bagger",
        "manufacturer": "O&K MH Plus",
        "model": "-mit diversem Zubehör",
        "year": 1995,
        "condition": "gebraucht",
        "functionality": "voll funktionsfähig",
        "operating_hours": 10567,
        "operating_hours_unit": "h",
        "mileage": null,
        "mileage_unit": null,
        "price": 19900,
        "currency": "EUR",
        "price_display": "19.900 €",
        "price_on_request": false,
        "price_previous": null,
        "price_previous_display": null,
        "price_terms": "EXW VB zzgl. MwSt.",
        "price_type": "negotiable",
        "vat": "excluded",
        "incoterm": "EXW",
        "location_city": "Extertal",
        "location_country": "Deutschland",
        "location_country_code": "DE",
        "image": "https://cdn.machineseeker.com/data/listing/img/vga/ms/43/03/22841195-01.jpg?v=1790680633",
        "image_count": 24,
        "seller_has_trust_seal": false,
        "specs": [
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          },
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          },
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          }
        ],
        "discount_pct": null,
        "description_preview": "Wir verkaufen einen Mobil Bagger O&K MH PLUS Bj. 1995\nmit diversem Zubehör\nBetriebsstundenzähler steht auf 10567\nReifen wurden vor ca. 4 J. neu gekauft, kaum Abnutzung zu sehen.\nDiv. Hydraulikschläuche sind neu gemacht. Siehe Fotos.\nBagger wird äußert selten genutzt und steht immer in überdachter Halle.\nTieflöffel : ca. 30 cm\nTieflöffel : ca. 80 cm\nGrabenlöffel : ca. 200 cm\nDer Bagger muss vor Ort abgeholt werden",
        "description_decoy_lines_removed": 1
      },
      {
        "listing_id": "21924313",
        "url": "https://www.maschinensucher.de/liebherr-a+312+bagger+deutsch+top/i-21924313",
        "listing_type": "classified",
        "machine_type": "Mobilbagger",
        "manufacturer": "LIEBHERR",
        "model": "A 312 Bagger Deutsch Top",
        "year": 1994,
        "condition": "gebraucht",
        "functionality": null,
        "operating_hours": 8143,
        "operating_hours_unit": "h",
        "mileage": null,
        "mileage_unit": null,
        "price": 16900,
        "currency": "EUR",
        "price_display": "16.900 €",
        "price_on_request": false,
        "price_previous": null,
        "price_previous_display": null,
        "price_terms": "Festpreis zzgl. MwSt.",
        "price_type": "fixed",
        "vat": "excluded",
        "incoterm": null,
        "location_city": "Peine",
        "location_country": null,
        "location_country_code": "DE",
        "image": "https://cdn.machineseeker.com/data/listing/img/vga/ms/02/27/21924313-01.jpg?v=1778715062",
        "image_count": 6,
        "seller_has_trust_seal": false,
        "specs": [
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          },
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          },
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          }
        ],
        "discount_pct": null,
        "description_preview": "* Dachluke\n* Fahrerschwingsitz\n* Rangiermaul\n* Standheizung\n* Kriechgang\n----Aufbau: ROPS Fahrerkabine beheizt, Motor: Waasergekühlter 4 Zylinder Deutz DieselmotorTyp 1012, 65 KW, Allradantrieb, Fahrgeschwindigkeit 20 km/h, 8-fach Bereifung, Spurbreite ca. 2.530mm, Planierschild 2500/600mm, hydraulische Achsabstützung, mechanisches Schnellwechselsystem, Verstellausleger, Hammer + Greiferverrohrung (7 Hydraulikanschlüsse), Baggerlöffel 1000mm/634 ltr\nVerkauf nur an Gewerbetreibende. BEI EXPORT IST NUR DER NETTOPREIS ZU BEZAHLEN !!!!! ALLE ANGABEN OHNE GEWÄHR INS. AUSSTATTUNG+ZUBEHÖR.Grundlage a",
        "description_decoy_lines_removed": 1
      },
      {
        "listing_id": "22292817",
        "url": "https://www.maschinensucher.de/rohr+bagger+gmbh-schwimmgreifer+rs+8%2C0%2F280-g/i-22292817",
        "listing_type": "classified",
        "machine_type": "Schwimmgreifer RS 8,0/280-G",
        "manufacturer": "Rohr Bagger GmbH",
        "model": "Schwimmgreifer RS 8,0/280-G",
        "year": null,
        "condition": "gebraucht",
        "functionality": "voll funktionsfähig",
        "operating_hours": null,
        "operating_hours_unit": null,
        "mileage": null,
        "mileage_unit": null,
        "price": null,
        "currency": null,
        "price_display": null,
        "price_on_request": true,
        "price_previous": null,
        "price_previous_display": null,
        "price_terms": null,
        "price_type": null,
        "vat": null,
        "incoterm": null,
        "location_city": "Bautzen",
        "location_country": "Deutschland",
        "location_country_code": "DE",
        "image": "https://cdn.machineseeker.com/data/listing/img/vga/ms/73/57/22292817-01.jpg?v=1783539248",
        "image_count": 1,
        "seller_has_trust_seal": false,
        "specs": [
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          },
          {
            "label": "[trimmed-depth]",
            "key": "[trimmed-depth]",
            "value": "[trimmed-depth]",
            "number": "[trimmed-depth]",
            "unit": "[trimmed-depth]"
          }
        ],
        "discount_pct": null,
        "description_preview": "Rohr Schwimmgreifer Bagger Anlage komplett mit Schwimmbänder\nHersteller Rohr Bagger GmbH\nTyp RS 8,0/280-G\nGrundbaujahr 1992\nGreiferinhalt 8 m³\nKatzenfahrwerk mit Hubwerk und Gegengewichten\nHydraulikgreifer\nKratzrost mit Überkornrutsche\nPendelaufgeber\nEntwässerungssieb Svedala Bj, 1998 Typ H2PP 6000x 2500\nBaggeraustrageband Fa. Bleichert Rohr Bj. 1996 Typ TRV 9.1/1000\nTrafostation\nFa. Schneider Bj. 1996 Typ TS 61440,800 kVA\nSchwimmbandanlage\nBaujahr 1992\nGesamtlänge ca. 250 m Gurt 800 mm\nSchute /Überkornschute Baujahr 2005 15 mx 5 m x 2,75 m Laderaum 40m³ ca. 45 t",
        "description_decoy_lines_removed": 1
      }
    ]
  }
}
Actions

What the Maschinensucher API does

ActionDescriptionConcrete use caseKey params
searchSearch or browse the marketplace. Combine a keyword with any of the typed filters the source supports natively — category, manufacturer, machine type, condition, price band, year of construction, operating hours, seller country and region, rental-only, price-published-only — and sort by price, year, listing date or update. Returns up to 25 rows a page with the price (and its VAT and incoterm wording), year, operating hours, condition, seller country and every property the result card prints. 🔴 Depth is capped by the source at 8 pages = 200 rows per query, so narrow rather than page; the filters are measured to bite hard (1,157 rows → 123 by manufacturer, → 269 by a 6-year window, → 178 by an operating-hour band).Pricing teams call search to search or browse the marketplace.market, query, category_id, manufacturer, machine_type, ...
detailOne listing in full, by id. Returns the machine (type, manufacturer, model, year, condition, functionality, operating hours), the price with its previous price, VAT treatment and incoterm, every technical property the seller typed — grouped the way the source groups them, each with a parsed number and unit — the boolean equipment badges, the delivery block (availability, delivery terms, dismantling, pickup and shipping costs), the payment block (an auction's buyer's premium, payment terms and methods), the offer block (listing code, reference number, last update), the seller's town, country, member-since year, listings online and trust seal, the geo coordinates the page's own map uses, the category breadcrumb and every gallery image. The price is cross-checked against the page's own schema.org product data and any disagreement is reported, not hidden.Marketplace operators call detail to get one listing in full, by id.listing_id, market
categoriesThe marketplace's own category tree with live per-category listing counts: the 45 top-level sectors (metalworking & machine tools, woodworking, construction plant, forklifts, food technology, packaging, agricultural…) with the numeric ids every other action's `category_id` takes. Pass a `category_id` to drill into that sector's sub-categories, which is how you get from 7,593 construction machines to the 803 excavators or the 2,049 access platforms. Every count is the source's own live figure, not an estimate.Catalog enrichment teams call categories to get the marketplace's own category tree with live per-category listing counts.market, category_id
facetsThe source's own live filter counts for a query: which categories, manufacturers, countries, regions and conditions have stock and how much, plus the distance bands. This is how you learn the exact spelling a filter wants (the source is case-sensitive and wants region NAMES, not codes) and how to narrow a query that is deeper than the 200-row retrievable ceiling. The source publishes its top 15 per group.Retail analysts call facets to get the source's own live filter counts for a query.market, query, category_id, manufacturer, machine_type, ...
suggestThe site's own autocomplete for a typed prefix, in four buckets: machine types, manufacturers, categories (with their numeric ids) and products. Use it to turn whatever a user typed into values the `machine_type`, `manufacturer` and `category_id` filters accept, instead of guessing a spelling the source would silently drop.Pricing teams call suggest to get the site's own autocomplete for a typed prefix, in four buckets.query, market, category_id
dealersThe dealer directory for one category: the machinery dealers themselves, 100 a page, each with company name, street, postcode, town, country and region, plus the dealer id the `seller` action takes. This is the supplier-side view of the marketplace — the site's own figure is over 8,100 dealers.Marketplace operators call dealers to get the dealer directory for one category.category_id, market, page, sort
sellerOne dealer's public profile by id: company name, contact address (street, postcode, town, region, country), their own description of the business, the machine categories and manufacturer ranges they deal in, and the site's trust seal. 🔴 The listing list on a dealer's page is login-walled placeholder markup — every card there carries the dealer's own name as its title and no price — so it is deliberately not returned; use `search` for real listings.Catalog enrichment teams call seller to get one dealer's public profile by id.dealer_id, market
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/maschinensucher/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"bagger","market":"de","page":1}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.maschinensucher.search with {"query":"bagger","market":"de","page":1}.
Use cases

Who uses this API and why

  • Price a machine you are about to buy or sell: pull one manufacturer and model inside a year window and an hour-meter band, and compare prices that mean the same thing because each comparable carries its own VAT treatment and incoterm.
  • Source machines across Europe: filter by seller country and region, condition, price band or rental-only, then use the dealers action to get the suppliers themselves with their postal addresses, 100 a page.
  • Watch a market: sort by newest listing and poll a narrow query to see what comes on, with the last-updated date on every listing and a clean NOT_FOUND when one disappears.
  • Build a filter UI without guessing: facets returns the source's own live counts for every category, manufacturer, country, region and condition that has stock for your query, and suggest turns whatever a user typed into values the filters will accept.
FAQ

Questions developers ask before integrating

Can I filter by year of construction?

Yes, and this is the one filter worth knowing about before you build: the source takes a UNIX timestamp, not a year. A bare year returns HTTP 200, prints a (0) headline and serves 25 rows with no year at all, which is the shape of an answer that silently ignored you. The API converts, so the filter bites exactly: excavators go from 1,157 listings to 269 for 2015-2020, to 178 when you add under 2,000 hours, to 123 when you add Caterpillar only.

What happens if I send a filter value the source does not know?

You get a clear error instead of the wrong answer. The source silently drops a value it does not recognise, answers HTTP 200, prints 0 results and then serves the unfiltered catalogue, so every enum is checked before the request leaves. And because the source's own counter is the thing that breaks in that case, a total of 0 served alongside real rows is reported as null with a warning rather than as a count.

How many rows can I get for one query?

200, and the API says so rather than letting you page into nothing: 25 a page, up to 8 pages, pagination.retrievable_max is 200, has_more is honest and asking for page 9 is an error with the reason in it. The way deeper is to narrow, which is why the filters are the part of this API measured hardest.

Which markets are supported, and does the price change between them?

Six hosts: de, at and ch with German labels, com, gb and ie with English ones. They are one shared catalogue, the same listing id answers on all six, and the price is the same number in the same currency on every one of them including machineseeker.co.uk, because the site does not convert currency. So market picks the LANGUAGE of the labels, not a different inventory. The wider Machineseeker network has fifty more hosts; they answer MARKET_UNAVAILABLE rather than returning fields whose labels this API cannot name.

Is there a distance to the machine?

No, deliberately. The site prints a distance for every listing computed from the viewer's own location, which for an API means the location of whichever server made the call: 6,618 km and 41 km for the same listing, depending on the exit. It is a property of our infrastructure, not of the machine, so it is not a field and there is no distance sort. The odometer, which IS a property of the machine, comes back as mileage and is kept separate from operating_hours.

Are the hour meter and the odometer the same field?

No. operating_hours is the hour meter with its unit, mileage is the odometer with its unit, and a machine can carry one, both or neither. Both are parsed numbers rather than strings, and every further property the dealer filled in comes back the same way: label, parsed number, unit.

What do I get about the dealer?

Business-level information and nothing personal: company name, street, postcode, town, country, region, how long they have been on the marketplace, how many listings they have online and whether they carry the site's trust seal. Contact names, phone numbers and e-mail addresses are not returned. The dealers action gives you the supply side directly, 100 a page for any category.

Is the total number of listings reliable?

For a filtered query, yes. With no filter at all the source reports a round 200,000 rather than a count, and that is flagged as total_is_rounded instead of being published as a measurement. One more honesty detail: a multi-word query WIDENS rather than narrows, because the source matches any one of the words, which was measured at 67,890 rows.

Do the descriptions come back clean?

Yes. The source injects one machine-generated line into every description and re-randomises it on every render. It is removed, and description_decoy_lines_removed tells you how many lines were taken out, so you can tell a cleaned description from an untouched one.

How fast is it, and how reliable?

One upstream request per call, median latency about 0.9 s, and 20 of 20 successful over a full run across all seven actions on plain datacentre exits. There is no wall on any axis here: no impersonation and no user-agent were needed, and datacentre and residential exits answered the same.

What is the Maschinensucher API?

Maschinensucher API is a ReefAPI endpoint group for europe's largest used industrial machinery marketplace as json: 200,000 listings from 8,100+ dealers across 41 sectors, each with year of construction, hour meter, condition and a price that carries its vat treatment and incoterm. It returns live JSON through POST requests under /maschinensucher/v1.

Is the Maschinensucher API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Maschinensucher calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Maschinensucher login or account?

No login to Maschinensucher 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 Maschinensucher data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

docs / maschinensucher

Maschinensucher

Europe's largest used industrial machinery marketplace as JSON: 200,000 listings from 8,100+ dealers across 41 sectors, each with year of construction, hour meter, condition and a price that carries its VAT treatment and incoterm.

base /maschinensucher/v17 endpoints
post/maschinensucher/v1/detail3 credits

One listing in full, by id. Returns the machine (type, manufacturer, model, year, condition, functionality, operating hours), the price with its previous price, VAT treatment and incoterm, every technical property the seller typed — grouped the way the source groups them, each with a parsed number and unit — the boolean equipment badges, the delivery block (availability, delivery terms, dismantling, pickup and shipping costs), the payment block (an auction's buyer's premium, payment terms and methods), the offer block (listing code, reference number, last update), the seller's town, country, member-since year, listings online and trust seal, the geo coordinates the page's own map uses, the category breadcrumb and every gallery image. The price is cross-checked against the page's own schema.org product data and any disagreement is reported, not hidden.

ParameterAllowed / rangeDescription
listing_idrequired—The listing id, as returned in `listing_id` on every search row, as the last path segment of a listing URL (…/sany-sy265c/i-22811490) or as the 'Inserat-ID / Listing ID' the page prints with an A in front (A22811490). All three forms and a full URL are accepted. A dead id answers NOT_FOUND, never an empty success.
market = deoptionalde · at · ch · com · gb · ieWhich Machineseeker host to read. 🔴 This picks the LANGUAGE of the labels, not a different catalogue: the listings are one shared pool and the price is the same number in the same currency on every host (measured: listing 22811490 is EUR 49,900 on all six, machineseeker.co.uk included — the site does not convert currency). Use 'de' for German wording and 'com' for English wording. The wider Machineseeker network has 50+ further hosts; only these six have their label vocabulary measured and mapped here, so the others answer MARKET_UNAVAILABLE rather than returning fields this engine cannot name.
Try in playground →
post/maschinensucher/v1/categories1 credit

The marketplace's own category tree with live per-category listing counts: the 45 top-level sectors (metalworking & machine tools, woodworking, construction plant, forklifts, food technology, packaging, agricultural…) with the numeric ids every other action's `category_id` takes. Pass a `category_id` to drill into that sector's sub-categories, which is how you get from 7,593 construction machines to the 803 excavators or the 2,049 access platforms. Every count is the source's own live figure, not an estimate.

ParameterAllowed / rangeDescription
market = deoptionalde · at · ch · com · gb · ieWhich Machineseeker host to read. 🔴 This picks the LANGUAGE of the labels, not a different catalogue: the listings are one shared pool and the price is the same number in the same currency on every host (measured: listing 22811490 is EUR 49,900 on all six, machineseeker.co.uk included — the site does not convert currency). Use 'de' for German wording and 'com' for English wording. The wider Machineseeker network has 50+ further hosts; only these six have their label vocabulary measured and mapped here, so the others answer MARKET_UNAVAILABLE rather than returning fields this engine cannot name.
category_idoptional1–Browse one category instead of searching, using the site's own numeric category id (105 = excavators, 43 = lathes, 42 = forklifts, 13 = packaging machines, 2 = metalworking & machine tools). Works for leaf categories too, not only the 40-odd top ones. Get the ids from the `categories` action or from any `ci-<id>` URL. Can be combined with `query` and every filter.
Try in playground →
post/maschinensucher/v1/facets2 credits

The source's own live filter counts for a query: which categories, manufacturers, countries, regions and conditions have stock and how much, plus the distance bands. This is how you learn the exact spelling a filter wants (the source is case-sensitive and wants region NAMES, not codes) and how to narrow a query that is deeper than the 200-row retrievable ceiling. The source publishes its top 15 per group.

ParameterAllowed / rangeDescription
market = deoptionalde · at · ch · com · gb · ieWhich Machineseeker host to read. 🔴 This picks the LANGUAGE of the labels, not a different catalogue: the listings are one shared pool and the price is the same number in the same currency on every host (measured: listing 22811490 is EUR 49,900 on all six, machineseeker.co.uk included — the site does not convert currency). Use 'de' for German wording and 'com' for English wording. The wider Machineseeker network has 50+ further hosts; only these six have their label vocabulary measured and mapped here, so the others answer MARKET_UNAVAILABLE rather than returning fields this engine cannot name.
queryoptional—Free-text keyword, exactly as typed into the site's own search box: a machine type ('bagger', 'drehmaschine', 'excavator'), a manufacturer, a model, or several words. Either `query` or `category_id` is the normal starting point; calling with neither walks the whole catalogue, and `meta.total` will say so. 🔴 A MULTI-WORD QUERY WIDENS, IT DOES NOT NARROW: the source splits on spaces and hyphens and matches any token, so adding words adds results. Measured on one run: 'machine' 64,678 · 'anywhere' 142 · 'zzz' 4 · and 'zzz-no-such-machine-anywhere-xyz' 67,890, roughly their union. A single unmatched word is an honest empty answer ('xyzzyplughfoo' → total 0, zero rows). To narrow, use `category_id`, `machine_type`, `manufacturer` or `description_contains` rather than a longer phrase.
category_idoptional1–Browse one category instead of searching, using the site's own numeric category id (105 = excavators, 43 = lathes, 42 = forklifts, 13 = packaging machines, 2 = metalworking & machine tools). Works for leaf categories too, not only the 40-odd top ones. Get the ids from the `categories` action or from any `ci-<id>` URL. Can be combined with `query` and every filter.
manufactureroptional—Manufacturer, spelled exactly as the source's own facet spells it ('Caterpillar', 'Liebherr', 'Komatsu', 'Wacker Neuson', 'DOOSAN' — the case is the source's). Pass a comma-separated list or a JSON array for several. Read the available spellings out of `facets.manufacturers` on an unfiltered call. Measured to bite: query=bagger 1,157 rows → 123 for Caterpillar.
machine_typeoptional—The machine-type name in that market's language, as printed on the first line of every result ('Kettenbagger', 'Abbruchbagger', 'CNC-Drehmaschine'). This is a narrower filter than `query` because it matches the typed field rather than the whole listing. Measured to bite: 1,157 → 158 for 'Kettenbagger'. The `suggest` action returns valid values for a prefix.
conditionoptionalused · new · ex-display machine · defectiveCondition class. Pass a comma-separated list for several. 🔴 An unknown value is NOT an error on this source — it is silently dropped and you get the unfiltered catalogue with a '0 matches' headline, so this engine validates the value instead of forwarding it. Measured to bite: 1,157 → 895 used, 256 new.
year_minoptional1900–2100Earliest year of construction, inclusive. Plain year — this engine converts it to the unix timestamp the site's own select carries, which is why the filter actually bites here: sending the bare year to the site answers HTTP 200 with a '0 matches' headline and 25 rows that have no year at all. Measured: year_min=2024 → 219 of 1,157 and every row on page 1 is 2024-2026.
year_maxoptional1900–2100Latest year of construction, inclusive (measured: year_max=2000 returns rows up to and including 2000). Same timestamp conversion as `year_min`.
operating_hours_minoptional0–Lowest operating-hour reading to include, in hours. This is the field a used-plant buyer prices on, and the source filters on it natively. Measured to bite: query=bagger 1,157 → 178 for 0-2,000 h and every returned reading was under 2,000 h.
operating_hours_maxoptional0–Highest operating-hour reading to include, in hours. Measured to bite: 1,157 → 119 for 10,000-99,999 h. Listings that publish no reading are excluded by the source when either bound is set.
price_minoptional0–Lowest price to include, in EUR (every price on this marketplace is EUR, on every host). Measured to bite: 1,157 → 430 for 10,000-50,000.
price_maxoptional0–Highest price to include, in EUR. Combine with `price_min` for a band; the source excludes the price-on-request listings from a price-filtered result, so pair this with `with_price_only=false` only when you want them back in an unfiltered call.
with_price_only = falseoptional—Only listings that publish a price. Worth knowing why it exists: 122 of 313 cards in a 12-category sweep carry no price at all but a 'price on request' button, and those come back with price=null and price_on_request=true. Measured to bite: 1,157 → 855.
countryoptional—Seller country as an ISO-3166 alpha-2 code, UPPER CASE ('DE', 'NL', 'ES', 'TR', 'AT', 'PL', 'BE', 'FR', 'IT', 'CH', 'GB'). Comma-separated for several. 🔴 The source is case-sensitive and silently drops 'de' — this engine upper-cases it for you and rejects anything that is not two letters. Measured to bite: 1,157 → 646 for DE, 117 for NL. `facets.countries` lists the codes that actually have stock for your query.
regionoptional—Sub-national region, spelled with the source's own NAME, not a code: 'Bayern', 'Nordrhein-Westfalen', 'Baden-Württemberg'. 🔴 Sending 'BY' is silently dropped by the source. Requires `country` (the source nests regions under a country), and `facets.regions` lists the valid names with counts for your query.
rental_only = falseoptional—Only machines offered for rent rather than for sale. Measured to bite: query=bagger 1,157 → 38.
description_containsoptional—Extra keyword matched against the listing's free-text description only, on top of `query`. This is how you find equipment detail the typed fields do not carry ('hydraulik', 'klimaanlage', 'CE'). Measured to bite: 1,157 → 64.
sort = relevanceoptionalrelevance · price_asc · price_desc · newest · oldest · year_desc · year_asc · updated_desc · updated_asc · manufacturer_asc · manufacturer_descResult order; each value maps to the source's own sort field, so the order is the site's and is not re-sorted here. 🔴 The site also offers a distance sort; it is deliberately NOT exposed, because it sorts by distance from the exit IP the request happened to leave through, which would make two identical calls return different orders.
Try in playground →
post/maschinensucher/v1/suggest1 credit

The site's own autocomplete for a typed prefix, in four buckets: machine types, manufacturers, categories (with their numeric ids) and products. Use it to turn whatever a user typed into values the `machine_type`, `manufacturer` and `category_id` filters accept, instead of guessing a spelling the source would silently drop.

ParameterAllowed / rangeDescription
queryrequired—At least two characters of what a user is typing. The source answers with its own vocabulary in four buckets, which is exactly what the other actions' filters want: machine types (feed to `machine_type`), manufacturers (feed to `manufacturer`), categories (feed the id to `category_id`) and products.
market = deoptionalde · at · ch · com · gb · ieWhich Machineseeker host to read. 🔴 This picks the LANGUAGE of the labels, not a different catalogue: the listings are one shared pool and the price is the same number in the same currency on every host (measured: listing 22811490 is EUR 49,900 on all six, machineseeker.co.uk included — the site does not convert currency). Use 'de' for German wording and 'com' for English wording. The wider Machineseeker network has 50+ further hosts; only these six have their label vocabulary measured and mapped here, so the others answer MARKET_UNAVAILABLE rather than returning fields this engine cannot name.
category_idoptional1–Browse one category instead of searching, using the site's own numeric category id (105 = excavators, 43 = lathes, 42 = forklifts, 13 = packaging machines, 2 = metalworking & machine tools). Works for leaf categories too, not only the 40-odd top ones. Get the ids from the `categories` action or from any `ci-<id>` URL. Can be combined with `query` and every filter.
Try in playground →
post/maschinensucher/v1/dealers2 credits

The dealer directory for one category: the machinery dealers themselves, 100 a page, each with company name, street, postcode, town, country and region, plus the dealer id the `seller` action takes. This is the supplier-side view of the marketplace — the site's own figure is over 8,100 dealers.

ParameterAllowed / rangeDescription
category_idrequired1–The category whose dealers to list, using the site's own numeric category id (105 = excavators, 43 = lathes, 2 = metalworking & machine tools). The site's dealer directory is organised per category and has no 'all dealers' page, so this is required.
market = deoptionalde · at · ch · com · gb · ieWhich Machineseeker host to read. 🔴 This picks the LANGUAGE of the labels, not a different catalogue: the listings are one shared pool and the price is the same number in the same currency on every host (measured: listing 22811490 is EUR 49,900 on all six, machineseeker.co.uk included — the site does not convert currency). Use 'de' for German wording and 'com' for English wording. The wider Machineseeker network has 50+ further hosts; only these six have their label vocabulary measured and mapped here, so the others answer MARKET_UNAVAILABLE rather than returning fields this engine cannot name.
page = 1optional1–1-based page number, 100 dealers a page. Past the last page the source answers HTTP 404 and this engine reports NOT_FOUND rather than an empty success.
sort = nameoptionalname · country · postcodeOrder of the directory. 🔴 The site's OWN default is distance from the visitor, which for an API means distance from whichever exit the request happened to leave through — two identical calls would return different dealers on page 1 and paging would never be complete. This engine therefore defaults to the company name and does not expose the distance order at all.
Try in playground →
post/maschinensucher/v1/seller2 credits

One dealer's public profile by id: company name, contact address (street, postcode, town, region, country), their own description of the business, the machine categories and manufacturer ranges they deal in, and the site's trust seal. 🔴 The listing list on a dealer's page is login-walled placeholder markup — every card there carries the dealer's own name as its title and no price — so it is deliberately not returned; use `search` for real listings.

ParameterAllowed / rangeDescription
dealer_idrequired—The dealer's numeric id, as returned by the `dealers` action and as the first path segment of a dealer URL (…/Haendler/10186640/schlueter-baumaschinen-gmbh-erwitte). A full dealer URL is also accepted.
market = deoptionalde · at · ch · com · gb · ieWhich Machineseeker host to read. 🔴 This picks the LANGUAGE of the labels, not a different catalogue: the listings are one shared pool and the price is the same number in the same currency on every host (measured: listing 22811490 is EUR 49,900 on all six, machineseeker.co.uk included — the site does not convert currency). Use 'de' for German wording and 'com' for English wording. The wider Machineseeker network has 50+ further hosts; only these six have their label vocabulary measured and mapped here, so the others answer MARKET_UNAVAILABLE rather than returning fields this engine cannot name.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.