Walmart Product Scraper
Pricing
from $1.00 / 1,000 results
Walmart Product Scraper
Reads Walmart.com product pages by item ID or /ip/ URL and returns one row per item: numeric price, was-price, brand, star rating, review count, availability status, the marketplace seller behind the buy box and the main image. Values come from Walmart's own item record, not display strings.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
String
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
20 days ago
Last modified
Categories
Share
What does Walmart Product Scraper do?
It reads Walmart.com product pages by item ID or product URL and returns one row per item: a
numeric price, a wasPrice when the item is genuinely marked down, brand, rating,
reviewCount, Walmart's own availability status, the sellerName behind the buy box, the main
image and the canonical product URL.
Every value comes out of the item record Walmart server-renders into its own page data, which is the
same object the storefront draws from. That is why prices, ratings and stock arrive as typed values
instead of display strings someone has to clean up later, and why a null here means Walmart's
record genuinely has no value rather than that a selector missed.
- One row per item, up to 300 items per run.
- A bare item ID and the full
/ip/URL resolve to the same page and are fetched once, so a mixed list is never billed twice for one item. - A URL that is not a Walmart item page — a
/browse/shelf, a seller storefront, another host entirely — is rejected before it costs a fetch. - Third-party marketplace sellers are named, not flattened into "Walmart".
- No account, API key or cookies. This is the page a logged-out shopper sees, at a median of about 3.3 seconds per product in our own measurements.
What data does it extract?
| Field | Type | Description |
|---|---|---|
itemId | string | Walmart's US item ID, taken from the record itself. Stable, and the right key to join on |
title | string | Product name as Walmart states it |
brand | string | Brand from the item record, not parsed out of the title |
price | number | 2.36, not "$2.36" |
priceText | string | Walmart's own formatted price string, e.g. $2.36 |
wasPrice | number | The pre-markdown price, reported only while it genuinely exceeds price |
currency | string | USD |
rating | number | Average stars out of 5 |
reviewCount | number | Number of reviews on the item |
availability | string | Walmart's own status, e.g. IN_STOCK, OUT_OF_STOCK. UNKNOWN when the record states none |
sellerName | string | The storefront the shopper sees: Walmart.com for Walmart's own inventory, otherwise the marketplace seller |
imageUrl | string | The item's primary image |
productUrl | string | Walmart's canonical URL for the item |
sourceUrl | string | The URL that was fetched |
collectedAt | string | ISO timestamp stamped once per run |
About wasPrice
A was-price stays on Walmart's record after a promotion ends, so taking it at face value invents
discounts that expired weeks ago. This Actor reports wasPrice only when it actually exceeds what
the item sells for today; a stale one comes back null. If you are building rollback detection, the
presence of wasPrice is the signal — you do not need to compare it against yesterday's price
yourself.
About sellerName
Walmart's record holds two names for a seller. sellerDisplayName is the storefront the buyer sees
("AnkerDirect"); sellerName is the legal entity behind it, which for a marketplace seller is often
an untransliterated company name. This Actor reports the display name, falling back to the legal one
when the display name is absent. Walmart's own items carry Walmart.com in both.
Why scrape Walmart products?
- Rollback and price monitoring. Numeric
priceplus a trustworthywasPriceis enough to spot a real markdown without maintaining your own price history first. - Buy-box seller intelligence.
sellerNametells you whether Walmart is selling an item itself or a marketplace seller holds it — a different competitive situation, and one you cannot infer from price alone. - Stock checks before sourcing.
availabilitycomes from the record rather than from a rendered badge, so an out-of-stock item reads as out of stock and not as a missing element. - Catalogue enrichment. Brand, rating, review count and a canonical URL for a list of item IDs you already keep.
- Cross-retailer comparison. Pair it with the Amazon and Home Depot Actors to put the same product's price side by side across three retailers.
How to use it
- Open the Actor and click Try for free.
- Fill Item IDs or URLs with numeric Walmart item IDs, full
walmart.com/ip/…URLs, or a mix of both. - Set Maximum results if you want a ceiling on the dataset, and leave Concurrency alone unless you have a reason — Walmart is fetched gently by default.
- Run it, then export the dataset as JSON, CSV, Excel or XML, or read it over the API.
- Check the
SUMMARYrecord in the run's key-value store for anything that failed and why.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
products | array of strings | required | Walmart item IDs or full walmart.com product URLs, 1 to 300 per run |
maxItems | integer | 1000 | Ceiling on dataset rows, 1 to 50,000 |
concurrency | integer | 2 | Items fetched in parallel, 1 to 5 |
{"products": ["10450114","https://www.walmart.com/ip/Great-Value-Whole-Vitamin-D-Milk-Gallon/10450114","https://www.walmart.com/ip/23849912"],"maxItems": 1000,"concurrency": 2}
A Walmart item is addressed by its numeric item ID, which is the last path segment of an /ip/
URL: walmart.com/ip/Great-Value-Whole-Vitamin-D-Milk-Gallon/10450114 is item 10450114. The slug
in the middle is decoration and Walmart serves the item under the bare ID just as well. Both forms
collapse to one URL before fetching, so the example above is two fetches and two rows, not three.
Anything that does not resolve to a numeric item ID is rejected up front and reported under
failures with the value you passed. That covers /browse/ shelves, seller storefronts, search
URLs and any other host, and none of them cost a fetch.
Output
One row per item. This is the shape rather than a captured run:
[{"itemId": "10450114","title": "Great Value Whole Vitamin D Milk, Gallon, 128 fl oz","brand": "Great Value","price": 2.36,"priceText": "$2.36","wasPrice": null,"currency": "USD","rating": 4.4,"reviewCount": 6132,"availability": "IN_STOCK","sellerName": "Walmart.com","imageUrl": "https://i5.walmartimages.com/seo/Great-Value-Whole-Milk-Gallon_a1f2.jpeg","productUrl": "https://www.walmart.com/ip/Great-Value-Whole-Vitamin-D-Milk-Gallon/10450114","sourceUrl": "https://www.walmart.com/ip/10450114","collectedAt": "2026-08-20T09:14:02.881Z"},{"itemId": "23849912","title": "Anker Soundcore Life Q30 Hybrid Active Noise Cancelling Headphones","brand": "Anker","price": 59.99,"priceText": "$59.99","wasPrice": 79.99,"currency": "USD","rating": 4.6,"reviewCount": 1874,"availability": "OUT_OF_STOCK","sellerName": "AnkerDirect","imageUrl": "https://i5.walmartimages.com/seo/Anker-Soundcore-Life-Q30_8c31.jpeg","productUrl": "https://www.walmart.com/ip/Anker-Soundcore-Life-Q30/23849912","sourceUrl": "https://www.walmart.com/ip/23849912","collectedAt": "2026-08-20T09:14:02.881Z"}]
Geography and currency
Walmart.com is the US storefront, and that is the whole geographic story here: currency is USD
on every row, and there is no country, store or ZIP input to set. Prices and stock are the national
online values the item page shows a visitor who has not chosen a store, which is the right basis for
comparing items against each other over time.
If you need per-store local pricing, that is a different retailer's model — the Home Depot Product Scraper takes a store number and resolves price and inventory against it. For non-US storefronts of other retailers, the Amazon Product Scraper covers seven countries.
How much does it cost?
Pay-per-event: you are charged per result row written to the dataset. A row is written only when it can be charged, so hitting your spend limit stops the writing rather than delivering unbilled rows. The current per-row figure sits on the Actor's Store page.
Runs started from an Apify free plan stop at 250 requests and 250 results and say so in the
run's status message. Any paid plan runs the full input and the maxItems you set.
The limit exists because this Actor fetches through our own scraping infrastructure, which Apify does not cover for free-plan runs. It binds on requests as well as rows, so a long item list cannot spend fetches on rows the run will never return.
Using it with the Apify API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('usestring/walmart-products').call({products: ['10450114', 'https://www.walmart.com/ip/23849912'],maxItems: 300});const { items } = await client.dataset(run.defaultDatasetId).listItems();const markdowns = items.filter((item) => item.wasPrice !== null);console.log(`${markdowns.length} of ${items.length} items are on rollback`);
The Python client and the plain REST API reach the same run, and a schedule will take the price snapshot for you every morning.
Is it legal to scrape Walmart products?
Walmart product pages are public. No login, no cookies and no API key are used, and the Actor reads
what an anonymous shopper is served. The output is product and offer data — price, stock, ratings,
seller storefront name — and carries no reviewer names, no review text and no personal data.
sellerName is a business storefront, not an individual.
Collecting public data is broadly lawful in the US and the EU, but your obligations depend on where you operate and what you do with the data next, and Walmart's terms of service are a separate question from the law. This is background, not legal advice.
Limitations
Product pages on walmart.com (US) only, and only for items you name. No review text, no variant
matrices, no specification tables, no per-store shelf inventory and no full offer list behind the
buy box. There is no search or category crawling here — the Actor never spends a fetch on a page you
did not ask for. Values reflect what Walmart's record said at collectedAt.
Related actors
- Home Depot Product Scraper — the same product fields for home improvement, with local price and stock per store number.
- Amazon Product Scraper — the matching lookup on Amazon, across seven marketplaces.
- Amazon Search Scraper — keyword discovery when you do not yet know which products to price.
- Amazon Bestsellers Scraper — category rankings, useful for building a comparison set worth checking on Walmart.
- Etsy Listings Scraper — listing-level data on the handmade marketplace.
FAQ
What is a Walmart item ID and where do I find it?
The numeric identifier at the end of a Walmart product URL — 10450114 in
walmart.com/ip/Great-Value-Whole-Vitamin-D-Milk-Gallon/10450114. Pass it bare or pass the whole
URL; both work, and both cost one fetch.
Can it search Walmart or crawl a category? No. You supply the items. That is a deliberate boundary: an Actor that crawled would spend your budget on pages you never asked for.
Does it return third-party marketplace sellers?
Yes. sellerName carries the storefront shown on the item, so you can tell Walmart's own inventory
from a marketplace seller's.
Why is wasPrice null on an item that shows a strikethrough price?
Because the recorded was-price was not higher than the current price when the run happened. Walmart
leaves stale was-prices on the record after a promotion ends, and reporting one as a discount would
be wrong.
How many rows does one item produce? One. One page fetched, one row emitted.
What happens to an item ID that no longer exists?
It is recorded under failures in the run's SUMMARY record, with Walmart's own error reason where
the page gives one, and the rest of the batch still returns. A run in which every item failed exits
as a failed run rather than as an empty success.
Do I need proxies? No. Fetching and anti-bot handling happen on our side; there is nothing to configure.
Feedback
If a field looks wrong or you need one that is not here, open an issue from the Actor's Store page and include the item ID. One ID is usually enough to reproduce the problem.