{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Shopping Scraper & API: Prices, Sellers, Price Tracker",
    "description": "Scrape Google Shopping by keyword or URL in 31 countries: price, old price and discount, seller, rating, reviews, delivery, product IDs and links, with optional product details and a scheduled price watcher for product links. No login, no browser; $1 per 1,000 products.",
    "version": "0.1",
    "x-build-id": "vx0lqOhnTknCBFcUW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/varnmill~google-shopping-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-varnmill-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/varnmill~google-shopping-scraper/runs": {
      "post": {
        "operationId": "runs-sync-varnmill-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/varnmill~google-shopping-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-varnmill-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",
        "properties": {
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "What you would type into Google Shopping, one per line (for example 'standing desk' or 'airpods pro 2'). Each keyword is one search. You can also paste Google Shopping URLs here.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Google Shopping URLs",
            "type": "array",
            "description": "Optional. Paste Google Shopping result URLs from your browser to keep any filter you clicked there (price range, store, brand, 'on sale', 'nearby'). The URL's own country (gl) and language (hl) are used when present.",
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product links to price-check",
            "type": "array",
            "description": "Optional. Google product links (the 'productLink' field of a search row). Each link is opened and returns the product with every seller Google shows, their prices and direct shop links, and the lowest price. Use this with the price watcher to track the same products every day. Charged as 'product-details' per link.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country",
            "enum": [
              "us",
              "au",
              "at",
              "be",
              "br",
              "ca",
              "cz",
              "dk",
              "fi",
              "fr",
              "de",
              "in",
              "ie",
              "it",
              "jp",
              "mx",
              "nl",
              "nz",
              "no",
              "pl",
              "pt",
              "sa",
              "sg",
              "za",
              "kr",
              "es",
              "se",
              "ch",
              "tr",
              "ae",
              "gb"
            ],
            "type": "string",
            "description": "Google Shopping country. Prices, sellers and currency are the ones shoppers in that country see.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Optional interface language code (hl), such as en, de, fr or ja. Empty uses the country's main language."
          },
          "maxProductsPerQuery": {
            "title": "Max products per search",
            "minimum": 1,
            "maximum": 160,
            "type": "integer",
            "description": "Stop each search after this many unique products. Google Shopping shows about 80 to 100 products per search (two pages of 40 plus themed shelves); asking for more returns what Google has.",
            "default": 40
          },
          "maxItems": {
            "title": "Max products in total",
            "minimum": 1,
            "type": "integer",
            "description": "Stop the whole run after this many products across all searches.",
            "default": 1000
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Drop products cheaper than this (in the country's currency). Filtering happens after Google's results come back, so it narrows the ~100 products a search returns; for a deeper price-filtered list, set the price filter on google.com and paste the URL into 'Google Shopping URLs'. Filtered products are not charged."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Drop products more expensive than this (in the country's currency). Filtered products are not charged."
          },
          "onSaleOnly": {
            "title": "Only products on sale",
            "type": "boolean",
            "description": "Keep only products that show an old (struck-through) price. Filtered products are not charged.",
            "default": false
          },
          "includeDetails": {
            "title": "Add product details (paid add-on)",
            "type": "boolean",
            "description": "Also open each product's Google product page and add its description, specifications, rating breakdown and review themes under 'details'. One extra Google request per product, charged as the 'product-details' event.",
            "default": false
          },
          "onlyChanged": {
            "title": "Price watcher: only changed products",
            "type": "boolean",
            "description": "For scheduled runs with 'Product links to price-check'. Remembers each product's lowest price, its seller and every seller's price under the watcher name, and returns only products that are new or changed since the last run (changeType, previousLowestPrice, priceChange). Each link is still read and charged on every run; unchanged ones are just left out of the results. Keyword searches always return all products, because Google reshuffles them on every load.",
            "default": false
          },
          "watcherName": {
            "title": "Watcher name",
            "type": "string",
            "description": "Name of the price watcher's memory (stored in your key-value store 'google-shopping-scraper-state'). Use a different name for each schedule you run.",
            "default": "default"
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many Google pages to fetch at the same time.",
            "default": 8
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}