Google Shopping EAN/GTIN Price Data API
Pricing
from $5.00 / 1,000 results
Google Shopping EAN/GTIN Price Data API
Real-time Google Shopping price data across 30 countries. Look up up to 1,000 EAN/GTIN barcodes or product IDs per run and get seller prices, shipping costs, and totals.
Pricing
from $5.00 / 1,000 results
Rating
0.0
(0)
Developer
PricePirate
Maintained by CommunityActor stats
1
Bookmarked
21
Total users
11
Monthly active users
5 days ago
Last modified
Categories
Share
Google Shopping Price Comparison Data API
Look up Google Shopping seller offers by barcode (GTIN/EAN) or Google Shopping catalog ID (CID) through a single Actor. Get prices, shipping, totals, item condition and availability in one JSON structure, across 30 supported countries. The returned offers depend on the upstream response; complete seller coverage and an exact barcode-to-catalog match are not guaranteed.
🚀 What's new in 1.3
This release moves the Actor onto our new scraping infrastructure:
- Bigger batches: up to 1,000 values per run in one bulk lookup job.
- Catalog IDs when available: a returned CID appears in
result.idand can be reused withsearch-by-id. A GTIN lookup can also return offers without a catalog ID (id: null,page_type: "offers_only"). - Multi-seller data: returned offers include item price, shipping and total; the Actor computes summary prices over those totals.
Perfect for price-comparison sites, repricing and margin tools, price monitoring and dynamic pricing engines, deal & coupon apps, browser extensions, dropshipping and product research, and AI shopping assistants targeting markets worldwide.
✓ 2 Ways to Look Up Google Shopping Data
Choose whichever identifier you already have:
| Operation | Value format | Returns |
|---|---|---|
search-by-gtin | GTIN / EAN / UPC barcode, exactly 8, 12, 13 or 14 digits, valid check digit, no repeated-digit placeholders | Product or offer list when offers are available |
search-by-id | Google Shopping catalog ID (CID), 10–25 digits, no leading zero | Product with returned seller offers |
✓ 30-Country Coverage
Query localized pricing across Google Shopping's country sites:
United States (us, default), Netherlands (nl), Germany (de),
France (fr), United Kingdom (uk), Spain (es), Italy (it),
Belgium (be), Austria (at), Switzerland (ch), Poland (pl),
Sweden (se), Denmark (dk), Norway (no), Finland (fi),
Portugal (pt), Ireland (ie), Czechia (cz), Hungary (hu),
Romania (ro), Greece (gr), Australia (au), Canada (ca), Brazil (br),
India (in), Japan (jp), Chile (cl), Luxembourg (lu), Mexico (mx),
South Africa (za). Use uk, not gb, for the United Kingdom.
✓ Multi-Seller Offer Data
For a barcode or catalog-ID lookup, a found result contains the returned
seller offers and available product information:
- Product: title, product URL, matched ID, EAN, brand, image
- Price summary: lowest, highest and average total (price + shipping), and the returned offer count
- Per-seller offers: seller name, seller URL, price, shipping cost, total price, currency, item condition, availability, and position in the returned list
Product metadata can be missing or null. Offer positions are one-based strings and preserve upstream order; the Actor does not re-rank offers by total.
✓ No Scraping Headaches
We handle the lookup infrastructure, so you get structured data without managing proxies or headless browsers. You do not need to poll the underlying lookup job yourself: start the Actor, wait for it to finish and read the dataset. Individual lookups can still return errors or time out.
💻 Input
{"operation": "search-by-gtin","values": ["4009803341163", "4014835778306"],"country": "us"}
operation(required): one ofsearch-by-gtin,search-by-id. All values in a run share the same operation. The Apify schema suppliessearch-by-gtinas its default; local runs must provide the operation explicitly.values(required): 1–1,000 strings, each one lookup — barcodes or Google Shopping catalog IDs, matching the selected operation. The Actor trims whitespace, drops blank entries and deduplicates, preserving first-seen order. At least one nonblank value must remain. Run the Actor multiple times for larger lists, subject to account capacity and allowance.country(optional, defaultus): 2-letter country code — see the list above.
Malformed values produce individual, free invalid_input error items and do
not prevent valid siblings from running. GTINs require a valid check digit and
must not be repeated-digit placeholders. Product IDs are 10–25 digits without
a leading zero. Only valid values enter the bulk gateway job.
Apify's input schema limits the raw array to 1,000 unique string entries and can reject invalid input structure before a run starts. Local runtime validation applies the 1,000 limit after trimming and deduplication. Identifier validation happens in the Actor, so malformed strings produce rows rather than making an otherwise valid input fail schema validation.
💻 Output
One dataset item per trimmed, deduplicated nonblank value for valid run input. This illustrative example has one offer and consistent totals; it is not a live price quote:
{"query": "4009803341163","operation": "search-by-gtin","country": "us","status": "found","result": {"id": "1234567890123456789","page_type": "product","name": "Example Product Name","url": "https://www.google.com/shopping/product/1234567890123456789?gl=us","ean": "4009803341163","brand": "Example Brand","description": null,"image_urls": ["https://example.com/product.jpg"],"review_rating": null,"review_count": null,"categories": null,"category_ids": null,"price_min": 129.0,"price_avg": 129.0,"price_max": 129.0,"offers_count": 1,"platform_data": {},"offers": [{"sellerId": "Example Store","title": null,"shop_name": "Example Store","shop_url": "https://www.example-store.com/product/123","shop_type": null,"marketplace_name": null,"shop_review_rating": null,"shop_review_count": null,"position": "1","platform_data": {},"condition": "new","currency": "USD","price": 125.01,"shipping": 3.99,"total": 129.0,"voucher": false,"free_return": null,"availability_text": "In stock","availability_code": "in_stock","classification": "product_page_match","confidence": "high"}],"source": "google-shopping","country": "us","fetched_at": "2026-07-27T12:00:03.000Z"}}
Note:
price_min,price_avg, andprice_maxare computed over returned offer totals (price + shipping); the average is rounded to two decimals. The current Google worker emits null product descriptions, reviews and categories, null shop ratings, and emptyplatform_dataobjects on products and offers. Every offer is classifiedproduct_page_matchwithhighconfidence, andavailability_codeis inferred fromavailability_text(unknownwhen the text is missing or unrecognized). Optional fields such asdirect_sale,available_sinceandlast_updatedare part of the shared contract but are not currently emitted by this worker.
When a GTIN response has no CID, result.id is null, page_type is
offers_only, and url is an empty string. Brand, condition, seller URL and
availability may be null; missing images are an empty array. A returned CID
does not itself prove exact barcode matching. not_found and error rows
have result: null.
The .actor/dataset_schema.json describes row fields, nested
product/offer types and the Overview view. It allows additional upstream fields
and requires only the nested fields guaranteed by the Actor's sanitizer.
The .actor/output_schema.json is separate: its results
property is the URL of default dataset items, not an inline result object or
array ({{links.apiDefaultDatasetUrl}}/items).
💻 Statuses & Errors
status is found, not_found, or error.
not_found means the upstream lookup returned no offers for that barcode or
catalog ID in the selected country; it is not proof that no seller exists.
Error items have result: null and carry a stable errorCode:
errorCode | Meaning |
|---|---|
invalid_input | The value does not match the selected operation, or the gateway rejected the job input |
free_limit_reached | This value exceeds the free plan's remaining lifetime result allowance |
timeout | No completed result was available at the Actor's shared deadline, or the upstream lookup timed out |
concurrency_limit_reached | Other runs filled this account's lookup capacity and admission retries were exhausted |
blocked | The upstream lookup reported a block |
internal_error | An unexpected failure or an unusable upstream result |
Error items are never charged, and error messages are sanitized. There is
no charge_limit_reached item: a charge budget limits billing, not delivery.
An all-error run normally still writes error rows and exits successfully.
Inspect the row statuses, run log and status message rather than treating an
Apify SUCCEEDED status as evidence that a lookup completed. Platform aborts,
timeouts or storage failures can interrupt delivery.
💰 Pricing
You pay per completed query result: found and not_found are eligible
for one query-result charge each, after delivery and subject to the run's
maximum charge budget. Errors and timeouts are always free. All completed
results are delivered even when the budget leaves no room to charge them.
A billing failure does not withhold delivered results. Run success is not a
billing signal.
Example: a batch contains 20 queries; 10 come back found, 5 come back
not_found, and 5 time out. You are charged for the 15 successful results —
the 5 timeouts are free (assuming sufficient charge budget).
There are no separate Apify platform usage charges — you only pay for successful requests.
Free Apify plans are capped at 50 lifetime completed results per account on
Google Shopping, across all runs. This is not 50 per run and does not reset.
The allowance is separate from other platforms and from the Apify charge
budget: found and not_found consume it even if billing is budget-clamped;
errors do not. Upgrade your Apify plan to remove this free-plan cap.
If a batch exceeds the remaining allowance, only the prefix of valid values
that fits is looked up; the rest receive uncharged free_limit_reached rows
in input order. With no previous usage or concurrent reservations, 1,000 valid
values allow up to 50 lookups and produce 950 quota-error rows. With 10 results
already used, up to 40 lookups fit. Concurrent reservations can reduce the
prefix further. Invalid values consume no allowance. Failed lookups refund
allowance for later runs, without backfilling the current run's overflow.
Quota-error messages can be generic (
Free tier limit reached. Upgrade your Apify plan to continue.⏱ Timing & Timeouts
Valid admitted values use one bulk gateway job, not one job per value. They may wait in an upstream queue; neither simultaneous execution nor a specific lookup speed is guaranteed. The Actor polls every 15 seconds with lightweight progress, then writes results after the job reaches a terminal state. It does not stream individual lookup completions into the dataset.
One shared 890-second budget covers admission retries and polling, not a
separate 900 seconds per query. At deadline the Actor fetches partial results
once more: completed results still ship, and unfinished values become free
timeout items. Requests in flight, salvage and delivery add overhead; the
890 seconds is not a strict wall-clock limit for the whole Actor. Gateway
requests time out after 30 seconds. Use an Apify Actor timeout of 960 seconds
to leave room for salvage and delivery.
Google Shopping allows 1,000 outstanding lookups per Apify account in its own capacity pool, separate from other platforms. A 429 waits 15, 30, 60, 120 and 240 seconds, subject to the remaining run budget. Persisted gateway-job resume is not supported: an Apify restart re-submits input and can repeat dataset items, quota consumption and charges. Avoid restarting runs unnecessarily.
If you see many timeouts, try smaller batches and spread requests throughout the day. Failed or timed-out requests are never billed.
📬 Contact & Support
Questions or higher limits: support@pricepirate.com