# Meijer Product Search Scraper (`stealth_mode/meijer-product-search-scraper`) Actor

Scrape detailed product information from Meijer.com with flexible search and URL-based options. Collect 24+ product attributes including pricing, eligibility flags, inventory status, and MPerks data — perfect for price monitoring, competitive analysis, and retail data aggregation.

- **URL**: https://apify.com/stealth\_mode/meijer-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 $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Meijer Product Search Scraper: Extract Retail Product Data at Scale

***

### About Meijer.com

Meijer is a major U.S. grocery and general merchandise retailer operating hundreds of locations across the Midwest. Meijer.com hosts thousands of products across groceries, household items, health & beauty, and more. Extracting product data manually is impractical at scale — the **Meijer Product Search Scraper** automates the collection of structured product information from search results and category pages, enabling data-driven insights.

***

### Scraper Overview

The **Meijer Product Search Scraper** is designed to extract comprehensive product data from Meijer search results and category pages. It supports two flexible input modes:

- **URL-based scraping:** Paste specific category or search result URLs to scrape directly
- **Search filter scraping:** Use keywords, price ranges, and sorting to dynamically query products

**Key features:**

- Capture 24+ product attributes per item
- Flexible filtering by price range ($0–$200)
- Configurable sorting (name, price)
- MPerks offer detection and eligibility flags
- Robust error handling with optional URL failure tolerance

**Common use cases:**

- **Price monitoring:** Track Meijer pricing against competitors
- **Inventory research:** Identify product availability and stock status
- **Promotional analysis:** Detect sponsored products and MPerks offers
- **Data aggregation:** Feed product catalogs into comparison platforms
- **Market research:** Analyze product mix across categories

***

### Input Format & Configuration

The scraper supports two input modes. You can use either URLs or search filters, but not both simultaneously.

#### Mode 1: URL-Based Scraping

```json
{
  "urls": [
    "https://www.meijer.com/shopping/search.html?text=meat",
    "https://www.meijer.com/shopping/departments/grocery/snacks.html"
  ],
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
```

| Parameter | Type | Description |
|---|---|---|
| `urls` | array | Direct links to Meijer search results or category pages |
| `max_items_per_url` | integer | Maximum products to collect per URL (1–200, default: 20) |
| `ignore_url_failures` | boolean | If `true`, continues running if a URL fails; if `false`, stops on failure |

**URL examples:**

- Search: `https://www.meijer.com/shopping/search.html?text=meat`
- Category: `https://www.meijer.com/shopping/departments/grocery/snacks.html`

#### Mode 2: Search Filter Scraping

```json
{
  "keyword": "meat",
  "sort_by": "item_name-ascending",
  "price_range": "10-15",
  "page": 2,
  "max_items_per_url": 100
}
```

| Parameter | Type | Options | Description |
|---|---|---|---|
| `keyword` | string | Any product name or category | Search term (e.g., "meat", "organic milk") |
| `sort_by` | string | `item_name-ascending`, `item_name-descending`, `discountSalePriceValue-ascending`, `discountSalePriceValue-descending` | Sort results by name or price |
| `price_range` | string | `0-5`, `5-10`, `10-15`, `15-20`, `20-25`, `25-50`, `50-100`, `100-200` | Filter by price bracket (USD) |
| `page` | integer | 1+ | Starting page number for pagination |
| `max_items_per_url` | integer | 1–200 | Maximum products per query (default: 20) |

> **Note:** Leave `urls` empty when using search filters. Conversely, omit keyword and price filters when scraping by URLs.

***

### Output Format & Field Definitions

**Sample output**

