Lempertz.com Auction Results & Artist Scraper avatar

Lempertz.com Auction Results & Artist Scraper

Pricing

from $7.50 / 1,000 results

Go to Apify Store
Lempertz.com Auction Results & Artist Scraper

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

Artsiom Kunitsyn

Maintained by Community

Actor 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

  • A single all-in realized price, plus the estimate range. price is 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), or artists (a real rollup — see below).
  • Richer per-lot detail than comparable actors. provenance, exhibitions, literature, and expert certificate text, plus a cites flag (CITES-restricted material) and a droit_de_suite flag (EU resale royalty applies) — fields dorotheum-scraper/artcurial-scraper don't report.
  • Genuine multi-attribution. A lot can be jointly credited to more than one artist/maker (e.g. a manufacturer plus its designer) — artists is 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. auctionResults defaults to the usual auto-incremental behavior (full scan first run, changes only after). currentAuctions always fully refreshes every run instead.
  • A real artist rollup, not a capped page. entityType: artists reports uncapped running stats (lot count, average price, latest lot) accumulated from every auctionResults lot 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_high are 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: true but price: null, not a fabricated zero.
  • entityType: currentAuctions is not confirmed to be a clean "upcoming only" list — the site's own /en/auctions.html can include catalogues that already have real results. Check each lot's own sold/session_end fields rather than trusting the entityType label alone.
  • entityType: artists does not crawl anything itself — it reads a rollup that auctionResults runs build up over time as they process sold lots. Running artists before auctionResults has 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_uid on 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.

ParameterTypeDefaultDescription
entityTypeStringauctionResultscurrentAuctions, auctionResults, or artists.
startUrlsArray 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.
maxItemsInteger50Stop 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.
modeStringautoauto (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.
impersonateStringchrome (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.
proxyConfigurationObject{"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 only new/changed/delisted (incremental).
  • currentAuctions: mode: auto always behaves as full, 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

  1. Open the Lempertz Auction Results & Artist Scraper in Apify Console and go to the Input tab.
  2. Pick entityType (currentAuctions, auctionResults, or artists).
  3. maxItems defaults to 50 (a quick preview) — clear it (set to null) for a full, uncapped run.
  4. Click Start.
  5. When the run finishes, browse results in the Output tab, or download as JSON/CSV/Excel, or fetch them via the API.
  6. To track over time instead of scraping once: create a Schedule with mode: auto.

🔗 You might also like

❓ 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