How-tos

Walmart Marketplace seller analysis with retailerapi: a 2026 sourcing playbook

How to use retailerapi to vet a Walmart Marketplace category in 30 minutes: pull seller profiles, identify buy-box owners, see seller-vs-seller pricing, and find sourcing opportunities Keepa can't.

By Matt Hall··4 min read

If you sell on Walmart Marketplace in 2026 and you don't have a programmatic seller-and-pricing-data layer, you are reading 30 to 50 product pages a day by hand. This is the workflow most active sellers actually run, and it's the workflow retailerapi was built to replace.

This post walks through one specific exercise: vetting a Walmart Marketplace category for sourcing opportunities in about 30 minutes using retailerapi. Real script, real numbers, real category (cordless power tools, because that's where the buy-box volatility is highest right now).

What you need

  • A retailerapi API key (sign up free, 1,000 tokens covers this exercise)
  • A list of 50 to 100 candidate UPCs in your target category (sourced from a wholesaler list, a competitor scrape, or your own historical data)
  • Node 20+ for the example script

The 5-step playbook

Step 1: Bulk-lookup current state across your candidate list

import { createClient } from '@retailerapi/sdk';

const client = createClient({ apiKey: process.env.RETAILERAPI_KEY });

const candidates = [
  '194629116676', '728028502244', '987010977', '19667262713',
  // ... your 50 to 100 UPCs
];

const results = await Promise.all(
  candidates.map(upc =>
    client.products.lookup({
      identifier: upc,
      include_cross_retailer: true,
    })
  )
);

For 100 UPCs with include_cross_retailer=true, expect 800 to 1,000 tokens consumed. About $0.30 to $0.40 of credits at the entry tier.

Step 2: Filter to candidates with seller-volatility signal

You want products where the buy-box recently changed hands or where the spread between sellers is wide. These are the products most likely to have a sourcing opportunity for a new seller (you).

const candidates_with_signal = results.filter(p => {
  const offers = p.offers || [];
  if (offers.length < 3) return false;  // need real seller competition
  const prices = offers.map(o => o.price).filter(Boolean);
  const spread = (Math.max(...prices) - Math.min(...prices)) / Math.min(...prices);
  return spread > 0.15;  // 15%+ spread between cheapest and priciest
});

In a typical 100-UPC sample of cordless power tools, about 22 to 30 products meet this filter. That's your shortlist for deeper investigation.

Step 3: Pull seller profiles for the buy-box owners

For each shortlisted product, get the seller's profile. High-volume, recently-active sellers are your real competition; low-volume hobby sellers are evidence the category is open.

const seller_ids = new Set(
  shortlist.flatMap(p => p.offers.map(o => o.seller_id))
);

const seller_profiles = await Promise.all(
  Array.from(seller_ids).map(id => client.sellers.get(id))
);

The retailerapi response includes seller name, listing count, average rating, account-age, and recent activity. A seller with 50,000 active listings, 4.6-star rating, and 3-year account is a Tier 1 competitor. A seller with 47 listings and a 3-month account is evidence the SKU is undersold.

Step 4: Pull price history on the top 10 candidates

const histories = await Promise.all(
  shortlist.slice(0, 10).map(p =>
    client.products.priceHistory({
      identifier: p.item_id,
      timeframe: '90d',
      retailer: 'walmart',
    })
  )
);

For each product, compute the 90-day low, the 90-day average, and the volatility (standard deviation / mean). Volatility above 20% means active price competition; volatility under 5% means the buy-box owner has stable control and breaking in is hard.

Step 5: Cross-retailer arbitrage check

For the products that pass steps 1 to 4, check if the same UPC is materially cheaper at Lowe's, Home Depot, or Amazon. If yes, you have a retail-arbitrage opportunity. If no, you need a wholesale source.

const arbitrage_candidates = shortlist.map(p => {
  const walmart_price = p.current_price;
  const others = (p.cross_retailer || [])
    .filter(c => c.status === 'ok' && c.price)
    .sort((a, b) => a.price - b.price);
  const cheapest_other = others[0];
  if (!cheapest_other) return null;
  const margin = walmart_price - cheapest_other.price;
  if (margin / walmart_price < 0.10) return null;  // 10%+ margin minimum
  return {
    upc: p.queried_identifier,
    title: p.title,
    walmart_price,
    cheapest_retailer: cheapest_other.retailer,
    cheapest_price: cheapest_other.price,
    gross_margin: margin,
    margin_pct: margin / walmart_price,
  };
}).filter(Boolean);

In our cordless power tools sample, this filter typically surfaces 5 to 8 products with 10%+ margin between Walmart and the cheapest non-Walmart retailer. Net of Walmart's 6% to 15% category fee and shipping, you're looking at 1 to 4 products with real arbitrage potential.

What this exercise reveals

After running the playbook on a 100-UPC list, you have:

  • A clean shortlist of 5 to 10 sourcing candidates with concrete margin numbers
  • Profiles of the actual buy-box-owner competition for each
  • 90-day price history showing whether the category is stable or volatile
  • Cross-retailer arbitrage signals that Keepa cannot give you

Total time: 30 minutes (most of it the script run, which is parallelizable).

Total token spend: ~1,500 tokens. That's free-tier territory.

What the manual workflow costs

Doing this by hand: open 100 Walmart product pages, hand-record 100 buy-box owners, click through to 100 seller profiles, copy/paste history if it's available (it's not, on Walmart), then re-do the same on Amazon, Lowe's, Home Depot, Target. About 15 to 25 hours of clicking. Most active sellers I know spend their evenings doing exactly this.

The script

A working version of this playbook lives at github.com/retailerapi/playbooks (will be public when the repo opens). About 80 lines of TypeScript.

Things to add to the playbook

If you're going beyond a single category vet:

  1. Schedule it nightly with GitHub Actions or Vercel Cron. New shortlist every morning.
  2. Push high-margin signals to Slack via incoming webhook. You see them while you're drinking coffee.
  3. Cross-reference against your active seller account (via Walmart's Seller API) to suppress products you already list.
  4. Layer in EC's wholesale-supplier feeds if you're a EC subscriber, so the cross-retailer check also evaluates your wholesale cost.

Try it on your category

Sign up free and run the playbook on your own UPC list. The MCP server (@retailerapi/mcp) makes it work inside Claude Code or Cursor too: pass your UPC list to Claude with the prompt "Run the Walmart sourcing playbook on these UPCs and report the top 10 candidates" and the agent will execute the steps for you.

If you're an EC subscriber, contact us about the wholesale-cost integration. It's a free upgrade for active EC accounts.


Free account

Build with retailerapi

1,000 free lookups per month, no credit card. Cross-retailer price and history across every major US retailer that carries the product.