Lempertz.com Auction Results & Artist Scraper
Pricing
from $7.50 / 1,000 results
Lempertz.com Auction Results & Artist Scraper
Lempertz.com auction scraper — real realized prices, upcoming estimates, rich provenance detail, and cross-run artist rollups, with delta mode.
Pricing
from $7.50 / 1,000 results
Rating
0.0
(0)
Developer
Artsiom Kunitsyn
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
lempertz-scraper
Scrapes auction lots and a real cross-run artist rollup from Lempertz.com — Germany's oldest auction house (Cologne, Berlin, Munich, Brussels). Real, open realized prices for historical sales, upcoming-sale estimates, and rich per-lot detail (provenance, exhibitions, literature, expert certificates) most comparable actors don't expose at all — all from one Actor.
Contents
- Key features
- Output
- Input
- Input examples
- Incremental (delta) mode
- How to scrape Lempertz.com
- You might also like
- FAQ
🔑 Key features
- A single all-in realized price, plus the estimate range.
priceis inclusive of buyer's premium (confirmed against the site's own "incl. premium" labeling) — the real final figure a buyer paid, not a hammer-only number. - Three entity types, one Actor.
entityType: currentAuctions(whatever the site currently shows under "Auctions" — see the caveat below),auctionResults(historical, with real realized prices — the default), orartists(a real rollup — see below). - Richer per-lot detail than comparable actors.
provenance,exhibitions,literature, and expertcertificatetext, plus acitesflag (CITES-restricted material) and adroit_de_suiteflag (EU resale royalty applies) — fieldsdorotheum-scraper/artcurial-scraperdon't report. - Genuine multi-attribution. A lot can be jointly credited to more than one artist/maker (e.g. a
manufacturer plus its designer) —
artistsis a list, not a single name field, and both get credited in the artist rollup. - A bulk-fetch discovery design. One catalogue's entire lot list comes from a single request, not one request per lot — the historical archive (439+ catalogues) is reachable without a per-lot crawl.
- Delta mode, tuned per entity type.
auctionResultsdefaults to the usual auto-incremental behavior (full scan first run, changes only after).currentAuctionsalways fully refreshes every run instead. - A real artist rollup, not a capped page.
entityType: artistsreports uncapped running stats (lot count, average price, latest lot) accumulated from everyauctionResultslot actually crawled — see Output's known gaps for exactly what that means and doesn't mean.
📋 Output
One dataset item per lot or artist, depending on entityType — see
.actor/dataset_schema.json for the full field list, or the Output
tab's per-entity-type views for a readable table.
Example lot record (historical, sold, jointly attributed):
{"source": "lempertz","entity_type": "auctionResults","external_id": "lempertz_139853","url": "https://www.lempertz.com/en/catalogues/lot/1096-2/1023-a-pair-of-augsburg-silver-candelabra.html","title": "A pair of Augsburg silver candelabra","auction_number": 1096,"state": "Z","sold": true,"price": 6820.0,"currency": "EUR","estimate_low": 5500.0,"estimate_high": 7000.0,"literature": "Cf. an almost identical work by Billers illus. in: Seling 1980, no. 714, 842.","artists": [{ "artist_id": "19245", "artist_key": "19245", "name": "Allgöwer, Jakob Samuel" },{ "artist_id": "19547", "artist_key": "19547", "name": "Biller, Friedrich Jakob" }],"change_type": "new"}
Example artist rollup record:
{"source": "lempertz","entity_type": "artists","external_id": "lempertz_artist_29533","name": "Doat, Taxile","tracked_lot_count": 21,"tracked_total_price": 90148.0,"tracked_avg_price": 4292.76,"latest_lot_title": "A Sèvres porcelain vase \"La musique et la danse\" by Taxile Doat","latest_auction_number": 1096}
Results can be downloaded as JSON, CSV, or Excel from the Console's Output tab, or pulled via the Apify API/dataset endpoint.
Known gaps:
price/estimate_low/estimate_highare only set once a lot is actually sold (sold: true) / when the site publishes an estimate.- A rare, real data gap: ~0.7% of sampled lots carry a "sold" state code with no price recorded on
the site's own end — those still report
sold: truebutprice: null, not a fabricated zero. entityType: currentAuctionsis not confirmed to be a clean "upcoming only" list — the site's own/en/auctions.htmlcan include catalogues that already have real results. Check each lot's ownsold/session_endfields rather than trusting the entityType label alone.entityType: artistsdoes not crawl anything itself — it reads a rollup thatauctionResultsruns build up over time as they process sold lots. RunningartistsbeforeauctionResultshas ever run pushes nothing (with a clear log message saying so). The rollup's numbers are real and uncapped, but only as complete as what's actually been crawled so far.catalogue_uidon a lot record is a raw site-internal id — not the same id used to discover and fetch that catalogue (a real naming collision confirmed on the site's own end; see ../../docs/actors/lempertz-scraper.md for the full story).
⚙️ Input
See .actor/input_schema.json for the full JSON schema.
| Parameter | Type | Default | Description |
|---|---|---|---|
entityType | String | auctionResults | currentAuctions, auctionResults, or artists. |
startUrls | Array of strings | (none) | Specific Lempertz catalogue URLs, lot URLs, or bare catalogue ids (e.g. "1296-1") to scrape directly. Ignored for entityType=artists. Scope is always "custom" — no delisting-detection, no persisted baseline. Leave empty for the full crawl instead. |
maxItems | Integer | 50 | Stop after pushing this many dataset items (lots or artists). Defaults to a fast, cheap preview (also what keeps an unconfigured run within Apify's automated 5-minute QA check). A full auctionResults crawl covers the entire historical archive — raise this or clear it (set to null) for that. |
mode | String | auto | auto (recommended): the usual full-then-incremental behavior for auctionResults; always full for currentAuctions regardless of an existing baseline. full/incremental override this per run. Has no effect for entityType=artists. |
impersonate | String | chrome (internal) | curl_cffi TLS-impersonation target. No bot-management signal was observed anywhere on lempertz.com while building this Actor, so this is set internally by default. |
proxyConfiguration | Object | {"useApifyProxy": false} | Apify Proxy config. Off by default — this Actor clears the site fine without one. |
🧪 Input examples
Quick preview of recent historical results (the default):
{ "entityType": "auctionResults" }
Full historical archive (exhaustive, slow — maxItems: null explicitly overrides the 50-item
default):
{ "entityType": "auctionResults", "maxItems": null }
Artist rollup (run auctionResults — ideally a full, unbounded run — at least once first):
{ "entityType": "artists", "maxItems": null }
A specific catalogue's results:
{ "entityType": "auctionResults", "startUrls": ["1296-1"] }
Scheduled tracking run — full, uncapped run (maxItems cleared — required for the baseline to
save and delistings to be detected):
{ "entityType": "auctionResults", "mode": "incremental", "maxItems": null }
🔄 Incremental (delta) mode
Every currentAuctions/auctionResults run classifies each lot as new, changed (state/price
moved), unchanged, or delisted, using a state baseline persisted in a named Apify Key-Value Store
scoped to entityType. entityType: artists doesn't use delta mode at all — every run is a full
snapshot of the current rollup (see Output's known gaps).
auctionResults:mode: auto(default) — first run for a scope pushes everything (full); later runs push onlynew/changed/delisted(incremental).currentAuctions:mode: autoalways behaves asfull, every run.- A
startUrls-scoped run is always partial and never updates the baseline or reports delistings.
Full design: ../../docs/incremental-mode.md.
🚀 How to scrape Lempertz.com
- Open the Lempertz Auction Results & Artist Scraper in Apify Console and go to the Input tab.
- Pick
entityType(currentAuctions,auctionResults, orartists). maxItemsdefaults to 50 (a quick preview) — clear it (set tonull) for a full, uncapped run.- Click Start.
- When the run finishes, browse results in the Output tab, or download as JSON/CSV/Excel, or fetch them via the API.
- To track over time instead of scraping once: create a Schedule with
mode: auto.
🔗 You might also like
- Dorotheum Auction Results & Artist Scraper — the first entry in the Auction houses collection.
- Artcurial Auction Results & Artist Scraper — the second entry, with two realized-price figures per lot (hammer and all-in).
❓ FAQ
Is it legal to scrape Lempertz.com? It's legal to collect publicly available auction-result data such as lot descriptions, prices, and sale information. Scrape it only with a legitimate purpose under GDPR.
How do I get only new/changed items? Use mode: auto (or incremental) on a schedule — see
Incremental mode.
Why is price null for a lot that's clearly listed? That lot hasn't sold yet (or wasn't sold) —
check estimate_low/estimate_high instead. In a small number of cases the site marks a lot sold
with no price recorded on its own end; check sold rather than price if you need that distinction.
Why does entityType: artists push nothing? It reads a rollup built up by
entityType: auctionResults runs — it doesn't crawl anything on its own. Run auctionResults
(ideally a full, unbounded run) at least once first.
Search keywords
lempertz scraper, auction house scraper, auction results scraper, art price data, art market analytics, realized price data, hammer price data, auction price index, art collector data feed