Artsper.com Artist & Artwork Scraper
Pricing
from $5.00 / 1,000 results
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
Maintained by CommunityActor 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
- Output
- Input
- Input examples
- Incremental (delta) mode
- How to scrape Artsper.com
- You might also like
- FAQ
π Key features
- Two entity types, one Actor. Set
entityTypetoartworksorartistsβ 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, ordelistedagainst 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 β butmaxItemsdefaults 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.
artistUrlslets 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 genericstartUrlslist, 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_limitedin 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/currencyare native, unconverted values, and the artist rollup'savg_price/sold_avg_price/latest_artwork_priceassume 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
entityType | String | artworks | artworks or artists. |
startUrls | Array 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. |
artistUrls | Array 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. |
verifyArtistUrls | Boolean | true | When 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. |
maxItems | Integer | 50 | Stop 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. |
mode | String | auto | auto (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. |
impersonate | String | chrome (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. |
proxyConfiguration | Object | {"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 onlynew/changed/delisted(incremental).- A
startUrls-scoped run is always partial and never updates the baseline.artistUrlsis 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 (
startUrlsorartistUrls) 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
modeor 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
- Open the Artsper Artist & Artwork Scraper in Apify Console and go to the Input tab.
- Pick
entityType(artworksorartists). 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β 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