{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Shopping Scraper: Prices, Stores & Discounts",
    "description": "Product prices from Google Shopping in 30 countries: price, was-price and discount, condition, store, delivery, returns, rating and reviews, one flat row per offer. Several countries per run; filter and sort by price, condition and store. $0.002 per product + $0.003 per Google page.",
    "version": "1.0",
    "x-build-id": "aaFWioxUlihoBcFs6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fairfetch~google-shopping-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fairfetch-google-shopping-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/fairfetch~google-shopping-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fairfetch-google-shopping-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/fairfetch~google-shopping-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fairfetch-google-shopping-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "queries"
        ],
        "properties": {
          "queries": {
            "title": "Search queries",
            "type": "array",
            "description": "One per line: what a shopper would type into Google Shopping, e.g. a product name or model (\"sony wh-1000xm5\", \"dyson v15 detect\") or a category (\"air fryer\"). Each query returns its own rows. Barcodes (GTIN / EAN / UPC) work only loosely: Google treats them as text and often returns unrelated products, especially outside the US, so add \"Title must include\" when you use them. Links are not accepted (free error row); the other queries still run.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Google Shopping countries; every query runs in each of them (one row set per country). The country sets Google's domain, the results' location and the currency of every price (the country's own; Google converts cross-border offers and keeps the seller's own price in foreignPriceText).",
            "items": {
              "type": "string",
              "enum": [
                "US",
                "GB",
                "CA",
                "AU",
                "NZ",
                "IE",
                "DE",
                "AT",
                "CH",
                "FR",
                "BE",
                "NL",
                "ES",
                "IT",
                "PT",
                "PL",
                "SE",
                "DK",
                "NO",
                "FI",
                "CZ",
                "IN",
                "JP",
                "SG",
                "MY",
                "BR",
                "MX",
                "ZA",
                "AE",
                "TR"
              ],
              "enumTitles": [
                "United States (USD)",
                "United Kingdom (GBP)",
                "Canada (CAD)",
                "Australia (AUD)",
                "New Zealand (NZD)",
                "Ireland (EUR)",
                "Germany (EUR)",
                "Austria (EUR)",
                "Switzerland (CHF)",
                "France (EUR)",
                "Belgium (EUR)",
                "Netherlands (EUR)",
                "Spain (EUR)",
                "Italy (EUR)",
                "Portugal (EUR)",
                "Poland (PLN)",
                "Sweden (SEK)",
                "Denmark (DKK)",
                "Norway (NOK)",
                "Finland (EUR)",
                "Czechia (CZK)",
                "India (INR)",
                "Japan (JPY)",
                "Singapore (SGD)",
                "Malaysia (MYR)",
                "Brazil (BRL)",
                "Mexico (MXN)",
                "South Africa (ZAR)",
                "United Arab Emirates (AED)",
                "Turkey (TRY)"
              ]
            },
            "default": [
              "US"
            ]
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of Google's labels (delivery, returns, condition), as a code like \"en\", \"de\", \"fr\" or \"pt-BR\". Product titles stay as the stores write them. The condition field is the same in every language.",
            "default": "en"
          },
          "maxProductsPerQuery": {
            "title": "Max products per query",
            "minimum": 1,
            "maximum": 400,
            "type": "integer",
            "description": "Stop a query after this many product rows. Google shows up to 40 products a page; later pages add about 30-38 new ones each (repeats are dropped), and a query's list usually ends after 2-8 pages, so in practice a query gives at most about 300-350 products (10 pages).",
            "default": 40
          },
          "maxPagesPerQuery": {
            "title": "Max Google pages per query",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Upper limit of Google result pages read per query (each page that brings new products costs one \"results-page\" event). Raise it with \"Max products per query\" or with filters that drop many products.",
            "default": 3
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Keep only offers at or above this price, in each country's own currency. Applied by this Actor after reading Google's page (Google ignores its own price filter on these pages), so filtered-out offers are free but the page is still charged."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Keep only offers at or below this price, in each country's own currency."
          },
          "condition": {
            "title": "Condition",
            "type": "array",
            "description": "Optional. Keep only these conditions. Google labels refurbished and used (pre-owned) offers; offers without a label count as new. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "refurbished",
                "used"
              ],
              "enumTitles": [
                "New",
                "Refurbished",
                "Used / pre-owned"
              ]
            }
          },
          "merchants": {
            "title": "Only these stores",
            "type": "array",
            "description": "Optional. Keep only offers whose store name contains one of these words (not case-sensitive), e.g. \"Best Buy\", \"Walmart\", \"amazon\".",
            "items": {
              "type": "string"
            }
          },
          "excludeMerchants": {
            "title": "Exclude these stores",
            "type": "array",
            "description": "Optional. Drop offers whose store name contains one of these words, e.g. \"eBay\" or \"Mercari\" to leave out marketplaces for used goods.",
            "items": {
              "type": "string"
            }
          },
          "titleMustInclude": {
            "title": "Title must include",
            "type": "array",
            "description": "Optional. Keep only offers whose title contains every one of these words or model numbers. Case, spaces, hyphens and slashes are ignored, so \"WH-1000XM5\" also keeps \"WH1000XM5\" and \"Wh 1000xm5\". Use it to drop cases, ear pads and other models. Offers removed this way are free.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort rows by",
            "enum": [
              "relevance",
              "price_low_to_high",
              "price_high_to_low",
              "rating",
              "reviews",
              "discount"
            ],
            "type": "string",
            "description": "Order of each query's rows. The sort covers every product on the Google pages the run reads for the query (and pays for), then keeps the first \"Max products per query\": with \"Price: low to high\" and 10, you get the 10 cheapest of the 40 on page 1. It does not make Google return other products. `position` always keeps Google's own order.",
            "default": "relevance"
          },
          "trackChanges": {
            "title": "Mark changes since the last run (best effort)",
            "type": "boolean",
            "description": "Compares each offer with the last run that returned the same offer (same tracking ID, country and language) and marks it new, price_down, price_up or unchanged, with the previous price. Best effort, not monitoring: Google returns a different mix of offers on every request, so in our tests two runs a few minutes apart had only 11-26 of 80 offers in common and the rest came back as new; offers that drop out are not reported. Works better with \"Only these stores\". The state is kept in your account in a key-value store named google-shopping-price-tracking.",
            "default": false
          },
          "trackingId": {
            "title": "Tracking ID",
            "type": "string",
            "description": "Name of the tracker, so separate monitors (e.g. one per client) don't mix. Use the same ID in every scheduled run.",
            "default": "default"
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}