# Fine Art America Artist & Artwork Scraper (`artsiom_k/fineartamerica-scraper`) Actor

Scrape FineArtAmerica.com artist profiles (including agencies/brands) and print-on-demand artworks, with real Followers/Visitors popularity signals and per-product-type pricing. No login required.

- **URL**: https://apify.com/artsiom\_k/fineartamerica-scraper.md
- **Developed by:** [Artsiom Kunitsyn](https://apify.com/artsiom_k) (community)
- **Categories:** Other, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## fineartamerica-scraper

Scrapes **artist/business profiles** and **print-on-demand artworks** from
[FineArtAmerica.com](https://fineartamerica.com), one of the largest print-on-demand art
marketplaces — via the site's own public sitemaps, no login required.

### Contents

- [Key features](#key-features)
- [Output](#output)
- [Input](#input)
- [Input examples](#input-examples)
- [Incremental (delta) mode](#incremental-delta-mode)
- [How to scrape FineArtAmerica.com](#how-to-scrape-fineartamericacom)
- [FAQ](#faq)

### 🔑 Key features

- **Two entity types, one Actor.** Set `entityType` to `artworks` or `artists`.
- **By far the largest artist directory covered by this collection** — ~300,000 individual artist
  profiles plus ~6,000 agency/brand accounts (Alamy, Getty Images, and other stock houses/galleries
  share the identical page template). Set `accountType` to `artist` or `business` for a clean
  dataset of just one, or leave it at `all` for both.
- **Real popularity signals no sibling Actor exposes**: `followers` and `visitors` (a cumulative
  profile-view count) on every artist/business record, plus an exact `total_artworks` count read
  directly from the page.
- **Real per-product pricing.** Every artwork is print-on-demand — priced as a range across several
  product types (canvas print, framed print, metal print, etc.), each with its own SKU and price.
- **`artistIds` input for a genuinely exhaustive per-artist catalog** — the default `artworks` crawl
  samples a large, real (but non-exhaustive) set of the site's own sitemaps; set `artistIds` to walk
  specific artists' full galleries to completion instead.
- **Delta mode built in.** Every run classifies each item as `new`, `changed`, `unchanged`, or
  `delisted` against a persisted baseline.
- **`maxItems` defaults to 50** — a fast preview, and what keeps an unconfigured run within Apify's
  automated 5-minute QA check. Clear `maxItems` (`null`) for a full run.

### 📋 Output

One dataset item per artwork or artist/business, depending on `entityType` — see
[`.actor/dataset_schema.json`](.actor/dataset_schema.json) for the full field list, or the
Output tab's **Artworks** / **Artists** views for a readable table.

**Example artwork record:**

```json
{
  "source": "fineartamerica",
  "entity_type": "artworks",
  "external_id": "25769634",
  "url": "https://fineartamerica.com/featured/poolside-glamour-slim-aarons.html",
  "title": "Poolside Glamour",
  "medium_type": "Photograph",
  "category_path": "Wall Art > Photographs > mountain",
  "artist_name": "Slim Aarons",
  "artist_url": "https://fineartamerica.com/profiles/gettyimages",
  "low_price": 68.97,
  "high_price": 141.72,
  "currency": "USD",
  "offer_count": 6,
  "offers": [
    { "sku": "poolside-glamour-canvas-print", "name": "Poolside Glamour Canvas Print", "price": 78.49, "availability": "InStock" }
  ],
  "comment_count": 5,
  "change_type": "new"
}
```

**Example artist record:**

```json
{
  "source": "fineartamerica",
  "entity_type": "artists",
  "external_id": "aaronblaise",
  "url": "https://fineartamerica.com/profiles/aaronblaise",
  "name": "Aaron Blaise",
  "account_type": "artist",
  "location": "Jensen Beach, FL, United States",
  "total_artworks": 112,
  "joined_year": "2013",
  "followers": 1562,
  "visitors": 1438196,
  "change_type": "new"
}
```

### 🔧 Input

| Field | Type | Default | Description |
|---|---|---|---|
| `entityType` | string | `artworks` | `artworks` or `artists`. |
| `artistIds` | array | — | `artworks` only. Profile slugs or URLs to walk exhaustively instead of the general sample. |
| `accountType` | string | `all` | `artists` only. `all` / `artist` / `business` — filter out agency/brand accounts (or individual artists). |
| `maxItems` | integer | `50` | Stop after pushing this many items. Set to `null` for a full crawl. |
| `mode` | string | `auto` | `auto` / `full` / `incremental` — see [Incremental mode](#incremental-delta-mode). |
| `concurrency` | integer | `10` | How many pages to fetch in parallel — validated clean up to 20 at real large-scale on both entity types, see FAQ. |
| `impersonate` | string | `chrome` | curl\_cffi TLS-impersonation target. |
| `proxyConfiguration` | object | off | Apify Proxy config — not needed; no anti-bot friction found. |

### 📥 Input examples

**Default preview (50 artworks):**

```json
{ "entityType": "artworks" }
```

**Full artist/business directory:**

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

**One artist's complete catalog:**

```json
{ "entityType": "artworks", "artistIds": ["aaronblaise"], "maxItems": null }
```

**Individual artists only, no agencies/brands:**

```json
{ "entityType": "artists", "accountType": "artist", "maxItems": null }
```

### 🔁 Incremental (delta) mode

`auto` mode does a full scan the first time it runs for a given `entityType`/scope, then only pushes
new/changed items on later runs. Only an uncapped, error-free run can detect delistings, price
changes, or update the baseline.

### 🌐 How to scrape FineArtAmerica.com

FineArtAmerica has no JSON API — this Actor discovers its scope entirely via the site's own public
sitemaps and reads each artwork/profile page's own embedded schema.org data and server-rendered
HTML, the same content your browser sees.

### ❓ FAQ

**Does this include sold/unsold status?**
No — this is a print-on-demand catalog. Every artwork is reproduced to order, so there's no concept
of a piece selling out; every product offer always shows `availability: "InStock"`.

**Is `entityType=artworks` (default) an exhaustive catalog of the whole site?**
No, and it doesn't claim to be — FineArtAmerica has no exhaustive artwork sitemap, only tiered
"popular"/"grouped"/"new" sitemaps (a large, real sample, but not every artwork on the site). For a
specific artist's *complete* catalog, use `artistIds` instead.

**Why does `entityType=artists` include businesses/agencies like Alamy or Getty Images?**
FineArtAmerica uses the exact same profile page template for individual artists and
agency/brand/stock-house accounts — there's no structural reason to split them into separate entity
types. `account_type` on each record says which; set `accountType` to `artist` or `business` if you
only want one.

**Does this need a proxy?**
No — no anti-bot friction was found anywhere on this site (plain Apache, no Cloudflare or
equivalent challenge).

**Why does an occasional item take longer than expected?**
A real, confirmed-live pattern on this site: individual pages occasionally (a handful per thousand
requests) hit a ~30-second connection stall, unrelated to concurrency or rate limiting — every
instance observed so far has self-healed on retry within a couple of short attempts. This is
expected, not a sign of blocking.

# Actor input Schema

## `entityType` (type: `string`):

Scrape artworks or artist/business profiles. entityType=artists covers both individual artists and agency/brand accounts (Alamy, Getty Images, etc. — same page template). entityType=artworks by default samples a large, real (but not exhaustive) set of the site's own popular/grouped/new-artwork sitemaps; set artistIds to instead walk specific artists' full galleries. This is a print-on-demand site — there is no sold/unsold concept; every offer is always in stock. See dataset\_schema.json for the full field list per entity type.

## `artistIds` (type: `array`):

Optional. Only used when entityType=artworks. A list of artist profile slugs (e.g. "aaronblaise", from an artists run's external\_id or URL) or full profile URLs. When set, this Actor walks each listed artist's own gallery to completion instead of the general sitemap sample — a genuinely exhaustive per-artist catalog.

## `accountType` (type: `string`):

Only used when entityType=artists. FineArtAmerica uses one identical profile template for individual artists and agency/brand accounts (Alamy, Getty Images, and other stock houses/galleries) — this filters which ones get pushed. "all" (default): both. "artist": individual artists only. "business": agencies/brands only. Does not change what's examined for delta-mode tracking, only what's pushed.

## `maxItems` (type: `integer`):

Stop after pushing this many dataset items. Defaults to 50 — a fast, cheap preview, and what keeps an unconfigured run within Apify's automated 5-minute QA check. This site's real catalog is enormous (~300,000 artist/business profiles; the artwork sample alone spans hundreds of thousands of URLs) — clear this (set to null) for a full crawl.

## `mode` (type: `string`):

"auto" (recommended): full scan on the first run for a given entityType/scope, incremental (new/changed only) afterwards. "full": always push every item and refresh the baseline. "incremental": always push only new/changed items. Only an uncapped, error-free run can detect delistings or update the baseline.

## `concurrency` (type: `integer`):

How many artwork/artist pages to fetch in parallel. Defaults to 10, deliberately conservative — this site has not yet been load-tested at real sustained volume (only a short burst, which is not proof against a sustained-load rate limit; see artbrokerage-scraper's own real incident). Raise cautiously until a real large-scale test confirms a higher value is safe.

## `impersonate` (type: `string`):

curl\_cffi browser TLS-impersonation target. Defaults to "chrome" internally, though no anti-bot friction was found anywhere on this site (plain Apache, no Cloudflare or equivalent challenge). Override only if that stops holding.

## `proxyConfiguration` (type: `object`):

Apify Proxy configuration. Leave off unless you start seeing blocks from your own IP reputation — no anti-bot friction was found while building this actor.

## Actor input object example

```json
{
  "entityType": "artworks",
  "accountType": "all",
  "maxItems": 50,
  "mode": "auto",
  "concurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("artsiom_k/fineartamerica-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("artsiom_k/fineartamerica-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call artsiom_k/fineartamerica-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,artsiom_k/fineartamerica-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/g05PnmrweFVFCgxS2/builds/UsJE0GjY1n9T522Gc/openapi.json
