Web Scraping Layers for AI & Automation

back to blog

How to scrape Walmart, Wayfair, and Target for price intelligence

ParseBird·09 Sep 2026

Key Takeaways

Why do these scrapers not need a headless browser? Walmart, Wayfair, and Target all load their product listings from embedded JSON baked into the page, the same data their own React/Next.js frontends render from — reading that JSON directly is faster and more reliable than rendering the page and parsing visible text.

Can you track price history over time, or only a current snapshot? Only a snapshot per run — none of the three actors store history themselves. Price history comes from running the same query on a schedule and appending each run's results to your own database, keyed by the stable product ID (usItemId, sku, or tcin).

Do "was" prices reliably indicate a real discount? Not always — a wasPrice/previousPrice/reg_retail field reflects what the retailer displays as the pre-discount price, which retailers sometimes set artificially high. Treat it as a retailer's own claim, not verified market value.

Three Retailers, One Extraction Pattern

RetailerActorStable product key
WalmartWalmart Product ScraperusItemId
WayfairWayfair Scrapersku
TargetTarget Product Scrapertcin

All three follow the same shape: search by keyword or paste product URLs, get current price plus a pre-discount reference price, rating, and review count, and page automatically through search results up to each retailer's own result ceiling (~1,000 products per keyword on Walmart and Target).

Walmart: Deal Badges and Fulfillment

The Walmart Product Scraper returns Walmart's own deal badge alongside the price:

{
  "usItemId": "5028313570",
  "name": "HP 15.6\" Laptop, Intel Core i5",
  "price": 379.0,
  "wasPrice": 449.0,
  "savings": "SAVE $70.00",
  "onSale": true,
  "rating": 4.3,
  "reviewCount": 1204,
  "seller": "Walmart.com",
  "flag": "Rollback",
  "isSponsored": false
}

flag carries Walmart's own merchandising label (Rollback, Best seller, Clearance, 100+ bought since yesterday) — a useful signal for spotting which SKUs Walmart itself is actively pushing, separate from your own price-tracking logic. seller distinguishes Walmart-fulfilled inventory from third-party marketplace sellers, which matters if you only care about Walmart's own pricing decisions rather than marketplace resellers.

Wayfair: Four Storefronts, Five Input Modes

The Wayfair Scraper is the only one of the three covering multiple regional storefronts — wayfair.com, .ca, .co.uk, and .ie — each with its own currency:

{
  "sku": "W118077895",
  "title": "Latitude Run Sectional Sofa",
  "brand": "Latitude Run",
  "price": 689.99,
  "previousPrice": 899.99,
  "currency": "USD",
  "ratingValue": 4.5,
  "reviewCount": 342,
  "promoFlag": "Labor Day Deal",
  "percentOff": 23
}

Five input modes cover different starting points: search (keyword), byUrl (paste any Wayfair URL — type and storefront auto-detected), byCategory, byBrand, and byProduct (direct SKU lookup, e.g. W118077895). Set fetchProductDetails: true to enrich each listing with a full description, breadcrumbs, and category — off by default, since it costs one extra request per product.

Target: Sponsored Filtering and Marketplace Flag

The Target Product Scraper exposes an is_sponsored flag directly, which matters more here than on the other two — Target's search results mix a meaningful share of paid placements with organic ranking:

{
  "tcin": "87654321",
  "title": "Keurig K-Classic Coffee Maker",
  "brand": "Keurig",
  "current_retail": 79.99,
  "reg_retail": 99.99,
  "save_percent": 20,
  "rating_average": 4.6,
  "rating_count": 3821,
  "is_marketplace": false,
  "is_sponsored": false
}

include_sponsored: false drops paid placements entirely, useful when the goal is reading Target's actual organic ranking and pricing rather than what advertisers paid to surface. is_marketplace separates Target-sold inventory from Target Plus marketplace sellers, the same distinction Walmart's seller field makes.

Combining Into a Cross-Retailer Price Check

async function comparePrice(productName) {
  const [walmart, wayfair, target] = await Promise.all([
    runActor("walmart-product-scraper", { searchQueries: [productName], maxProductsPerSearch: 5 }),
    runActor("wayfair-scraper", { mode: "search", text: productName, maxItems: 5 }),
    runActor("target-product-scraper", { keyword: productName, results_wanted: 5 }),
  ]);

  return {
    walmart: walmart[0]?.price,
    wayfair: wayfair[0]?.price,
    target: target[0]?.current_retail,
  };
}

This same three-retailer pattern extends the sold-price/supplier-cost/own-price triangle from Monitoring Competitor Prices Across eBay, 1688, and Your Own Shopify Catalog — Walmart, Wayfair, and Target add three more listed-price data points to weigh against actual sold prices and your own cost basis.

FAQ

Do these need a login or Walmart/Wayfair/Target account? No — all three read public search and product pages, no account or API key from the retailer required.

How do you match the same physical product across all three retailers? There's no shared identifier across retailers (each uses its own usItemId/sku/tcin), so matching has to go by brand + model number or UPC pulled from the title/description — an exact-name match on name/title is a reasonable first pass for branded electronics and appliances where titles are standardized.

Browse the e-commerce actor category for more retail data sources.