Scrape Yahoo Shopping Data (Python + API)

By Serpent API Team · · 9 min read

Yahoo Shopping product data — title, merchant, price, currency, URL, thumbnail, and a sponsored flag — comes back as clean JSON through a shopping API. There is no official Yahoo Shopping search API, so the practical path for a Python script is a shopping API that returns the product rail as structured data.

This guide shows you exactly how, with a tested Python example, the real response shape, and the honest limits you'll hit (Yahoo does not return everything a Google Shopping scraper would).

TL;DR: Yahoo exposes no public API for its Shopping search results, and every listing in the rail is an affiliate placement. The fastest reliable way to scrape Yahoo Shopping in Python is one HTTPS call to the Yahoo Shopping API with an X-API-Key header, then parse results.shopping. Below is the exact script, tested against the live endpoint.

Table of Contents

Why scrape Yahoo Shopping at all

Google Shopping gets nearly all the attention. Every SERP provider, scraper library, and tutorial covers Google Shopping prices. Yahoo Shopping is the quieter sibling — and that is exactly why it is worth a look.

Fewer people track it means less competition for the data you collect. If you run a price-monitoring or price intelligence workflow, adding a second product source gives you a cross-market check on what a shopper actually sees on another engine. That cross-engine view is the whole idea behind our Google vs Yahoo price comparison workflow.

Yahoo Shopping also surfaces real merchants — Macy's, Best Buy, Fleet Feet, Foot Locker, Walmart — with real prices, which makes it a genuine complement to a Google Shopping feed rather than a low-quality mirror.

What Yahoo actually exposes

First, the honest picture. Yahoo does not have a public API for reading Shopping search results. Its product search returns a compact rail of listings, and those listings are affiliate placements — Yahoo earns a cut when a shopper clicks through. That means two practical consequences for a scraper:

Those aren't bugs in an API — they are properties of the source. Any tool that scrapes Yahoo Shopping runs into the same ceiling, because the page itself only shows that much.

The fields the API returns

The Yahoo Shopping API returns each product with the fields below. Here is one real item from a live sony headphones query (August 4, 2026):

{
  "position": 2,
  "title": "Sony WF-1000XM6",
  "price": "$299.99",
  "extractedPrice": 299.99,
  "currency": "USD",
  "merchant": "Best Buy",
  "store": "Best Buy",
  "url": "https://www.bestbuy.com/product/sony-wf1000xm6-...",
  "thumbnail": "https://img.example.com/products/wf1000xm6.jpg",
  "rating": null,
  "reviews": null,
  "sponsored": true,
  "snippet": "These earbuds are ideal for users seeking a premium audio experience..."
}
FieldWhat it is
position1-based slot in the Yahoo rail.
titleProduct name.
priceDisplayed price as text, e.g. $299.99. May be null — see limits below.
extractedPriceThe same price as a number, ready for math. Present only when a price is.
currencyISO currency code, e.g. USD. Our API keeps this as a separate field.
merchant / storeSeller name, e.g. Best Buy.
urlDirect product URL on the merchant's site.
thumbnailProduct image.
rating / reviewsReview score and count when Yahoo shows them (often null).
sponsoredtrue when the listing is a paid placement.
snippetA short product description.

Working Python: one call to a product table

Here is a complete, runnable script. It queries Yahoo Shopping, prints a table, and handles the two things that trip people up: missing prices and the short result list.

Replace sk_live_your_key with your key from the dashboard. Authentication is the X-API-Key header.

import requests

API_KEY = "sk_live_your_key"
BASE_URL = "https://apiserpent.com/api/shopping"

def yahoo_shopping(query, num=10):
    resp = requests.get(
        BASE_URL,
        params={"q": query, "engine": "yahoo", "num": num},
        headers={"X-API-Key": API_KEY},
        timeout=60,
    )
    resp.raise_for_status()
    return resp.json()["results"]["shopping"]

def money(item):
    price = item.get("price")
    if not price:
        return "n/a"          # Yahoo sometimes shows the card without a price
    return price

products = yahoo_shopping("nike running shoes")

print(f"{'#':>2} {'title':38} {'price':10} {'merchant':22}")
print("-" * 76)
for p in products:
    print(f"{p['position']:>2} {p['title'][:38]:38} {money(p):10} {p['merchant'][:22]:22}")

priced = sum(1 for p in products if p.get("price"))
print(f"\n{len(products)} products, {priced} with a price, "
      f"{len(products) - priced} without.")

Run it and you get a table like this (trimmed):

 # title                                       price      merchant
 1 Nike Vomero 18                              $155.00    Macy's
 2 Nike Pegasus 41                             n/a        Macy's
 3 Nike Pegasus 42                             $145.00    Fleet Feet
 4 Nike Vaporfly 4                             $270.00    Fleet Feet

10 products, 8 with a price, 2 without.

Notice two things. First, the result list is short — that is Yahoo's rail, not a missing feature. Second, one product came back without a price. The script treats that honestly instead of pretending a number exists.

Honest limits: what Yahoo won't give you

Scraping Yahoo Shopping has hard ceilings, and a good scraper plans around them:

If you need deep catalogs, delivery data, or discount history, a dedicated product feed or a marketplace's own API is the right tool. For a fast, clean read of what Yahoo Shopping shows for a query — which is the realistic use case — a shopping API is the sweet spot.

What it costs

Yahoo Shopping searches with Serpent are billed per 1,000 calls, paid from the first call (shopping is not in the shared free pool). Current tiers:

TierPer 1,000 callsPer call
Default$0.60$0.0006
Growth$0.06$0.00006
Scale$0.03$0.00003

There is no per-page multiplier on shopping and no subscription — credits never expire. See the pricing page for the full table. If you want the Google-shaped view of the same product data instead, the Google Shopping API engine returns link/source/product_rating fields.

Next step: pull your key from the dashboard, hit the live playground to see the raw response for your own query, then wire the script above into your daily price monitoring job. Start at $0.03 per 1,000 at the Scale tier.

FAQ

Is there an official Yahoo Shopping API?

No. Yahoo does not offer a public API that reads its Shopping search results. A shopping API that returns the product rail as JSON is the standard workaround.

Are Yahoo Shopping results organic or paid?

They are affiliate placements. Every listing in the rail is a paid slot, so the sponsored field is true across the board rather than an organic/ads split.

Why is my result list so short?

Yahoo shows a compact product rail per query — typically around a dozen listings. Requesting a larger num returns as many as the source shows; it cannot exceed what Yahoo surfaces.

Why is the price sometimes null?

Yahoo loads the price footer after the card renders, so a share of listings can lack a displayed price at read time. The API returns price: null rather than inventing a number.

Can I scrape Yahoo Shopping without a browser?

Yes — that is the whole point of the API. One HTTPS request with an X-API-Key header returns parsed JSON. You never run a headless browser, proxy, or consent flow yourself.