How do you scrape Walmart products via API without getting blocked?
Call ReefAPI's walmart search action with a query and read item ids, prices, ratings, sellers and availability back as JSON, then use product_detail for brand, specifications, UPC and seller identity. The trap is that the search card and the product page disagree about who the seller is, and both are telling the truth.
This guide demonstrates the real Walmart API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.
Price monitoring, retail analytics, catalog enrichment and competitive research.
Call the live endpoint
- 1
Search with sort and price bounds
walmart/v1/search takes query plus sort, min_price, max_price, page and facet. Sorting by price surfaces marketplace sellers first, which is a fact about the inventory, not a bug.
- 2
Check who is selling before you compare prices
seller 'Walmart.com' is first-party; anything else is a marketplace merchant. Key on seller_id, because the display name differs between search and detail for the same seller.
- 3
Call product_detail for brand and identifiers
brand, upc, manufacturer_part_number, model, specifications and seller_rating exist only there. item_id from search is the input.
- 4
Read the three pagination numbers together
total is the corpus, max_page is Walmart's grid depth, page_ceiling is our cap. The smallest one binds, and stop_reason names it.
- 5
Guard against placeholder zeros
min_price 0.0 means 'no variant range', not 'free'. list_price and savings_amount are properly null when absent, so those two you can test normally.
Copy the request
These snippets use the captured request params for walmart/v1/search.
curl -X POST https://api.reefapi.com/walmart/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"laptop"}'import requests
r = requests.post(
"https://api.reefapi.com/walmart/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "laptop"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/walmart/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "laptop"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.walmart.search with {"query":"laptop"}.Captured output from ReefAPI
Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.
{
"method": "POST",
"url": "https://api.reefapi.com/walmart/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "laptop"
}
}{
"ok": true,
"meta": {
"api": "walmart",
"endpoint": "search",
"mode": "live",
"latency_ms": 4673,
"record_count": 43,
"bytes": 1432207,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "limit_reached",
"currency": "USD",
"total": 19624,
"count": 43,
"page": 1,
"max_page": 13,
"query": "laptop",
"field_coverage": {
"rows": 43,
"price": 43,
"brand": 0,
"note": "Walmart publishes `brand` on the whole search grid or on none of it. This grid published it on none — the value is absent from Walmart's own payload here, not dropped; use product_detail, which carries brand on every product."
},
"charged_credits": 2,
"version": "1.1.0"
},
"data": {
"results": [
{
"item_id": "18221467595",
"name": "Lenovo IdeaPad 5i 15.3\" Touchscreen 2-in-1 Laptop, Intel Core Ultra 5, 16GB Ram, 512GB SSD, Luna Grey - 3 Months of Microsoft 365 Personal included",
"brand": null,
"type": "REGULAR",
"url": "https://www.walmart.com/ip/Lenovo-IdeaPad-5i-2-in-1-15-Laptop-Touchscreen-Intel-Ultra-5-16GB-RAM-512GB-SSD-Luna-Grey/18221467595?classType=REGULAR&athbdg=L1300",
"price": 729,
"list_price": 879,
"savings_amount": null,
"price_display": "$729.00 - $790.00",
"currency": "USD",
"rating": 4.3,
"review_count": 40,
"availability": "IN_STOCK",
"seller": "Walmart.com",
"category": null,
"image": "https://i5.walmartimages.com/seo/Lenovo-IdeaPad-5i-2-in-1-15-Laptop-Touchscreen-Intel-Ultra-5-16GB-RAM-512GB-SSD-Luna-Grey_35ffcfba-2176-4a1a-943e-5e76a19456c9.07d8442f28ddafcdbb1b8eaaa50f218c.jpeg?odnHeight=180&odnWidth=180&odnBg=FFFFFF",
"sponsored": true,
"availability_display": "In stock",
"in_stock": true,
"seller_id": "F55CDC31AB754BB68FE0B39041159D63",
"savings_display": null,
"price_range": "$729.00 - $790.00",
"min_price": 729,
"max_price": 790,
"badge": "Rollback",
"fulfillment": {
"methods": [
"[trimmed-depth]",
"[trimmed-depth]"
],
"earliest_date": "2026-09-23T23:37:08.298Z"
},
"variant_count": null,
"class_type": "REGULAR"
},
{
"item_id": "19978269940",
"name": "Pryloxen 15.6\" Student & Business Laptop, AMD Ryzen 3 3250C, 16GB RAM 512GB SSD, Windows 11 Pro, Backlit Keyboard, Fingerprint Unlock, Silver",
"brand": null,
"type": "REGULAR",
"url": "https://www.walmart.com/ip/Pryloxen-Laptop-Windows-11-Pro-15-6-AMD-Ryzen-3-3250C-CPU-Home-Computer-16GB-RAM-512GB-SSD-silver/19978269940?classType=REGULAR&athbdg=L1700",
"price": 419.99,
"list_price": 529.99,
"savings_amount": null,
"price_display": "$419.99",
"currency": "USD",
"rating": 4.3,
"review_count": 4,
"availability": "IN_STOCK",
"seller": "Kutoda Laptops",
"category": null,
"image": "https://i5.walmartimages.com/seo/Pryloxen-Laptop-Windows-11-Pro-15-6-AMD-Ryzen-3-3250C-CPU-Home-Computer-16GB-RAM-512GB-SSD-silver_62905f82-fee1-4a78-9697-ce0d46628dab.a62fdb919ee856964e65216ed0ee88b7.png?odnHeight=180&odnWidth=180&odnBg=FFFFFF",
"sponsored": true,
"availability_display": "In stock",
"in_stock": true,
"seller_id": "31BF982D48F34A2588BF2EFB04BCDB9D",
"savings_display": null,
"price_range": null,
"min_price": null,
"max_price": null,
"badge": "Reduced price",
"fulfillment": {
"methods": [
"[trimmed-depth]"
],
"earliest_date": "2026-09-25T21:59:00.000Z"
},
"variant_count": null,
"class_type": "REGULAR"
},
{
"item_id": "5322758134",
"name": "Lenovo IdeaPad 5a 2-in-1 15\" Laptop, Touchscreen, AMD Ryzen AI 7 445, 16GB RAM, 1TB SSD, Luna Grey - 3 Months of Microsoft 365 Personal included",
"brand": null,
"type": "REGULAR",
"url": "https://www.walmart.com/ip/GOSMITH-Set-of-Music-Theme-Pillow-Covers-Words-Print-Life-Would-Be-A-Mistake-Without-Music-Home-Decorative-Pillows-Cases/5322758134?classType=REGULAR&athbdg=L1300",
"price": 849,
"list_price": 999,
"savings_amount": null,
"price_display": "$849.00",
"currency": "USD",
"rating": 4.4,
"review_count": 34,
"availability": "IN_STOCK",
"seller": "Walmart.com",
"category": null,
"image": "https://i5.walmartimages.com/seo/GOSMITH-Set-of-Music-Theme-Pillow-Covers-Words-Print-Life-Would-Be-A-Mistake-Without-Music-Home-Decorative-Pillows-Cases_b92d6382-a198-41e5-9cbd-f1484a8d8cab.092e97765c2da67c527ec66a76172d06.jpeg?odnHeight=180&odnWidth=180&odnBg=FFFFFF",
"sponsored": true,
"availability_display": "In stock",
"in_stock": true,
"seller_id": "F55CDC31AB754BB68FE0B39041159D63",
"savings_display": null,
"price_range": null,
"min_price": null,
"max_price": null,
"badge": "Rollback",
"fulfillment": {
"methods": [
"[trimmed-depth]",
"[trimmed-depth]"
],
"earliest_date": "2026-09-23T23:37:08.323Z"
},
"variant_count": null,
"class_type": "REGULAR"
}
],
"total": 19624,
"count": 43,
"page": 1,
"max_page": 13,
"related_searches": [
{
"query": "laptop computers under $200",
"url": "https://www.walmart.com/search?q=laptop%20computers%20under%20%24200&searchMethod=relatedSearch"
},
{
"query": "hp laptop",
"url": "https://www.walmart.com/search?q=hp%20laptop&searchMethod=relatedSearch"
},
{
"query": "macbook",
"url": "https://www.walmart.com/search?q=macbook&searchMethod=relatedSearch"
}
],
"corrected_query": null
}
}Why this is hard manually
Walmart.com is two marketplaces in one skin, and the search grid does not tell you which one you are looking at. Sorting our 'wireless earbuds' query by price returned ten results of which eight were third-party marketplace sellers and two were Walmart.com itself. If your competitive analysis assumes 'Walmart's price', eight of those ten rows are somebody else's price on Walmart's shelf.
It gets subtler. We pulled item 17329464759 from search and again from product detail. Same item, same seller_id (CCE6F4E0DCBC456EADD7E94A197DBF8E), two different seller names: 'Tanuse store' on the search card and 'GuangZhouShiEnHaoShanMaoYiYouXianGongSi' on the product page. The storefront display name and the registered entity name are different fields on Walmart's side, and a pipeline that keys on the seller name will treat one merchant as two.
The third thing worth knowing before you scope a project: a search that reports 23,350 results will not give you 23,350 rows. Walmart caps how deep the grid goes, and the response says so in max_page and page_ceiling. The big number is a corpus size, not a retrieval promise.
Why ReefAPI solves it
seller_id is the field to key on. It was identical across search and detail for the same item while the seller name differed, so it is the only stable merchant identity in the response. product_detail also carries seller_rating and seller_review_count, which is what you actually want for judging a marketplace listing.
brand is null on search results and populated on detail. This is not intermittent - it was null on all ten of our search rows, and product_detail on one of those same items returned brand 'Ikeay' with model 'Ikeay-KDXB103'. If brand matters to your analysis, budget a detail call per item rather than hoping search will fill it in.
One of our own warts, stated plainly: min_price comes back as 0.0 rather than null when a product has no variant price range. It read 0.0 on nine of ten rows, and 2.17 on the one row that had a real range (price_range 'Options from $2.17 - $2.45'). Treat 0.0 there as absent. Branch on price_range being non-null, not on min_price being non-zero.
list_price and savings_amount are properly null when there is no comparison price - five of our ten results had no list_price and therefore no savings. On the rows that did have one the arithmetic held: price 3.04, list_price 6.64, savings_amount 3.60. That is worth checking on any marketplace, because an inflated comparison price is the oldest trick in retail and it produces discount percentages that are technically computed and completely fake.
The pagination fields disagree with each other on purpose. Our search reported total 23,350, max_page 13 and page_ceiling 10 in the same response: total is Walmart's own result count, max_page is how far its grid goes for that query, and page_ceiling is our own cap. The binding constraint is the smallest of the three, and stop_reason ('limit_reached') tells you which one stopped the run. Plan a full-category sweep around narrow queries and category browsing, not around deep pagination of a broad one.
product_detail returns about forty fields, including the ones that make a catalog joinable: upc, manufacturer_part_number, model, product_type_id, category_path and brand_url, plus specifications as clean name/value pairs (16 on our test item), long_description as HTML, images, variant_ids and variant_criteria, condition, is_preowned, order_limit, return_policy, warranty, ingredients and warnings. manufacturer was null while brand was populated - on marketplace listings those are often the same company and Walmart only asks for one.
Two smaller observations from the live data. related_searches is not a synonym list - for 'wireless earbuds' it returned 'open ear earbuds' alongside 'laptop monitor extender' and '67xl ink cartridges', so treat it as a merchandising module rather than as query expansion. And product titles on marketplace listings frequently carry promotional prefixes ('Up to 65% off!Wireless Earbuds, Bluetooth 5.3...') that need stripping before any title-matching. Search answered in about 4.5 seconds, detail in about 9.0.
Questions developers ask
Why does the same item have two different seller names?
Because Walmart stores a storefront display name and a registered entity name separately. We saw 'Tanuse store' on the search card and 'GuangZhouShiEnHaoShanMaoYiYouXianGongSi' on the product page for item 17329464759, with an identical seller_id on both. Key on seller_id.
Why is brand null in search results?
Walmart's search cards do not carry it. It was null on all ten of our results while product_detail returned 'Ikeay' for one of those same items. Brand needs a detail call.
min_price says 0.0 but the product costs money. Is that a bug?
It is a placeholder we emit when a product has no variant price range, and yes, null would have been the better choice. Nine of our ten rows read 0.0 with price_range null; the one row with a real range read 2.17 with price_range 'Options from $2.17 - $2.45'. Test price_range, not min_price.
The search says 23,350 results. Can I retrieve them all?
No. The same response reported max_page 13 and page_ceiling 10. total is Walmart's count of matching products, not a retrievable set. Use narrower queries or the category action for coverage rather than deep pagination.
Can I trust the discount percentage?
Compute it yourself and sanity-check it. Where list_price existed the arithmetic was consistent (6.64 minus 3.04 equals savings_amount 3.60), but five of ten rows had no list_price at all, and an inflated comparison price is a common marketplace tactic. A discount off a price nobody ever paid is not a discount.
What is in related_searches?
Walmart's merchandising suggestions, which are only loosely related. Our 'wireless earbuds' search returned 'open ear earbuds' but also 'laptop monitor extender' and '67xl ink cartridges'. Do not use it for query expansion.
Does a failed or blocked call cost anything?
No. Failed calls are never charged, and rejected parameters are rejected before any fetch happens.