# Walmart Scraper: Products, Prices, Sellers (`automation_craft/walmart-scraper`) Actor

Scrape Walmart US, Canada and Mexico by category, brand, keyword landing page, shelf, link or product id, no login. Get price, was price, Rollback, rating, availability, seller, delivery dates and the ZIP Walmart priced at. Add details, reviews, seller contacts. JSON, CSV, Excel; pay per product.

- **URL**: https://apify.com/automation_craft/walmart-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** E-commerce, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.47 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Walmart Scraper: Products, Prices, Sellers

**Walmart scraper** for product data from walmart.com, walmart.ca and walmart.com.mx: read Walmart categories, brand pages, Walmart's own keyword landing pages, department and shelf pages, product links and product ids, and walmart.com seller links and ids, and get every product as a row with its price, was price, unit price, rating and review count, availability, seller, pickup and delivery dates, Rollback and other badges, category trail and the ZIP code and store Walmart priced it at. Optional Product details add the description, specifications, UPC, model, variants, return policy, warranty, protection plans, every other seller's offer and one offer per condition; optional Review rows add walmart.com reviews; seller links and ids (or the optional Seller profile on products) give a Marketplace seller's legal name, e-mail, phone and address. No login, no cookies, no proxy of your own needed.

Walmart prices every page for a location. This Actor does not pick one for you: each row says in `pricedAt` the ZIP code, city, state and store Walmart used, so you always know which shelf price you are looking at.

#### Who uses it

- Brands and Walmart Marketplace sellers watching prices, Rollbacks, availability, the selling seller and ratings of their own products and of others in their category.
- Price comparison and deal sites that list Walmart offers in the US, Canada and Mexico.
- Retail analysts (assortment, price bands, was prices, badges, seller mix) and teams building lists of Walmart Marketplace sellers with their published contacts.

### Quick start

1. Paste one or more Walmart links in **Walmart links** (a category such as `https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913`, a brand page, a `/c/kp/` keyword page, a department or shelf page, product pages or walmart.com seller pages), or give **Category ids**, **Product ids** or **Seller ids**.
2. For ids, pick the **Market**: United States (default), Canada or Mexico. A pasted link carries its own site.
3. Set **Max products in all** and **Max products per input** (100 each when left out).
4. Optionally add a **Sort**, a price range, **Brands**, **Other filters**, a **Store number** or a **Min customer rating** (walmart.com listing pages).
5. Optionally switch on **Product details**, **Seller profile** or set **Reviews per product**, then run it and download the dataset as JSON, CSV or Excel, or read it through the API.

### What you get

One row per Walmart product (`type: product`), delivered and charged once per run. Seller links and ids give one row per seller (`type: seller`, see Seller rows below).

| Field | What it is |
|---|---|
| `productId`, `market`, `url` | Walmart's item id (the number at the end of the product link), the site (`us`, `ca`, `mx`) and the product link |
| `name`, `brand`, `image`, `shortDescription` | as Walmart shows them |
| `price`, `currency`, `priceText`, `wasPrice`, `wasPriceText` | the current price and the earlier price Walmart shows beside a reduced one, in USD, CAD or MXN |
| `unitPrice`, `savings`, `savingsText`, `priceRange`, `shippingPrice`, `subscriptionPrice`, `priceCondition`, `otherConditionPrice` | the price per unit, the stated saving, the price range of the variants, the shipping price, the subscription price, Walmart's price condition text and the lowest price in another condition |
| `rating`, `reviewCount` | average customer rating out of 5 and the number of reviews Walmart counts |
| `availability` | Walmart's availability code and text (`IN_STOCK`, "In stock") |
| `sellerName`, `sellerId`, `sellerInternalId`, `isWalmartSeller` | the seller of the offer Walmart shows first and whether it is Walmart itself |
| `fulfillment` | shipping, pickup and delivery options with their dates |
| `badges`, `labels`, `flags` | Walmart's badges (Rollback, Best seller, Clearance), the other labels on the product card, and yes or no flags read from them (`rollback`, `clearance`, `bestSeller`, `walmartPlusSavings`, `snapEligible`, `lowStock` and more) |
| `isSponsored`, `condition` | a sponsored placement (only with **Include sponsored products**) and the condition Walmart shows ("Open Box", "Restored: Like New") |
| `variantCount`, `variants`, `variantOf`, `variantAttributes`, `additionalOfferCount` | the product's variants with their own ids, the product a variant row belongs to, its size or colour, and how many more offers Walmart counts |
| `categoryPath`, `categoryPathIds`, `categoryPathText`, `aisles` | Walmart's category trail (names and ids) and the store aisle where Walmart shows one |
| `pricedAt` | the ZIP code, city, state and store Walmart priced the row at |
| `position`, `page`, `sortedBy`, `source`, `scrapedAt` | where the product stood on Walmart's page, the order, which input found the row (and the shelf, on a shelf page) and when |
| `details`, `detailsStatus` | the Product details add-on (below; `details.otherOffers` holds every other seller's offer as Walmart's page lists it), else `null`; with details asked, `detailsStatus` is `read` or says why not (`charge_limit`, `not_read_unpaid_work`, `stopped`, `failed`, `not_found`, `another_product`) |
| `variantsStatus` | with **Expand variants** on: `read` when the product page naming the variants was read, `not_offered_with_filters` on a walk whose filters a variant cannot prove, or why the page was not read (`not_read_unpaid_work`, `stopped`, `failed`, `not_found`, `another_product`) |
| `reviewsStatus`, `reviewsDelivered`, `reviewsOnWalmart`, `reviewsNote` | with reviews asked: what was read (`read`, `partly_read`, `none` when Walmart lists no review, `failed`, `not_found`, `not_read_unpaid_work`, `stopped`, `charge_limit`, or `not_offered_in_market` on walmart.ca and walmart.com.mx), how many review rows came with the product, Walmart's count of written reviews (on a read without star or verified filters), and, for every status other than `read`, `none` and `not_offered_in_market`, a note naming the first cause (your charge limit, a page that did not apply the order or filters, repeats, an early empty page, a failed page, the run stopping) |
| `sellerProfile`, `sellerProfileStatus`, `sellerProfileKey`, `sellerProfileCharged` | the Seller profile add-on (below) and the seller id it belongs to, else `null` with the reason (`sold_by_walmart`, `no_seller_id`, `not_offered_in_market`, `charge_limit`, `not_read_unpaid_work`, `stopped`, `failed`, `not_found`, `another_seller`); `sellerProfileCharged` is `true` on the one row of the seller that carries the run's single Seller profile charge (a product row, or the seller's own row from a seller link or id) and `false` on the seller's other rows (if the platform declines that charge, the seller is not charged again in the run) |

