# Google Shopping Scraper (`sfoln/google-shopping-search`)

Search Google Shopping and get one row per product: title, merchant, URL, numeric price and currency, rating, reviews, delivery, offers and product ID, plus min, median and max price per query. $6 per 1,000 result pages of about 40 products.

- Family: Company & lead intelligence
- Categories: Ecommerce, Lead generation, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Google Shopping Scraper (sfoln/google-shopping-search)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/google-shopping-search.json
- MCP: https://mcp.apify.com?tools=sfoln/google-shopping-search
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~google-shopping-search/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~google-shopping-search/runs

Google Shopping Scraper searches Google Shopping and returns one clean row per product: title, merchant, product URL, domain, numeric price and ISO currency, rating, reviews count, delivery info, number of offers, image and Google product ID. Each query also gets a summary row with min, median and max price. Built for price monitoring, competitor research, catalog enrichment and shopping assistants.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Google Shopping credit (`google-shopping-query`) | $0.003 | $3 / 1,000 | Charged per upstream credit consumed. One Google Shopping page (up to ~40 products) uses 2 credits. |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~google-shopping-search/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["wireless earbuds"]}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/google-shopping-search"
    }
  }
}
```

Example prompt: Search Google Shopping in the US for "wireless earbuds" and show the 10 cheapest offers with merchant, price and rating.

## Input

Enter product searches (one per line). Each query writes one row per product plus one `query_summary` row with price statistics.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `queries` (required) | array | — | Product queries: Product searches as you would type them into Google Shopping, one per line. Accounts on the Apify free plan can process up to 10 queries per run. |
| `country` | string | `"us"` | Country (gl): Two-letter country code for the shopping market, e.g. us, gb, de. It also decides how a bare "$" price is read (CAD in ca, AUD in au...). |
| `language` | string | `"en"` | Language (hl): Language code, e.g. en, de, fr. |
| `location` | string | — | Location: Optional free-text location for local prices and delivery, e.g. "Chicago, Illinois, United States". |
| `resultsPerQuery` | integer | `40` | Products per query: Maximum products per query (1–100). Google Shopping returns up to ~40 products per page, and each page costs 2 google-shopping-query events. |
| `page` | integer | `1` | Start page: Result page to start from. |
| `maxQueries` | integer | `1000` | Max queries: Safety cap on the number of queries processed in this run. |
| `concurrency` | integer | `5` | Concurrency: How many queries run in parallel. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified upstream pages to each query_summary row. |

Example input:

```json
{
  "queries": [
    "wireless earbuds"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | Input |
| `query` | string | Query |
| `resultType` | string | Result type: product \| query_summary (one per query, not charged itself) |
| `rank` | integer | null | Rank: Overall position: (page − 1) × 40 + the product's place on its page. |
| `position` | integer | null | Position on page |
| `page` | integer | null | Page |
| `title` | string | null | Product title |
| `url` | string | null | URL: Merchant product page. |
| `domain` | string | null | Domain |
| `merchant` | string | null | Merchant: Seller name as shown by Google. |
| `price` | string | null | Price (display) |
| `priceValue` | number | null | Price: Numeric price parsed from `price`. |
| `currency` | string | null | Currency: ISO 4217 code parsed from `price`. |
| `rating` | number | null | Rating |
| `ratingCount` | integer | null | Reviews count |
| `delivery` | string | null | Delivery |
| `freeDelivery` | boolean | null | Free delivery: true when the delivery text offers free delivery without a condition ("Free shipping over $35" is false). |
| `imageUrl` | string | null | Image URL |
| `productId` | string | null | Google product ID |
| `offers` | string | null | Offers (display) |
| `offersCount` | integer | null | Offers count: Number of sellers ("10+" → 10). |
| `totalProducts` | integer | null | Products |
| `pagesFetched` | integer | null | Pages fetched |
| `creditsUsed` | number | null | Credits used: query_summary: upstream credits the query used. |
| `creditsCharged` | number | null | Credits charged: query_summary: google-shopping-query events charged for the query, before any of its rows was written (equal to creditsUsed unless the maximum cost per run was reached). |
| `merchants` | array | Merchants |
| `minPrice` | number | null | Min price |
| `maxPrice` | number | null | Max price |
| `medianPrice` | number | null | Median price |
| `country` | string | null | Country: query_summary: shopping market (Google gl); a bare "$" is read as this country's dollar. |
| `status` | string | Status: ok \| not_found \| error \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged: true on a product row covered by the google-shopping-query charge of its results page; the query_summary row is never charged itself (see creditsCharged). |
| `chargedEvent` | string | Charged event |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Data source |
| `fetchedAt` | string | Fetched at |

Example record:

```json
{
  "input": "nike air max",
  "query": "nike air max",
  "resultType": "product",
  "rank": 1,
  "position": 1,
  "page": 1,
  "title": "Nike Air Max 97 GS 'White Metallic Silver'",
  "url": "https://www.nike.com/t/air-max-97-big-kids-shoes-fQk07c/921522-104",
  "domain": "nike.com",
  "merchant": "Nike",
  "price": "$104.97",
  "priceValue": 104.97,
  "currency": "USD",
  "rating": 4.5,
  "ratingCount": 1,
  "delivery": "$8.00 shipping",
  "freeDelivery": false,
  "imageUrl": "https://encrypted-tbn2.gstatic.com/shopping?q=…",
  "productId": "4195027484078128635",
  "offers": "10+",
  "offersCount": 10,
  "status": "ok",
  "charged": true,
  "chargedEvent": "google-shopping-query",
  "source": "serper",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}
```

## Related

- [Amazon Search Results Scraper](https://www.sfoln.com/actors/amazon-search.md) (`sfoln/amazon-search`)
- [Google Search Results Scraper](https://www.sfoln.com/actors/google-search-results.md) (`sfoln/google-search-results`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
