# Michaels Product Search Scraper (`stealth_mode/michaels-product-search-scraper`) Actor

Scrape thousands of product listings from Michaels.com with advanced filtering. Get prices, ratings, images, inventory details, and 48+ fields per product. Perfect for price monitoring, competitor analysis, and market research on craft supplies and home decor.

- **URL**: https://apify.com/stealth\_mode/michaels-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
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

## Michaels Product Search Scraper: Extract Craft Supplies Data at Scale

***

### What Is Michaels.com?

Michaels.com is the e-commerce platform for Michaels Stores, one of North America's largest retailers of craft supplies, home décor, floral items, and seasonal products. With millions of SKUs across hundreds of categories, manually tracking pricing, availability, and product updates is impractical. The **Michaels Product Search Scraper** automates product data collection, enabling businesses to monitor inventory, prices, and trends in real time.

***

### Overview

The **Michaels Product Search Scraper** extracts comprehensive product listings from Michaels search results and detail pages. It supports two modes of operation:

- **URL mode:** Scrape specific product list URLs directly
- **Search filter mode:** Use keywords and filters (price range, rating, sale status) to discover and collect products dynamically

Ideal users include:

- **Price monitoring services** tracking craft supply costs across retailers
- **Market researchers** analyzing consumer demand for DIY and craft products
- **E-commerce aggregators** building craft product databases
- **Competitors** benchmarking product selection and pricing strategy

The scraper handles pagination, honors site rate limits via `ignore_url_failures`, and delivers structured data across 48+ product attributes.

***

### Input Format

The scraper accepts flexible JSON configuration supporting two operational modes:

#### Mode 1: Direct URL Scraping

```json
{
  "urls": [
    "https://www.michaels.com/search?q=4+x+6",
    "https://www.michaels.com/search?q=canvas&sortBy=Price%3A+Low+to+High"
  ],
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
```

#### Mode 2: Search Filter-Based Scraping

```json
{
  "keyword": "4 x 6",
  "sort_by": "Best Sellers",
  "on_sale": true,
  "price_min": 20,
  "price_max": 50,
  "rating": 4,
  "page": 2,
  "max_items_per_url": 200
}
```

#### Parameter Definitions

| Parameter | Type | Description | Example |
|---|---|---|---|
| `urls` | array | Direct links to Michaels search result pages or product lists | `["https://www.michaels.com/search?q=acrylic+paint"]` |
| `keyword` | string | Search term to find products on Michaels | `"canvas stretcher bars"` |
| `sort_by` | select | Order results by: "Best Match", "Best Sellers", "New Arrivals", "Price: High to Low", "Price: Low to High" | `"Best Sellers"` |
| `on_sale` | boolean | Include only discounted items when `true` | `true` |
| `price_min` | integer | Minimum product price filter (USD) | `15` |
| `price_max` | integer | Maximum product price filter (USD) | `150` |
| `rating` | string | Minimum star rating: "Any", "1 star or more", "2 stars or more", "3 stars or more", "4 stars or more", "5 stars" | `"4"` |
| `page` | integer | Starting page number for paginated results (useful for resuming interrupted scrapes) | `1` |
| `max_items_per_url` | integer | Maximum products collected per URL/search (1–500) | `200` |
| `ignore_url_failures` | boolean | Continue scraping if specific URLs fail instead of stopping the entire run | `true` |

> **Tip:** Use URL mode when you have pre-built Michaels search URLs. Use filter mode when you want the scraper to dynamically construct searches based on keywords and criteria.

***

### Output Format

**Sample output**

