Google Shopping Ads Data: Track Sponsored Product Listings

By Serpent API Team · · 8 min read

Every shopping listing you pull through the Google Shopping API carries a sponsored flag. That single boolean is the key to tracking ad placements: filter on it, count the ads, and you have the start of a shopping ad-intelligence feed.

This guide shows how to pull that data with the API, what the sponsored field actually means on a shopping rail, and the honest limits of ad tracking from product listings.

TL;DR: Product listings on a shopping rail are paid placements. The API returns sponsored: true on each, so in Python you filter the list, count ads vs non-ads, and analyze price + merchant mix — all from one GET to /api/shopping. Below is the tested script.

Table of Contents

Why track sponsored product listings

When a shopper searches for a product, the listings they see are largely paid placements — the modern successor to the classic Product Listing Ad unit. Which merchants appear, in what order, and at what price is valuable competitive signal.

Three uses pop up constantly:

All three need the same raw material: a clean list of listings with their ad status, price, and merchant. That is exactly what a shopping API returns.

Reading the sponsored flag

Here is a real item from a live sony headphones query through the Google Shopping API engine (August 4, 2026). Note the Google-style field names — link, source, product_rating:

{
  "position": 1,
  "title": "Sony WH-1000XM6",
  "link": "https://www.bestbuy.com/product/sony-wh1000xm6-...",
  "source": "Best Buy",
  "price": "$299.99",
  "currency": "USD",
  "thumbnail": "https://img.example.com/products/wh1000xm6.jpg",
  "product_rating": null,
  "product_reviews": null,
  "sponsored": true,
  "snippet": "These are ideal for users seeking top-tier noise cancellation..."
}

The sponsored field is true here. On Yahoo-sourced shopping rails that is the norm rather than the exception — virtually every listing in the product rail is a paid placement, so don't expect a 50/50 organic mix. Your tracking logic should filter on the flag and report the real split, not assume one.

Working Python: count and analyze ads

Here is a complete, runnable script. It pulls listings for a query, filters the sponsored ones, and prints an ad table plus a merchant breakdown.

Replace sk_live_your_key with your key from the dashboard.

import requests
from collections import Counter

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

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

def money(item):
    return item.get("price") or "n/a"

products = shopping_listings("nike running shoes")
ads = [p for p in products if p.get("sponsored")]
organic = [p for p in products if not p.get("sponsored")]

print(f"listings: {len(products)} | sponsored: {len(ads)} | non-sponsored: {len(organic)}")
print()
print("Sponsored listings")
print("-" * 74)
for p in ads:
    print(f"#{p['position']:>2} {p['title'][:32]:32} {money(p):10} {p['source'][:20]:20}")

print()
print("Merchants in the sponsored rail")
for merchant, count in Counter(p.get("source") for p in ads).most_common():
    print(f"  {merchant or 'unknown':22} {count}")

Run it and you get output like this (trimmed):

listings: 10 | sponsored: 10 | non-sponsored: 0

Sponsored listings
----------------------------------------------------------------------
# 1 Nike Vomero 18                       $155.00    Macy's
# 2 Nike Pegasus 42                      $145.00    Fleet Feet
# 3 Nike Vaporfly 4                      $270.00    Fleet Feet
...

Merchants in the sponsored rail
  Macy's                    3
  Fleet Feet                2
  Foot Locker               1
...

In this real run, all ten listings were sponsored — consistent with a shopping rail made of affiliate placements. Your script now has the exact data you need for a daily share-of-voice report.

Honest limits of ad tracking

Tracking ads from product listings is powerful but has ceilings. Say them out loud before you build on top:

Those limits are why ad tracking from a shopping API works best as a position + price + merchant monitor, not as a replacement for an advertising platform's own reporting.

What it costs

Shopping searches are billed per 1,000 calls, paid from the first call. Current tiers: $0.60 / 1K at Default, $0.06 / 1K at Growth, $0.03 / 1K at Scale. No per-page multiplier, no subscription, credits never expire. Full table on the pricing page.

Next step: get a key from the dashboard, test the Google Shopping API in the playground, then schedule the script above to run daily. For the price side of the same data, pair it with price monitoring or price-drop alerts.

FAQ

How do I know if a Google Shopping listing is an ad?

The sponsored boolean in the API response marks paid placements. Filter on it and count to measure the ad mix for a keyword.

Are all product listings sponsored?

On a shopping rail, most or all listings are paid placements. In a real 10-listing test for "nike running shoes" every listing came back sponsored: true. Treat the flag as the source of truth rather than assuming a mix.

Can I see competitors' ad spend with this data?

No. You can see which merchant won a slot and the price shown, but not what they bid or paid. That lives in the advertising platform's own reporting.

What is the difference between sponsored and organic shopping results?

Sponsored listings are paid placements; organic results are earned. The shopping rail is dominated by paid placements, so a separate organic product result is rarely present for these queries.

How often should I run an ad-tracking sweep?

Daily is the common cadence for share-of-voice and merchant-mix reporting. At $0.03 per 1,000 at the Scale tier, a 500-keyword daily sweep is a fraction of a cent per keyword per day.