Artsper.com Artist & Artwork Scraper avatar

Artsper.com Artist & Artwork Scraper

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Artsper.com Artist & Artwork Scraper

Artsper.com Artist & Artwork Scraper

Artsper.com artist & artwork scraper with real per-artist rollup stats (avg price, medium mix, sold count) from each artist's full catalog, plus delta mode.

Pricing

from $5.00 / 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

9 days ago

Last modified

Categories

Share

artsper-scraper

Scrapes both artworks and artist profiles from Artsper.com, including per-artist rollup stats (average price, medium mix, sold count, latest artwork) computed from the artist's full catalog β€” not a sample.

Contents

πŸ”‘ Key features

  • Two entity types, one Actor. Set entityType to artworks or artists β€” no need for two separate scrapers to build a full picture of an artist and their work.
  • Real per-artist rollup stats, not a sample. Average price, unique medium mix, sold-artwork count, and latest artwork are computed from an artist's entire catalog, enumerated via Artsper's own catalog pagination (paginated to completion), not just whatever a single search page happens to show.
  • Delta mode built in. Every run classifies each item as new, changed, unchanged, or delisted against a persisted baseline β€” pay for what changed, not a full re-scrape every time.
  • Exhaustive when you ask for it. With no startUrls/artistUrls, discovery is the full site sitemap β€” every artwork, every artist β€” but maxItems defaults to 50 (a fast preview, and what keeps an unconfigured run within Apify's automated 5-minute QA check), so clear it (null) for a real full crawl.
  • Rich data straight from the site's own structured markup. Every artwork/artist page ships clean Schema.org JSON-LD (price, medium, dimensions, artist nationality, birth year, full biography) β€” read directly rather than scraped from display text, so it doesn't break on cosmetic page redesigns the way plain-HTML scraping would.
  • A verified, trackable artist list. artistUrls lets you scrape exactly the artists you care about β€” each URL is checked against the real artist sitemap first (typos/removed artists are logged and skipped), and unlike a generic startUrls list, it gets its own persisted tracking scope: run the same list on a schedule and get real new/changed/delisted detection for just those artists.
  • Progress visible in the run log. Every ~10 items or ~20 seconds, the log reports how many items have been processed (with a known total for bounded runs), pushed, and errored, plus the observed rate β€” and for entityType: artists, a running count of artworks fetched across all rollups so far.
  • Confirmed-gone URLs are never re-fetched. Artsper.com doesn't return an HTTP error for a removed artwork β€” it silently serves the generic catalog page instead (still 200 OK). This Actor detects that content signal, persists it, and skips the URL on every future run β€” no input needed to enable it.
  • Resilient to a real, confirmed rate limit β€” bounded, not stuck. Artsper.com's Cloudflare protection sometimes throttles a large artist rollup (occasional 429s that mostly resolve on retry, just slowly). Rather than one artist's catalog silently stalling a run for a long time, a wall-clock budget cuts a rollup short after 180 seconds and still returns a real, useful partial result (flagged via rollup_rate_limited in the run log), and a separate failure-count breaker catches a harder, sustained block the same way.

πŸ“‹ Output

One dataset item per artwork or artist, depending on entityType β€” see .actor/dataset_schema.json for the full field list, or the Output tab's Artworks / Artists views for a readable table.

Example artwork record:

{
"source": "artsper",
"entity_type": "artworks",
"external_id": "artsper_2462506",
"url": "https://www.artsper.com/fr/oeuvres-d-art-contemporain/peinture/2462506/toile-lamour-dans-la-nature-jerome-mesnager",
"title": "Toile L'amour dans la nature",
"artist_name": "JΓ©rΓ΄me Mesnager",
"artist_url": "https://www.artsper.com/us/contemporary-artists/france/17/jerome-mesnager",
"category": "Painting",
"medium": "acrylic",
"surface": "canvas",
"date_created": "2022",
"price": 2800,
"currency": "EUR",
"availability_status": "InStock",
"width_cm": 81,
"height_cm": 100,
"condition": "Artwork sold in perfect condition, framed, ready to hang",
"signature": "Hand-signed by artist",
"gallery_name": "At Down",
"gallery_country": "France",
"change_type": "new"
}

Example artist record:

{
"source": "artsper",
"entity_type": "artists",
"external_id": "artsper_artist_17",
"url": "https://www.artsper.com/fr/artistes-contemporains/france/17/jerome-mesnager",
"name": "JΓ©rΓ΄me Mesnager",
"nationality": "France",
"birth_year": 1961,
"total_artworks": 45,
"sold_artworks": 0,
"avg_price": 1037.0,
"mediums": "Fine Art Drawings, Painting, Print, Sculpture",
"change_type": "new"
}

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/currency are native, unconverted values, and the artist rollup's avg_price/ sold_avg_price/latest_artwork_price assume a single currency across an artist's whole catalog (the common case) β€” mixed currencies aren't detected or converted.
  • latest_artwork_* assumes the catalog's default sort is newest-first; not independently confirmed against a date field.
  • A large artist's rollup can be cut short by Cloudflare rate-limiting (see Key features) β€” when that happens, total_artworks/avg_price/etc. reflect only the artworks fetched before the 180-second budget ran out, not the artist's full catalog. Check the run log for a "cut short by sustained rate-limiting" warning if a rollup's numbers look lower than expected.

βš™οΈ Input

See .actor/input_schema.json for the full JSON schema.

ParameterTypeDefaultDescription
entityTypeStringartworksartworks or artists.
startUrlsArray of strings(none)Specific artist/artwork URLs, or a category/search catalog URL, to scrape directly instead of discovering via the full site sitemap. Scope is always "custom", with no persisted tracking across runs β€” for persisted per-artist tracking, use artistUrls instead. A catalog URL's unfiltered form self-caps at 100 pages regardless of true match count β€” narrow with a category/filter for large result sets.
artistUrlsArray of strings(none)Artists only. Paste artist URLs, one per line (a .txt file's contents paste in directly, no upload needed) to scrape exactly those artists + their artworks. Verified against the real artist sitemap first (see verifyArtistUrls); gets its own persisted scope, so re-running the same list on a schedule gives real new/changed/delisted tracking for just those artists. Takes priority over startUrls.
verifyArtistUrlsBooleantrueWhen artistUrls is set, check each URL against the real sitemap first (roughly a minute, one full sitemap walk, regardless of list size) and skip any not found. Turn off to scrape the list unverified.
maxItemsInteger50Stop after pushing this many dataset items. Defaults to a fast, cheap preview (also what keeps an unconfigured run within Apify's automated 5-minute QA check). A full crawl covers the entire site β€” raise this or clear it (set to null) for that; note a capped run never updates the incremental baseline (see below), so any real tracking run needs this cleared.
modeStringautoauto (recommended): full scan on the first run, incremental after. full: always push every item and refresh the baseline. incremental: always push only new/changed items. Only a plain, unscoped sitemap crawl or a verified artistUrls list can detect delistings or update the baseline.
impersonateStringchrome (internal)curl_cffi TLS-impersonation target. Artsper's Cloudflare protection challenges plain requests, so this is set internally by default β€” override only if that stops working.
proxyConfigurationObject{"useApifyProxy": false}Apify Proxy config. Off by default β€” the sitemap/profile/detail pages this Actor relies on worked fine without one while building it.

πŸ§ͺ Input examples

Full artwork catalog scan (exhaustive, slow β€” every artwork's detail page is fetched; maxItems: null explicitly overrides the 50-item default):

{ "entityType": "artworks", "maxItems": null }

Bounded preview (the default β€” fast, but not a curated subset, just the first N artworks the sitemap yields):

{ "entityType": "artworks", "maxItems": 200 }

Full artist directory, with rollup stats:

{ "entityType": "artists", "maxItems": null }

A specific, tracked list of artists (verified against the sitemap, own persisted scope β€” maxItems: null so the whole list is scraped even if it's longer than the 50-item default):

{
"entityType": "artists",
"artistUrls": [
"https://www.artsper.com/fr/artistes-contemporains/france/17/jerome-mesnager"
],
"maxItems": null
}

Scheduled tracking run β€” full, uncapped run (maxItems cleared β€” required for the baseline to save and delistings to be detected):

{ "entityType": "artworks", "mode": "incremental", "maxItems": null }

πŸ”„ Incremental (delta) mode

Every run classifies each item as new, changed (price or availability moved, for artworks; catalog size/sold-count/avg-price moved, for artists), unchanged, or delisted, using a state baseline persisted in a named Apify Key-Value Store scoped to entityType.

  • mode: auto (default) β€” first run for a scope pushes everything (full); later runs push only new/changed/delisted (incremental).
  • A startUrls-scoped run is always partial and never updates the baseline. artistUrls is different: it's treated as a complete, closed universe (like a full sitemap crawl), so its baseline does get saved and delisted-detection does run β€” as long as no item hit a genuinely ambiguous error that run (a confirmed-gone URL doesn't count against this β€” see below; a timeout, 5xx, or parse error does, and skips the baseline-save/delisted-detection that run to avoid false "delisted" reports).
  • Every bounded run (startUrls or artistUrls) logs a quick "X new, Y already tracked, Z already known-dead" preview right after startup, before the full fetch loop begins β€” new/already-tracked is informational only (every URL is still fully fetched and classified regardless, real price/status-change detection isn't skipped for "already tracked" items); already-known-dead URLs genuinely are skipped, see below.
  • A URL confirmed gone is recorded and never fetched again on any future run, regardless of mode or scope β€” logged distinctly from other errors. Doesn't count toward the baseline-save/ delisted-detection gate above, since it's a trustworthy, already-understood outcome rather than an ambiguous failure.

πŸš€ How to scrape Artsper.com

  1. Open the Artsper Artist & Artwork Scraper in Apify Console and go to the Input tab.
  2. Pick entityType (artworks 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 β€” the first run does a full scan, every run after only bills what actually changed.

πŸ”— You might also like

  • SaatchiArt Artist & Artwork Scraper β€” the same entity-type/rollup-stats design pointed at a second, independent art marketplace, for expanding artist coverage or cross-referencing the same artist's presence and pricing across platforms.
  • Artmajeur Artist & Artwork Scraper β€” a third, independent art marketplace source, same design.
  • Artfinder Artist & Artwork Scraper β€” a fourth, independent art marketplace source, same design.
  • Artsy Artist, Artwork & Gallery Scraper β€” a fifth, independent art marketplace source, plus a genuine dealer/gallery angle (real represented-artist rollups per gallery) this collection doesn't otherwise have.
  • Bluethumb Artist & Artwork Scraper β€” a sixth, independent art marketplace source (Australia's largest), with real per-artist sold/available/total counts read from a single profile-page fetch, no rollup fan-out needed.
  • Riseart Artist & Artwork Scraper β€” a seventh, independent art marketplace source, built entirely on the site's own public GraphQL search API (no HTML scraping, no per-item detail fetch), with a real per-artist rollup (total artworks, avg price, for-sale vs. enquire-only split).
  • Kunsthaus ARTES Artist & Artwork Scraper β€” an eighth, independent art marketplace source (German gallery), with a real four-state availability signal (for sale, price-on-request, reserved, sold) read from the site's own schema.org microdata.
  • Ars Mundi Artist & Artwork Scraper β€” a ninth, independent art marketplace source (a sibling German gallery running the same underlying platform as Kunsthaus ARTES), also selling jewelry and decorative objects alongside paintings/sculptures.
  • Artprice.com Artist & Artwork Scraper β€” a tenth, independent art marketplace source, built on Artprice.com's own public unauthenticated JSON APIs (artist directory + current marketplace listings), with real per-artist rollup stats and multi-currency pricing (EUR/USD/GBP/CNY/BTC/ETH) on every artwork.

❓ FAQ

Is it legal to scrape Artsper.com? It's legal to collect publicly available marketplace data such as artwork listings, prices, and public artist profile 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.

Does this Actor detect sold artworks? Yes β€” sold_artworks/sold_avg_price on artist records are computed from real availability_status values read off each artwork's own page, confirmed live (a real artist sampled came back with sold_artworks: 13 out of 54 fetched). If a large artist's rollup gets cut short by rate-limiting before reaching every artwork, these numbers reflect only what was fetched β€” see the rate-limiting note under Known gaps.

Search keywords

artsper scraper, art marketplace scraper, artist data scraper, artwork data scraper, art price data, art market analytics, art collector data feed