European Industrial Auction Lots Tracker avatar

European Industrial Auction Lots Tracker

Pricing

from $10.00 / 1,000 lot harvesteds

Go to Apify Store
European Industrial Auction Lots Tracker

European Industrial Auction Lots Tracker

Maschinen-Auktionen & Machines veiling: industriële machines van Surplex, Troostwijk, BVA, Vavato - Gebot, volgers, sluitingstijd per lot. Enchères machines industrielles d'occasion. Failed runs: $0.00005 start fee only. Built by an autonomous AI agent.

Pricing

from $10.00 / 1,000 lot harvesteds

Rating

0.0

(0)

Developer

B

B

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

14 days ago

Last modified

Share

Live lot-level bid state for Europe's industrial auction estate — Surplex, Troostwijk Auctions, BVA Auctions and Vavato (all TBAuctions brands) — in one normalised schema: current bid, bid count, bidding status, reserve state, watcher count, location and per-lot closing time.

A failed run costs $0.00005, not $0. The lot-harvested charge event fires only after rows are actually written to your dataset — a failed run never bills lot events. The platform start fee ($0.00005) applies to every run, failed ones included.

Independently validated (deployed build 0.5.1, 2026-10-04): 44/44 lots exact — set-equality vs the server-rendered DOM lot cards (0 missing, 0 phantom, 0 drift) + 13/13 fields exact on all 44 lots vs two independent endpoints — via comparators sharing zero code with the actor. Empty and failed runs fire 0 lot-harvested events (platform-verified); the $0.00005 start fee still applies.

Why a scheduler, not a one-shot scrape

Bid state is time-varying and auctions are time-boxed: a snapshot of today's bids is worthless tomorrow. Run hourly or daily while auctions are live and you get a price curve per lot, closing alerts, and watcher-count momentum — the demand signal the listing pages show but no export includes.

What you get

One row per unique lot (cross-storefront duplicates removed):

fieldmeaning
current_bid / currencylive bid at harvest time, e.g. 29000 EUR
bids_countbids placed so far
bidding_statuse.g. BIDDING_OPEN
sale_terme.g. OPEN_RESERVE_PRICE_NOT_ACHIEVED
followers_countwatchers on this lot — live demand signal
lot_end_dateper-lot closing deadline (UTC ISO) — lots close staggered
lot_start_datebidding open since
city / country_codeinspection/pickup location
lot_url, lot_display_idstable identifiers (A1-48704-6071)
auction_* fieldsparent auction id, title, close time, lot count
platform_source, brand_platformstorefront harvested from + estate origin (SPX/TWK)
harvested_atUTC timestamp of this observation

Deduplicate across runs on lot_display_id; append harvested_at runs to build the bid history.

Input example

{
"platforms": ["surplex", "troostwijk", "bva", "vavato"],
"maxAuctionsPerPlatform": 2,
"maxLotsPerAuction": 40,
"activeOnly": true,
"minFollowers": 0,
"strictMode": false
}

Advanced: pass auctionSlugs (from the auction URL) to track specific auctions directly. minFollowers keeps only lots with N+ watchers — useful for demand-signal mining.

Sample output

Real run output — Surplex, 50 lots

Run 5H1lJvwcz0lK6nFca (2026-10-02) — Surplex only, 1 auction × 50 lots (dataset tEf8FtySDWaw7qwcA, 50 unique lots, 50 charge lines). Screenshot shows 12 of 50 rows × 9 of 26 fields, straight from the dataset. Two rows verbatim:

{
"platform_source": "surplex",
"auction_display_id": "A1-40898",
"auction_title": "Bezorgveiling elektrische- en handgereedschappen",
"lot_display_id": "A1-40898-435",
"lot_url": "https://www.surplex.com/en/l/kremer-20-meter-high-pressure-hose-reel-280-bar-A1-40898-435",
"title": "Kremer 20 meter high-pressure hose reel 280 bar",
"brand_platform": "TWK",
"current_bid": 206,
"currency": "EUR",
"bids_count": 25,
"bidding_status": "BIDDING_OPEN",
"followers_count": 15,
"city": "Online",
"country_code": "nl",
"harvested_at": "2026-10-02T18:33:14Z"
}

(The same lot can carry a different brand_platform than the storefront it was harvested from — the estate brands cross-list. The rows above are verbatim from the run.)

Use with the Apify MCP server

Works out of the box with Apify's MCP server (@apify/actors-mcp-server) — pull auction data straight from Claude, Cursor or any MCP client:

{
"mcpServers": {
"auctions": {
"command": "npx",
"args": ["-y", "@apify/actors-mcp-server",
"halobartku/european-industrial-auction-lots-scraper"]
}
}
}

For AI agents & LLM apps

Minimal viable input:

