Artfinder.com Artist & Artwork Scraper avatar

Artfinder.com Artist & Artwork Scraper

Pricing

from $2.10 / 1,000 results

Go to Apify Store
Artfinder.com Artist & Artwork Scraper

Artfinder.com Artist & Artwork Scraper

Artfinder.com artist and artwork scraper with real per-artist rollup stats, a sold-artworks filter, and built-in delta mode.

Pricing

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

a day ago

Last modified

Categories

Share

Scrapes both artworks and artist profiles from Artfinder.com, including per-artist rollup stats (total/sold artworks, average price, medium mix) computed from the artist's full catalog — not a sample.

Contents

🔑 Key features

  • Two entity types, one Actor. Set entityType to artworks or artists — same design as this Actor's siblings for SaatchiArt.com and Artmajeur.com.
  • Real per-artist rollup stats, not a sample. Total/sold artwork counts and average price are computed from an artist's entire catalog, paginated to completion — confirmed to include sold items, not just currently-for-sale ones.
  • minSoldArtworks filter. Only push artists with at least N sold artworks — skip the majority who've never sold anything, without paying for rows you'd throw away.
  • Delta mode built in. Every run classifies each item as new, changed, unchanged, or delisted against a persisted baseline.
  • Exhaustive when you ask for it. A plain run (no startUrls) covers the whole site — the full artist directory (~3,785 artists at the last check) or the full artwork catalog (~144,000 products across 3 sitemap shards). maxItems defaults to 50 (a fast preview) — clear it or raise it for a real full run.
  • Full artwork detail for specific artists. Set artistUrls on entityType: "artworks" to fetch every artwork for exactly those artists instead of the full product sitemap. Pair with an entityType: "artists" + minSoldArtworks run to first collect the artist URLs you want.

📋 Output

One dataset item per artwork or artist, depending on entityType — see the Output tab's Artworks / Artists views for a readable table.

Example artwork record:

{
"source": "artfinder",
"entity_type": "artworks",
"external_id": "2312900",
"url": "https://www.artfinder.com/product/east-meets-west-c3fc7/",
"title": "East Meets West",
"artist_name": "Teresa Pereira",
"artist_url": "https://www.artfinder.com/artist/teresa-pereira/",
"category": "Oil painting",
"style": "Photorealistic",
"materials": "oil",
"price": 999.0,
"currency": "USD",
"availability_status": "avail",
"width_cm": 71.12,
"height_cm": 55.88,
"change_type": "new"
}

Example artist record:

{
"source": "artfinder",
"entity_type": "artists",
"external_id": "97906",
"url": "https://www.artfinder.com/artist/olgali/",
"name": "Olga Li",
"country": "Italy",
"followers_total": 194,
"total_artworks": 103,
"sold_artworks": 5,
"avg_price_eur": 287.4,
"mediums": "Collage, Mixed media",
"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.

⚙️ Input

The Input tab lists every option with its description.

ParameterTypeDefaultDescription
entityTypeStringartworksartworks or artists.
startUrlsArray of strings(none)Specific artist or product URLs to scrape directly, instead of discovering via the artist-search API or the product sitemap. A startUrls-scoped run cannot detect delistings or update the incremental baseline, and for entityType=artists it skips the artist-search pass, so country isn't populated for that scope (see Known gaps).
artistUrlsArray of strings(none)Artworks only. Specific artist URLs (the url field on an artist record) — fetches every artwork for exactly those artists instead of the product sitemap. startUrls still takes priority over this. Gets its own delta-mode scope.
maxItemsInteger50Stop after pushing this many dataset items. Defaults to a fast, cheap preview. A full run covers the entire site — raise this or clear it for that.
minSoldArtworksInteger0Artists only. Only push artist records with at least this many sold artworks (the sold_artworks rollup field) — set to 1 to skip artists who've never sold anything. Artists are still fully tracked internally either way (delta baseline, delisted-detection); this only filters what's pushed to the dataset.
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 run (no startUrls) can detect delistings or update the baseline.
concurrencyInteger6Items fetched in parallel (max 10). For artists, each artist's rollup pages are also fetched in parallel.
proxyConfigurationObject{"useApifyProxy": false}Apify Proxy config. Off by default — this Actor's default (a plain browser User-Agent header, no TLS impersonation) worked cleanly from every network tested while building it.

🧪 Input examples

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

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

Full artist directory, with rollup stats:

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

Artists with at least one sold artwork only (skips the majority of artists who've never sold — useful if you only care about active sellers):

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

Scheduled tracking run — only new/changed/delisted items since the last baseline:

{ "entityType": "artists", "mode": "incremental" }

🔄 Incremental (delta) mode

Every run classifies each item as new, changed (price/status 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.

🚀 How to scrape Artfinder.com

  1. Open the Artfinder 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) — raise it or clear it (set to null) for a full, uncapped run.
  4. For entityType: artists, optionally set minSoldArtworks to only get artists who've sold something.
  5. Click Start.
  6. When the run finishes, browse results in the Output tab, or download as JSON/CSV/Excel, or fetch them via the API.
  7. 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.

Known gaps

  • country isn't populated for a startUrls-scoped artists run. The full field set (name, country, URL) comes from the artist-search discovery pass, which a startUrls-scoped run skips entirely — the artist's identity is instead recovered from their own artwork records (which do carry name, but not country). Not populated in that scope only, not a bug.
  • No joined_date, social links, or bio. Those only exist on an artist's own profile page, a second per-artist request this Actor doesn't make, to keep artist runs fast and cheap. Open an issue if you need them.
  • No latest_artwork_* fields, unlike this Actor's SaatchiArt/Artmajeur siblings — the rollup data source has no reliable timestamp to determine "latest" from (only an is_new boolean, and an unconfirmed default sort order), so this Actor doesn't report an unverified guess.
  • avg_price_eur/sold_avg_price_eur are converted display prices, not each artwork's real native currency — the per-artist rollup endpoint doesn't expose a native-currency marker the way the artwork detail page does (which is why artworks records report real price + currency instead).
  • sold_artworks on an artist record can occasionally undercount by one or two. Confirmed live (2026-08-29): Artfinder's own per-artist products-listing API (what the rollup reads) can lag behind an item's own detail page — one real example stayed is_in_stock: true on the listing while its detail page already correctly showed is_in_stock: false/quantity: 0. An artistUrls run (which re-fetches each artwork's own page) doesn't have this gap; the artist rollup does, since re-fetching every artwork individually there would defeat its whole cost-saving purpose.

🔗 You might also like

  • SaatchiArt Artist & Artwork Scraper — the same entity-type/rollup-stats design pointed at a first, independent art marketplace.
  • Artmajeur Artist & Artwork Scraper — a second independent art marketplace source, same design.
  • Artsper Artist & Artwork Scraper — a third, independent art marketplace source, same design.
  • Artsy Artist, Artwork & Gallery Scraper — a fourth, independent art marketplace source, plus a genuine dealer/gallery angle (real represented-artist rollups per gallery) this collection doesn't otherwise have.
  • Riseart Artist & Artwork Scraper — a fifth, 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, sold count).
  • Kunsthaus ARTES Artist & Artwork Scraper — a sixth, 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 — an eighth, 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 ninth, 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 Artfinder.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 artists who've sold something? Set minSoldArtworks: 1 — see Input examples.

How do I get only new/changed items? Use mode: auto (or incremental) on a schedule — see Incremental mode.

Search keywords

artfinder scraper, artfinder.com scraper, art marketplace scraper, artist data scraper, artwork data scraper, art price data, art market analytics, art collector data feed