```json
{
  "id": "10477537",
  "analytics_product_detail_view": {
    "channel": "1",
    "sku_number": "10477537",
    "item_name": "6 Pack Basics 4\" x 6\" Black Frames by Studio Décor®",
    "average_rating": 4.6584,
    "comment_count": 161,
    "full_taxonomy_path": "Multipack Table Frames",
    "item_properties": "$undefined",
    "sub_skus": "$undefined",
    "item_price": {
      "price": "$$21.99",
      "org_price": null,
      "price_range": null,
      "org_price_range": null,
      "unit_price": null,
      "unit_price_range": null,
      "price_flag": null,
      "saved_amount": null,
      "saved_percent": null,
      "number_price": "21.99"
    },
    "badges": {
      "free_store_pickup": true,
      "same_day_delivery": true
    }
  },
  "master_sku": "$undefined",
  "sku_number": "10477537",
  "pdp_url": "/product/6-pack-basics-4-x-6-black-frames-by-studio-decor-10477537",
  "name": "6 Pack Basics 4\" x 6\" Black Frames by Studio Décor®",
  "description": "6 Pack Basics 4\" x 6\" Black Frames by Studio Décor®",
  "price": 21.99,
  "price_display": "$$21.99",
  "unit_price_display": "$undefined",
  "original_price": "$undefined",
  "org_price_display": "$undefined",
  "price_range": "$undefined",
  "org_price_range": "$undefined",
  "rating": 4.6584,
  "review_count": 161,
  "image": "https://imgs.michaels.com/48de1f17-a59b-490b-ae72-16be37222b85.jpg?fit=inside|540:540",
  "images": [
    "https://imgs.michaels.com/48de1f17-a59b-490b-ae72-16be37222b85.jpg?fit=inside|540:540",
    "https://imgs.michaels.com/89e50aa4-0a91-4b93-9a6d-7e9c661810d2.jpg?fit=inside|540:540",
    "https://imgs.michaels.com/ff52cc50-feea-4b1f-828c-c48e2b88571b.jpg?fit=inside|540:540"
  ],
  "category": "Multipack Table Frames",
  "brand": "Michaels",
  "size": "$undefined",
  "color": "$undefined",
  "color_swatches": [],
  "variant_count": "",
  "variant_counts": {},
  "availability": {
    "store_pickup": true,
    "ship_to_me": true,
    "scheduled_delivery": false,
    "stock_count": "$undefined",
    "store_name": "MacArthur Park",
    "store_code": "1056"
  },
  "badges": {
    "free_store_pickup": true,
    "michaels_exclusive": false,
    "michaels_pro_pack": false,
    "online_only": false,
    "not_available_to_ship": false,
    "same_day_delivery_badge": true,
    "global_non_discountable": false,
    "coupon_exclusion": false,
    "sale": false,
    "new_pdt": false,
    "clearance": false,
    "great_buy": false,
    "coming_soon": false,
    "everyday_value": false,
    "doorbuster": false,
    "ships_for_free": false
  },
  "is_pro_pack": false,
  "is_exclusive": false,
  "badge": "$undefined",
  "store_only": false,
  "is_sponsored": false,
  "is_online_only": false,
  "is_bundle": false,
  "components": "$undefined",
  "bundle_sku": "$undefined",
  "balloon_inflation": false,
  "inflation_eligible": "$undefined",
  "balloon_inflation_product_store_available": false,
  "mbai": "$undefined",
  "pick_up_store_info": "$undefined",
  "promotion_message": "30% off every regular price purchase with code SAVE30NOW",
  "promotion_expiry": "2026-09-19T23:59:59.000Z",
  "channel": "1",
  "store_id": null,
  "seller_store_id": null,
  "seller_store_name": "$undefined",
  "free_title_info": "Free on Orders $49+",
  "shipping": {
    "free_shipping_eligible": "$undefined",
    "free_standard_shipping": "$undefined",
    "override_shipping_rate": "$undefined",
    "ship_minimum_order_quantity": 1,
    "bopis_minimum_order_quantity": 1
  },
  "from_url": "https://www.michaels.com/search?q=4+x+6"
}
```

Each product returns a detailed record with 48 fields covering identification, pricing, attributes, availability, and marketing data:

#### Product Identification & Catalog

