Google Shopping EAN/GTIN Price Data API avatar

Google Shopping EAN/GTIN Price Data API

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Google Shopping EAN/GTIN Price Data API

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

PricePirate

Maintained by Community

Actor stats

1

Bookmarked

21

Total users

11

Monthly active users

5 days ago

Last modified

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.id and can be reused with search-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:

OperationValue formatReturns
search-by-gtinGTIN / EAN / UPC barcode, exactly 8, 12, 13 or 14 digits, valid check digit, no repeated-digit placeholdersProduct or offer list when offers are available
search-by-idGoogle Shopping catalog ID (CID), 10–25 digits, no leading zeroProduct 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 of search-by-gtin, search-by-id. All values in a run share the same operation. The Apify schema supplies search-by-gtin as 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, default us): 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, and price_max are 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 empty platform_data objects on products and offers. Every offer is classified product_page_match with high confidence, and availability_code is inferred from availability_text (unknown when the text is missing or unrecognized). Optional fields such as direct_sale, available_since and last_updated are 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:

errorCodeMeaning
invalid_inputThe value does not match the selected operation, or the gateway rejected the job input
free_limit_reachedThis value exceeds the free plan's remaining lifetime result allowance
timeoutNo completed result was available at the Actor's shared deadline, or the upstream lookup timed out
concurrency_limit_reachedOther runs filled this account's lookup capacity and admission retries were exhausted
blockedThe upstream lookup reported a block
internal_errorAn 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.
) or include gateway allowance details. The status message summarizes the outcome; it need not repeat each row's message. If no allowance remains at startup, all valid values receive quota errors, no lookup job is admitted and nothing is charged. The Actor still normally exits successfully with those error rows.

⏱ 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