Europe's used-machinery market, with the price split into the facts that make it comparable
The Maschinensucher API turns Europe's largest used industrial machinery marketplace into JSON in seven actions.
7 active endpoints, on 1, 2 and 3 credit tiers.
- POST/maschinensucher/v1/search
- POST/maschinensucher/v1/detail
- POST/maschinensucher/v1/categories
- POST/maschinensucher/v1/facets
- POST/maschinensucher/v1/suggest
- POST/maschinensucher/v1/dealers
- POST/maschinensucher/v1/seller
What Maschinensucher endpoints does ReefAPI ship?
7 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Maschinensucher API
5 of 7 endpoints, ready to run
The catalogue with the filters the source actually honours: manufacturer, year, hour meter, condition, country, price band.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Maschinensucher API works
Maschinensucher is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From a machine type to a priced, comparable set
Three calls. The facets call tells you which values the source will accept, the search narrows with them, the detail call opens one machine.
Live counts per manufacturer, country, region and condition for that query, so the filter you build next uses values the source honours instead of values you guessed.
Measured: excavators go 1,157 to 269 for 2015-2020, to 178 with under 2,000 hours, to 123 with Caterpillar only. Every row carries price, currency, incoterm, price_type and vat separately.
The full listing: hour meter, odometer, condition, functionality, dealer town and country, and every further property with its label, parsed number and unit.
A comparable set where every price is readable as an offer rather than as a number, and every machine's hours and year are parsed figures.
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}'{
"ok": true,
"data": { … },
"meta": {
"api": "maschinensucher",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}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.
| field | what it holds | why it is separate |
|---|---|---|
| price | the number, or null | null is not missing data: see price_on_request |
| currency | the currency the dealer quoted | the source does not convert; the same listing is the same number on all six hosts |
| incoterm | EXW and the rest, as the dealer set it | a price ex works and a delivered price are not the same offer |
| price_type | asking, negotiable, auction start | an auction opening bid is never an asking price |
| vat | whether VAT is included, excluded or not applicable | the 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.
What was measured, on 2026-10-08
674 logged live calls across seven actions. The limits below are the source's, and each one is reported rather than smoothed over.
de, at and ch carry German labels; com, gb and ie carry English ones. 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. So market picks the language of the labels, not a different inventory. The wider network's fifty other hosts answer MARKET_UNAVAILABLE rather than returning fields whose labels this API cannot name.
The source's own filter expects a UNIX timestamp. A bare year answers HTTP 200, prints a (0) headline and serves 25 rows with no year at all. The API converts, and the filter then bites exactly: 1,157 excavators to 269 for 2015-2020, 178 under 2,000 hours, 123 Caterpillar only.
It answers HTTP 200, prints 0 results and serves the unfiltered catalogue. Every enum is validated before the request leaves, so a bad value is a clear error instead of the wrong answer, and a total of 0 served alongside real rows comes back as null with a warning rather than as a count.
25 a page, up to 8 pages. pagination.retrievable_max is 200, has_more is honest, and page 9 is an error with the reason in it. With no filter at all the source reports a round 200,000 rather than a count, flagged as total_is_rounded.
The source matches any one of the words, measured at 67,890 rows. Stated because it is the opposite of what a search box implies.
Measured 6,618 km and 41 km for the same listing from two exits. It is a property of whoever made the call, not of the machine, so there is no distance field and no distance sort, and the dealer directory is forced off its distance default. The odometer, which IS a property of the machine, comes back as mileage and is separate from operating_hours.
On the ch host 49'900 read as 49 and 1'800 hours read as 1 before this was caught by the cross-market audit against the page's own ld+json. Both are parsed correctly now, which is why the market matters to the parser even though it does not change the inventory.
The source adds one machine-generated line to every description, re-randomised on every render. Ground truth from 31 listings over two renders: 44 of 44 caught, 0 false positives across 617 real lines. description_decoy_lines_removed says how many lines were taken out.
Company name, street, postcode, town, country, region, time on the marketplace, listings online and the trust seal. No contact names, no phone numbers, no e-mail addresses. The address parser is positional rather than Germany-only, with postcode_city kept raw beside the split.
Measured with four calls per arm: no impersonation at all answered 4/4, no user-agent at all answered 4/4, and datacentre, residential DE, US and TR all answered 4/4. 20/20 on plain datacentre exits, median latency about 0.9 s, one upstream request per call, no 429.
What people build with Maschinensucher
The jobs this data is most often used for.
endpoints
credits per call
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.
What Maschinensucher data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 438 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
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}'import requests
r = requests.post(
"https://api.reefapi.com/maschinensucher/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "bagger",
"market": "de",
"page": 1
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Maschinensucher.
Get a free key →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.
191 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Maschinensucher, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-08.