```json
{
  "product_name": "Fresh from Meijer All Natural Boneless Thin Cut Pork Chops",
  "is_sponsored": false,
  "event_type": null,
  "has_m_perks": false,
  "is_alcohol": false,
  "is_bopas": false,
  "is_business_active": true,
  "is_choking_hazard": false,
  "is_food_stamp_eligible": true,
  "is_home_delivery_available": true,
  "is_primary_upc": true,
  "is_product_age_restricted": false,
  "m_perks_offer_id": [],
  "product_id": "2872294",
  "thumbnail_image": {
    "url": "https://www.meijer.com/content/dam/meijer/product/0201/56/3000/00/0201563000005_1_A1C1_0200.jpg"
  },
  "sold_by_unit": "PKG",
  "sold_by_unit_description": "Pkg",
  "unit_of_measure_quantity": 1.0,
  "upc": "20156300000",
  "upc_type_name": "UPCA",
  "updated_at": "2026-08-11T17:54:49.736Z",
  "max_order_quantity": null,
  "is_curbside_eligible": true,
  "is_price_by_weight": false,
  "is_third_party_shipping": false,
  "third_party_offers": null,
  "store_specific_product_details": {
    "product_rules": {
      "is_wic_eligible": null
    },
    "product_store": {
      "is_on_sale": true,
      "is_price_displayable": true,
      "savings_description": "$2.70 Off",
      "price_description": null,
      "base_price": 6.29,
      "base_price_per_sold_by_unit": 6.29,
      "customer_price": 3.59,
      "customer_price_per_sold_by_unit": 3.59,
      "discount_value_per_sold_by_unit": 2.7,
      "discount_value": 2.7,
      "sold_by_unit": "PKG",
      "avg_sold_by_units_per_pricing_unit": 1.0,
      "avg_pricing_units_per_sold_by_unit": 1.0,
      "unit_of_measure_quantity": 1.0,
      "percentage_off": 0.0,
      "dollar_off": 0.0,
      "age_limit": null,
      "buy_quantity": 1,
      "clearance_price": null,
      "clearance_price_per_sold_by_unit": null,
      "pricing_unit": "LB",
      "promotion_price": 3.59,
      "sell_quantity": 0,
      "deposit_value": null,
      "price_text": "$3.59"
    },
    "product_store_inventory": {
      "stock_status": "inStock",
      "ilc_primary": "A-24-14-1",
      "ilcs": "A-24-14-1"
    },
    "promotions": null
  },
  "from_url": "https://www.meijer.com/shopping/search.html?text=meat"
}
```

Each scraped product returns a detailed record with 24 fields:

#### Product Identification

| Field | Meaning | Example |
|---|---|---|
| `Product Name` | Full product title as displayed | "Beef Ground Chuck 80/20" |
| `Product ID` | Internal Meijer product identifier | "12345678" |
| `UPC` | Universal Product Code | "012345678901" |
| `UPC Type Name` | Type of barcode (e.g., UPC-A) | "UPC-A" |
| `Is Primary UPC` | Whether this is the main barcode | `true` / `false` |
| `Thumbnail Image` | Product image URL | "https://meijer.com/img/..." |

#### Pricing & Units

| Field | Meaning | Example |
|---|---|---|
| `Sold By Unit` | Base unit of sale | "LB" (pound), "EACH" |
| `Sold By Unit Description` | Human-readable unit description | "Per Pound" |
| `Unit Of Measure Quantity` | Quantity in the declared unit | "2.5" (2.5 lbs) |
| `Is Price By Weight` | Whether price varies by weight | `true` / `false` |
| `Max Order Quantity` | Maximum purchasable units per order | "10" |

#### Product Attributes & Flags

| Field | Meaning | Example |
|---|---|---|
| `Is Sponsored` | Whether the listing is a paid promotion | `true` / `false` |
| `Event Type` | Seasonal or promotional event | "Weekly Ad", "Sale" |
| `Is Alcohol` | Age-restricted alcohol product | `true` / `false` |
| `Is Choking Hazard` | Product hazard warning for children | `true` / `false` |
| `Is Product Age Restricted` | Other age restrictions | `true` / `false` |

#### Availability & Eligibility

| Field | Meaning | Example |
|---|---|---|
| `Is Food Stamp Eligible` | SNAP/EBT eligible product | `true` / `false` |
| `Is Home Delivery Available` | Can be shipped via home delivery | `true` / `false` |
| `Is Curbside Eligible` | Available for curbside pickup | `true` / `false` |
| `Is BOPAS` | Buy Online Pick-up At Store eligible | `true` / `false` |
| `Is Business Active` | Meijer Business product | `true` / `false` |

