# Blick Art Materials Scraper (`maximedupre/dickblick`) Actor

Browse Blick product families by category or keyword, or look up product variants from public URLs. Get titles, prices, brands, categories, images, ratings, availability, and source links when Blick publishes them.

- **URL**: https://apify.com/maximedupre/dickblick.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.70 / 1,000 product families

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🛒 Browse Blick products without manual catalog work

For ecommerce researchers, art-supply buyers, catalog teams, and developers, Blick Art Materials Scraper reads public dickblick.com pages and saves product data in an Apify dataset. Get product family summaries for category or keyword searches, or variant details from product URLs, with prices, brands, category paths, images, ratings, stock signals, and source links when Blick publishes them.

Use it to:

- Compare paint families when planning an order with **[Acrylic Paint](https://apify.com/maximedupre/dickblick/examples/acrylic-paint)**.
- Find watercolor families by category or keyword with **[Watercolor Paint](https://apify.com/maximedupre/dickblick/examples/watercolor-paint)**.
- Review oil paint families with prices and source links in **[Oil Paint](https://apify.com/maximedupre/dickblick/examples/oil-paint)**.
- Gather drawing pencil families for a classroom or studio list with **[Drawing Pencils](https://apify.com/maximedupre/dickblick/examples/drawing-pencils)**.
- Check visible sale fields for framing products with **[Blick Framing Sale](https://apify.com/maximedupre/dickblick/examples/blick-framing-sale)**.
- Collect product image URLs for catalog work with **[Blick Art Materials Photos](https://apify.com/maximedupre/dickblick/examples/blick-art-materials-photos)**.
- Browse art-supply families and compare brands, price ranges, and categories with **[Art Supplies](https://apify.com/maximedupre/dickblick/examples/art-supplies)**.

#### 📦 Blick product families and variants

Every dataset row has one of two shapes. Product family rows come from a category browse or one keyword and keep a family price range. Product variant rows come from submitted product URLs and keep one variant's price, SKU, availability, and attributes. Optional fields appear only when Blick publishes them, so missing source values are omitted.

#### ▶️ Run a Blick catalog check

Choose Product family summaries or Product variant details. For family summaries, choose one public category URL or one keyword. For variant details, add one or more public product URLs, then add any filters you need. Fields in the other choice are ignored. Leave Maximum results empty to return all available results until the source is exhausted.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `resultType` | string | Chooses `product_families` for category or keyword family summaries, or `product_variants` for product URL lookups. |
| `familySearch` | object | Holds the discovery method and value used for Product family summaries. This section is ignored for Product variant details. |
| `familySearch.discoveryMethod` | string | Chooses `category` to browse one public category URL or `keyword` to search one keyword. |
| `familySearch.categoryUrl` | string (URL) | Gives one public Blick category or subcategory URL when `discoveryMethod` is `category`. |
| `familySearch.keyword` | string | Gives one keyword when `discoveryMethod` is `keyword`. |
| `productUrls` | array of objects | Gives one or more public Blick product URLs for Product variant details. |
| `productUrls[].url` | string (URL) | Gives the public product URL inside a `productUrls` entry. |
| `brand` | string | Keeps Product variant details whose brand contains this text. Leave it blank to allow all brands. |
| `priceRange` | object | Holds a minimum price, a maximum price, or both for Product variant details. Values use the source currency. |
| `priceRange.min` | number | Keeps variant results at or above this price in the source currency. |
| `priceRange.max` | number | Keeps variant results at or below this price in the source currency. |
| `minimumRating` | number | Keeps Product variant details with a source rating at or above this value. Use 0 to 5. |
| `saleOnly` | boolean | Keeps Product variant details that Blick marks with a sale or clearance price. |
| `inStockOnly` | boolean | Keeps Product variant details that Blick marks as in stock. |
| `maxItems` | integer | Stops Product family summaries after this many family rows. Leave it empty to return all available results until the source is exhausted. |

**Successful current-beta input**

This is the public input from a successful current-beta category run.

```json
{
  "resultType": "product_families",
  "familySearch": {
    "discoveryMethod": "category",
    "categoryUrl": "https://www.dickblick.com/categories/painting/"
  },
  "maxItems": 20
}
```

#### 🧾 Output

**Run output**

| Field | Type | What it does |
|---|---|---|
| `results` | string (URL) | Opens the default dataset view for the saved product rows. |

**Product family summary rows**

These rows come from a category browse or keyword search. The required fields are `recordType`, `productId`, `title`, `sourceUrl`, `priceMin`, `priceMax`, and `currency`.

| Field | Type | What it does |
|---|---|---|
| `recordType` | string | Identifies the row as `productFamily`. |
| `productId` | string | Blick's source ID for the product family. |
| `title` | string | Product title published by Blick. |
| `sourceUrl` | string (URL) | Public Blick URL for the product family. |
| `priceMin` | number | Lowest price published for a variant in the family. |
| `priceMax` | number | Highest price published for a variant in the family. |
| `currency` | string | Currency code published with the family prices. |
| `brand` | string | Brand name published by Blick. |
| `categoryPath` | array of strings | Public category or breadcrumb names for the product. |
| `description` | string | Product description published by Blick. |
| `imageUrls` | array of strings | Public product image URLs published by Blick. |
| `rating` | number | Average rating published by Blick. |
| `ratingCount` | integer | Number of ratings published by Blick. |
| `onSale` | boolean | Says whether Blick marks the family as on sale. |
| `isBestPrice` | boolean | Says whether Blick marks the family as a best price. |
| `isOnClearance` | boolean | Says whether Blick marks the family as on clearance. |
| `isNew` | boolean | Says whether Blick marks the family as new. |
| `isOverstock` | boolean | Says whether Blick marks the family as overstock. |
| `savingStory` | string | Savings text published by Blick. |
| `labels` | array of strings | Product labels or certifications published by Blick. |

**Genuine current-beta family row**

This complete row comes from the successful current-beta keyword run.

```json
{
  "recordType": "productFamily",
  "productId": "5gVJXjJopb5NXDCoYSfTJe",
  "title": "Blickrylic Student Acrylic Paints and Sets",
  "sourceUrl": "https://www.dickblick.com/products/blickrylic-student-acrylics/",
  "priceMin": 5.17,
  "priceMax": 183.4,
  "currency": "USD",
  "brand": "Blick",
  "description": "Blickrylic is a true acrylic paint, priced for the budget-minded. The paint is extremely pourable and non-toxic, making it ideal for classroom settings. It dries quickly to a permanent, waterproof, semi-gloss finish.",
  "imageUrls": [
    "https://cld-assets.dick-blick.com/image/upload/f_auto/q_auto/00711-Group-12-4ww.jpg"
  ],
  "rating": 4.6
}
```

**Product variant rows**

These rows come from submitted product URLs. The required fields are `recordType`, `productId`, `itemSku`, `title`, `sourceUrl`, `price`, and `currency`.

| Field | Type | What it does |
|---|---|---|
| `recordType` | string | Identifies the row as `productVariant`. |
| `productId` | string | Blick's source ID for the product family of this variant. |
| `itemSku` | string | Blick's source SKU for the product variant. |
| `title` | string | Product title published by Blick. |
| `sourceUrl` | string (URL) | Public Blick URL for the product variant. |
| `price` | number | Price published for the product variant. |
| `currency` | string | Currency code published with the variant price. |
| `variantName` | string | Variant name, such as a size or color, published by Blick. |
| `brand` | string | Brand name published by Blick. |
| `categoryPath` | array of strings | Public category or breadcrumb names for the product. |
| `description` | string | Product description published by Blick. |
| `color` | string | Color name published for the variant. |
| `gtin` | string | Global Trade Item Number published for the variant. |
| `imageUrls` | array of strings | Public product image URLs published by Blick. |
| `availability` | string | Availability status published for the variant. |
| `inStock` | boolean | Says whether Blick publishes the variant as in stock. |
| `rating` | number | Average rating published by Blick. |
| `ratingCount` | integer | Number of ratings published by Blick. |
| `onSale` | boolean | Says whether Blick marks the variant as on sale. |
| `isBestPrice` | boolean | Says whether Blick marks the variant as a best price. |
| `isOnClearance` | boolean | Says whether Blick marks the variant as on clearance. |
| `isNew` | boolean | Says whether Blick marks the variant as new. |
| `isOverstock` | boolean | Says whether Blick marks the variant as overstock. |
| `savingStory` | string | Savings text published by Blick. |
| `labels` | array of strings | Product labels or certifications published by Blick. |

**Genuine current-beta variant row**

This complete row comes from the successful current-beta product URL run.

```json
{
  "recordType": "productVariant",
  "productId": "6QEpEx5CHqjh12XfPrdyq7",
  "itemSku": "01637-1010",
  "title": "Blick Studio Acrylic Paints and Sets",
  "sourceUrl": "https://www.dickblick.com/products/blick-studio-acrylics/?Item=01637-1010",
  "price": 4.21,
  "currency": "USD",
  "variantName": "Blick Studio Acrylics  Pkg of 2 Titanium White 4 oz tubes",
  "brand": "Blick",
  "categoryPath": [
    "Home",
    "Paint and Mediums",
    "Paint Sets",
    "Acrylic Paint Sets",
    "Blick Studio Acrylic Paints and Sets"
  ],
  "description": "Pkg of 2",
  "color": "Titanium White",
  "gtin": "741389150497",
  "imageUrls": [
    "https://cld-assets.dick-blick.com/image/upload/f_auto/q_auto/v1748040642/01637-1010-SC-4ww.jpg",
    "https://cld-assets.dick-blick.com/image/upload/f_auto/q_auto/v1748045458/01637-1020-s-4ww.jpg"
  ],
  "availability": "InStock",
  "inStock": true,
  "rating": 4.7,
  "ratingCount": 1148,
  "onSale": true,
  "isBestPrice": true,
  "isOnClearance": false,
  "isNew": false,
  "isOverstock": false,
  "savingStory": "SAVE 35-75%",
  "labels": [
    "California Proposition 65",
    "CL Cautionary Label"
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. A saved product family summary uses the family event, and a saved product variant detail uses the variant event. Check the pricing panel for the current tier rates. Your total depends on how many rows the run saves.

#### 🔌 Integrations

Open the default Apify dataset to export the rows or read them through its API URL in the output panel.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I get one row for every color or size?

Product URL lookups return variant-level rows when Blick publishes those variants. Category and keyword searches return product family summaries, not an exhaustive variant expansion.

##### Can I search more than one keyword or category in one run?

No. Choose one category URL or one keyword for a family run. Run the Actor again for another search or category.

##### Can I filter the returned products?

Yes, for Product variant details you can filter by brand, price range, minimum rating, sale status, and stock status. These filters do not apply to Product family summaries.

##### Why is a field missing from a row?

Optional fields appear only when Blick publishes a value for that product or variant. The Actor leaves unpublished values out instead of guessing.

##### Does the Actor place orders or use private account data?

No. It reads public Blick product pages and returns catalog data. It does not handle checkout or other transaction actions.

##### Do I need a Blick login?

No. The Actor reads publicly accessible Blick pages and does not ask for customer login credentials.

### 📝 Changelog

**v0.0** (20-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~dickblick/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [John Lewis Product Scraper](https://apify.com/maximedupre/john-lewis-product-scraper) - Collect UK retail product and variant data with prices, availability, images, ratings, and source URLs.
- [Amazon Price Tracker](https://apify.com/maximedupre/amazon-price-tracker) - Compare public Amazon product snapshots with prices, discounts, ratings, sellers, and availability.
- [Uline Scraper](https://apify.com/maximedupre/uline-scraper) - Collect product catalog rows with SKUs, prices, availability, dimensions, and specifications.
- [Toolstation Scraper](https://apify.com/maximedupre/toolstation-scraper) - Collect trade and DIY product rows with prices, stock, ratings, images, and specifications.
- [Rockler](https://apify.com/maximedupre/rockler) - Collect woodworking catalog products with prices, stock, specifications, ratings, and direct links.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `resultType` (type: `string`):

Choose family summaries for category or keyword searches, or variant details for product URL lookups.

## `familySearch` (type: `object`):

For Product family summaries, choose Browse a category or Search by keyword, then fill only the matching field. This section is ignored for Product variant details.

## `productUrls` (type: `array`):

Add one or more public Blick product URLs. Each accepted URL can return variant-level details.

## `brand` (type: `string`):

For Product variant details, enter a brand to keep only matching results. Leave it blank to allow all brands.

## `priceRange` (type: `object`):

For Product variant details, enter a minimum price, a maximum price, or both. Values use the source currency.

## `minimumRating` (type: `number`):

For Product variant details, keep variants with this source rating or higher. Use a value from 0 to 5.

## `saleOnly` (type: `boolean`):

For Product variant details, keep only products that Blick marks with a sale or clearance price. Leave it off to allow all results.

## `inStockOnly` (type: `boolean`):

For Product variant details, keep only products that Blick marks as in stock. Leave it off to allow all results.

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

For Product family summaries, stop after this many family rows from a category or keyword search. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "resultType": "product_families",
  "familySearch": {
    "discoveryMethod": "category",
    "categoryUrl": "https://www.dickblick.com/categories/painting/"
  },
  "maxItems": 20
}
```

# Actor output Schema

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

Open the default dataset to review family and variant rows.

# 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 = {
    "resultType": "product_families",
    "familySearch": {
        "discoveryMethod": "category",
        "categoryUrl": "https://www.dickblick.com/categories/painting/"
    },
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/dickblick").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 = {
    "resultType": "product_families",
    "familySearch": {
        "discoveryMethod": "category",
        "categoryUrl": "https://www.dickblick.com/categories/painting/",
    },
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/dickblick").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 '{
  "resultType": "product_families",
  "familySearch": {
    "discoveryMethod": "category",
    "categoryUrl": "https://www.dickblick.com/categories/painting/"
  },
  "maxItems": 20
}' |
apify call maximedupre/dickblick --silent --output-dataset

```

## MCP server setup

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

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/gOUYoRgAAF8rJZUvc/builds/HXvAZi5bB6rjONzwC/openapi.json
