Site scraper

Walmart Scraper: Prices and Products

HTTP $0.50JS rendering $2.00 per 1,000 results or your own scraper from $1.95/GB

ProxyField's Walmart scraper is its Web Scraping API, in development (contact sales), at $0.50 per 1,000 successful pages over plain HTTP, or $0.20 from 10,000 results in one purchase: 1 million Walmart product pages cost $500, or $200 at the volume price, and 1 million products read from search pages (about 50 per page) cost about $10. It returns the page with Walmart's embedded __NEXT_DATA__ JSON, and the parsers on this page turn it into records: for each product on a search page, the item ID, title, price and was-price, stock, rating, review count, seller, sponsored flag and the store and ZIP code Walmart priced it for; for a product page, 15 fields from brand and category to variants, specifications and description. If you need a chosen store's or ZIP code's prices as parsed records today, a per-record scraper service with a store input fits better; if you want to pay per page and own the parser, this API or your own scraper on ProxyField's US residential proxies fits. To start today, take the Easy Trial: 1 GB for $2.95, about 3,300 product pages at 300 KB a page.

Web Scraping API per 1,000 successful results
Web Scraping API prices per 1,000 successful results
FetchEntryVolume, from
HTTP$0.50$0.20
JS rendering$2.00$1.00

Billed on successful results only.

Your own scraper on residential proxies
from $1.95/GB Easy Trial: 1 GB for $2.95
gate.proxyfield.io:7000

What you get from each Walmart page type (paths inside props.pageProps.initialData):

FieldProduct page (data.product …)Search page, per product (searchResult.itemStacks[].items[])
Item IDusItemIdusItemId
Titlenamename
Brandbrandoften empty on cards: take it from the product page
Current pricepriceInfo.currentPrice.priceprice
Was-pricepriceInfo.wasPrice.pricepriceInfo.priceDetails.priceLines[] with lineType COMPARISON
CurrencypriceInfo.currentPrice.currencyUnitpriceInfo.priceDetails.currency
AvailabilityavailabilityStatus (IN_STOCK …)availabilityStatusV2.value
SellersellerName, sellerIdsellerName, sellerId
Rating, review countaverageRating; data.reviews.totalReviewCountaverageRating, numberOfReviews
Categorycategory.path[].namecategory.categoryPath
ImagesimageInfo.allImages[].urlimageInfo.thumbnailUrl
VariantsvariantCriteria[]–
Specificationsdata.idml.specifications[] (name, value)–
DescriptionshortDescription–
Sponsored flag–isSponsoredFlag
Store and ZIP the prices are for–pageMetadata.location.storeId, .postalCode

The search-page paths and the 49 products are from our own fetch of walmart.com/search?q=coffee+grinder on 28 October 2026, run through the parser below. The product-page paths follow Walmart's page as public scraping guides describe it; our own product-page request that day, from a datacenter IP, got Walmart's "Robot or human?" page instead, so check the paths on your first pages. Walmart renames keys from time to time: a field that comes back empty usually means the key moved.

A product page read by parse_product() in the Python section below gives one record with the product-page fields (example values, not a live product):

JSON
{"item_id": "123456789", "title": "Example 12-Cup Drip Coffee Maker", "brand": "ExampleBrand",
 "price": 39.97, "was_price": 49.99, "currency": "USD", "availability": "IN_STOCK",
 "seller": "Walmart.com", "seller_id": "F55CDC31AB754BB68FE0B39041159D63",
 "rating": 4.5, "review_count": 1287, "category": ["Home", "Kitchen & Dining", "Coffee Makers"],
 "images": ["https://i5.walmartimages.com/example-1.jpeg"], "variants": ["Color"],
 "specifications": [{"name": "Capacity", "value": "12 cups"}],
 "description": "Brews up to 12 cups ..."}
Data

Walmart, eBay and Amazon in one place

ProxyField covers Walmart, eBay and Amazon from one account, one API key and one balance, and the normaliser below gives all three one record shape: Amazon comes back as parsed JSON on 8 marketplaces, Walmart and eBay come back as pages that the ready parsers turn into JSON. In detail: Walmart and eBay through the Web Scraping API at $0.50 per 1,000 successful pages ($0.20 from 10,000), Amazon through the Amazon scraper API with parsed JSON at $0.60 ($0.30 from 10,000). 100,000 pages on each marketplace cost $160 a month at the entry prices, or $70 at the volume prices, all billed on successful results only.

