# Walmart Scraper (`unfenced-group/walmart-scraper`) Actor

Scrape Walmart products by keyword, URL, or item ID. Get prices, discounts, variants, ratings with full star breakdown, seller and return info, deal and sponsored flags, fulfillment options, and reviews. Price-change tracking and MAP detection built in. No API key required.

- **URL**: https://apify.com/unfenced-group/walmart-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 27 total users, 9 monthly users, 99.4% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Walmart Scraper

![Walmart Scraper](https://api.apify.com/v2/key-value-stores/ClElVyZWvQgPQIuDL/records/walmart-scraper)

Extract product data from Walmart.com and Walmart.ca at scale: prices, deal badges, sellers, variants, ratings, review distribution, return policy, fulfillment options, and full descriptions. Built-in price-change tracking, MAP violation detection, bulk item-ID mode, and customer reviews. Search by keyword, direct URL, or item ID. No API key required.

***

### Why this scraper?

#### 🔍 Three discovery modes

**Search** finds products by keyword. **Bulk** fetches a list of item IDs directly for the fastest possible runs. **Monitor** tracks a fixed set of products and returns only the ones that changed since the last run.

#### 💵 Complete pricing

Current price, original "was" price, calculated discount and discount percentage, and per-unit price for grocery items. Sort search results by price and filter by a minimum and maximum price.

#### 🎨 Full variant data

Every colour, size, and configuration is returned with its own item ID, price, availability, and image, plus a compact list of all available options.

#### ⭐ Ratings and review distribution

Average rating, total review count, and the full one-to-five-star breakdown for each product. Optionally pull individual customer reviews with text, rating, verified-purchase flag, and helpful votes.

#### 🏷️ Deal and demand signals

Rollback, Clearance, Special Buy, Best Seller, and Sponsored flags, so you can spot promotions and paid placements at a glance.

#### 🚚 Fulfillment and seller detail

Pickup, delivery, shipping, and free-shipping availability per product. Seller name, first-party flag, and — for marketplace sellers — seller rating and review count. Return policy included.

#### 📉 Price change tracking and MAP enforcement

Each run compares price and availability against last-known values and tags every item with a change status. Supply your MAP prices and any product priced below its minimum is flagged automatically.

#### 📍 ZIP-code geo pricing

Walmart prices and availability vary by location. Enter a US ZIP code to scrape exactly what a buyer there sees.

***

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `"search"` | `search` (keyword), `bulk` (item ID list), or `monitor` (change tracking). |
| `keywords` | array | `[]` | Search terms. Each keyword runs independently. |
| `startUrls` | array | `[]` | Specific Walmart product (`/ip/...`) or search page URLs. |
| `itemIds` | array | `[]` | Walmart numeric item IDs for bulk mode. Fastest input method. |
| `domain` | string | `"walmart.com"` | `walmart.com` (USD) or `walmart.ca` (CAD). |
| `maxResults` | integer | `5` | Maximum products to return across all inputs. |
| `sort` | string | `"best_match"` | Sort search results: `best_match`, `price_low`, `price_high`, `best_seller`, `new`, or `rating_high`. |
| `minPrice` | integer | (empty) | Only return products priced at or above this value. |
| `maxPrice` | integer | (empty) | Only return products priced at or below this value. |
| `fetchDetails` | boolean | `false` | Fetch each product's detail page for variants, description, unit price, model, UPC, review distribution, seller rating, and return policy. Always on in bulk and monitor modes. |
| `zipCode` | string | `""` | US ZIP code for geo-targeted pricing (e.g. `"10001"`, `"90210"`). |
| `outputOnlyChanges` | boolean | `false` | Emit only items that changed since the last run. Requires history from previous runs. |
| `mapPrices` | object | `{}` | MAP per item ID: `{ "1004249195": 49.99 }`. Items below are flagged `mapViolation: true`. |
| `includeReviews` | boolean | `false` | Fetch customer reviews (saved as separate items). Billed at $0.50 per 1,000 reviews. |
| `maxReviews` | integer | `20` | Maximum reviews per product when `includeReviews` is on. |
| `skipReposts` | boolean | `false` | Skip products already returned in previous runs (cross-run dedup). |

***

### Output schema

#### Always present (every product)

| Field | Type | Description |
|---|---|---|
| `itemId` | string | Walmart numeric item ID. |
| `title` | string | Full product title. |
| `url` | string | Canonical product URL. |
| `price` | number|null | Current price (null if out of stock or not offered). |
| `listPrice` | number|null | Original "was" price before discount. |
| `discount` | number|null | Absolute discount from list price (null when not discounted). |
| `discountPct` | number|null | Discount as a percentage (null when not discounted). |
| `currency` | string | `"USD"` or `"CAD"`. |
| `availability` | string|null | Availability status as reported by Walmart. |
| `inStock` | boolean|null | True when the item is in stock. |
| `brand` | string|null | Product brand. |
| `rating` | number|null | Average customer rating (0–5). |
| `reviewCount` | integer|null | Total review count. |
| `image` | string|null | Primary image URL. |
| `sellerName` | string|null | Seller display name. |
| `sellerId` | string|null | Walmart seller ID (null for first-party items). |
| `isFirstParty` | boolean | True when sold directly by Walmart. |
| `fulfillment` | string|null | Primary fulfillment type. |
| `offersPickup` | boolean | Store pickup available. |
| `offersDelivery` | boolean | Local delivery available. |
| `offersShipping` | boolean | Shipping available. |
| `freeShipping` | boolean | Free shipping offered. |
| `dealBadge` | string|null | Badge text (Rollback, Clearance, etc.). |
| `isRollback` | boolean | Rollback badge present. |
| `isClearance` | boolean | Clearance badge present. |
| `isSpecialBuy` | boolean | Special Buy badge present. |
| `isBestSeller` | boolean | Best Seller badge present. |
| `isSponsored` | boolean | Paid/sponsored placement in search results. |
| `domain` | string | Walmart domain scraped. |
| `zipCode` | string|null | ZIP used for geo pricing. |
| `changeStatus` | string | `NEW`, `PRICE_DROP`, `PRICE_RISE`, `RESTOCKED`, `OUT_OF_STOCK`, or `UNCHANGED`. |
| `prevPrice` | number|null | Price from the previous run (null on first run). |
| `prevAvailability` | string|null | Availability from the previous run. |
| `priceChange` | number|null | Price change versus previous run. |
| `priceChangePct` | number|null | Percentage price change versus previous run. |
| `mapViolation` | boolean | True when price is below the supplied MAP. |
| `mapPrice` | number|null | The MAP you supplied for this item. |
| `belowMapBy` | number|null | How far below MAP the current price is. |
| `source` | string | Walmart domain. |
| `scrapedAt` | string | ISO 8601 timestamp. |
| `contentHash` | string | 16-character hash for change detection. |

#### With `fetchDetails: true` (and in bulk/monitor mode)

| Field | Type | Description |
|---|---|---|
| `model` | string|null | Manufacturer model number. |
| `upc` | string|null | UPC barcode. |
| `pricePerUnit` | string|null | Unit price for grocery items (e.g. `"44.1 ¢/oz"`; null for non-grocery). |
| `categories` | array | Full category breadcrumb path. |
| `descriptionHtml` | string|null | Raw HTML description. |
| `descriptionText` | string|null | Plain-text description. |
| `descriptionMarkdown` | string|null | Description converted to Markdown. |
| `variants` | array|null | Each variant: `itemId`, `type`, `name`, `price`, `listPrice`, `availability`, `inStock`, `image`, `currency`. |
| `variantOptions` | array|null | Available options grouped by attribute, e.g. `[{ "name": "Color", "values": ["Black","Blue"] }]`. |
| `images` | array | All product image URLs. |
| `ratingDistribution` | object|null | Star breakdown: `{ one, two, three, four, five }` counts. |
| `sellerAverageRating` | number|null | Marketplace seller rating (null for first-party). |
| `sellerReviewCount` | integer|null | Marketplace seller review count (null for first-party). |
| `returnPolicy` | object|null | `{ returnable, freeReturns, returnWindow, text }`. |

#### Review items (`includeReviews: true`)

Saved as separate items with `"_type": "review"`.

| Field | Type | Description |
|---|---|---|
| `_type` | string | Always `"review"`. |
| `reviewId` | string|null | Platform review ID. |
| `itemId` | string | Parent product item ID. |
| `rating` | number|null | Star rating (1–5). |
| `title` | string|null | Review headline. |
| `text` | string|null | Review body. |
| `authorName` | string|null | Reviewer display name. |
| `isVerifiedPurchase` | boolean | Verified Purchaser badge. |
| `helpfulVotes` | integer | Helpful vote count. |
| `submissionDate` | string|null | Submission date. |

#### Example product (search with `fetchDetails: true`)

```json
{
  "itemId": "256397692",
  "title": "Hanes Men's Beefy-T Heavyweight Cotton T-Shirt",
  "url": "https://www.walmart.com/ip/Hanes-Mens-Beefy-T/256397692",
  "price": 15.00,
  "listPrice": 20.00,
  "discount": 5.00,
  "discountPct": 25.0,
  "currency": "USD",
  "availability": "IN_STOCK",
  "inStock": true,
  "brand": "Hanes",
  "model": "5180",
  "upc": "075338110738",
  "rating": 4.6,
  "reviewCount": 1240,
  "ratingDistribution": { "one": 5, "two": 0, "three": 4, "four": 14, "five": 102 },
  "sellerName": "Walmart.com",
  "isFirstParty": true,
  "offersPickup": true,
  "offersDelivery": true,
  "offersShipping": true,
  "freeShipping": true,
  "isBestSeller": true,
  "isSponsored": false,
  "categories": ["Clothing", "Mens Clothing", "Mens Shirts", "Mens T-Shirts"],
  "variantOptions": [
    { "name": "Color", "values": ["Black", "Navy", "White"] },
    { "name": "Clothing Size", "values": ["S", "M", "L", "XL", "2XL"] }
  ],
  "variants": [
    { "itemId": "15343651004", "type": "Color / Clothing Size", "name": "Black / L", "price": 15.00, "availability": "IN_STOCK", "inStock": true }
  ],
  "returnPolicy": { "returnable": true, "freeReturns": true, "returnWindow": 90, "text": "Free 90-day returns" },
  "changeStatus": "PRICE_DROP",
  "prevPrice": 18.00,
  "priceChange": -3.00,
  "priceChangePct": -16.67,
  "mapViolation": false,
  "scrapedAt": "2026-07-10T08:36:00.000Z",
  "contentHash": "a3f8b21c9d4e7f01"
}
```

***

### Examples

**Keyword search with full detail and geo pricing:**

```json
{ "keywords": ["coffee maker"], "maxResults": 50, "fetchDetails": true, "zipCode": "10001" }
```

**Price-sorted search with a price range:**

```json
{ "keywords": ["laptop"], "sort": "price_low", "minPrice": 300, "maxPrice": 800, "maxResults": 40 }
```

**Bulk mode — fastest way to check known products:**

```json
{ "itemIds": ["1004249195", "846561863", "5095233663"], "fetchDetails": true, "domain": "walmart.com" }
```

**Daily price-drop monitor (scheduled run):**

```json
{ "keywords": ["keurig", "nespresso"], "mode": "monitor", "outputOnlyChanges": true, "maxResults": 500, "fetchDetails": true }
```

***

### 💰 Pricing

**$3.00 per 1,000 products** — you only pay for products successfully returned. Failed retries are never charged.

Reviews add-on: **$0.50 per 1,000 reviews** when `includeReviews` is enabled.

| Products | Cost | Reviews (20 each) |
|---|---|---|
| 100 | ~$0.30 | +~$1.00 |
| 1,000 | ~$3.00 | +~$10.00 |
| 10,000 | ~$30.00 | +~$100.00 |

> Flat-rate Walmart data services charge $49–$199/month regardless of usage. Use the **Max results** cap to control your spend exactly.

***

### Performance

| Run | Typical time |
|---|---|
| 50 products, bulk mode | 2–4 min |
| 50 products, search + fetchDetails | 4–6 min |
| 200 products, search + fetchDetails | 15–20 min |
| 1,000 products, monitor + outputOnlyChanges | 20–40 min |

***

### Known limitations

- Detail-only fields (variants, description, unit price, model, UPC, review distribution, seller rating, return policy) require `fetchDetails: true`. Bulk and monitor modes always fetch details.
- `pricePerUnit` is only present for grocery and consumable items that Walmart prices per unit; it is null for everything else.
- `sellerAverageRating` and `sellerReviewCount` are only present for third-party marketplace sellers, not first-party Walmart items.
- `outputOnlyChanges` returns zero items on the first run, since every item is new. It is useful from the second run onwards.
- ZIP targeting is US-only; `walmart.ca` ignores `zipCode`.
- `walmart.com.mx` is not currently supported.

***

### Technical details

- **Sources:** walmart.com (USD), walmart.ca (CAD).
- **Memory:** 512 MB.
- **Price history store:** KeyValueStore `walmart-price-history` (up to 200K items tracked).
- **Retry:** automatic retry on network errors with exponential backoff.

***

### Related scrapers

Other scrapers in our marketplaces and retail collection:

- [Amazon Seller Scraper](https://apify.com/unfenced-group/amazon-seller-scraper)
- [eBay Scraper](https://apify.com/unfenced-group/ebay-scraper)
- [Shopify Products Scraper](https://apify.com/unfenced-group/shopify-products-scraper)

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Controls how products are discovered. 'search' uses keyword queries, 'bulk' directly fetches a list of item IDs (fastest), 'monitor' fetches known items and tracks price/availability changes.

## `keywords` (type: `array`):

List of search terms to query on Walmart (used in 'search' and 'monitor' modes). Each keyword is run independently. Example: \["laptop", "gaming chair"].

## `startUrls` (type: `array`):

Specific Walmart URLs to scrape — product pages (/ip/...) or search/category pages (/search?q=...).

## `itemIds` (type: `array`):

List of Walmart numeric item IDs to fetch directly. Fastest input method — skips search entirely. One detail page fetch per ID. Example: \[1004249195, 846561863].

## `domain` (type: `string`):

Which Walmart marketplace to scrape. Use walmart.com for US, walmart.ca for Canada, walmart.com.mx for Mexico.

## `maxResults` (type: `integer`):

Maximum total products to return across all inputs. In bulk mode, this caps how many IDs are processed.

## `sort` (type: `string`):

Sort order for keyword search results. Applies to search and monitor modes.

## `minPrice` (type: `integer`):

Only return products priced at or above this value (in the marketplace currency). Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Only return products priced at or below this value (in the marketplace currency). Leave empty for no maximum.

## `fetchDetails` (type: `boolean`):

Fetch full product detail page for each result. Adds variant pricing, description, full image list, UPC, model number, and precise seller info. Always true in bulk and monitor modes.

## `zipCode` (type: `string`):

US ZIP code for geo-targeted pricing and availability. Walmart shows different prices per location. Example: 10001 (New York), 90210 (Beverly Hills), 60601 (Chicago).

## `outputOnlyChanges` (type: `boolean`):

When enabled, only items with a price or availability change since the last run are saved to the dataset. Ideal for scheduled daily price-monitoring runs. Requires price history to be built up over multiple runs.

## `mapPrices` (type: `object`):

Minimum Advertised Price (MAP) per item ID. Supply as a JSON object: { "1004249195": 49.99, "846561863": 29.99 }. Items priced below their MAP will have mapViolation: true in the output.

## `includeReviews` (type: `boolean`):

Fetch customer reviews for each product (up to maxReviews per product). Reviews are saved as separate dataset items with \_type: 'review'. Billed at $0.50/1,000 reviews.

## `maxReviews` (type: `integer`):

Maximum number of reviews to fetch per product when includeReviews is enabled.

## `skipReposts` (type: `boolean`):

Skip products already returned in previous runs (cross-run deduplication via KV store). Best combined with keyword search for daily new-product feeds.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "laptop"
  ],
  "startUrls": [],
  "itemIds": [],
  "domain": "walmart.com",
  "maxResults": 100,
  "sort": "best_match",
  "fetchDetails": false,
  "zipCode": "",
  "outputOnlyChanges": false,
  "mapPrices": {},
  "includeReviews": false,
  "maxReviews": 20,
  "skipReposts": 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 = {
    "keywords": [
        "laptop"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/walmart-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 = {
    "keywords": ["laptop"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/walmart-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 '{
  "keywords": [
    "laptop"
  ],
  "maxResults": 100
}' |
apify call unfenced-group/walmart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/walmart-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/IfmsrmOiFrghdh6bm/builds/P8GhS2TdtEmFb5hn1/openapi.json