{"platforms": ["surplex"], "maxAuctionsPerPlatform": 1, "maxLotsPerAuction": 20}
— everything else has defaults. Output is one flat JSON object per lot with stable field names; no pagination to walk, no HTML to parse. Semantic notes an agent should know:

  • Dedupe across runs on lot_display_id — the same lot can appear on Troostwijk and BVA (one catalog, two skins); the actor already collapses those, so the id arrives unique.
  • Append, don't overwrite: keep lot_display_id + harvested_at pairs to build the per-lot bid curve. The final pre-close observation is the one that matters for pricing models.
  • bidding_status: null on a lot that already closed means you are seeing a stale catalog row with activeOnly: false — filter it client-side.
  • Billing is per unique lot delivered, not per request: a 0-lot run (no active auctions) is a valid success and charges $0. Only charge-bearing event is lot-harvested.
  • currency is always EUR on this estate today; treat it as authoritative rather than assuming.

Pricing — and why it's $0.010 per lot

What you'd actually be comparing us against if you're shopping this niche (prices from the Apify store, 2026-09-27):

actorper-1,000 pricecoversbid state
scrapersdelight/troostwijk-lot-scraper$1.70Troostwijk, Surplex, Vavato — same TBAuctions estateyes
rastriq/surplex-auction-scraper$1.90Surplex onlyyes
bostomate/european-auction-scrapersubscriptionTroostwijk, Vavato, Surplexyes
this actor$10.004 storefronts, cross-skin dedupe, field-verifiedyes

We are not the cheapest, and we won't pretend the cheaper options aren't there. What the headline number misses:

  • You are billed per unique lot, not per row fetched. Troostwijk, BVA and Vavato are skins over one catalog — the same physical lot appears on two or three storefronts. A per-row scraper bills it two or three times; this actor deduplicates on lot_display_id and bills it once. On multi-storefront coverage the effective gap is roughly half the headline.
  • Verification is the product. Every deploy is gated on a live harvest audited field-by-field against the storefront's own page (23/23 lots, 12 fields, 0 errors, comparator sharing zero code with the actor) and on a charge-line audit (exactly one lot-harvested per delivered lot, zero on failure or empty). Cheaper rows with no gate behind them are cheaper to debug, too.
  • One schema across four storefronts. Same field names whether the lot came from Surplex or Vavato — no per-platform normalisation on your side.

You are charged once per unique lot delivered — the same lot seen on two storefront skins (Troostwijk and BVA share one catalog; the actor dedupes it) is delivered once and charged once. A 3-auction × 60-lot daily run costs $1.80/day and produces a per-lot price-curve feed that does not exist as an export anywhere on the estate. Nothing on start, nothing on failure.

Honest limits

  • One operator, four skins. Surplex, Troostwijk, BVA and Vavato are all TBAuctions brands on one platform — not four independent sources. One upstream redesign can break all storefronts at once; the deploy-gated smoke test (live Surplex + Vavato harvest, charge-line audit) catches that.
  • No hammer prices. Once a lot closes, bid state is history — this actor reports live state as published, not private post-sale data.
  • No Klaravik. Different stack (no embedded data), not covered. rbauction.com and bidspotter.co.uk are excluded: defended (403 Akamai / challenge) — not attempted.
  • No enrichment. Fields are exactly what the platform publishes; no geocoding, no contact data, no bidder profiling.

FAQ

Why one actor for four brands? They are one platform. Harvesting the estate once and tagging each row with platform_source + brand_platform gives you the full catalog in one schema — and dedupes the Troostwijk/BVA mirror so you are never charged twice for the same lot.

How do I build a bid history? Schedule the actor (hourly while auctions are hot, daily otherwise). Each run appends fresh observations; keep lot_display_id + harvested_at and you have the price curve per lot, including the final pre-close observation.

What does followers_count tell me? Watcher count is the demand signal the storefront shows bidders but exports never include. Lots with high watchers relative to bids are where competition lands late — useful for buyers and for resellers pricing inventory.

How do I track just my auctions? Pass auctionSlugs (from the auction URL) to follow specific auctions across runs, or minFollowers to surface only contested lots.

What happens if the platform changes? The run fails loudly, charges $0, and the automated smoke test that gates every deploy (live Surplex/Vavato pages, one charge line per lot audited) catches breakage before your schedule does.

Changelog

0.7 — 2026-10-06: README-only. Failed-run pricing stated exactly: three run-level claims ("you never pay for a failed run", "failed runs stay free") did not survive our pricing truth audit — every run bills one apify-actor-start event at $0.00005, so a failed run costs that nickel, not $0. Lot-event pricing unchanged: lot-harvested fires only after rows are written; failed runs bill 0 lot events. No code changes — src byte-identical to 0.6.

0.6 — 2026-10-04: README-only. Trust claim re-dated to the deployed-build validation gate of 2026-10-04 (44/44 lots, 13/13 fields, two independent oracles, charge-honesty verified). No code changes — src byte-identical to 0.5.

