Walmart Scraper - Products, Prices, Sellers & Reviews
Pricing
from $0.90 / 1,000 product records
Walmart Scraper - Products, Prices, Sellers & Reviews
Scrape Walmart.com by keyword, URL, or item ID. Extract prices, was-prices, sellers, marketplace offers, stock, ratings, specs, images, and reviews. Track NEW, UPDATED, REAPPEARED, and EXPIRED items with resume and MCP export.
Pricing
from $0.90 / 1,000 product records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Walmart Scraper: Products, Prices, Sellers & Reviews
Walmart Scraper turns walmart.com into structured product data. Search by keyword, paste storefront links, or look up specific products by link or item id, and get prices, was-prices, every seller offer, stock status, ratings, specifications, images and the customer reviews the product page publishes. Run search mode for fast listing-level pulls, or turn on detail enrichment for a fully specced record, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Reviews and offers ride the same request as the product page. Every walmart.com product page ships its reviews and its seller offers in the same document as the product itself, so this actor returns them from one detail read instead of a separate call per review or per offer.
- A listing page returns full product rows for free. A search or browse page carries its whole result grid as structured data, so a listing-level pull returns price, was-price, rating, review count, seller and stock for every card with no per-product request at all.
- Filters that are actually true. The storefront's own sort and filter parameters are sent with the request, so filtering narrows results before they count against your item cap. Sponsored tiles are injected into the grid regardless of the active filters, and this actor re-checks every row so "hide sponsored" and "sold by Walmart" mean what they say.
- Search keywords and pasted links in one run. Mix keyword searches with pasted search, browse, shop or category links; each is walked on its own, page by page, with the storefront's own pagination bound.
- Monitoring built in. Label every record NEW, UPDATED, REAPPEARED or EXPIRED across scheduled runs, resume an interrupted crawl, and export results through MCP connectors.
- Structured failures. A run the storefront refuses fails loudly with a clear message instead of returning an empty dataset that looks like a search with no matches.
Use Cases
- Price and stock monitoring: track prices, was-prices and availability for a product list or a category, and get alerted only to what actually changed.
- Marketplace and seller research: compare offers, seller types and fulfillment options across the same product to study competition on a listing.
- Catalog and assortment analysis: pull a whole category or search result to study assortment, brand coverage and pricing bands.
- Review and reputation analysis: collect ratings, rating breakdowns and customer review text for products you sell or compete with.
- Comparison shopping and repricing tools: feed live prices and seller data into your own pricing or comparison app through the API.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "product" (the only record type this actor returns) |
itemId | "000000000000" |
title | "Sample Product Name 15-inch Laptop" |
brand | "Sample Brand" |
price / wasPrice | 199.0 / 249.0 |
currency / priceRangeLow / priceRangeHigh | "USD" / a variant group's "from" price range, when a card has no single price |
rating / reviewCount | 4.5 / 123 |
ratingHistogram / recommendedPercentage | star breakdown and percent who'd recommend it (fetchDetails only) |
sellerName / sellerType | "Sample Seller" / "INTERNAL" |
offerCount / offers | 2 / every seller offer with price, condition and fulfillment (fetchDetails only) |
availabilityStatus / inStock | "IN_STOCK" / true |
condition | "New" (fetchDetails only) |
model / upc | "SAMPLE-MODEL-01" / "0000000000000" (fetchDetails only) |
categoryPath | "Electronics / Sample Category / Sample Subcategory" |
badges / sponsored | ["Sample badge"] / false |
fulfillmentOptions | ["DELIVERY", "PICKUP", "SHIPPING"] (fetchDetails only) |
returnPolicy | returnable, free returns, window in days, policy text (fetchDetails only) |
specifications / productHighlights | name and value pairs the product page publishes (fetchDetails only) |
images / imageUrl | the full gallery / the first image |
description / shortDescription | full and short product copy |
reviews | up to 10 reviews, each with rating, title, text, date and the reviewer's public display name (includeReviews only) |
priceScope | the postal code, city, state and store the prices were quoted for (fetchDetails only) |
searchQuery / resultPage / resultPosition | which keyword, result page and grid slot the product was found at (search mode only) |
url / sourceUrl | the product page link / the listing page this record came from |
changeType / changedFields / firstSeenAt / lastSeenAt | incremental mode only: "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED", the fields that changed, and when the record was first and last seen |
Product mode looks up product links or bare item ids directly and always returns a fully enriched record, the same shape detail enrichment adds to a search-mode record.
How to Use
- Keep the default search mode, add one or more keywords, and run. Paste storefront links (search, browse, shop or category) instead of, or alongside, keywords if you already have them; filters already in a pasted link are kept and this run's own filters are added on top.
- Narrow with the storefront's own filters: sort, brands, sold by, condition, deals, minimum rating, availability and price range. Turn on Hide sponsored results for a clean assortment view.
- Turn on Fetch product details for full specs, offers and return policy, and Include customer reviews for the reviews the product page itself publishes (no extra request beyond the detail read).
- Set Max products to control run size and cost, then click Start. Switch to products mode instead when you already know which items you want, and list their links or item ids.
Quick keyword search:
{"mode": "search","queries": ["desk lamp"],"maxItems": 20}
Filtered search, sorted and priced within a range:
{"mode": "search","queries": ["running shoes"],"sortBy": "price_low","retailerType": "walmart","minPrice": 20,"maxPrice": 80,"excludeSponsored": true,"maxItems": 50}
A whole category, with full detail and reviews:
{"mode": "search","searchUrls": ["https://www.walmart.com/browse/electronics/3944"],"fetchDetails": true,"includeReviews": true,"maxItems": 100}
Look up specific products:
{"mode": "products","productInputs": ["10000000001", "https://www.walmart.com/ip/10000000002"],"fetchDetails": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/walmart-scraper").call(run_input={"mode": "search", "queries": ["desk lamp"], "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["title"], product["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/walmart-scraper').call({ mode: 'search', queries: ['desk lamp'], maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Caps and pagination
Max products stops the whole run once that many records have been returned; each keyword and each pasted link is otherwise walked to its own natural end. Max result pages bounds how many pages are walked per keyword or link; 0 walks every page the storefront offers for that search, up to an internal ceiling of 100 pages per scope, then stops at the storefront's own last page or when a page returns nothing new.
A keyword or link that shares products with an earlier keyword or link in the same run only returns each shared product once, credited to whichever scope reached it first. Known limitation: one list of already-collected products is shared by every keyword and link in the run, and a walk treats a page on which every product is already on that list as the end of its results. So when any page of a later keyword or link (its first page or a later one) holds only products an earlier keyword or link already returned, that walk stops there and never requests its remaining pages, silently dropping products that only appear on those pages. In incremental mode such a walk still counts as having reached its end, so products tracked from a previous run that sat on those unrequested pages can be reported EXPIRED even though they are still listed. If you run several closely related keywords or overlapping links, run each as a separate actor call (with its own stateKey if you monitor them) instead of one combined run.
Resume and recurring updates
- Resume (
resumeFromRunId) skips products already collected by an earlier run: paste its run or dataset ID and those products are neither returned nor charged again. It works as expected in products mode. Known limitation in search mode: the collected products are added to the same already-collected list described under Caps and pagination, so a keyword or link walk stops at the first page on which every product was already collected. An interrupted crawl has usually collected all of page 1, so the resumed walk typically ends right there and returns nothing from that keyword's or link's later pages, and the run can finish with zero records. To pick up a large search crawl, start a fresh run rather than a resumed one. - Resume and incremental mode together: products skipped because the resumed run already collected them are never added to the incremental state, so a later incremental run reports them as
NEWagain. Run a normal (non-resumed) incremental pass afterward so the tracked baseline reflects everything. - Incremental mode (
incrementalMode) is for scheduled runs over the same search or link. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(only after a run whose walks all reached their end, never after a capped or resumed run, and only withemitExpiredon; see the overlapping-scope limitation under Caps and pagination).stateKeynames or shares the stored state; leave it empty and the actor derives one from the run's search and filter setup. When a complete scan does tombstone EXPIRED products, that batch is not itself limited by Max products, so a monitoring run with a low cap and a large tracked baseline can return more records than the cap on the run where products disappear.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field (
mcpConnectors). (If the picker is empty, you haven't authorized a connector yet.) - For Notion, also set
notionParentPageUrlto the page where items should be created. - Optionally set
maxNotifyListingsto cap how many items are written to each connector per run (default 50).
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keywords and pasted listing links) or products (specific product links or item ids). |
queries | array | laptop | Search mode: keywords to search, each walked separately. |
searchUrls | array | (none) | Search mode: walmart.com search, browse, shop or category links to walk. Filters already in a pasted link are kept. |
productInputs | array | (none) | Product mode: product links or bare item ids, mixed freely. |
sortBy | string | best_match | Storefront sort order: best match, price low to high, price high to low, best seller, highly rated, or new arrivals. |
brands | array | (none) | Keep only products from these brands, spelled as the storefront spells them; several are combined as "any of these". |
retailerType | string | any | Narrow to who sells the item: Walmart, Pro Sellers, or marketplace sellers fulfilled by Walmart. |
condition | string | any | Narrow to new, restored or pre-owned items. |
specialOffer | string | any | Narrow to reduced price, clearance or rollback items. |
minRating | string | any | Narrow to 4 stars and up, or 3 stars and up. |
inStockOnly | boolean | false | Hide items the storefront currently cannot sell or deliver. |
excludeSponsored | boolean | false | Drop advertising tiles from the results, even though the storefront injects them regardless of the filters above. |
minPrice | integer | (none) | Only keep products priced at or above this amount (USD). |
maxPrice | integer | (none) | Only keep products priced at or below this amount (USD). |
fetchDetails | boolean | false | Read each product's own page for brand, model, UPC, full description, specifications, all images, every seller offer, return policy and rating breakdown. Charged once per record enriched. |
includeReviews | boolean | false | Add the reviews the product page itself publishes. Reads the same page as fetchDetails, so it costs no extra request, but it does turn detail enrichment on and it takes part in change detection. |
maxReviews | integer | 10 | How many of the product page's own reviews to keep per product, newest-first, up to the 10 the page publishes. |
maxItems | integer | 20 | Maximum number of records to return across the whole run. 0 is unlimited. |
maxPages | integer | 0 | Maximum result pages walked per keyword or pasted link. 0 walks every page the storefront offers for that search. |
resumeFromRunId | string | (none) | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for products already collected there. |
incrementalMode | boolean | false | Turn on for scheduled monitoring. The first run returns every matching product as NEW; later runs return only NEW, UPDATED and REAPPEARED products by default. |
stateKey | string | (none) | Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. |
emitUnchanged | boolean | false | Also return, and bill, products that have not changed since the last run, marked UNCHANGED. |
emitExpired | boolean | false | Also return, and bill, products present in a previous run but no longer found, marked EXPIRED. Only produced after a run that fully scanned the tracked search or link. |
proxy | object | Apify Proxy, US residential | Connection settings. walmart.com serves search and product pages only on a US residential exit; a datacenter exit is refused. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "product","itemId": "000000000000","url": "https://www.walmart.com/ip/Sample-Product-Name/000000000000","title": "Sample Product Name 15-inch Laptop","brand": "Sample Brand","model": "SAMPLE-MODEL-01","upc": "0000000000000","shortDescription": "A sample product description written for this example.","price": 199.0,"wasPrice": 249.0,"currency": "USD","rating": 4.5,"reviewCount": 123,"ratingHistogram": {"5": 80, "4": 25, "3": 10, "2": 5, "1": 3},"recommendedPercentage": 90,"sellerName": "Sample Seller","sellerType": "INTERNAL","offerCount": 2,"offers": [{"sellerName": "Sample Seller", "price": 199.0, "condition": "New","fulfilledByWalmart": false, "isBuyBoxWinner": true},{"sellerName": "Sample Reseller", "price": 209.5, "condition": "New","fulfilledByWalmart": true, "isBuyBoxWinner": false}],"availabilityStatus": "IN_STOCK","inStock": true,"condition": "New","categoryPath": "Electronics / Sample Category / Sample Subcategory","badges": ["Sample badge"],"sponsored": false,"fulfillmentOptions": ["DELIVERY", "PICKUP", "SHIPPING"],"returnPolicy": {"returnable": true, "freeReturns": true, "windowDays": 90,"text": "Free 90 day returns"},"specifications": [{"name": "Sample specification", "value": "Sample value"}],"reviews": [{"reviewId": "000000000", "rating": 5, "title": "Sample review title","text": "Sample review text written for this example.","submittedAt": "1/1/2026", "authorNickname": "SampleShopper","verifiedPurchase": true, "helpfulVotes": 3}],"priceScope": {"postalCode": "00000", "city": "Sample City", "state": "ST","storeId": "00000"},"searchQuery": "sample keyword","sourceUrl": "https://www.walmart.com/search?q=sample+keyword","resultPage": 1,"resultPosition": 4,"changeType": "NEW","changedFields": [],"firstSeenAt": "2026-09-04T02:00:00+00:00","lastSeenAt": "2026-09-04T02:00:00+00:00"}
Every value above is illustrative and fictional, invented for this example, not a real walmart.com product, price, seller or customer. A real run's reviews carry only what walmart.com prints publicly beside each review: a rating, text and the reviewer's public display name, never an email address, phone number or profile link, because the product page does not publish those.
Plan Requirement
Pay per event: one unit per returned record, plus an actor start event, plus a detail-enrichment unit for each record actually enriched from its product page. A record whose product page could not be read still ships, uncharged, and a suppressed unchanged record in incremental mode is neither returned nor charged. A US residential Apify Proxy exit is required; the default proxy setting is already set to this. walmart.com serves its home page on other connections but refuses search and product pages on a datacenter exit.
FAQ
How much does it cost?
You pay per record returned, plus a detail-enrichment unit only for records you asked to be enriched with fetchDetails. Reviews add no extra charge beyond that. The Pricing tab shows the current rates. Use Max products to cap the cost of any run.
Is it legal to scrape walmart.com?
This actor collects only publicly available product data that walmart.com prints on its own pages. You are responsible for how you use it: follow Walmart's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product prices and specifications are generally facts, but images, descriptions and review text may be subject to third-party rights.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared products, and unchanged ones are not billed unless you turn emitUnchanged on.
Why do reviews cost the same as detail enrichment?
Because they come from the same request. The product page walmart.com serves carries the specifications, offers and reviews in one document, so turning includeReviews on reads the same page fetchDetails reads; you're never billed twice for the same read.
Why did my run fail instead of returning an empty dataset?
If the storefront refuses every request, the run stops with a clear message so "no products matched" is never confused with "nothing could be read". Run it again in a few minutes, and check that the proxy is set to a US residential exit. If only some keywords or pages could be read, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
π More scrapers you might like
Pair this actor with these related scrapers from the same team:
| π§© Gopuff Scraper Scrape Gopuff, the US quick-commerce delivery store, by location or product: prices... | π Cdiscount Scraper Scrape product data from Cdiscount.com by keyword, category, or URL. Apply filters and... |
| π PB Tech Scraper Scrape pbtech.co.nz products with full specifications, price, brand, condition, per-store... | π Harvey Norman Scraper Scrape Harvey Norman Australia products: name, brand, price, was-price / discount... |
| π Appliances Online Scraper Scrape appliancesonline.com.au by category, keyword, or URL. Extract title, brand, AUD... | π§© Mercado Livre Brazil Scrape Mercado Livre Brazil by keyword or URL. Filter by category, brand, price... |
π Browse all abotapi scrapers
π¬ Support & custom scrapers
- π Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- π οΈ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- β Enjoying it? A quick review on the actor page helps other users find it.