An add-on that is not delivered never takes its product with it: the product row is delivered and its status field names why (`charge_limit`: your charge limit did not pay for it; `not_read_unpaid_work`: the run's allowance for unbilled work was spent; `stopped`: the run was stopping; `failed`, `not_found`, `another_product`, `another_seller`: Walmart did not serve it), and the add-on is not charged.

How full the fields are, measured on 2026-10-31 on runs of this Actor on Apify (build 0.1.1, 28 runs between 21:08 and 21:27 UTC): 1,063 product rows (746 distinct products; 1,052 from walmart.com, mostly the TVs category, 10 from walmart.ca, 1 from walmart.com.mx), 11 of them with Product details (9 distinct products), 305 review rows of 7 products, 1 row with a Seller profile.

| Field | Apify runs |
|---|---|
| `productId`, `market`, `url`, `currency`, `pricedAt` (ZIP code, city, state, store number) | 100% |
| `availability` | 100% |
| `name`, `image`, `sellerName`, `fulfillment` (variant rows carry only what the page shows about the variant) | 99.5% to 99.6% |
| `reviewCount` | 99.4% |
| `price` (30 tiles of keyword, shelf and deep category pages were served without one) | 97.2% |
| `categoryPath` (walmart.ca tiles: 0 of 10) | 96.7% |
| `labels` | 96.3% |
| `shortDescription` | 95.9% |
| `rating` (only products someone rated carry one) | 74.2% |
| `additionalOfferCount` | 26.1% |
| `wasPrice` | 24.0% |
| `badges` (Rollback, Best seller and others) | 16.3% |
| `condition` ("Open Box", "Restored: Like New") | 14.2% |
| `priceRange` | 12.5% |
| `shippingPrice` | 2.3% |
| `savings` | 0.8% |
| `unitPrice` (where Walmart shows a price per unit) | 0.4% |
| `brand`: category tiles 0 of 1,027, shelf page tiles 10 of 10, rows read from product pages 11 of 11 | 2.0% |
| Product details: `longDescription`, `specifications`, `images`, `returnPolicy`, `offerCount`, `reviewsSummary`, `embeddedReviews` | 11 of 11 |
| Product details: `upc`, `model`, `manufacturerProductId` (the manufacturer part number), `highlights` | 10 of 11 |
| Product details: `fulfillmentOptions`, `conditionOffers` | 10 of 11 |
| Product details: `variantCriteria`, `promotions` | 9 of 11 |
| Product details: `warranty` | 8 of 11 |
| Product details: `addOnServices` (protection plans and expert help with prices) | 8 of 11 |
| Product details: `videos` | 8 of 11 |
| Product details: the seller's rating (Marketplace sellers only) | 1 of 11 |
| Reviews: `rating`, `submittedAt`, `submittedDate`, `isVerifiedPurchase`, `helpfulVotes`, `unhelpfulVotes` | 100% |
| Reviews: `text`, `authorName` | 99.3% |
| Reviews: `title` | 73.1% |
| Reviews: `sellerName`, `fulfilledBy` | 71.8%, 71.5% |
| Reviews: `aspects` | 61.3% |
| Reviews: `brandResponse` | 43.3% |
| Reviews: `photos` | 37.4% |
| Seller profile: `displayName`, `legalName`, `email`, `phone`, `address`, `about`, `rating`, `reviewCount` | 1 of 1 |
| Seller profile: `writtenReviewCount`, `hasSellerBadge`, `logo`, `profileUrl` | 1 of 1 |

#### Product details (add-on)

With **Product details** on, each delivered product carries `details`: `upc` (and `gtin` on walmart.com.mx), `model`, `manufacturerProductId` (the manufacturer part number), `shortDescription` and `longDescription` as served, `highlights`, `specifications`, `warranty`, `images`, `videos`, `variantCriteria` (every size and colour with its availability), `fulfillmentOptions` (shipping, pickup and delivery with dates, prices and order limits), `returnPolicy` (returnable, free returns, return to store, window in days), `addOnServices` (protection plans and expert help with their prices), `otherOffers` (every other seller's offer of the product in the same condition, as Walmart serves it: `sellerId`, `sellerName`, `sellerDisplayName`, `offerId`, `price`, `priceText`, `currency`, `offerType`, `condition`, `availability`, `fulfillmentType`, `sellerRating`, `sellerReviewCount`, `sellerStorefrontUrl`, `wfsEnabled`; the offer Walmart shows first stays on the row itself; our saved page of product 19365359171 of 2026-11-01 holds two other sellers beside the first offer, Electronic Express at $219.99 and GSAWHOLESALE at $249.99), `conditionOffers` (one offer per condition with its price), `offerCount`, `promotions`, the `seller` (name, id, type, and for Marketplace sellers the rating and review count), `reviewsSummary` (average, rating count, written review count, star histogram, review topics), `embeddedReviews` (the reviews the product page shows), the category links, and the label blocks Walmart serves for food, health and other products (`ingredients`, `nutritionFacts`, `warnings`, `directions`, `tire`). Rows from product links and ids are read from the product page, so they carry details and are charged one Product details each (unless your charge limit cannot pay it: `detailsStatus: charge_limit`); a variant row carries details only with **Product details** on. A listing row can go without details when the run's add-on allowance is spent; `detailsStatus` then says so.

#### Reviews (add-on)

Set **Reviews per product** above 0 and each delivered walmart.com product brings up to that many reviews as their own rows (`type: review`): `rating`, `title`, `text`, `submittedAt` and `submittedDate`, `authorName` (the nickname), `isVerifiedPurchase`, `helpfulVotes`, `unhelpfulVotes`, `photos`, `brandResponse`, `sellerName`, `fulfilledBy`, `badges`, `aspects`, `syndicationSource` and the reviewed variant (`reviewedProductId`, `reviewedProductName`). Walmart's six review orders and its star and verified purchase filters are available; Walmart lists up to 10,000 reviews per order and star filter. Review rows are written as they are read, a page at a time, each before its product row, and billed when written; if a run is stopped between a product's reviews and its product row, the review rows stay delivered and billed, and a restarted run writes the product row without reading or billing them again. One Review is charged per review row.

#### Seller profile (add-on)

With **Seller profile** on, every delivered product of a walmart.com Marketplace seller carries `sellerProfile` from the seller's public page: `displayName`, `legalName`, `email`, `phone`, `address`, `about`, `rating`, `reviewCount`, `writtenReviewCount`, `hasSellerBadge`, `logo` and `profileUrl`. The page is read once per seller per run attempt (a seller row with **Raw data** on reads its own page, and a run the platform restarts reads it again, and a seller row reads it again when an earlier read of that seller failed), and one Seller profile is charged once per seller per run, on the first delivered product of that seller unless the run already charged it as a seller row (`sellerProfileCharged: true` there, `false` on the seller's other products, which carry the same profile; if the platform declines that one charge, the seller is not charged again in the run). Products sold by Walmart itself carry none (`sellerProfileStatus: sold_by_walmart`). In our run of 2026-10-31 with three product ids, the one Marketplace product carried its seller's profile and the run was charged one Seller profile; the two products sold by Walmart carried none.

#### Seller rows

Give walmart.com seller links (`https://www.walmart.com/seller/101174524`, or the `/global/seller/` form product pages link to) in **Walmart links**, or their ids in **Seller ids**, and each seller becomes one row (`type: seller`) read from its public seller page:

| Field | What it is |
|---|---|
| `sellerId`, `market`, `profileUrl` | Walmart's catalogue seller id (the number at the end of the seller link), `us`, and the seller page |
| `displayName`, `legalName` | the name buyers see and the registered business name, as Walmart serves them |
| `email`, `phone`, `phoneCountryCode` | the contacts Walmart publishes on the seller page (some sellers publish a relay e-mail address) |
| `address` | `line1`, `line2`, `city`, `state`, `postalCode`, `country` as published |
| `about`, `sellerType`, `hasSellerBadge`, `status` | the seller's own text, Walmart's seller type, its seller badge and its account status (`ACTIVE`) |
| `rating`, `reviewCount`, `writtenReviewCount` | the seller's average rating, its rating count and its written review count |
| `logo`, `banner` | the seller's images where it has them |
| `isAddressVisibilityExempted`, `isContactVisibilityExempted`, `isAlcoholSeller` | Walmart's marks for a seller exempted from showing its address or contacts, and for an alcohol seller |
| `sellerProfileCharged`, `source`, `scrapedAt` | whether this row carries the seller's charge, the input that asked for it and when |

Each seller is charged ONE Seller profile per run, whichever way it comes (its page is read once per seller per run attempt: a seller row with **Raw data** on reads its own page, and a run the platform restarts reads it again, and a seller row reads it again when an earlier read of that seller failed): a seller row is charged one Seller profile (the same event and price as the add-on), a seller already charged in the run through the Seller profile add-on of a product is delivered as a free seller row (`sellerProfileCharged: false`), and the products of a seller charged as a row carry its profile free. Seller ids Walmart does not know (its seller page answers not found) are counted on one free status row per reason, which lists their input positions, never the ids. Seller rows count in **Max products in all**; seller pages are read on walmart.com only. In our saved pages of 2026-11-01, five of five real seller ids carried their e-mail, phone and address, and two made up ids answered not found.

#### Free rows

Every listing input that is walked gets one `coverage` row; inputs that are not walked (settings their market or page kind cannot apply, a link refused, an input the same as an earlier one, also one found to be the same only after its filter list was read) are listed by position on one free status row per reason. A coverage row holds Walmart's stated count (`totalOnWalmart`), the distinct products met, the pages and price bands read, the products delivered, left out by filters, repeated and sponsored, why the walk stopped (`stoppedBy`), the walk's `ranges` (the main list and every price band read, each with its price bounds, its own stated count, the distinct products met and whether it is complete), products whose product page no longer matched the filters sent (`changedSinceListed`), and `complete`: true only when the main list, or the price bands together, cover the walk's whole price range with each one read to its own stated count, and the distinct products met reach Walmart's count for the page (or **Max products per input** ended the walk); a page Walmart lists empty while stating products there, a setting refused for the page, an add-on page that failed or a run restarted by the platform is never complete. Status rows name what could not be used or found: product ids and links Walmart does not know or no longer sells and seller ids and links Walmart does not know (one row per reason, listing their input positions in `inputs` with the `count`, never the ids), a filter Walmart does not list for the page, a keyword page Walmart sends to its site search, a link the Actor does not read. With **Filter options** on, each listing input adds one row with every filter and value Walmart shows for the page and its sub categories. The last row is the run `summary`. None of these is charged.

#### Depth

Walmart shows 10 pages of 40 products (about 400) for one listing in one order. When you ask for more, a walmart.com walk goes on in closed price bands read in Walmart's best match order: a band stating more than 400 products is split in two at the middle price of its first page, and bands are read until none is left (or your caps or the band limit), every product already met skipped, so one category can deliver up to **Max products per input** (up to 50,000), each once; those rows have no `position` and say `best_match` in `sortedBy`. A band within one dollar that still states more than 400 is read to Walmart's depth and the coverage row says so. Every listing page is read once, as Walmart serves it; a walk whose distinct products fall short of Walmart's stated count is partial (`complete: false`). The coverage row shows each range with its own count next to the distinct products met. Sponsored placements are skipped free and counted by default. In our run of 2026-10-31 asking 700 products of the TVs category (Walmart stated 1,371), the walk read 36 pages in 11 ranges, delivered 700 products, each once, and skipped 299 sponsored placements free.

### How much does it cost to scrape Walmart?

Pay per event: you pay for the products, details, reviews and seller profiles delivered, plus a small start fee per run. Platform usage is included.

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Product (per 1,000) | $0.66 | $0.60 | $0.55 | $0.47 |
| Product details, add-on (per 1,000) | $2.00 | $1.70 | $1.45 | $1.20 |
| Review, add-on (per 1,000) | $0.29 | $0.28 | $0.27 | $0.25 |
| Seller profile, a seller row or the add-on (per 1,000) | $2.80 | $2.50 | $2.20 | $2.00 |
| Actor start (per run) | $0.005 | $0.005 | $0.005 | $0.005 |

Platinum and Diamond plans pay the Gold price. The start fee has no discount. The Store pricing card shows these same prices per 1,000 events: "$0.47 / 1,000" on the Product row means one product costs less than a tenth of a cent.

Examples at the Bronze price: 1,000 category products cost $0.60 plus the $0.005 start fee, $0.605 in all; 100 category products with details cost $0.06 + $0.17 + $0.005 = $0.235; one product id with 500 reviews costs $0.0006 + $0.0017 + $0.14 + $0.005 = $0.1473; 50 products from 10 Marketplace sellers with seller profiles cost $0.03 + $0.025 + $0.005 = $0.06; 20 seller ids cost $0.05 + $0.005 = $0.055.

Not charged: a product left out by a filter or the minimum rating, a sponsored placement skipped, a product repeated in the run, an id Walmart does not know or no longer sells, a seller id Walmart does not know, a seller already charged in the run (its other rows carry the profile free), a product whose product page no longer matches the filters or store sent, a filter or order a page does not offer, details, reviews or seller profiles that could not be read, and every status, coverage, filter options and summary row. You can cap the spend of a run with Apify's maximum charge setting: the Actor stops cleanly at it.

### Input

| Setting | What it does |
|---|---|
| `startUrls` | Walmart links: categories (`/browse/...`, with their own page, sort, filter, price and store settings), keyword pages (`/c/kp/...`), brand pages (`/c/brand/...`), department and shelf pages (`/cp/...`, `/shop/...`, the home page; page 1, every product tile) and product pages (`/ip/...`), on walmart.com, walmart.ca or walmart.com.mx, and walmart.com seller pages (`/seller/<id>`, one seller row each). |
| `categoryIds` | Walmart category ids, the last part of a category link (`3944_1060825_447913` for TVs). |
| `productIds` | Product ids, each read from its product page (`18211860309`; walmart.com.mx keeps its leading zeros; walmart.ca ids hold letters and digits). |
| `sellerIds` | walmart.com seller ids (`101174524`) or seller links, each read from its seller page as one seller row (see Seller rows); read on walmart.com only. |
| `market` | The site category ids and product ids are read on: United States (default), Canada or Mexico. |
| `language` | English (default) or French for walmart.ca category and product ids; a pasted walmart.ca link keeps its own. |
| `sort` | Walmart's orders: best match, price low to high, price high to low, best selling, highest rating, new arrivals. |
| `minPrice`, `maxPrice` | Walmart's price filter in whole dollars, checked again on every row as delivered (product ids and links too); a product without a price is left out free. |
| `brands`, `filters` | Brand names and any other filter of the page by Walmart's own labels (`Retailer: Walmart`, `Special Offers: Rollback`). A value Walmart does not list for the page is left out or a free status row, never a wider search. Brands are also checked on every row: a listing row by its brand when the tile carries one (most category tiles carry none) and else by the brand filter Walmart says it applied, a product id or link by the brand on its product page. Product ids and links cannot prove other filters: with `filters` or `storeId` set they are not read (one free status row). |
| `storeId` | A Walmart store number: only products available in that store. |
| `minRating` | Only products with at least this average rating, checked on every row (product ids, links and variants too); a product without a rating is left out free. |
| `includeSponsored` | Delivers sponsored placements (marked `isSponsored`) on a plain category page without filters, brands or store, when they belong to that category and pass every check; brand, keyword, department and shelf pages always skip them; off by default. |
| `maxItems`, `maxItemsPerInput` | Caps for the whole run (up to 100,000; seller rows count too) and per input (up to 50,000; a product id or link counts its variants in it); 100 each when left out. |
| `startPage`, `maxPagesPerInput` | The Walmart page a walk starts at (1 to 10) and the most pages one input reads. |
| `includeDetails`, `expandVariants` | Product details for listing rows (the row is then the product page's own, newer than the listing); each variant the product page names as its own product row, checked like every row (not on a listing page with **Other filters**, a non-brand facet in the link, or a store, which a variant cannot prove: `variantsStatus: not_offered_with_filters`; price bounds and brands do not stop them). On such a page, a product whose page no longer agrees with its listing on the seller, the availability, the price range or a badge is left out free and counted (`changedSinceListed`). |
| `maxReviewsPerProduct`, `reviewsSort`, `reviewsRatings`, `reviewsVerifiedOnly` | The Reviews add-on, its order, its stars and verified purchases only. Every review page must prove the order and filters sent: it shows the order sent; with a star filter alone its count is that star's own review count; with a star filter and verified purchases only its count is at most that star's review count and every row on it has that star (Walmart does not narrow its star counts to verified purchases); with verified purchases only every row on it carries the mark and its count is at most Walmart's written total (Walmart does not echo that filter). Else it is asked once more, then nothing of it is charged and the reviews are `partly_read` (`failed` when no review was delivered); every review row is still checked on its stars and verified mark. A product's reviews are `read` only when the distinct reviews delivered reach the count Walmart's pages state for every star asked, each read to its end (or **Reviews per product** was delivered); anything short of that is `partly_read` with a note naming why. |
| `includeSellerProfile` | The Seller profile add-on (a seller already charged in the run as a seller row rides free). |
| `includeFilterOptions` | One free row per listing input with every filter Walmart shows for it (with counts) and its sub categories. |
| `includeRawData` | Adds Walmart's own product object to each row. |
| `outputFields` | Keeps only the product row fields you name (plus `type`, `productId`, `market`, `url`, `source` and the add-on status fields); the `details` and `sellerProfile` a row is charged for are always kept. |
| `includePersonalData` | Adds the reviewer's Walmart user id (`authorId`) to review rows; off by default. |
| `proxyConfiguration`, `maxConcurrency`, `requestTimeoutSecs`, `maxRequestRetries` | Run settings; the defaults need no change. Left out, the proxy is Apify datacenter addresses, with a few residential addresses of the page's country when Walmart refuses datacenter ones (never for review pages). Choosing Apify residential proxies reads datacenter first: Walmart answers Apify datacenter exits; residential exits are used only when datacenter exits are refused, for at most 10 percent of reads, at least 2 reads a run (a note row and the summary say so). Your own proxy links (`http://user:password@host:port`; `https://` proxy links are refused) are used as given for every page and cost only the run's data transfer (USD 0.20 per GB both ways). |

Sorts, the price range, brands, other filters and the store number apply to walmart.com category, keyword and brand pages; on a walmart.ca, walmart.com.mx, department or shelf page that would need one, the input is not read and is listed by its position on one free status row per reason. A brand page (a `/c/brand/` page, or a category link whose path carries one brand) keeps its own brand: **Brands** given with it must name exactly that brand, else the link is a free status row ("this link is a brand page of onn; brands cannot be changed on it; use the category link"), since Walmart would list both brands. An input without any of `startUrls`, `categoryIds`, `productIds` and `sellerIds` (for example `{}`) reads a sample: the first 20 products of Walmart's TVs category (or **Max products in all**, when you set it), charged as products, with a note row saying so. One of them given as `null`, an empty text or an empty list, with nothing else to read, is an invalid input: one free status row, only the start fee.

Example input:

```json
{
    "startUrls": [{ "url": "https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913" }],
    "brands": ["Samsung"],
    "minPrice": 300,
    "maxPrice": 900,
    "sort": "best_seller",
    "maxItems": 200,
    "includeDetails": true
}
```

### What this Actor does NOT do

- It does not run Walmart's keyword search (`/search`): Walmart's robots.txt closes it to automated readers. A `/search` link is a free status row; Walmart's own keyword pages (`/c/kp/...`) are read.
- It does not set a ZIP code, state or store for prices: Walmart prices each page for the location of the address that reads it. On 2026-11-01 we tried every setter we found again, two or three times each, for two ZIP codes (72712 and 10001), on product and category pages: the link settings `stores`, `storeId`, `zipcode` and `postalCode`, the location cookies `assortmentStoreId`, `xptc`, `isoLoc`, `locGuestData` and `locDataV3` (alone and forged together), and Walmart's app product door, whose request carries no location; every page stayed priced at the reading address (Sacramento, CA 95829, store 3081 on Apify's default addresses), and Walmart's own location lookup answered with its waiting room. Each row states the location Walmart priced it at in `pricedAt`.
- It does not price walmart.ca for a postal code: Walmart Canada turns a postal code into its nearest stores only for a Canadian residential address (on Apify's default addresses that lookup answers with its waiting room), prices every page at the location of the reading address, and ignores a store forged for another place (2026-11-01, Toronto M5V 3L9 and Vancouver V6B 1A1).
- It does not name the seller of an offer in another condition (used, refurbished): those come in `details.conditionOffers` with their condition and price, and Walmart's page does not carry their seller. Every other seller's offer in the same condition is delivered in `details.otherOffers`. Walmart's page now and then counts other offers (`additionalOfferCount`) without listing them; `otherOffers` is then an empty list for that read (seen once in seven reads of one product in our tests).
- It does not list a seller's whole catalogue: a seller page carries the seller's profile and no product, and Walmart loads the seller's products only through its site search call, which robots.txt closes. Give the seller's product links or a category instead.
- It does not read sellers from a sitemap: Walmart publishes no seller sitemap (none of the sitemaps its robots.txt lists holds seller pages, and `sitemap_seller.xml`, `sitemap_slp.xml` and `sitemap_slp_1.xml` answer not found). Seller ids come from product rows (`sellerId`, `details.otherOffers`) or your own list.
- It does not read questions and answers: Walmart's product pages do not carry them.
- It does not give stock counts: Walmart's pages carry an availability code and text and, where shown, a low stock label, not a number of units.
- It does not read reviews or seller profiles on walmart.ca and walmart.com.mx: they are read on walmart.com, and other rows say so in `reviewsStatus` and `sellerProfileStatus`.
- It does not run your own code on the rows: **Output fields** picks the fields you keep instead.
- It does not track or compare prices, stock or new products between runs, and sends no alerts; schedule runs and compare their datasets yourself (each row carries `scrapedAt` and `pricedAt`).
- It does not log in, place orders or read anything behind a Walmart account.

### FAQ

#### Is there a Walmart product API I can use?

This Actor gives you Walmart's public product pages as an API on Apify, with no Walmart account or key: start a run with the input above and read the dataset as JSON, CSV or Excel, or connect it to Make, n8n or Zapier.

#### How do I scrape Walmart prices without coding?

Paste a Walmart category link or product ids in the input form, set how many products you want, and click Start. The dataset holds one row per product with price, was price, unit price, rating, availability and seller.

#### Can I get Walmart prices for a ZIP code or store?

Not by choice: Walmart prices each page for the location it gives the address that reads it and offers this Actor no way to change it. Every row says in `pricedAt` which ZIP code, city, state and store Walmart priced it at (in our runs of 2026-10-31 on Apify's default addresses, all 1,052 walmart.com rows were priced at Sacramento, CA 95829, store 3081). **Store number** limits a walmart.com walk to products available in that store.

#### How do I get a Walmart seller's contact details?

Give the seller's link (`https://www.walmart.com/seller/101174524`) in **Walmart links** or its id in **Seller ids**. Each seller comes back as one row with the e-mail, phone and address Walmart publishes on its seller page, its legal and display name, rating and review counts; one Seller profile is charged per seller per run. Product rows name their seller in `sellerId`, and `details.otherOffers` names every other seller of a product, so a category walk with **Product details** on is a way to find seller ids.

#### Can it scrape a whole Walmart category?

Yes. Give the category link or id and raise both **Max products per input** and **Max products in all** (100 each when left out, so raising one alone still stops at 100): past Walmart's 10 pages a walmart.com walk goes on in price bands, and the coverage row shows the products met next to Walmart's count.

#### How do I scrape Walmart reviews?

Set **Reviews per product** and give product ids, links or a category. Each walmart.com product brings its reviews as rows, in the order you pick, filtered by stars or verified purchases if you want. One Review is charged per review delivered.

#### Why does this Actor run with limited permissions?

It runs with limited permissions (least privilege): it can write only to its own run's dataset and key-value store and cannot read or change anything else in your Apify account.

### API

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~walmart-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"categoryIds": ["3944_1060825_447913"], "sort": "price_low", "maxItems": 50}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('automation_craft/walmart-scraper').call({ startUrls: [{ url: 'https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913' }], maxItems: 100, includeDetails: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'product').length);
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("automation_craft/walmart-scraper").call(run_input={"productIds": ["18211860309"], "maxReviewsPerProduct": 100})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["type"], item.get("name") or item.get("title"))
```

### Changelog

- 0.1: first release.

### More data tools by Automation Craft

- [Amazon Product Scraper - Search, Best Sellers](https://apify.com/automation_craft/amazon-data-scraper)
- [Etsy Scraper: Listings, Prices, Ads, Reviews](https://apify.com/automation_craft/etsy-scraper)
- [AliExpress Search Scraper - Products and Prices](https://apify.com/automation_craft/aliexpress-search-scraper)
- [Noon Scraper: Products, Prices, Sellers, Stock](https://apify.com/automation_craft/noon-scraper)
- [Coupang Scraper: Products, Prices, Rocket Delivery](https://apify.com/automation_craft/coupang-scraper)
- [Trendyol Scraper: Products, Prices, Reviews](https://apify.com/automation_craft/trendyol-scraper)
- [Flipkart Scraper: Products, Prices, Sellers](https://apify.com/automation_craft/flipkart-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/walmart-scraper/changelog.md

# Actor input Schema

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

Links copied from walmart.com, walmart.ca or walmart.com.mx: a category page (https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913, with its own page, sort, facet, min_price, max_price or stores settings), a keyword page (/c/kp/...), a brand page (/c/brand/... or a category filtered to one brand), a department or shelf page (/cp/..., /shop/..., the home page; page 1, every product tile), a product page (/ip/...) or a walmart.com seller page (https://www.walmart.com/seller/101174524, also the /global/seller/ form; one seller row each, as Seller ids below). Each link is read in its own market; seller links of walmart.ca or walmart.com.mx are not read (seller pages are read on walmart.com). Walmart search links (/search) are not read: robots.txt closes them. Other links are a free status row.

## `categoryIds` (type: `array`):

Walmart category ids, the last part of a category link (3944_1060825_447913 for TVs), read in the market below.

## `productIds` (type: `array`):

Product ids, in the market below: the number at the end of a product link (18211860309; walmart.com.mx keeps its leading zeros; walmart.ca ids hold letters and digits). Each is read from its product page and checked against the price range, brands and minimum rating. Ids Walmart does not know, or no longer sells, are counted on one free status row (one per reason), which lists their input positions, never the ids.

## `sellerIds` (type: `array`):

walmart.com Marketplace seller ids, the number at the end of a seller link (101174524 in walmart.com/seller/101174524), or the seller links themselves. Each is read from its public seller page and delivered as one seller row (type seller): display and legal name, e-mail, phone, address, about text, rating and review count, logo, badge and the visibility marks Walmart serves. One Seller profile is charged per seller per run, while a seller page is read once per seller per run attempt (a seller row with Raw data on reads its own page, a seller row reads it again when an earlier read of that seller failed, and a restarted run reads it again): a seller already charged in the run through the Seller profile add-on of a product is delivered free, and a product of a seller charged here carries its profile free. Ids Walmart does not know are counted on one free status row, which lists their input positions, never the ids. Read on walmart.com only (leave Market out or set it to United States).

## `market` (type: `string`):

The site category ids and product ids are read on. Left out: walmart.com. A pasted link carries its own site.

## `language` (type: `string`):

The language walmart.ca pages are read in for category ids and product ids. Left out: English. A pasted walmart.ca link keeps its own.

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

Walmart's own orders. Left out: a link's own order, else best match.

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

Only products at or above this price, in whole dollars (Walmart's own price filter, checked again on every row).

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

Only products at or below this price, in whole dollars (Walmart's own price filter, checked again on every row).

## `brands` (type: `array`):

Brand names as Walmart lists them in the page's Brand filter (Samsung, TCL). A name Walmart does not list for the page is left out; when none is listed, the page is a free status row, never a wider search. On a brand page (a /c/brand/ page or a category link whose path carries one brand), the brands must be exactly that page's own brand, else the link is a free status row: use the category link to choose other brands.

## `filters` (type: `array`):

Any other filter of the page by Walmart's own labels, one "<filter name>: <value>" per line (Retailer: Walmart, Special Offers: Rollback). A filter or value Walmart does not list for the page is a free status row (or left out beside listed values).

## `storeId` (type: `string`):

A Walmart store number (digits, as in walmart.com/store/3081): only products available in that store (Walmart's In-store filter).

## `minRating` (type: `number`):

Only products with at least this average rating (1 to 5, one decimal), checked on every row; a product without a rating is left out free.

## `includeSponsored` (type: `boolean`):

Sponsored placements are skipped free and counted by default. On: delivered (marked isSponsored) only on a plain category page (a /browse/ category or a category id) without filters, brands or store, when the product's own category path holds that category and every check passes. Brand, keyword, department and shelf pages always skip them free.

## `maxItems` (type: `integer`):

The most products and seller rows the run delivers across every input (up to 100,000; it also bounds the run's memory). Left out: 100.

## `maxItemsPerInput` (type: `integer`):

The most products each link, category or product id delivers (up to 50,000), its variants included. Left out: 100. Past Walmart's 10 pages (about 400 products) a walmart.com walk goes on in closed price bands in Walmart's best match order, a band stating more than 400 split in two, until every band is read or a cap is reached.

## `startPage` (type: `integer`):

Walmart's result page each listing walk starts at (1 to 10). Left out: a link's own page, else page 1.

## `maxPagesPerInput` (type: `integer`):

The most Walmart result pages one listing input reads, its price bands included. Left out: no page limit (the product limits and Walmart's depth decide).

## `includeDetails` (type: `boolean`):

Reads each delivered product's page (a Product details event each): description and specifications as served, UPC, model, manufacturer part number, every image and video, variants with their own ids, fulfillment options with dates, return policy, warranty, add-on services with prices, every other seller's offer with its seller, price and rating (otherOffers), offers per condition, offer counts, review totals and the location Walmart priced at. Rows from product links and ids always carry it. On a listing page with filters (other than brands) or a store, a product whose page no longer agrees with its listing on the seller, the availability, the price range or a badge is left out free and counted (changedSinceListed).

## `expandVariants` (type: `boolean`):

With a product page read, each variant the page names with its own id (another size or colour) becomes its own product row (a Product each), checked like every row and counted in Max products per input; a variant whose price the page does not carry is read from its own page. On a listing page with Other filters, a non-brand facet in the link, or a Store number, variants are not expanded (a variant cannot prove them; the coverage row says so). Price bounds and brands do not stop them.

## `maxReviewsPerProduct` (type: `integer`):

walmart.com reviews of each delivered product (a Review each), up to 10,000 per order and star filter. Left out or 0: no reviews.

## `reviewsSort` (type: `string`):

Walmart's own review orders. Left out: most relevant. A review page must prove the order and filters sent (it shows the order sent, its count is the star's own review count, or at most that count with Verified purchases only, every row is a verified purchase when asked); one that does not is asked once more, then nothing of it is charged and the product's reviews are marked partly read (failed when none was delivered).

## `reviewsRatings` (type: `array`):

Only reviews with these star ratings (Walmart's own star filter, one pass per rating; a page whose count is not that star's review count bills nothing; with Verified purchases only, a page whose count is above that star's review count or that holds a review of another star bills nothing; every review row is checked again, and one with other stars is left out free).

## `reviewsVerifiedOnly` (type: `boolean`):

Only reviews Walmart marks as verified purchases (Walmart's own filter, which it does not echo: a page holding any review without the mark, or stating more reviews than Walmart's written total, proves the filter was ignored, so nothing of it is charged and the product's reviews are marked partly read, or failed when none was delivered).

## `includeSellerProfile` (type: `boolean`):

For marketplace sellers on walmart.com: the seller's public page, on every delivered product of that seller (charged once per seller per run, the Seller profile event on the first delivered product of that seller; the page is read once per seller per run attempt, except that a seller row with Raw data on reads its own page, a seller row reads it again when an earlier read of that seller failed, and a restarted run reads it again; a seller already charged in the run as a seller row from Seller ids or a seller link rides free): display and legal name, e-mail, phone, address, about text, rating and review count, and whether Walmart shows a seller badge. Products sold by Walmart itself carry none.

## `includeFilterOptions` (type: `boolean`):

Adds one free row per listing input with every filter and value Walmart shows for the page (with counts) and its sub categories: the labels Brands and Other filters take.

## `includeRawData` (type: `boolean`):

Adds Walmart's own product object to each row as served (larger rows).

## `outputFields` (type: `array`):

Only these product row fields (for example name, price, rating); the type, productId, market, url, source and the add-on status fields are always kept, and so are the Product details and the Seller profile a row is charged for. Left out: every field.

## `includePersonalData` (type: `boolean`):

Off by default. On: review rows also carry the reviewer's Walmart user id (authorId) where Walmart shows it (the nickname is always delivered as the review's author). You are responsible for a lawful use of personal data, GDPR included.

## `proxyConfiguration` (type: `object`):

Left out: Apify datacenter addresses, a fresh one for every page, and a few residential addresses of the page's country when Walmart refuses datacenter ones (never for review pages). Choosing Apify residential reads the same way: Walmart answers Apify datacenter exits; residential exits are used only when datacenter exits are refused, for at most 10 percent of reads, at least 2 reads a run (in the country you pick, else the page's country), and the run says so in a note row and its summary. Your own proxy links (http://user:password@host:port; https:// proxy links are refused) are used as given for every page, in turn (a password of at least 8 characters with letters and digits); Apify does not bill proxy traffic for them, so their pages cost only the run's data transfer, USD 0.20 per GB both ways.

## `maxConcurrency` (type: `integer`):

Pages read at once (a listing page counts two). Left out: 4.

## `requestTimeoutSecs` (type: `integer`):

How long one page read may take. Left out: 30.

## `maxRequestRetries` (type: `integer`):

Attempts of a page that failed (a server error or no answer), each on a fresh address. Left out: 3. Refused addresses are replaced on top of these.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913"
    }
  ],
  "maxItems": 20
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/walmart-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913" }],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/walmart-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.walmart.com/browse/electronics/tvs/3944_1060825_447913"
    }
  ],
  "maxItems": 20
}' |
apify call automation_craft/walmart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/walmart-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eNULYtHXKgPUNhrvu/builds/Efd6d33RM6alDm6rl/openapi.json
