---
title: "Walmart scraper"
description: "Scrape Walmart products, search results and reviews as JSON: price, savings, seller, delivery, pickup, rating and item ID. One API request from Python, Node or MCP."
canonical: https://www.zenrows.com/scrape/walmart
updated: 2026-10-20
---

# Walmart scraper

The Zenrows Walmart scraper turns Walmart product, search and review pages into structured JSON: item ID, name, brand, current and original price, savings, seller, shipping and pickup, key features, images, rating, star counts and review text. Fetch in Adaptive Stealth Mode opens the page and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: walmart.com
- Returns: Products, prices, sellers, fulfillment and reviews

## Run it: one Walmart product in, JSON out

```json Input
{
  "url": "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "product": {
    "item_id": "5689919121",
    "name": "Restored Apple AirPods Pro 2 In-Ear Headphones with USB-C Charging Case, White",
    "brand": "Apple",
    "canonical_url": "https://www.walmart.com/ip/AirPods-Pro-2nd-generation-with-MagSafe-Case-USB-C/5689919121?conditionGroupCode=2"
  },
  "pricing": {
    "currency": "USD",
    "current_price": 173.99,
    "original_price": 199,
    "savings_amount": 25.01,
    "price_qualifier": "Price when purchased online"
  },
  "fulfillment": {
    "sold_by": "Gadget Replay",
    "shipping_available": true,
    "shipping_cost": "Free",
    "shipping_arrival_label": "Arrives Oct 22",
    "pickup_available": true
  },
  "ratings_summary": { "average_rating": 4.4 },
  "key_features": [
    { "description": "Battery Life: 6 h" },
    { "description": "Manufacturer Part Number: MTJV3AM/A" }
  ]
}
```

Request and output of a live call to a Walmart product page from the US on Oct 20, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from Walmart?

Walmart product pages, search results and review pages each come back as their own groups of fields. These are the ones retail teams use most, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `product.item_id` | Walmart's item ID, the number at the end of every `/ip/` URL | `5689919121` |
| `product.name` | Full product title | `Restored Apple AirPods Pro 2 In-Ear Headphones…` |
| `product.brand` | Brand on the listing | `Apple` |
| `pricing.current_price` | The price a shopper pays today | `173.99` |
| `pricing.original_price` | The "was" price, when the page shows one | `199` |
| `pricing.savings_amount` | The difference Walmart prints as savings | `25.01` |
| `pricing.price_qualifier` | The note next to the price | `Price when purchased online` |
| `fulfillment.sold_by` | The seller of the offer: Walmart or a marketplace seller | `Gadget Replay` |
| `fulfillment.shipping_arrival_label` | Delivery promise shown on the page | `Arrives Oct 22` |
| `fulfillment.pickup_available` | Whether store pickup is offered | `true` |
| `fulfillment.return_policy` | The return terms shown on the offer | `Extended holiday returns…` |
| `key_features[]` | Attribute lines such as battery life or part number | `Manufacturer Part Number: MTJV3AM/A` |
| `media_gallery[]` | Images and videos with type and position | `{ "media_type": "image", … }` |
| `ratings_summary.average_rating` | Star rating out of 5 | `4.4` |
| `products[]` (search) | Item ID, title, rating, review count, badge, sponsored flag, delivery label | `{ "item_id": "5162907971", … }` |
| `rating_summary` (reviews) | Average, total reviews and the count and share of each star level | `{ "five_star_count": 34555, … }` |
| `reviews[]` (reviews) | Reviewer, rating, date, text, verified purchase, helpful votes | `{ "rating": 5, … }` |

## How to scrape Walmart with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Pick the Walmart URL.** Product pages (`/ip/…/ITEM_ID`), searches (`/search?q=…`) and review pages (`/reviews/product/ITEM_ID`) all work the same way.
3. **Send it from the US** with the default configuration: Adaptive Stealth Mode to open the page and Extract to return the fields. Walmart prices, delivery dates and pickup depend on the shopper's location.
4. **Read `parsed`** from the response. To keep only some fields, list their paths and the response returns just those.
5. **Run your item IDs in Batch** once one URL returns what you need.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",   # Walmart.com prices and delivery for US shoppers
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
print(data["product"]["name"], data["pricing"]["current_price"], data["fulfillment"]["sold_by"])
print(json.dumps(data, indent=2))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121",
  mode: "auto",
  extract: "auto",
  proxy_country: "us",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
