How to scrape Google Shopping with Python

This guide shows how to scrape Google Shopping with Python: call one endpoint, get products as clean JSON with title, price, store, and rating, then save them to a CSV file. No browser, no HTML parsing.

3,000 free searches / month, no card Title, price, store, rating Clean JSON, no HTML parsing
PULLED LIVE FROM THE API, JULY 20, 2026

One request, real response

The hard part of scraping Google Shopping yourself is driving a browser, dodging blocks, and parsing a product grid that keeps changing. Instead you send one HTTP request to a search endpoint and get clean JSON back. First a quick test with curl:

# one credit per successful search; zero results cost nothing curl "https://crustapi.com/v1/search?type=shopping&q=running shoes" -H "x-api-key: YOUR_KEY"

Then the same call in Python with the requests library. Install it with pip install requests, drop in a key, and run. The products live under the shopping key in the response:

# pip install requests, then run this file import requests resp = requests.get( "https://crustapi.com/v1/search", params={"type": "shopping", "q": "running shoes"}, headers={"x-api-key": "YOUR_KEY"}, ) data = resp.json() for item in data["shopping"]: print(item["title"], item["price"], item["source"], item["rating"])

Here are the first two products that came back, shown as CSV so they drop straight into Sheets or a spreadsheet:

title,source,price,rating,ratingCount,productId "Men's Nike Alphafly 3","DICK'S Sporting Goods","$294.99",4.4,1100,12155525817235103985 "New Balance Men's FuelCell SuperComp Trainer v3","Running Warehouse US","$124.88",4.3,616,7869527423502023736

Change q to any product search you would type into the Shopping box, like 4k monitor or office chair.

One call returns a full page of products in the order Google ranks them. To collect more, pass a page number and loop, gathering each page into one list:

# pull the first three pages into one list import requests all_products = [] for page in range(1, 4): data = requests.get( "https://crustapi.com/v1/search", params={"type": "shopping", "q": "running shoes", "page": page}, headers={"x-api-key": "YOUR_KEY"}, ).json() all_products.extend(data["shopping"]) print(len(all_products), "products collected")
WHAT EVERY PRODUCT INCLUDES

The full record, ready to use

Each product comes back with its title, price, the store selling it, a star rating, the number of ratings, a stable productId, and its rank via position. The first product as CSV, ready for Sheets or a database:

title,source,price,rating,ratingCount,productId,position "Men's Nike Alphafly 3","DICK'S Sporting Goods","$294.99",4.4,1100,12155525817235103985,1

Or the same record as JSON, exactly as the API returns it:

// one product in full { "title": "Men's Nike Alphafly 3", "source": "DICK'S Sporting Goods", "condition": null, "link": "", "price": "$294.99", "imageUrl": "", "rating": 4.4, "ratingCount": 1100, "productId": "12155525817235103985", "position": 1 }

Price is a formatted string with its currency symbol, so store it as text. Some listings leave condition, link, or imageUrl empty; read them with item.get("link", "") so a missing field never crashes your loop.

HOW IT COMPARES

vs writing your own scraper

You can build a Shopping scraper with a headless browser and a parser, and plenty of tutorials show how. The trade is maintenance. Here is the difference in practice.

Writing it yourselfCrustAPI
SetupInstall a headless browser, handle blocks and grid changesOne GET request, no browser
OutputParse the HTML yourself; fields break when the layout changesClean JSON from the API, or the same rows as CSV
MaintenanceFix the scraper each time the page changesWe keep it working
Free tierFree, but you pay in time and blocked requests3,000 searches / month, no card
Cost modelServer, proxy, and developer timeOne credit per successful search, however many products come back; empty searches free
Storing the dataYours to manageNo storage limits. Export to CSV or a database
PRICING

One credit per search

Prepaid packs, and credits never expire: 25k for $49 · 100k for $149 · 500k for $549 · 2.5M for $1,999 · up to 250M, all self-serve, ex-tax. A search costs one credit no matter how many products come back; a search that returns none costs nothing.

Run your first Shopping search free
3,000 credits a month. No card, no contract.
Get started →
THE LAST STEP

Save the results to a CSV file

Because the response is plain JSON, Python's built-in csv module writes it to a file in a few lines. No extra libraries. This reads every product from the search and writes one row each:

# save every product to a CSV file with the built-in csv module import csv, requests data = requests.get( "https://crustapi.com/v1/search", params={"type": "shopping", "q": "running shoes"}, headers={"x-api-key": "YOUR_KEY"}, ).json() with open("products.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["title", "source", "price", "rating", "ratingCount", "productId"]) for p in data["shopping"]: writer.writerow([p["title"], p["source"], p["price"], p.get("rating", ""), p.get("ratingCount", ""), p.get("productId", "")])

Open products.csv in Sheets or Excel and you have a finished price list. Swap the query, run it again, and append to build a bigger catalog.

Related: Google Shopping API · Google Shopping Scraper · Google Search API · Scrape Google News with Python · API docs

FAIR PLAY

When a different tool fits better: listing your own products, managing inventory, or a contract with a formal SLA are Google Merchant products, not scraping. This endpoint returns the public product results anyone sees in the Shopping tab, which is what most price research and market work needs, but it is not the official Content API for Shopping.

BEFORE YOU ASK

Common questions

WORKS WITH YOUR STACK

Try it on a product you sell

3,000 free credits covers a real search. Run one query and look at the JSON that comes back.

Get 3,000 free credits
No credit card required