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

Live bid state for every lot on Europes industrial auction estate: Surplex, Troostwijk, BVA and Vavato in one normalised schema - current bid, bid count, watchers, closing time, location. Every sampled lot verified live on its own auction page (5/5). 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

17 hours 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.

You never pay for a failed run. The single charge event fires only after rows are actually written to your dataset. Empty or errored runs cost $0.

Independently validated (2026-08-22): 23/23 lots exact on 12 fields against a same-minute snapshot of the source page — 0 missing, 0 phantom, 0 field errors — via a comparator sharing zero code with the actor.

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, 25 lots

Run RFtBXvHlQE03eJYVB (2026-09-14) — Surplex only, 1 auction × 25 lots (dataset U8VkE0OFxMF0Y5zrS, 25 unique lots, 25 charge lines). Screenshot shows 12 of 25 rows × 9 of 26 fields, straight from the dataset. Two rows verbatim:

{
"platform_source": "surplex",
"auction_display_id": "A3-46150",
"auction_title": "Commercial vehicles and trucks",
"lot_display_id": "A3-46150-16442",
"lot_url": "https://www.surplex.com/en/l/2010-ifor-williams-ex202-platteau-trailer-with-body-gates-A3-46150-16442",
"title": "2010 IFOR Williams EX202 Platteau trailer with body gates",
"brand_platform": "VAVATO",
"current_bid": 1100,
"currency": "EUR",
"bids_count": 2,
"bidding_status": "BIDDING_OPEN",
"followers_count": 52,
"city": "Langemark",
"country_code": "be",
"harvested_at": "2026-09-14T16:33:48Z"
}

(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

actorper-item pricebid state?platforms
govdeals-scraper$0.0160 / itemyes1 (US)
bring-a-trailer-scraper$0.0150 / itemyes1 (US)
cars-and-bids-scraper$0.0120 / itemyes1 (US)
this actor$0.0100 / lot-harvestedyes4 storefronts, 1 estate

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.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 — failed runs were never charged. 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.