console.log(parsed.product.item_id, parsed.pricing.current_price, parsed.fulfillment.shipping_arrival_label);
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.walmart.com%2Fip%2FApple-AirPods-Pro-2%2F5689919121&mode=auto&extract=auto&proxy_country=us"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.walmart.com%2Fip%2FApple-AirPods-Pro-2%2F5689919121&mode=auto&extract=auto&proxy_country=us&extract_fields=product.item_id%2Cpricing.current_price%2Cfulfillment.sold_by"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://www.walmart.com/search?q=coffee+maker",
    params={"mode": "auto", "extract": "auto", "proxy_country": "us"},
)
for item in response.json()["parsed"]["products"]:
    print(item["item_id"], item["title"], item.get("rating"), item.get("review_count"))
```

## Input

The scraper takes one Walmart URL per request with the options below. The same settings apply to every task of a Batch job, so a catalog of item IDs is a list of URLs plus one configuration.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A Walmart product (`/ip/…/ITEM_ID`), search (`/search?q=…`) or review page (`/reviews/product/ITEM_ID`) |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `pricing.current_price,fulfillment.sold_by` |
| `proxy_country` | string | any | Two-letter country code. Use `us` for walmart.com, since price, delivery and pickup follow the shopper's location |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Keep the same session for several requests, up to 10 minutes, such as the pages of one search |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121", "external_id": "5689919121" },
    { "url": "https://www.walmart.com/ip/Mainstays-Black-12-Cup-Drip-Coffee-Maker/5162907971", "external_id": "5162907971" },
    { "url": "https://www.walmart.com/reviews/product/5689919121", "external_id": "reviews-5689919121" },
    { "url": "https://www.walmart.com/search?q=coffee+maker", "external_id": "search-coffee-maker" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Walmart served it, and `parsed`, the structured record. The groups in `parsed` follow the page type. All three samples below are trimmed outputs of live requests on Oct 20, 2026.

```json Product page
{
  "product": {
    "item_id": "5689919121",
    "name": "Restored Apple AirPods Pro 2 In-Ear Headphones with USB-C Charging Case, White",
    "brand": "Apple",
    "primary_image_url": "https://i5.walmartimages.com/asr/3c3cb9a4-cbae-459d-ab83-f5083b8b75aa.5f98f5bb100a4d663ba29e3b0fe63ffd.jpeg?odnHeight=573&odnWidth=573&odnBg=FFFFFF"
  },
  "pricing": { "currency": "USD", "current_price": 173.99, "original_price": 199, "savings_amount": 25.01 },
  "fulfillment": {
    "delivery_available": null,
    "pickup_available": true,
    "return_policy": "Extended holiday returnsDetailsFree Holiday returns until Jan 31",
    "shipping_arrival_label": "Arrives Oct 22",
    "shipping_cost": "Free",
    "sold_by": "Gadget Replay"
  },
  "add_on_services": [{ "provider": "Allstate", "plan_name": null, "price": null }],
  "key_features": [
    { "description": "Headphone Style: In-Ear", "label": null },
    { "description": "Charging Case: USB-C", "label": null },
    { "description": "Model Name: Airpods Pro", "label": null }
  ],
  "media_gallery": [
    { "media_type": "image", "position": 1, "url": "https://i5.walmartimages.com/asr/3c3cb9a4-cbae-459d-ab83-f5083b8b75aa.5f98f5bb100a4d663ba29e3b0fe63ffd.jpeg" },
    { "media_type": "image", "position": 3, "url": "https://i5.walmartimages.com/asr/0f13e8de-9f60-4810-a5e2-a77ceacdd085.f043c740e058c48b072836f0211d8a9e.jpeg" }
  ]
}
```

```json Search results
{
  "search_query": { "query": "coffee maker", "total_results": null },
  "products": [
    {
      "item_id": "2258193826",
      "title": "Nespresso Vertuo Pop Coffee and Espresso Maker by De'Longhi, Liquorice Black",
      "rating": 4.4,
      "review_count": 4417,
      "badge": "rollback",
      "is_sponsored": true,
      "low_stock": true,
      "fulfillment_label": "Free shipping, arrives tomorrow",
      "walmart_plus_savings": true
    },
    {
      "item_id": "5162907971",
      "title": "Mainstays Black 12-Cup Drip Coffee Maker",
      "rating": 4.5,
      "review_count": 12298,
      "badge": null,
      "is_sponsored": null,
      "low_stock": null,
      "fulfillment_label": "Shipping, arrives tomorrow",
      "product_url": "/ip/Mainstays-Black-12-Cup-Drip-Coffee-Maker/5162907971?classType=VARIANT&athbdg=L1103&from=/search",
      "thumbnail_url": "https://i5.walmartimages.com/seo/Mainstays-Black-12-Cup-Drip-Coffee-Maker_58a85a1a-a7c6-4340-b23f-7e3040fe3a82.9bfe652540ee75919b2f687ebcd098c7.jpeg?odnHeight=576&odnWidth=576&odnBg=FFFFFF"
    }
  ]
}
```

```json Review page
{
  "product": {
    "item_id": "5689919121",
    "name": "Restored Apple AirPods Pro 2 In-Ear Headphones with USB-C Charging Case, White",
    "product_page_url": "/ip/AirPods-Pro-2nd-generation-with-MagSafe-Case-USB-C/5689919121?conditionGroupCode=2"
  },
  "rating_summary": {
    "average_rating": 4.4,
    "total_reviews": 7517,
    "five_star_count": 34555,
    "five_star_percent": 78,
    "four_star_count": 3250,
    "three_star_count": 1400,
    "two_star_count": 953,
    "one_star_count": 4326,
    "one_star_percent": 10
  },
  "reviews": [
    {
      "reviewer_name": "F.",
      "rating": 3,
      "review_date": "Oct 9, 2026",
      "review_text": "It suddenly stop working, I will have to off and on my Bluetooth before it works again",
      "is_verified_purchase": true,
      "helpful_votes": 0,
      "unhelpful_votes": 0
    },
    {
      "reviewer_name": "S.",
      "rating": 5,
      "review_date": "Jul 29, 2026",
      "review_text": "I love them",
      "is_verified_purchase": true,
      "helpful_votes": 0,
      "unhelpful_votes": 0
    }
  ]
}
```

Need a spreadsheet? Load `parsed` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape Walmart from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape Walmart from a prompt.

The agent calls the same Fetch and Extract request shown in the code above, so it reads the same JSON. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121" --proxy-country us
```

