Google Shopping Ads Data: Track Sponsored Product Listings

By Anurag Pathak · · 8 min read

The Google Shopping API may return product cards with a sponsored flag. Use a supported ad indicator to count labeled ads; leave the status unknown when it is not supplied. Google’s free listings guidance distinguishes unpaid product listings from Shopping ads.

This guide shows how to read a sponsored indicator and the limits of inferring ad coverage from product cards. A saved August 2026 ten-card example had all cards marked sponsored, but one sample cannot establish the mix on other queries or prove current endpoint availability.

The Shopping API is live. GET /api/shopping returns real product listings — title, price, currency, store, link, image, and rating where the listing shows one — on engine=google, yahoo, ddg or brave. Not every listing shows a price, so code for a missing one. Rates are on the Shopping API page.

TL;DR: Shopping results can include ads and free listings. In Python, classify a card only from its returned ad indicator, then analyze the labeled ad count, prices and merchant mix — all from one GET to /api/shopping. Below is the tested script.

Table of Contents

Why track sponsored product listings

Product searches can show both Shopping ads and free listings. Merchant, ordering and displayed price are useful observations, but classify an ad only when a reliable label or returned indicator supports it.

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 saved August 4, 2026 sample item for a sony headphones query. 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 in this saved sample. Classify only cards with a supported ad indicator; otherwise mark status unknown. Report the observed split rather than assuming 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 saved ten-card example, every listing was marked sponsored. The script demonstrates counting labeled cards; it does not establish a general ad share.

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, pay-as-you-go. Tiers: $0.35 / 1K at Default, $0.32 / 1K at Growth, $0.25 / 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?

Google Shopping can show both ads and free listings. A saved ten-card example was marked sponsored throughout, but that is not a general rate. Count only cards with an explicit ad indicator and keep unclassified cards separate.

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?

Shopping ads are paid placements; free listings are unpaid. Both can appear in product results, so use an explicit label or supported ad indicator before classifying a card.

How often should I run an ad-tracking sweep?

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