| Field | Meaning | Example |
|---|---|---|
| `ID` | Michaels internal unique product identifier | `"12345678"` |
| `Master SKU` | Base SKU linking variants and bundles | `"40123456"` |
| `SKU Number` | Specific variant stock-keeping unit | `"40123456-WHITE-LRG"` |
| `Name` | Official product name | `"Strathmore 400 Series Canvas Pad 4 x 6"` |
| `Description` | Full product description HTML | Contains detailed product info, materials, usage |
| `PDP URL` | Direct link to product detail page | `"https://www.michaels.com/product/..."` |
| `Brand` | Manufacturer or product line | `"Strathmore"` |
| `Category` | Product classification | `"Painting > Canvas Pads"` |

#### Pricing & Promotions

| Field | Meaning | Example |
|---|---|---|
| `Price` | Current selling price (numeric) | `12.99` |
| `Price Display` | Formatted price as shown on site | `"$12.99"` |
| `Unit Price Display` | Price per unit/gram/meter if applicable | `"$12.99 each"` |
| `Original Price` | Regular price before discount (numeric) | `16.99` |
| `Original Price Display` | Formatted regular price | `"$16.99"` |
| `Price Range` | Min-max for products with variants | `"$8.99 - $24.99"` |
| `Original Price Range` | Regular price range | `"$10.99 - $29.99"` |
| `Promotion Message` | Active discount or offer text | `"Save 25% with coupon"` |
| `Promotion Expiry` | When the promotion ends | `"2024-12-31"` |

#### Ratings & Reviews

| Field | Meaning | Example |
|---|---|---|
| `Rating` | Average star rating (1–5) | `4.5` |
| `Review Count` | Total customer reviews | `237` |

#### Product Attributes & Variants

| Field | Meaning | Example |
|---|---|---|
| `Size` | Dimensions or size options | `"4 x 6"` |
| `Color` | Available color(s) | `"White"` |
| `Color Swatches` | Visual color options (image URLs) | Array of color preview images |
| `Variant Count` | Total number of variants available | `8` |
| `Variant Counts` | Breakdown of variant types | `{"Color": 4, "Size": 2}` |

#### Inventory & Availability

| Field | Meaning | Example |
|---|---|---|
| `Availability` | Stock status (in stock, low stock, out of stock) | `"In Stock"` |
| `Store Only` | Product available only in-store | `false` |
| `Is Online Only` | Product exclusive to online | `true` |
| `Pick Up Store Info` | Local pickup availability details | Store location and availability |

#### Imagery

| Field | Meaning | Example |
|---|---|---|
| `Image` | Primary product image URL | `"https://cdn.michaels.com/image.jpg"` |
| `Images` | Array of all product images | Multiple image URLs for gallery |

#### Special Flags & Classifications

| Field | Meaning | Example |
|---|---|---|
| `Is Pro Pack` | Professional bulk package | `false` |
| `Is Exclusive` | Michaels exclusive product | `true` |
| `Is Sponsored` | Paid promotional placement | `false` |
| `Is Bundle` | Multi-product package deal | `false` |
| `Components` | Items included in bundle | Array of component SKUs |
| `Badge` | Promotional badge displayed | `"Best Seller"`, `"New"`, `"On Sale"` |
| `Badges` | Multiple applicable badges | `["Best Seller", "Clearance"]` |

#### Specialty Features

| Field | Meaning | Example |
|---|---|---|
| `Balloon Inflation` | Balloon inflation service eligibility | `false` |
| `Inflation Eligible` | Eligible for inflation services | `false` |
| `Balloon Inflation Product Store Available` | In-store inflation availability | `true` |
| `MBAI` | Michaels exclusive attribute flag | `false` |
| `Bundle SKU` | SKU for bundled products | `"40123456-BUNDLE"` |

#### Seller & Fulfillment

| Field | Meaning | Example |
|---|---|---|
| `Channel` | Sales channel (Direct, Marketplace) | `"Direct"` |
| `Store ID` | Michaels store identifier | `"123"` |
| `Seller Store ID` | Third-party seller store ID | `"VENDOR456"` |
| `Seller Store Name` | Name of selling entity | `"Michaels Direct"` |
| `Shipping` | Shipping method and cost info | `"Free shipping on orders $60+"` |
| `Free Title Info` | Free shipping or title eligibility | Promotional eligibility details |
| `Analytics Product Detail View` | Analytics tracking identifier | Internal analytics ID |