Read moreShow less
MarketplaceAPI (design)Price per 1,000 successful resultsWhat you sendWhat comes back
WalmartWeb Scraping API, POST /v1/scrape$0.50, $0.20 from 10,000; JS $2.00, $1.00 from 10,000walmart.com product, search, review or seller URLsthe page; JSON from the parser or the evaluate action
eBayWeb Scraping API, POST /v1/scrapethe sameeBay search, sold-listings, item or seller URLs, any eBay sitethe page; JSON from the eBay scraper's parser or an evaluate script
AmazonAmazon scraper API, POST /v1/amazon/product$0.60, $0.30 from 10,000an ASIN or URL and the marketplace: amazon.com, .co.uk, .de, .fr, .it, .es, .ca, .co.jpparsed JSON: price, Buy Box seller, rating, Best Sellers Rank and more

The two request shapes, same key, same balance:

Shell
# Walmart (and eBay): any URL
curl https://api.proxyfield.io/v1/scrape -H "Authorization: Bearer <api_key>" -H "Content-Type: application/json" \
  -d '{"url": "https://www.walmart.com/ip/example-product/123456789", "render": false, "country": "us", "output": "json"}'

# Amazon: an ASIN and a marketplace
curl https://api.proxyfield.io/v1/amazon/product -H "Authorization: Bearer <api_key>" -H "Content-Type: application/json" \
  -d '{"asin": "B0EXAMPLE1", "domain": "co.uk"}'

One record shape for all three. The Walmart parser on this page and the eBay parser on the eBay scraper page already use the same field names; the Amazon scraper API's product object maps onto them. 13 common fields:

Common fieldWalmart (search card; product page)eBay (parse_results())Amazon scraper API (product.…)
marketplace"walmart""ebay""amazon"
item_idusItemIditem_id, from /itm/<id>asin
titlenametitletitle
priceprice; priceInfo.currentPrice.pricepriceprice
was_priceCOMPARISON price line; priceInfo.wasPrice.price–price_strikethrough
currencypriceInfo.priceDetails.currency; currentPrice.currencyUnitcurrencycurrency
availabilityavailabilityStatusV2.value; availabilityStatus– (sold rows carry quantity_sold)stock
condition–condition–
shipping–shippingdelivery
sellersellerNamesellerbuybox.seller_name
ratingaverageRating– (the seller's positive_pct instead)rating
review_countnumberOfReviews; reviews.totalReviewCount– (the seller's feedback_score instead)reviews_count
urlcanonicalUrlurlbuilt from asin and the domain you sent
Python
COMMON = ["marketplace", "item_id", "title", "price", "was_price", "currency", "availability",
          "condition", "shipping", "seller", "rating", "review_count", "url"]

def common(marketplace, row, domain="com"):
    """row: a parse_search() row (Walmart), a parse_results() row (eBay) or the Amazon API's `product`."""
    if marketplace == "amazon":
        row = {"item_id": row.get("asin"), "title": row.get("title"), "price": row.get("price"),
               "was_price": row.get("price_strikethrough"), "currency": row.get("currency"),
               "availability": row.get("stock"), "shipping": row.get("delivery"),
               "seller": (row.get("buybox") or {}).get("seller_name"), "rating": row.get("rating"),
               "review_count": row.get("reviews_count"),
               "url": f"https://www.amazon.{domain}/dp/{row.get('asin')}"}
    return {k: marketplace if k == "marketplace" else row.get(k) for k in COMMON}

Three rows of one table, one per marketplace (example values; a field a marketplace does not show is null):

{"marketplace": "walmart", "item_id": "988617972", "title": "Example Conical Burr Coffee Grinder", "price": 109.97, "was_price": 129.0, "currency": "USD", "availability": "IN_STOCK", "condition": null, "shipping": null, "seller": "Walmart.com", "rating": 4.4, "review_count": 696, "url": "https://www.walmart.com/ip/example/988617972"}
{"marketplace": "ebay", "item_id": "115998877665", "title": "Example Burr Coffee Grinder", "price": 58.99, "was_price": null, "currency": "USD", "availability": null, "condition": "Used", "shipping": "Free delivery", "seller": "techresale", "rating": null, "review_count": null, "url": "https://www.ebay.com/itm/115998877665"}
{"marketplace": "amazon", "item_id": "B0EXAMPLE7", "title": "Example Stainless Steel Burr Coffee Grinder", "price": 89.99, "was_price": 109.99, "currency": "USD", "availability": "In Stock", "condition": null, "shipping": [{"type": "FREE delivery", "date": "Wednesday, October 29"}], "seller": "Example Home Store", "rating": 4.4, "review_count": 5873, "url": "https://www.amazon.com/dp/B0EXAMPLE7"}
Pages a month on each marketplaceWalmarteBayAmazonAll three, entry pricesAll three, from 10,000 in one purchase
10,000$5$5$6$5 + $5 + $6 = $16$2 + $2 + $3 = $7
100,000$50$50$60$50 + $50 + $60 = $160$20 + $20 + $30 = $70
1,000,000$500$500$600$500 + $500 + $600 = $1,600$200 + $200 + $300 = $700

With Walmart and eBay rendered so the evaluate action returns JSON on all three, 100,000 pages each cost $200 + $200 + $60 = $460 at the entry prices, or $100 + $100 + $30 = $230 at the volume prices. Details: eBay scraper, Amazon scraper API, and the ecommerce scraper for other stores.

Walmart search results as JSON, without a parser

The JSON record, without writing a parser: on a rendered request, the API design's evaluate action runs a script in the page and returns its result in actions_log[0].result. This one returns every product on a search page:

JSON
{
  "url": "https://www.walmart.com/search?q=coffee+grinder&page=1",
  "render": true,
  "country": "us",
  "output": "json",
  "actions": [
    {"type": "evaluate",
     "script": "const d = JSON.parse(document.getElementById('__NEXT_DATA__').textContent).props.pageProps.initialData; const loc = d.pageMetadata?.location || {}; const seen = new Set(); return d.searchResult.itemStacks.flatMap(s => s.items).filter(i => i.__typename === 'Product' && !seen.has(i.usItemId) && seen.add(i.usItemId)).map(i => ({item_id: i.usItemId, title: i.name, price: i.price, availability: i.availabilityStatusV2?.value, rating: i.averageRating, review_count: i.numberOfReviews, seller: i.sellerName, sponsored: !!i.isSponsoredFlag, store_id: loc.storeId, zip: loc.postalCode}));"}
  ]
}

actions_log[0].result, first of the 49 products (example values; the store and ZIP are the ones Walmart picked for our test request):

JSON
[
  {"item_id": "988617972", "title": "Example Conical Burr Coffee Grinder", "price": 109.97,
   "availability": "IN_STOCK", "rating": 4.4, "review_count": 696, "seller": "Walmart.com",
   "sponsored": true, "store_id": "3081", "zip": "95829"}
]

One rendered search page costs $0.002 ($2.00 per 1,000, $1.00 from 10,000 results); the same page over plain HTTP costs $0.0005 if you run the Python parser below on the returned HTML instead. This is the API's design, in development: API documentation.

Walmart scraper at a glance

QuestionAnswer
Price$0.50 per 1,000 successful pages over plain HTTP, $0.20 from 10,000 results in one purchase; $2.00 with JS rendering, $1.00 from 10,000
What is "one result"One successful page: a product page, a search page with about 50 products, or a reviews page
Price per 1,000 productsProduct pages: $0.50 ($0.20 from 10,000 results). Search cards: about 21 search pages, about $0.01 over plain HTTP
What comes backThe page as HTML, Markdown or text, or a JSON envelope with the status code, final URL, headers, cookies, the content and actions_log[]
Parsed fieldsNo parsed Walmart endpoint: the evaluate action (rendered) or the Python parser on this page (any route) returns the fields above as JSON
Store and ZIPNo store or ZIP setting; Walmart picks the store, and pageMetadata.location on a search page says which one
BillingSuccessful results only; blocked and timed-out requests and our retries are not billed
Limits (design)20 concurrent requests per account; batches of up to 1,000 URLs, results kept 48 hours
StatusIn development: Contact sales

Each Walmart job is one kind of URL, at the same price:

JobURL you sendPrice per 1,000 successful results
Products by keywordwalmart.com/search?q=<keyword>&page=<n>$0.50, $0.20 from 10,000
Products in a categorywalmart.com/browse/<category>/<id>$0.50, $0.20 from 10,000
One product by item IDwalmart.com/ip/<name>/<item-id>$0.50, $0.20 from 10,000
Reviews of a productwalmart.com/reviews/product/<item-id>$0.50, $0.20 from 10,000
A seller's productswalmart.com/seller/<seller-id>$0.50, $0.20 from 10,000
Prices for a chosen store or ZIP codeNot a setting: use your own scraper on proxies (below)–

Any job on the JS-rendering route costs $2.00 per 1,000 instead, $1.00 from 10,000 results in one purchase.

Which Walmart scraper fits you

Three routes reach the same public data; they differ in who parses it and how you pay.

RouteYou sendYou get1,000 product pages
Web Scraping API, plain HTTP + the Python parserWalmart URLsThe page; the parser returns the JSON$0.50, $0.20 from 10,000 results
Web Scraping API, rendered + evaluateWalmart URLs and the scriptJSON in actions_log[0].result, no parser to run$2.00, $1.00 from 10,000 results
Your own scraper on ProxyField residential proxiesRequests through gate.proxyfield.io:7000Whatever your code fetches and parsesabout $0.89 at $2.95/GB, $0.59 at $1.95/GB (300 KB a page, plus retries)
A per-record scraper serviceA URL, keyword or SKUThe vendor's fields per recordthe vendor's price per record

Pick the API when you want to pay per successful page; pick your own scraper when you already run one, or when you need a chosen store's prices. More: Web Scraping API and what a web scraping API is.

Pricing

Pricing: $0.50 per 1,000 Walmart pages, $0.20 from 10,000

Walmart pages cost the Web Scraping API's price: $0.50 per 1,000 successful results over plain HTTP and $2.00 with JS rendering; from 10,000 successful results in one purchase, $0.20 and $1.00. You pay only for successful results, from the same crypto balance as proxies (USDT, BTC, ETH and 10 other coins). The balance never expires, and there is no subscription or monthly fee.

The own-scraper column is an estimate: retries and blocked requests use traffic too, and page sizes vary, so measure yours in the dashboard's usage stats. A planning assumption, not a measurement: if 15% of requests are retried, add 15% traffic, so 100,000 pages become about 34.5 GB, $96.26 at $2.79/GB. The API bills successful results only, so its columns need no retry allowance.

Engineering and maintenance are the cost no table shows: on either route your parser breaks when Walmart renames a key, and a field that comes back empty is the sign. The paths to check first are in the field table at the top of this page; with the API you keep the parser, with your own scraper you also keep the fetching, pacing and IP rotation.

Pages a month
Pages a month, Plain HTTP, $0.50, Plain HTTP, $0.20 (from 10,000 in one purchase), JS, $2.00, JS, $1.00 (from 10,000 in one purchase), Own scraper, 300 KB a page
Pages a monthPlain HTTP, $0.50Plain HTTP, $0.20 (from 10,000 in one purchase)JS, $2.00JS, $1.00 (from 10,000 in one purchase)Own scraper, 300 KB a page
10,000$5$2$20$10≈ 3 GB = $8.85 at $2.95/GB
100,000$50$20$200$100≈ 30 GB = $83.70 at $2.79/GB
1,000,000$500$200$2,000$1,000≈ 300 GB = $687 at $2.29/GB
30,000,000 (1 million products, daily)$15,000$6,000$60,000$30,000≈ 9,000 GB: from 1 TB the price is individual, contact sales
Workload (30-day month)Pages$0.50$0.20 (from 10,000 in one purchase)
5,000 products, price and stock daily150,000$75$30
The same 5,000 products, plus their reviews page daily300,000$150$60
50,000 products, once a month50,000$25$10
200 keywords, first 3 search pages, daily (about 880,000 product readings)18,000$9$3.60

Search pages are the cheap way to watch many products: one page held 49 different products in our test (62 cards, some repeated in a "4 stars and above" block), so one product reading costs about $0.00001 over plain HTTP. They carry price, was-price, stock, rating, reviews and seller, but not specifications or variants, and Walmart shows a limited number of pages per query (13 for our test query), so split large catalogs by category.

Billed: a page Walmart answered with a 2xx status; a target's 404 or 410, and a sign-in page served with a 200 status, also count as results. Not billed: error responses, blocked and timed-out requests, and our internal retries. Every response says whether it was billed. Sales contact: the sales team on our 24/7 live chat. All prices: pricing.

Through the sales team on our 24/7 live chat

How it works

How the Web Scraping API fetches a Walmart page

The design: a POST to https://api.proxyfield.io/v1/scrape with your key in an Authorization: Bearer <api_key> header and a JSON body: url, render (false for plain HTTP, true for JS rendering), country and output (html, markdown, text or json). Every API accepts the proxy pool's countries (195+); for walmart.com, use us. Parameter reference: API documentation.

Shell
# The Web Scraping API's design (in development; access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
  -H "Authorization: Bearer <api_key>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.walmart.com/search?q=coffee+grinder&page=1", "render": false, "country": "us", "output": "json"}'

Example response (shortened; content is the page's HTML with the __NEXT_DATA__ tag):

JSON
{
  "metadata": {"id": "req_6c0f2b9e4a7d1358", "api": "web_scrape", "status": "success", "billed": true},
  "status_code": 200,
  "final_url": "https://www.walmart.com/search?q=coffee+grinder&page=1",
  "content_type": "text/html; charset=utf-8",
  "content": "<!DOCTYPE html><html lang=\"en-US\">…<script id=\"__NEXT_DATA__\" type=\"application/json\">…</script>…</html>"
}

For a product page as JSON, render it and send this evaluate script; actions_log[0].result then holds the 15 product fields:

JSON
{"type": "evaluate",
 "script": "const d = JSON.parse(document.getElementById('__NEXT_DATA__').textContent).props.pageProps.initialData.data; const p = d.product || {}; return {item_id: p.usItemId, title: p.name, brand: p.brand, price: p.priceInfo?.currentPrice?.price, was_price: p.priceInfo?.wasPrice?.price ?? null, currency: p.priceInfo?.currentPrice?.currencyUnit, availability: p.availabilityStatus, seller: p.sellerName, rating: p.averageRating, review_count: d.reviews?.totalReviewCount ?? p.numberOfReviews, category: (p.category?.path || []).map(c => c.name).join(' > '), images: (p.imageInfo?.allImages || []).map(i => i.url), variants: (p.variantCriteria || []).map(v => v.name), specifications: d.idml?.specifications || [], description: p.shortDescription};"}

For thousands of URLs, send a batch of up to 1,000 requests: the design returns a signed callback per finished job and keeps results for 48 hours. There is no SDK, MCP server or no-code export in v1; any HTTP client or automation tool with an HTTP step can call it.

Store and ZIP code prices

ProxyField's Walmart scraper has no store or ZIP code setting, and ProxyField offers no ZIP targeting on its proxies either. Walmart picks the store for each visitor: our test request, which set no location, was priced for store 3081 in Sacramento, CA 95829. A search page says which store it used in props.pageProps.initialData.pageMetadata.location (storeId, postalCode, city), and the parsers here copy store_id and zip into every record, so each price is tied to its store.

For a chosen store's prices, run your own scraper on proxies: open a sticky session on a US residential IP in that store's city, set the store once in Walmart's own location setting, and check pageMetadata.location on every run before you store prices. Sessions for a store setting, a cart or search pages are in e-commerce proxies.

Compare

Walmart's official APIs or scraping?

Walmart's developer APIs serve 2 groups: Marketplace sellers, who manage their own items, prices and orders through the Marketplace API, and approved affiliates, who look up products to link to Walmart. Neither gives you competitors' prices, search rankings or reviews across the catalog. Scraping reads the public pages any shopper sees instead.

ItemWalmart Marketplace APIWalmart affiliate APIsWeb Scraping API
Who can use itApproved Walmart sellersApproved affiliatesProxyField customers, through Contact sales
DataYour own items, orders, inventoryProduct lookups for linkingAny public product, search, review or seller page
Competitors' prices and rankingsNoLimited to the lookupYes, as shown on the page
CostSet by WalmartSet by Walmart$0.50 per 1,000 successful results, $0.20 from 10,000
Good to know

Why Walmart blocks scrapers

Walmart answers fast, repetitive or datacenter traffic with a block page: on 28 October 2026 our product-page request from a datacenter server was redirected to walmart.com/blocked with a "Robot or human?" check, while a search page from the same server came back with its data. Rotating US residential IPs, a low rate per IP and normal browser headers reduce blocks. With the Web Scraping API, blocked requests are retried on new IPs and not billed.

Use cases

What teams use Walmart data for

  • Price and stock monitoring daily prices and availability of your own or competitors' products, with the store each price is for.
  • Search ranking where your products appear for a keyword, sponsored or organic (isSponsoredFlag).
  • Assortment and seller research what sells in a category, at what price, from which sellers.
  • Review analysis ratings and complaints by product.

For prices across many stores, see the price scraping API and the ecommerce scraper.

Do it yourself

Scrape Walmart with Python and ProxyField proxies

This parser reads a Walmart search page from either route: fetched through US residential IPs, as below, or returned by the Web Scraping API in content. We ran it on the search page we fetched on 28 October 2026: it returned 49 products (62 cards minus repeats), 25 of them with a was-price and 15 sponsored.

Read moreShow less
Python
import json, re
import requests

# A rotating US residential IP on every request
proxy = "http://<login>-country-us:<password>@gate.proxyfield.io:7000"
url = "https://www.walmart.com/search?q=coffee+grinder&page=1"

def dig(obj, *path):
    for key in path:
        if isinstance(obj, list) and isinstance(key, int) and key < len(obj):
            obj = obj[key]
        elif isinstance(obj, dict):
            obj = obj.get(key)
        else:
            return None
    return obj

def parse_search(html):
    m = re.search(r'<script id="__NEXT_DATA__"[^>]*>(.*?)</script>', html, re.S)
    if not m:
        return None                                   # block or challenge page
    data = dig(json.loads(m.group(1)), "props", "pageProps", "initialData") or {}
    loc = dig(data, "pageMetadata", "location") or {}
    rows, seen = [], set()
    for stack in dig(data, "searchResult", "itemStacks") or []:
        for it in stack.get("items") or []:
            if it.get("__typename") != "Product" or it.get("usItemId") in seen:
                continue                              # ads, placeholders, repeats
            seen.add(it.get("usItemId"))
            lines = {l.get("lineType"): dig(l, "values", 0, "value")
                     for l in dig(it, "priceInfo", "priceDetails", "priceLines") or []}
            rows.append({
                "item_id": it.get("usItemId"),
                "title": it.get("name"),
                "price": it.get("price"),
                "was_price": float(lines["COMPARISON"]) if lines.get("COMPARISON") else None,
                "currency": dig(it, "priceInfo", "priceDetails", "currency"),
                "availability": dig(it, "availabilityStatusV2", "value"),
                "rating": it.get("averageRating"),
                "review_count": it.get("numberOfReviews"),
                "seller": it.get("sellerName"),
                "seller_id": it.get("sellerId"),
                "sponsored": bool(it.get("isSponsoredFlag")),
                "category": dig(it, "category", "categoryPath"),
                "image": dig(it, "imageInfo", "thumbnailUrl"),
                "url": "https://www.walmart.com" + (it.get("canonicalUrl") or "").split("?")[0],
                "store_id": loc.get("storeId"),
                "zip": loc.get("postalCode"),
            })
    return rows

def parse_product(html):                          # a walmart.com/ip/... page
    m = re.search(r'<script id="__NEXT_DATA__"[^>]*>(.*?)</script>', html, re.S)
    if not m:
        return None
    data = dig(json.loads(m.group(1)), "props", "pageProps", "initialData", "data") or {}
    p = data.get("product") or {}
    return {
        "item_id": p.get("usItemId"), "title": p.get("name"), "brand": p.get("brand"),
        "price": dig(p, "priceInfo", "currentPrice", "price"),
        "was_price": dig(p, "priceInfo", "wasPrice", "price"),
        "currency": dig(p, "priceInfo", "currentPrice", "currencyUnit"),
        "availability": p.get("availabilityStatus"),
        "seller": p.get("sellerName"), "seller_id": p.get("sellerId"),
        "rating": p.get("averageRating"),
        "review_count": dig(data, "reviews", "totalReviewCount"),
        "category": [c.get("name") for c in dig(p, "category", "path") or []],
        "images": [i.get("url") for i in dig(p, "imageInfo", "allImages") or []],
        "variants": [v.get("name") for v in p.get("variantCriteria") or []],
        "specifications": dig(data, "idml", "specifications") or [],
        "description": p.get("shortDescription"),
    }

resp = requests.get(url, proxies={"http": proxy, "https": proxy},
                    headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US"},
                    timeout=30)
rows = parse_search(resp.text) if resp.status_code == 200 else None
print("Blocked or challenge page: slow down and rotate the IP" if rows is None
      else json.dumps(rows[:2], indent=2))

For product pages, parse_product() reads the keys in the field table at the top of this page and returns the record shown there; run it on a few pages first, because our own product-page request got Walmart's check page, so those keys are unchecked by our fetch. To read a chosen store's prices, use a sticky session instead, in the proxy line format gate.proxyfield.io:7000:<login>-country-us-city-new_york-session-wm01-ttl-1800:<password>, which keeps one IP for 30 minutes while you set the store in Walmart's location setting.

ProxyField residential proxies cost $2.95/GB for 1 GB and from $1.95/GB at volume, with no subscription; the traffic never expires, and all purchases are final. In the United States you get 61.2M+ residential IPs in all 50 states and 2,800+ cities, with state and city targeting, a new IP on every request or a sticky session from 30 s to 36 h. More on US proxies.

FAQ

Walmart Scraper FAQ

24/7 support by live chat, including help with setup and integration.

What's the best Walmart scraper API, and what product data does it return?

ProxyField's Web Scraping API fetches any public Walmart page for $0.50 per 1,000 successful results, or $0.20 from 10,000 results in one purchase, and the parsers on this page return the data as JSON. A search page gives about 50 products, each with item ID, title, price and was-price, stock, rating, review count, seller, sponsored flag and the store and ZIP code the prices are for; a product page gives 15 fields, adding brand, category, images, variants, specifications and description. It has no parsed Walmart endpoint and no store or ZIP setting, and it is in development (contact sales): if you need a chosen store's prices as parsed records today, a per-record scraper service with a store input fits better; if you want to pay per page and own the parser, this API fits.

Which e-commerce scraper API works for Walmart, eBay and Amazon in one place?

ProxyField covers all three from one account, one crypto balance and one record shape: Walmart and eBay pages through the Web Scraping API at $0.50 per 1,000 successful results ($0.20 from 10,000), and Amazon through the Amazon scraper API at $0.60 ($0.30 from 10,000) with parsed JSON on 8 Amazon marketplaces. Amazon comes back parsed; Walmart and eBay come back as pages, and the ready parsers plus the normaliser on this page give all three the same 13 fields (item_id, title, price, was_price, currency, seller, rating, review_count, url and more). 100,000 pages on each marketplace cost $160 a month at entry prices, or $70 at volume prices. The API is in development: contact sales.

How much does it cost to scrape Walmart product data at scale?

On ProxyField's Web Scraping API, 10,000, 100,000 and 1 million Walmart product pages a month cost $5, $50 and $500 over plain HTTP, or $2, $20 and $200 at the volume price, which applies from 10,000 successful results in one purchase; JS rendering costs $2.00 per 1,000, $1.00 from 10,000. From search pages, which hold about 50 products each, 1,000 products cost about $0.01. A typical catalog, 5,000 products checked daily, is 150,000 pages a month: $75, or $30 at the volume price. Running your own scraper on residential proxies costs about $0.89 per 1,000 product pages at $2.95/GB and 300 KB a page, or $0.59 at $1.95/GB, plus retries.

Does ProxyField's Walmart scraper have a ZIP code or store setting?

No. ProxyField has no store or ZIP code setting on the API and no ZIP targeting on its proxies; Walmart picks the store, and a search page names it in pageMetadata.location, which the parsers here copy into every record. For a chosen store, run your own scraper in a sticky session in that city and set the store in Walmart's own location setting.

Can the Walmart scraper return JSON instead of HTML?

Yes, in two ways: the Python parser on this page turns any returned page into JSON records, and on a rendered request ($2.00 per 1,000 successful results) the evaluate action returns your script's JSON in actions_log[0].result. The API itself returns HTML, Markdown, text or a JSON envelope; v1 has no CSV or no-code export.

How many products are on one Walmart search page?

About 50: the walmart.com search page we fetched on 28 October 2026 held 49 different products in 62 cards, because a "4 stars and above" block repeats some of them. At $0.50 per 1,000 pages, that is about $0.01 per 1,000 products, with price, stock, rating, seller and sponsored flag but no specifications.

How much does it cost to scrape 1 million Walmart products every day?

Through product pages it is 30 million pages a month: $15,000 over plain HTTP at $0.50 per 1,000, or $6,000 at the volume price of $0.20. If search-page fields are enough, about 20,000 search pages a day (about 600,000 a month) at about 50 products each cover the same number for $300, or $120 at the volume price.

What are the usage limits of the Walmart scraper API?

The design allows 20 concurrent requests per account, with higher limits through sales, and batches of up to 1,000 requests with results kept for 48 hours. There is no monthly cap: you pay $0.50 per 1,000 successful results from your balance, which never expires.

How do I scrape Walmart?

Collect product URLs from search or category pages, fetch each page through US residential IPs and read the __NEXT_DATA__ JSON embedded in it; products sit under props.pageProps.initialData. Keep the rate low and rotate the IP on every request, or send the URLs to a scraping API.

Does Walmart block web scraping?

Yes: fast, repetitive or datacenter traffic gets a block page; our datacenter request for a product page on 28 October 2026 got Walmart's "Robot or human?" check. Rotating US residential IPs at a low rate per IP, with normal browser headers, reduce blocks.

Show 14 more questionsShow fewer questions

Why do businesses scrape Walmart data?

To track prices and stock against competitors, see search rankings for their keywords, research what sells in a category and follow ratings and reviews. Walmart's own APIs give sellers and affiliates their own data, not this market view.

Does Walmart have an official API?

Yes, for 2 groups: Marketplace sellers manage their own items, prices and orders through the Marketplace API, and approved affiliates look up products to link to Walmart. Neither is a feed of competitors' prices, rankings or reviews.

Can I scrape Walmart reviews?

Each product has a public reviews page at walmart.com/reviews/product/<item-id> showing the rating, review title and text, date and verified-purchase flag; the Web Scraping API fetches it like any page, at $0.50 per 1,000 successful results. ProxyField's rule is public pages only, following the site's terms; store ratings and short excerpts rather than republishing full review texts.

Can I scrape Walmart seller data?

The public pages show it: search results carry each product's sellerName and sellerId, a product page names its seller, and the seller page lists the seller's name, rating and products, at $0.50 per 1,000 pages through the Web Scraping API. Keep to public pages and the site's terms, and collect business facts about sellers, not personal data.

Do I need an account to scrape Walmart?

No account is needed to read Walmart's public product, search, review and seller pages, and a scraper should not sign in: ProxyField's acceptable use policy forbids accessing data behind logins you are not entitled to. Order history and offers shown only to signed-in members are out of scope.

Do I need a headless browser to scrape Walmart?

Usually not: Walmart embeds product and search data as JSON in the HTML, so plain HTTP at $0.50 per 1,000 successful results is enough with a parser. Render at $2.00 per 1,000 when you want the evaluate action to return JSON, or for sections that load only after the page's scripts run.

Can I scrape Walmart without writing code?

For a few pages, a browser extension that exports a table works. For daily prices on thousands of products, use an automation tool with an HTTP step that calls the API with the evaluate script on this page and maps actions_log[0].result to columns; v1 has no no-code export of its own.

Can a Walmart scraper handle bulk extraction?

Yes: ProxyField's proxies give unlimited concurrent threads and a new IP on every request, and the API design takes batches of up to 1,000 URLs at 20 concurrent requests. 1 million product pages cost $500 over plain HTTP, or $200 at the volume price.

Can I schedule Walmart scraping jobs?

Yes: run your scraper from cron or a workflow tool at a fixed hour, so prices are comparable day to day, and store each run with its timestamp and the store ID from pageMetadata.location. Alert on runs that return far fewer products than usual.

How fast is a Walmart scraper at scale?

ProxyField publishes no speed figure for the Web Scraping API. Throughput depends mostly on how many requests run in parallel (20 at once in the API design, unlimited threads on the proxies) and on Walmart's blocks.

Can I try the Walmart scraper before buying a large volume?

For the API, contact sales with your page types and volume; you are billed only for successful results. To test the parsers on this page first, start with the Easy Trial: 1 GB of residential traffic for $2.95, about 3,300 product pages at 300 KB a page, with no subscription, and the traffic never expires.

Can I scrape Walmart from outside the US?

Yes, through US residential IPs: walmart.com prices and stock are for US stores, so fetch it as a US shopper. Walmart's sites in other countries, such as Canada and Mexico, are separate sites; fetch each from its own country.

Do Walmart's terms allow web scraping?

Walmart's terms of use govern the use of walmart.com, including automated access, so read them before you scrape. Breaching a site's terms is a separate question from breaking a law; ProxyField's rule is public pages only, following the site's terms. This is not legal advice.

Can I use ProxyField's Walmart scraper API today?

Not yet: the Web Scraping API is in development, and access is through Contact sales. Its design is published in the API documentation; to scrape Walmart today, run the parsers on this page on ProxyField's residential proxies, from $2.95 for 1 GB.

Collect Walmart pages with the Web Scraping API

Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.