European Industrial Auction Lots Tracker
Pricing
from $10.00 / 1,000 lot harvesteds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
18 hours ago
Last modified
Categories
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):
| field | meaning |
|---|---|
current_bid / currency | live bid at harvest time, e.g. 29000 EUR |
bids_count | bids placed so far |
bidding_status | e.g. BIDDING_OPEN |
sale_term | e.g. OPEN_RESERVE_PRICE_NOT_ACHIEVED |
followers_count | watchers on this lot — live demand signal |
lot_end_date | per-lot closing deadline (UTC ISO) — lots close staggered |
lot_start_date | bidding open since |
city / country_code | inspection/pickup location |
lot_url, lot_display_id | stable identifiers (A1-48704-6071) |
auction_* fields | parent auction id, title, close time, lot count |
platform_source, brand_platform | storefront harvested from + estate origin (SPX/TWK) |
harvested_at | UTC 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

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}- 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_atpairs to build the per-lot bid curve. The final pre-close observation is the one that matters for pricing models. bidding_status: nullon a lot that already closed means you are seeing a stale catalog row withactiveOnly: 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. currencyis always EUR on this estate today; treat it as authoritative rather than assuming.
Pricing — and why it's $0.010 per lot
| actor | per-item price | bid state? | platforms |
|---|---|---|---|
| govdeals-scraper | $0.0160 / item | yes | 1 (US) |
| bring-a-trailer-scraper | $0.0150 / item | yes | 1 (US) |
| cars-and-bids-scraper | $0.0120 / item | yes | 1 (US) |
| this actor | $0.0100 / lot-harvested | yes | 4 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.