#### MPerks & Third-Party

| Field | Meaning | Example |
|---|---|---|
| `Has MPerks` | Linked to Meijer Rewards program | `true` / `false` |
| `MPerks Offer ID` | Unique reward offer identifier | "OFFER\_987654" |
| `Is Third Party Shipping` | Sold via third-party fulfillment | `true` / `false` |
| `Third Party Offers` | Alternative seller offers | JSON array of offers |

#### Metadata

| Field | Meaning | Example |
|---|---|---|
| `Updated At` | Last data refresh timestamp | "2024-09-15T14:32:00Z" |
| `Store Specific Product Details` | Location-based info (stock, pricing) | JSON object with store data |

***

### How to Use

#### Step 1: Choose Your Input Mode

**Option A – URL Mode** (best for specific categories or saved searches):

- Navigate Meijer.com and find the product list you want
- Copy the full URL from your browser
- Paste into the `urls` array

**Option B – Search Mode** (best for dynamic queries):

- Enter a keyword (e.g., "organic beef", "gluten-free")
- Select sort order: name (A–Z, Z–A) or price (low–high, high–low)
- Choose a price range ($0–$200)
- Set starting page if resuming from a previous run

#### Step 2: Configure Settings

```json
{
  "max_items_per_url": 100,     // Adjust based on your data needs
  "ignore_url_failures": true   // Skip failed URLs instead of halting
}
```

#### Step 3: Run & Monitor

- Start the scraper and check the live log
- Monitor progress as products are extracted
- Let it complete (can take minutes to hours depending on volume)

#### Step 4: Export Results

- Download output as **JSON**, **CSV**, or **Excel**
- Import into your database, BI tool, or analysis platform
- Clean and deduplicate as needed

**Troubleshooting:**

- If results are empty, verify the URL is a product list (not a single product page)
- Use `ignore_url_failures: true` for robustness during bulk runs
- Reduce `max_items_per_url` if hitting timeouts
- If a keyword returns no results, try broader terms

***

### Use Cases & Business Value

**Price Intelligence:**\
Monitor Meijer's pricing strategy across product categories and regions. Detect price changes, compare against competitors, and optimize your own pricing.

**Promotional Analysis:**\
Identify sponsored products, MPerks offers, and weekly ad items. Understand Meijer's promotional calendar and customer incentive programs.

**Inventory & Availability:**\
Track which products are eligible for home delivery, curbside pickup, or BOPAS (Buy Online Pick-up At Store). Adjust your fulfillment strategy accordingly.

**Competitor Benchmarking:**\
Compare product selection, features, and eligibility flags against other retailers. Spot gaps in your own offering.

**Data Aggregation:**\
Feed scraped Meijer data into price comparison platforms, shopping bots, or internal product databases. Enrich your data pipeline with real-time grocery intelligence.

The **Meijer Product Search Scraper** transforms unstructured web data into actionable insights, saving hours of manual research and enabling data-driven decisions.

***

### Conclusion

The **Meijer Product Search Scraper** is a powerful tool for retail professionals, researchers, and analysts who need reliable product data from one of the U.S.'s largest grocery retailers. With 24+ fields, flexible input modes, and robust filtering, it scales from single-URL queries to enterprise-level data collection. Start today and unlock competitive insights from Meijer's catalog.

# 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

## `price_range` (type: `string`):

Price range to filter by

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

## `proxy` (type: `object`):

Select proxies to be used by your scraper.

## Actor input object example

```json
{
  "urls": [
    "https://www.meijer.com/shopping/departments/grocery/snacks.html?icid=T1:Grocery:VW:Snacks"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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.meijer.com/shopping/departments/grocery/snacks.html?icid=T1:Grocery:VW:Snacks"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/meijer-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.meijer.com/shopping/departments/grocery/snacks.html?icid=T1:Grocery:VW:Snacks"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/meijer-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.meijer.com/shopping/departments/grocery/snacks.html?icid=T1:Grocery:VW:Snacks"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call stealth_mode/meijer-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/meijer-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/C4KDqJL57tPFUzKRT/builds/ErWSKzbca3zSRCzN9/openapi.json