***

### How to Use

#### Quick Start (URL Mode)

1. **Gather URLs** — Navigate to Michaels.com and perform searches. Copy the full search result URLs.
   - Example: `https://www.michaels.com/search?q=acrylic+paint&sortBy=Best+Sellers`
2. **Paste URLs** — Add them to the `urls` array in your configuration.
3. **Set max items** — Adjust `max_items_per_url` (default: 20, max: 500).
4. **Enable resilience** — Set `ignore_url_failures: true` to skip any failed URLs.
5. **Run** — Execute the scraper and download results as JSON, CSV, or Excel.

#### Advanced (Filter Mode)

1. **Define your search** — Specify a `keyword` (e.g., `"acrylic paint"`, `"canvas stretcher"`)
2. **Apply filters**:
   - Set `price_min` and `price_max` to focus on a price range
   - Use `on_sale: true` to scrape only discounted items
   - Specify minimum `rating` (1–5 stars)
   - Choose `sort_by` order (Best Sellers, New Arrivals, Price)
3. **Pagination** — Use `page` parameter to start from a specific page (useful for large datasets)
4. **Execute** — The scraper constructs the Michaels URL and scrapes dynamically

**Best practices:**

- Test with a small `max_items_per_url` (e.g., 20) before scaling to 200+
- Use filter mode for recurring scrapes; it auto-handles pagination
- Combine `on_sale: true` with specific categories for trend analysis
- If results vary, clear browser cache or use a fresh proxy

***

### Use Cases & Applications

- **Price monitoring:** Track art supply and craft product pricing across seasonal promotions
- **Competitive intelligence:** Monitor competitor stock levels and promotional strategies
- **Demand analysis:** Identify trending craft categories (DIY, home décor, seasonal items)
- **Marketplace integration:** Feed Michaels products into your own retail platform or price comparison site
- **Inventory research:** Benchmark product depth (variants, colors, sizes) in categories of interest

By automating product data collection, teams save dozens of hours per month and gain real-time visibility into the craft retail landscape.

***

### Conclusion

The **Michaels Product Search Scraper** simplifies access to detailed craft supply and home décor product data. Whether you need to monitor competitor pricing, analyze market trends, or build a craft product database, this scraper's dual-mode design and rich 48-field output make it an essential tool for retail researchers, aggregators, and e-commerce professionals.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `keyword` (type: `string`):

Enter the keyword to search for items

## `sort_by` (type: `string`):

Sort items by options

## `on_sale` (type: `boolean`):

If true, the scraper will only scrape items that are on sale.

## `price_min` (type: `integer`):

The minimum price of the items to scrape.

## `price_max` (type: `integer`):

The maximum price of the items to scrape.

## `rating` (type: `string`):

The minimum star rating of the items to scrape.

## `page` (type: `integer`):

The page number to start scraping from.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.michaels.com/search?q=4+x+6&sortBy=Price%3A+High+to+Low&minRating=4&pmin=20&pmax=50&ways=Sale"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.michaels.com/search?q=4+x+6&sortBy=Price%3A+High+to+Low&minRating=4&pmin=20&pmax=50&ways=Sale"
    ],
    "ignore_url_failures": true,
    "on_sale": false,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/michaels-product-search-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 = {
    "urls": ["https://www.michaels.com/search?q=4+x+6&sortBy=Price%3A+High+to+Low&minRating=4&pmin=20&pmax=50&ways=Sale"],
    "ignore_url_failures": True,
    "on_sale": False,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/michaels-product-search-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 '{
  "urls": [
    "https://www.michaels.com/search?q=4+x+6&sortBy=Price%3A+High+to+Low&minRating=4&pmin=20&pmax=50&ways=Sale"
  ],
  "ignore_url_failures": true,
  "on_sale": false,
  "max_items_per_url": 20
}' |
apify call stealth_mode/michaels-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stealth_mode/michaels-product-search-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/ZDw9qCeEf8Dp9Yq9p/builds/QT8kpw5xmkBNquOBE/openapi.json