```text Then ask your agent
Use Zenrows to search Walmart for "coffee maker" from the US, then open the
first five organic results and return item ID, name, current price, original
price, seller and delivery date as a table, cheapest first.
```

## Scrape Walmart at scale with Batch and Crawl

**Batch** runs a list of Walmart URLs as one job, with your own ID on each result. Use the item ID as the `external_id` and run the job every morning to track price, seller and delivery across your catalog.

**Crawl** finds the item URLs for you. Start it on a search or category page, keep the links that contain `/ip/`, and it returns every product page it reaches. Send the item IDs it finds to Batch.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto", "proxy_country": "us" },
    "tasks": [
      { "url": "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121", "external_id": "5689919121" },
      { "url": "https://www.walmart.com/ip/Mainstays-Black-12-Cup-Drip-Coffee-Maker/5162907971", "external_id": "5162907971" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# items.jsonl: one {"url": "https://www.walmart.com/ip/ITEM_ID", "external_id": "ITEM_ID", "extract": "auto"} per line
zenrows batch create items.jsonl --proxy-country us --wait
zenrows batch results <job-id> --out walmart-products.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.walmart.com/search?q=coffee+maker",
    "depth": 2,
    "max_pages": 200,
    "include_patterns": ["/ip/", "q=coffee+maker"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto",
        "proxy_country": "us"
      },
      "tasks": [
        {
          "url": "https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121",
          "external_id": "walmart"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Walmart data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Price monitoring against Walmart | Current and original price, savings and rollback badge per item | Retail pricing and ecommerce teams |
| Marketplace seller tracking | Seller name on each offer, price and condition | Brands, MAP and channel teams |
| Search share and digital shelf | Item order, sponsored flag and badges for a keyword | CPG brands and retail media agencies |
| Delivery and pickup checks | Arrival date, shipping cost and pickup availability | Ecommerce operations and analysts |
| Review and rating analysis | Star counts, review text, dates and verified flag | Product, CX and market research teams |
| Catalog matching with Amazon | Item ID, part numbers in key features, name and brand | Price comparison and data teams |

## Tips for scraping Walmart

- **The item ID is the key.** It is the number at the end of every `/ip/` URL and in `product.item_id`. Use it as your `external_id` and to build review URLs.
- **Check the condition of the offer.** The sample URL returned a restored listing: the name starts with "Restored" and the canonical URL carries `conditionGroupCode=2`. Read `product.name` and `product.canonical_url` when you need new items only.
- **Track the seller, not only the price.** Walmart offers come from Walmart or from marketplace sellers. `fulfillment.sold_by` tells you who holds the offer on the day you scraped it.
- **Request from the US.** Walmart.com shows prices, delivery dates and pickup for US shoppers, so send every request with the US as the country.
- **Reviews have their own page.** `https://www.walmart.com/reviews/product/ITEM_ID` returns the star counts and a page of reviews, more than the product page shows.
- **Page through search with the `page` parameter.** Add `&page=2` and onward to a search URL and keep the same session for one query.
- **Sponsored results carry tracking URLs.** Their `product_url` is a Walmart ad redirect. Read the item ID from `item_id` instead of parsing the link.

## Frequently asked questions

### Is it legal to scrape Walmart?

Collecting publicly available data from Walmart, such as prices, product details, sellers and ratings shown to every visitor, is common practice for price monitoring and market research. Reviews include reviewer names, and personal data is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use. Check Walmart's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Walmart API?

Walmart's developer APIs serve its partners. The Marketplace APIs let approved sellers manage their own items, prices, orders and inventory. The affiliate APIs on Walmart.io give registered affiliates product lookups for their links. Neither gives you any Walmart page on demand with the seller, delivery and review data a shopper sees, which is why teams use a scraper for competitor data.

### What Walmart pages can I scrape?

Product pages ( /ip/…/ITEM_ID ), search results ( /search?q=… ), category browse pages and review pages ( /reviews/product/ITEM_ID ). Send the URL as it appears in your browser.

### Can I scrape Walmart prices?

Yes. Product pages return the current price, the original price, the savings amount and the note next to the price, along with the seller and delivery date. Run your item IDs in Batch for a daily price history.

### Can I scrape Walmart reviews?

Yes. The review page of an item returns the average rating, the total number of reviews, the count and share of each star level, and each review's rating, date, text, verified purchase flag and votes.

### How do I scrape Walmart with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the Walmart URL, Adaptive Stealth Mode and Extract turned on, and the US as the country, as in the Python example above. The response's parsed key holds the product as a Python dictionary. The zenrows package on PyPI wraps the same request.

### How many Walmart products can I scrape?

Send one URL per request, or a whole list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Can AI agents scrape Walmart with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the products you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Walmart on a schedule?

Yes. Create a scheduled Batch job with your Walmart URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Walmart scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send results to Google Sheets, a database or a data warehouse from the workflow tool you already use. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

### Can I compare Walmart and Amazon prices?

Yes. Scrape the Walmart item and the matching Amazon listing with the same request format, then join them on brand and part number. The Amazon price scraper returns Amazon prices per country, and the Amazon ASIN scraper returns the identifiers to match on.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