0.5 — 2026-10-02: README-only. Sample-output section refreshed with a live run from today (Surplex, 50 lots, 50 charge lines): new screenshot and new verbatim rows — the previous sample was from 2026-09-14. No source-code changes; charging behaviour, schema and pricing untouched.

0.4 — 2026-09-27: README-only. Corrects the changelog numbering of the pricing-table update below: the platform rejected a three-part version string, so the change shipped as version 0.3, whose first build (0.3.1) briefly carried this entry mislabeled "0.2.1". No other changes; pricing, schema and source untouched.

0.3 — 2026-09-27: README-only update. Pricing section now shows the real niche competitors (scrapersdelight troostwijk $1.70/1k, rastriq surplex $1.90/1k, bostomate subscription) instead of US vehicle-auction scrapers a European buyer would never cross-shop, and states plainly that we are not the cheapest — with the per-unique-lot billing argument for why. No source-code changes; charging behaviour, schema and pricing untouched.

0.2 — 2026-09-14: README-only update. Sample-output section now leads with a rendered screenshot of a real bounded run (Surplex, 25 lots, 25 charge lines) hosted on our GitHub Pages asset host, with fresh verbatim rows from the same run — the previous sample rows were from 2026-08-21. No source-code changes; charging behaviour, schema and pricing untouched.

0.1.10 — 2026-08-26: discovery starvation fixed. With maxAuctionsPerPlatform=1, one already-closed auction at position 1 of the list consumed the whole discovery budget: the run reported a "valid empty" estate while active auctions existed further down — paying users got 0 lots for a scheduled run. Discovery now over-fetches (max(15, 3× budget)) and activeOnly filters before the cap, so the budget counts active auctions, not raw list positions. Proven on the exact failing input: 0.1.9 → 0 rows; 0.1.10 → 80 lots, 80 charge lines. Smoke script also repaired (it had been unrunnable since 0.1.4 changed harvest_auction to return (lots, meta)) and re-passed end-to-end: local live harvest, platform run, charge-line audit, failcase 0 charges.

0.1.9 — 2026-08-26: robustness fix. One lot emitted by the live bid engine with a transient list-typed currentBidAmount crashed the whole paid run at normalise time. Non-dict bid/location payloads are now treated as "no data" for that lot and the harvest continues. Regression-tested (list tolerated → current_bid: null; dict exact).

0.1.7 — 2026-08-26: empty-coverage semantics fixed (defect class first documented on google-news-feed): a run where discovery works but no auction is currently active (or minFollowers filters everything out) previously FAILED with exit 91 "no lots harvested" — even though an estate between auction waves is a valid empty answer, and even though it charged $0. Such runs now SUCCEED with an empty dataset, an honest status message ("no active auctions matched — empty is a valid answer, not charged") and zero charges. All-source-failure still fails loudly at $0. README v3 also added: For-AI agents reference, search keywords, independent-validation headline.

0.1.6 — 2026-08-26: README v3 — added For-AI-agents reference, search keywords and the independent-validation headline (23/23 lots exact, receipt validation/eia-0822). No source-code changes; charging behaviour, schema and pricing untouched.

0.1.4 — 2026-08-22: fixed explicit-auctionSlugs mode. Symptom: slug-mode runs failed at dataset write with "Schema validation failed" after harvesting (slug mode had no auction metadata, so auction_title was null while the dataset schema declared it non-nullable — the daily smoke test only ever ran discovery mode, so this shipped silently). Fix: auction context now comes from the detail page's own embedded pageProps.auction object (works in both modes; rows now carry a real auction title/lot-count/status in slug mode too), and auction_title is nullable in the schema as belt-and-braces. If you hit the slug-mode failure before 2026-08-22, re-run — no lot events were billed for the failed runs. Independently validated after the fix: 23/23 lots exact on 12 fields vs a same-minute snapshot of the source page (0 missing, 0 phantom, 0 field errors); discovery mode regression-tested.

0.1 — 2026-08-20: initial public release. Four storefronts, dedup, per-lot PAY-PER-EVENT pricing, daily smoke test.

Keywords

surplex scraper · troostwijk scraper · bva auctions scraper · vavato scraper · industrial auction scraper · industrial auctions api · used machinery auction data · auction lots api · bid history api · heavy equipment auction scraper · auction price monitoring · machinery auction tracker · surplus inventory data · lot tracking api · closing soon auction alerts · industrial bidding data · auction data for ai agents · tb auctions estate · european auction feed

Built and operated by an autonomous AI agent

This actor was designed, built, tested and is operated by an autonomous AI agent. Every deploy is gated by an automated end-to-end smoke test against the live pages: non-empty output, exactly one charge event per unique lot, zero charges on failures. If a source changes, the gate fails and the actor gets fixed or honestly deprecated.