Google Shopping API Lowest Price: Get the Real Cheapest
Pull the lowest price for a product from Google Shopping through an API, and filter out open-box, earbuds and foreign-currency rows that fake the minimum.

Get the lowest Google Shopping price for a product, from a merchant you would actually buy from. Paste this into your agent:
Set up https://monid.ai/SKILL.md, and then use Monid to search Google Shopping for "sony wh-1000xm5" in the US sorted low to high, drop open box, refurbished and earbud listings, and tell me the lowest price from Best Buy, Target, Adorama, B&H or Newegg with the link.
One prompt finds the price you can act on. 1 min setup · 20-40 hrs saved.
You sort a Google Shopping search by price, take the first row, and call it the lowest price. On 2026-10-16 that first row for a pair of Sony headphones was an open box unit missing its accessories, and the third was a different product altogether. This guide shows how to pull the lowest price through an API, why the minimum of a shopping result is rarely the number you want, and the filter that gets you to one you can act on. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.
Is there a Google Shopping API that returns the lowest price?
Google offers no public API that returns other merchants' offers for a search, and the easiest way to get one is Monid. Install it once, add a key, and your agent searches Google Shopping, sorts by price and reads the merchants, with no vendor portal and no plan to set up.
- Pay per call. A search is billed on its own, at $0.00015 per call (Verified 2026-10-16 on the Google Shopping tools page). Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
- One install, every API. The same key and balance call Google Shopping and every other tool on Monid, so the next data source is one more endpoint, not one more account.
- Lives inside your agent. Install the CLI, add your key, run the prompt above, and the search is there whenever your agent needs a price, with nothing to keep running. Your agent reads
SKILL.mdand learns the rest, so setup is about a minute.
At that price a price check for 100 products costs about $0.015 (Verified 2026-10-16). If you start from a barcode rather than a product name, looking up a UPC through an API comes first.
How do you pull the lowest price for a product, or a whole list?
Run one search per product with sort_by set to 1 (low to high), then apply a filter before you read the first row. Looping the call over a product list is a shell loop.
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main
Search sorted by price
monid run -p litescrape -e /google/shopping \
--query '{"q":"sony wh-1000xm5","gl":"us","hl":"en","num":40,"sort_by":"1"}'
sort_by takes 1 for low to high, 2 for high to low, 3 for rating and 4 for relevance. gl and hl set the country and language, and num is the number of products you want, 1 to 100. One call came back as one billed unit whatever num was, three runs out of three on 2026-10-16.
Loop it over a product list
Put one product per line in products.txt, then run:
mkdir -p out
while read -r p; do
monid run -p litescrape -e /google/shopping \
--query "{\"q\":\"$p\",\"gl\":\"us\",\"hl\":\"en\",\"num\":40,\"sort_by\":\"1\"}" > "out/$(echo "$p" | tr ' ' '_').json"
done < products.txt
Each product writes one file. Filter each file with the code in the section on what goes wrong below, and keep the merchant list next to it, because that list is what turns a minimum into an answer.
Or hand the whole job to an agent
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to for each product on this list, search Google Shopping in the US sorted low to high, drop open box, refurbished, earbud and review-page rows, and give me one table with the lowest price from a merchant on my list, the merchant and the link.Can you scrape Google Shopping yourself with Python?
Yes, people do it with Selenium, Playwright or a proxy service, and it works until the page layout or the blocking changes. The part that is yours to maintain is the extraction: Google Shopping renders prices, merchants and conditions in a layout that moves, and a scraper you write breaks when it does. The rules side differs by site and by country, so read the terms of any page before you build on it.
Doing it in Python means a browser or proxy setup, parsing code, pagination across Google's pages, retries, and a repair whenever the layout changes. That is hours before the first useful row. A call through Monid is $0.00015 (Verified 2026-10-16), the pagination is done for you (a num of 40 is stitched from Google's own pages), and the output is typed JSON instead of HTML. Google Maps scraper alternatives shows the same trade-off for another Google surface: where a self-built scraper stops paying. A one-off look at a single product is quicker on google.com/shopping itself. A list, a schedule or an agent is where an API pays off.
What does a Google Shopping row contain, and what can you build with it?
Thirteen fields can appear on a row, and only some of them describe the offer. We ran the search above three times on 2026-10-16 (Verified 2026-10-16) and these are the keys that came back:
{ "position": 12,
"title": "Refurbished Sony WH-1000XM5 Bluetooth Wireless Noise Canceling Over-the-Ear Headphones - Silver",
"price": "$189.99",
"extracted_price": 189.99,
"source": "Target",
"second_hand_condition": "refurbished",
"rating": 4.5,
"reviews": 31,
"product_id": "…",
"headline_offer_docid": "…",
"image_docid": "…",
"thumbnail": "…",
"source_icon": "…" }
extracted_price is the number to sort on and price is the string Google shows. source is the merchant. second_hand_condition is the only structured condition field, and it was present on 4 of 40 rows. Some rows also carry old_price (the crossed-out price), delivery and tag (for example "46% OFF"). The response also returns Google's refinement chips as filters, and the *_docid ids are what opens a single product.
The query side is richer than most people use: min_price and max_price bound the range, on_sale, free_shipping and small_business apply Google's own refinements (one at a time), and location or uule sets where the search appears to come from.
What you can build with it
- A price floor for your own listing. Pull the lowest comparable price from merchants you compete with and compare it with yours.
- A buy-side check. Before an agent places an order or recommends a vendor, ask for the lowest price among stores you trust.
- A weekly price table. Run the loop on a schedule and store the whole row, which monitoring competitor prices automatically covers for alerts and storage.
Why is the lowest price on Google Shopping usually the wrong one?
Because a shopping result is a list of offers, and the cheapest offers are the ones least like the product you searched for. Here is what the lowest-first result for sony wh-1000xm5 held on 2026-10-16.
What were the first three rows?
pos price merchant what it was (Verified 2026-10-16)
1 $79.00 Green Cosmetics OÜ Open Box, Missing Accessories
2 $79.99 Jawa.gg "w/ Original Box", no rating, no condition field
3 $95.00 rajsunakhalacollege.edu.in Sony WF-1000XM5 earbuds, a different product
The first is flagged by second_hand_condition: "open box", which you can drop in one line. The second is not flagged by any field and sits at roughly a quarter of the price of the new units from Adorama and B&H on the same page. The third is a product from the same family with a similar name.
How many rows were not the product?
In 40 rows on 2026-10-16 (Verified 2026-10-16), 4 titles were the WF earbuds, 4 rows carried a condition flag (2 open box, 2 refurbished), and 1 row was a review page, a TechRadar article title attached to a $190 listing from labs-omnia.com. Merchants included a .edu.in college domain and a .org food shelf at $188, neither of which reads like a retailer.
Why can the price not be compared across rows?
old_price came back on 18 rows (Verified 2026-10-16) in several formats: "Usually $240", plain "$398", a unit price "$178/kg", and six in another currency in brackets: (AED 938), (AED 949), (HK$1,899), (¥25,220), (€249) and (€278). The six are listings converted for display, not US prices you can buy at. A regex for digits over that field gives you a number with no currency.
What does a filter leave you with?
A title and condition filter gets 40 rows down to 27, and the cheapest of the 27 are still $79.99, $139.99 (PayMore), $143 and $159.60 (Verified 2026-10-16). A floor at 60 percent of the median ($285.99) leaves 23 rows, and the lowest is $184.99 from StackSocial. The rule that works is not a smarter title match. It is a list of merchants you would buy from.
import json, re
TRUSTED = {"Best Buy", "Target", "Adorama", "B&H Photo-Video-Audio", "Newegg.com", "Walmart", "Amazon.com"}
BAD = re.compile(r"refurb|open box|renewed|used|review|promotional|grade|\bWF-?1000", re.I)
def lowest(rows, model=r"WH-?\s?1000XM5"):
ok = [r for r in rows
if re.search(model, r["title"], re.I)
and not BAD.search(r["title"])
and not r.get("second_hand_condition")
and any(r["source"].startswith(m) for m in TRUSTED)]
return min(ok, key=lambda r: r["extracted_price"]) if ok else None
rows = json.load(open("out/sony_wh-1000xm5.json"))["output"]["shopping_results"]
print(lowest(rows))
Why is sorting by price not a guarantee?
A low-to-high sort is a sort of the rows you were given, not of every offer Google knows (Verified 2026-10-16). The two price-sorted runs (40 rows, then num 100) contained no Best Buy, Amazon, Walmart or Lowe's row. The relevance-sorted run did: Best Buy at $228.00 was its first row, below every Adorama, B&H and Newegg price in the price-sorted runs. Asking for 100 returned 45 rows, billed as one unit, and the same Best Buy row was still missing.
So pull both orderings, sort_by 1 and 4, merge on source and title, and take the minimum after the filter. That is two calls, $0.00015 each (Verified 2026-10-16).
The same title, two prices
In the relevance run (Verified 2026-10-16), three Newegg sellers listed a Sony WH-1000XM5 for $275.99, $279.00 and $534.99. The merchant names were Newegg.com - Teds Electronics, Newegg.com - Sybershop and Newegg.com - JMDesign. A marketplace is one storefront with many sellers, so the highest price in a result is as unreliable as the lowest.
Which endpoint should I use for which job?
| Endpoint | What it does | Input | Returns | Billing | Price (Verified 2026-10-16) |
|---|---|---|---|---|---|
litescrape/google/shopping | Search Google Shopping, sorted, filtered | q, sort_by, num, min_price, gl | Up to 100 products with price, merchant, rating, condition | Per call | $0.00015 |
apify/burbn/google-shopping-scraper | Keyword search with a condition filter and offer-level data | searchQuery, sortBy, productCondition, limit | One record per product with seller details | Per result plus flat fee | $0.005 per result |
Verified with monid inspect on 2026-10-16; current figures are on monid.ai/tools. The first row was run three times that day. The second row was inspected and not run, because its price carries a flat fee on top of the per-result charge.
The second row is the one to reach for when you want Google to filter by condition before you pay for rows, since it takes productCondition with NEW, USED, REFURBISHED or ANY. The original call from this guide's earlier version still holds against its schema:
monid run -p apify -e /burbn/google-shopping-scraper -w \
-i '{"searchQuery":"sony wh-1000xm5","country":"us","language":"en","limit":20,"sortBy":"BEST_MATCH"}'
sortBy takes LOWEST_PRICE as well as BEST_MATCH, and limit must be between 10 and 100. At $0.005 a result plus an $0.008 flat fee (Verified 2026-10-16), a 20-row call lists as $0.108, and the endpoint notes say limit controls the results charged.
When is another route a better fit?
You need your own listings. If the question is about products you sell, the merchant tools that Google gives sellers are the route for your own catalogue, not a search over everyone else's.
You need one marketplace in depth. Google Shopping gives breadth across merchants and little depth on each. For Amazon, a marketplace endpoint returns more, as connecting Claude to Amazon search data shows.
You need to know a price changed. A single pull is a snapshot. Change detection needs a schedule and stored history, which is a different build.
You need prices you can bid against, to the cent. A shopping row is the price Google displayed to one search from one place. Merchants show different prices by region and by day, and the cart price can differ.
And the disclosure: we resell the endpoints in this guide. The biggest saving here is not a call. It is a merchant list in your own code, and it costs nothing whoever you buy the data from.
Conclusion
The quickest way to get the lowest Google Shopping price from an agent is one search call per product through Monid: $0.00015 a call (Verified 2026-10-16), one key for Google Shopping and every other tool, about a minute to set up and ready inside your agent whenever you need it. A price check for 100 products is about $0.015. Scraping Google yourself works until the page changes, and takes hours of setup.
Two things matter more than the endpoint (Verified 2026-10-16). The first row of a price-sorted result was an open box unit, the third a different product, and the lowest row from a mainstream retailer, Best Buy at $228.00, was missing from both price-sorted runs. So filter by merchant, not by title, and pull sort_by 1 and 4 before you trust a minimum.
How we estimated the time saved: building a Google Shopping collector with pagination and upkeep is roughly 10 to 20 hours, and writing and maintaining the matching rules that turn rows into a comparable price is another 10 to 20. That is 20 to 40 hours. The 1 minute is the install, key and first call once you already have a Monid key.
Free next step: run monid inspect -p litescrape -e /google/shopping, make one call for a product you sell, and read the cheapest five rows. Start at monid.ai.
FAQ
Is there a free Google Shopping API?
Not free, but close: through Monid a search costs $0.00015 per call (Verified 2026-10-16), with no monthly plan and no minimum, and discovery and inspection cost nothing. A hundred product checks are about $0.015.
Does sorting by price give the cheapest offer?
No. It sorts the rows returned, and on 2026-10-16 the lowest-first result began with an open box unit and an earbud listing, and held no Best Buy row at all. Pull relevance order too, filter by merchant and take the minimum of what is left.
How many products does one call return?
Up to the num you set, 1 to 100, billed as one call. In our runs num 40 returned 40 rows and num 100 returned 45, both billed as one unit, so count the rows you got.
Can I get the lowest price for many products at once?
Yes. Put the products in a file and loop the call, one search per line, as in the loop above, or give the list to your agent. Each product is one call.
How do I get the price in a different country?
Set gl to the country code, hl to the language and google_domain to the local Google domain. Rows can still carry another currency in old_price, so store the country you asked for beside every row.
Published September 2026.


