Google Content API vs Google Shopping Scraping API (2026 Guide)
The official Google Content API (now Merchant API) manages your own catalog and inventory, but it cannot return competitor prices or market offers. This guide compares what each API does, why the Content API cannot scrape competitor data, and how to pull multi-seller pricing with Python.
The core distinction: merchant feed API vs market intelligence API
Developers frequently land on Google's official developer documentation hoping to query live market prices, compare competing merchants, or build repricing logic. The reality quickly sets in: the official Google Content API cannot scrape competitor prices.
Google built the Content API for Shopping (now transitioning to the new Google Merchant Center API) for one specific purpose: managing your own store's merchant inventory. It is an inbound administration surface. You use it to upload your product catalogue, update your stock quantities, verify shipping settings, and review account policy warnings.
It is deliberately isolated from the rest of the market. You cannot query another retailer's listings. You cannot inspect who holds the lowest price on a given barcode. You cannot see the full list of merchants selling an item on Google Shopping.
To monitor competitor prices, identify MAP violations, or feed dynamic repricers, you need a dedicated scraping API. Here is how the two compare, why the distinction matters for your engineering team, and how to query live competitor offers with Python.
Why developers search for Content API competitor pricing
When e-commerce businesses begin automating price monitoring, their first instinct is to look for an official Google API. The reasoning seems logical:
- Google Shopping displays every merchant selling a product side by side.
- Google provides developer tools under Google Cloud Console.
- Therefore, an API endpoint like
products.listCompetitors()must exist.
However, Google Merchant Center operates on a closed merchant model. Google's Terms of Service and API design strictly protect merchant data from being exposed to other merchants through feed management interfaces. The API only authorises calls scoped to your specific merchantId. Any attempt to request product IDs outside your account returns a 404 Not Found or 403 Forbidden.
For teams building pricing dashboards, competitive benchmarking tools, or automated repricing pipelines, the official API is a dead end.
The 2026 shift: Content API v2.1 sunset to Merchant API
Google is currently deprecating Content API v2.1 in favour of the Google Merchant Center API on Google Cloud.
While the new Merchant API modernises authentication, introduces gRPC transport, and splits sub-APIs (such as Accounts, Inventories, Products, and Order Tracking), its functional scope has not changed:
- It remains strictly an account management interface for your own listings.
- It requires Google Cloud project setup, service account keys, and OAuth consent screens.
- It provides no public search or multi-merchant offer extraction endpoints.
If you need market pricing, the migration to the new Merchant API will not solve your requirement.
Side-by-side feature comparison
| Feature | Official Google Content / Merchant API | ShoppingScraper Channel API |
|---|---|---|
| Primary Purpose | Inbound feed and stock management | Outbound competitive price monitoring |
| Data Scope | Your own merchant inventory only | Public Google Shopping listings across 40+ countries |
| Competitor Pricing | Not supported (by design) | Real-time prices from all competing merchants |
| Multi-Seller Offers | None | Full seller array (merchant name, price, shipping, condition) |
| Authentication | OAuth 2.0 / Service Account with Merchant Center delegation | Simple API Key (X-API-Key header) |
| Product Resolution | Requires your own SKU/ID | Resolves 13-digit EAN/GTIN to Google catalog SKU |
| Merchant Account Required | Yes (verified Merchant Center account) | No |
| Shipping Costs | Your own shipping rules | Landed shipping costs for every active seller |
| Setup Time | Days (GCP project, IAM roles, OAuth tokens) | Under 5 minutes (runnable HTTP request) |
The barcode obstacle: EAN to catalog SKU resolution
If you decide to scrape Google Shopping directly or through a generic SERP API, you encounter the primary technical failure point: Google disabled direct barcode lookups on Shopping.
When you search Google Shopping with a raw 13-digit EAN or GTIN, Google's index frequently returns empty results or unrelated lookalike products. Google keys its internal shopping catalogue by a proprietary catalog ID (a numeric SKU like 16472093412589034112).
Naive scrapers pass the EAN into search parameters and return low-quality HTML results. ShoppingScraper's Channel API solves this problem upstream:
- Resolution: The resolver identifies the true canonical product behind your EAN.
- Catalog Locking: It queries Google's actual catalog index to pinpoint the exact Google catalog ID.
- Offer Extraction: It fetches all active merchant offers, current prices, previous prices, and landed shipping costs for that catalog SKU.
This ensures you monitor prices for the exact product, not an accessory or an unrelated model.
Runnable Python example: fetching live competitor offers
Here is how to query live competitor offers for an EAN across 40+ countries using the ShoppingScraper Channel API.
First, install httpx:
pip install httpxNext, run this script to pull all competitor prices and shipping costs:
import httpx
API_KEY = "YOUR_API_KEY"
ENDPOINT = "https://enterprise.shoppingscraper.com/v2/channel/google/offers"
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
}
# Query Google Shopping Netherlands for a specific EAN
payload = {
"country": "nl",
"application_id": "repricer-sync-01",
"items": [
{"ean": "8719706046244"}
]
}
response = httpx.post(ENDPOINT, headers=headers, json=payload, timeout=30.0)
response.raise_for_status()
data = response.json()
# Parse the resolved catalog product and competing seller prices
for item in data.get("items", []):
ean = item.get("ean")
catalog_id = item.get("catalog_id")
title = item.get("title")
currency = item.get("currency", "EUR")
print(f"Product: {title}")
print(f"EAN: {ean} -> Verified Catalog ID: {catalog_id}")
print(f"Total Offers: {item.get('offers_count', len(item.get('offers', [])))}\n")
for offer in item.get("offers", []):
merchant = offer.get("merchant")
item_price = offer.get("price")
shipping = offer.get("shipping", 0.0)
total_price = offer.get("total_price", item_price + shipping)
in_stock = "In Stock" if offer.get("in_stock", True) else "Out of Stock"
condition = offer.get("condition", "new")
print(f" [{merchant}]")
print(f" Landed Price: {currency} {total_price:.2f} (item: {currency} {item_price:.2f}, shipping: {currency} {shipping:.2f})")
print(f" Status: {in_stock} | Condition: {condition}")
print(f" Direct URL: {offer.get('direct_link')}\n")Sample JSON response
The Channel API returns clean, structured data ready for your database or repricing logic:
{
"status": "success",
"country": "nl",
"application_id": "repricer-sync-01",
"items": [
{
"ean": "8719706046244",
"catalog_id": "16472093412589034112",
"matched": true,
"title": "Apple AirPods Pro (2nd generation) USB-C",
"brand": "Apple",
"currency": "EUR",
"offers_count": 28,
"min_price": 229.00,
"offers": [
{
"merchant": "bol.com",
"price": 229.00,
"shipping": 0.00,
"total_price": 229.00,
"condition": "new",
"in_stock": true,
"direct_link": "https://www.google.nl/shopping/product/16472093412589034112/offer/1"
},
{
"merchant": "Coolblue",
"price": 239.00,
"shipping": 0.00,
"total_price": 239.00,
"condition": "new",
"in_stock": true,
"direct_link": "https://www.google.nl/shopping/product/16472093412589034112/offer/2"
},
{
"merchant": "MediaMarkt",
"price": 249.00,
"shipping": 0.00,
"total_price": 249.00,
"condition": "new",
"in_stock": true,
"direct_link": "https://www.google.nl/shopping/product/16472093412589034112/offer/3"
}
]
}
]
}Architecture: using both APIs together
High-performing e-commerce architectures do not choose between the Content API and a scraping API; they deploy both in tandem:
+-------------------------------------------------------------+
| Your ERP / PIM |
+------------------------------+------------------------------+
|
+------------------+------------------+
| |
v v
+-----------------------+ +-----------------------+
| Google Merchant API | | ShoppingScraper API |
| (Inbound Feed Sync) | | (Market Intelligence)|
+-----------+-----------+ +-----------+-----------+
| |
| Push own inventory | Pull competitor prices
v v
+-----------------------+ +-----------------------+
| Google Merchant Center| | Repricing / MAP Engine|
+-----------------------+ +-----------+-----------+
|
| Calculate optimal price
v
+-----------------------+
| Update Price in ERP |
+-----------------------+
- Google Merchant API (Inbound): Automatically pushes your catalogue updates, inventory counts, and current price adjustments to Google Shopping every hour.
- ShoppingScraper API (Outbound): Polls competitor prices and stock positions across Google Shopping, Amazon, and regional marketplaces for your key SKUs.
- Pricing Rules Engine: Ingests competitor prices, calculates dynamic margins, verifies MAP rules, and sends the updated target price back to your ERP or directly to Merchant Center.
Next steps
If your goal is to manage your own product listings and campaign feeds, continue with Google's official Merchant Center API documentation.
If you need to track competitor prices, detect unauthorised sellers, or feed automated repricing rules, start with ShoppingScraper:
- Review the Google Shopping Scraper API documentation.
- Test your barcodes with the GTIN Lookup Tool.
- Create a free account at shoppingscraper.com for 100 free test credits.
CTO & Co-founder
Full-stack engineer specializing in web scraping, API design, and AI applications for e-commerce. Built ShoppingScraper's infrastructure processing 1M+ daily product lookups.