{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Shopping Scraper - Prices, Stores & Offers",
    "description": "Scrape Google Shopping in any country: title, price, old price, discount, currency, store, shipping, condition, rating, reviews, image, product ID and link. Store-by-store offers with direct links, up to every store Google has for the product. Price, condition and store filters. Pay per product.",
    "version": "0.1",
    "x-build-id": "gt5f1EuXlebr1pW4f"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~google-shopping/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-google-shopping",
        "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/scrapewise~google-shopping/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-google-shopping",
        "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/scrapewise~google-shopping/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-google-shopping",
        "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 terms",
            "type": "array",
            "description": "Products or keywords to search on Google Shopping, one per line (for example \"wireless earbuds\", \"running shoes\", a brand or a model name). Each term is searched separately and every row says which term it came from ('searchQuery'). There is no limit on terms per run. Also accepts 'searchQueries', 'searchQuery', 'query' or 'q' from other Google Shopping scrapers.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code (Google's gl), for example us, gb, de, fr, br, in, jp. It sets the stores and the currency Google shows: prices come in that country's currency (USD for us, EUR for de, JPY for jp...). 'countryCode' and 'gl' also work.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Interface language (Google's hl), for example en, de, fr, pt-BR, ja. Product titles stay as the stores wrote them. 'languageCode' and 'hl' also work.",
            "default": "en"
          },
          "maxItems": {
            "title": "Maximum products",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of unique products in this run, across all search terms. You pay per product delivered.",
            "default": 30
          },
          "maxItemsPerQuery": {
            "title": "Maximum products per search term (optional)",
            "minimum": 1,
            "type": "integer",
            "description": "Cap for each term. Set 1 to get exactly one product per term (the top-ranked one). With many terms, set 'Maximum products' to terms x this number so every term is searched. 'num', 'resultsPerPage' and 'maxResultsPerQuery' also work."
          },
          "maxPagesPerQuery": {
            "title": "Maximum Google pages per search term",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Each Google Shopping page brings about 30 to 40 new products. The Actor stops earlier when Google stops showing new products.",
            "default": 10
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "price_low",
              "price_high",
              "rating",
              "reviews"
            ],
            "type": "string",
            "description": "Relevance keeps Google's own order ('position'). The other options sort the products collected for each search term before they are saved. 'sortBy' from other Google Shopping scrapers (LOWEST_PRICE, price_low, review_score...) also works.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "Only products priced at or above this, in the country's currency."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Only products priced at or below this, in the country's currency."
          },
          "itemCondition": {
            "title": "Condition",
            "enum": [
              "any",
              "new",
              "used",
              "refurbished"
            ],
            "type": "string",
            "description": "Filter by the condition Google shows on the product card. 'condition' and 'productCondition' from other scrapers (NEW, used, refurbished...) also work.",
            "default": "any"
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only products with a Google rating at or above this (0 to 5). Products without rating are left out when set."
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Only products with a crossed-out old price or a deal badge (20% OFF, LOW PRICE...).",
            "default": false
          },
          "freeShippingOnly": {
            "title": "Free shipping only",
            "type": "boolean",
            "description": "Only products whose card says free delivery or free shipping.",
            "default": false
          },
          "freeReturnsOnly": {
            "title": "Free returns only",
            "type": "boolean",
            "description": "Only products whose Google card says returns are free (for example \"Free 60-day returns\"). Google shows the return policy on about one card in six, so this filter keeps few products; every product also gets a 'freeReturns' flag and the store offers get 'freeReturns' and 'returnDays' without this filter.",
            "default": false
          },
          "storeFilter": {
            "title": "Stores (optional)",
            "type": "array",
            "description": "Only products sold by these stores (part of the name is enough, for example \"walmart\", \"best buy\", \"amazon\"). 'stores' and 'merchants' (list or comma-separated text) also work.",
            "items": {
              "type": "string"
            }
          },
          "includeStoreLink": {
            "title": "Direct store link for each product",
            "type": "boolean",
            "description": "Adds 'storeUrl': the retailer's own product page (walmart.com, bestbuy.com, the brand's shop...), not a Google link, plus 'storeUrlStore', 'storeUrlPrice' and 'storeUrlMatch' (same offer as the product card, same store, or the cheapest store). Google only puts the store link on the product page, so this opens it once per product: it turns on the store offers and is charged as the same 'Store offers loaded' event, nothing more.",
            "default": false
          },
          "includeOffers": {
            "title": "Include store offers for each product",
            "type": "boolean",
            "description": "Opens each product and adds 'offers': store, price, shipping, availability, returns and the direct store link for the offers Google lists first (usually 3 to 5), plus 'offersAvailable' and the description. One extra Google page per product, charged as a separate event. Turn on 'Include product details' too to get the photos, variants, related products and forum threads of that same page at no extra cost.",
            "default": false
          },
          "includeDetails": {
            "title": "Include product details",
            "type": "boolean",
            "description": "Opens each product page and adds 'images' (the photo gallery, usually 10 to 15), 'variants' (colors or models with their photo), 'relatedProducts' (similar and cheaper options with price, store and rating), 'discussions' (Reddit and forum threads Google links to the product: title, site, age, link), 'attributes' (the product attributes Google lists, such as battery life, color, size or impedance) and 'typicalPriceLow'/'typicalPriceHigh'. It is the same page as the store offers, so it turns them on too and costs the same single event: no extra charge on top of the offers. Full review texts are not in that page and are not collected.",
            "default": false
          },
          "maxStores": {
            "title": "Stores per product (more stores)",
            "minimum": 0,
            "maximum": 300,
            "type": "integer",
            "description": "Get the full 'More stores' list instead of the 3 to 5 stores Google shows first. Leave empty or 0 to keep the default. With 25, each product comes with up to 25 stores; with 300, every store Google has for it (popular products have 100 to 200+). Stores come in pages of 10 and each extra page that brings at least one new store is charged as one more 'Store offers loaded' event ($0.02, about $2 per 1,000 stores). The run stops when Google has no more stores, so you never pay for empty pages. Turns on the store offers and adds 'attributes'. Free plan: up to 30 stores per product."
          },
          "productUrls": {
            "title": "Product links or IDs (optional)",
            "type": "array",
            "description": "Get store offers for specific products: paste Google Shopping product links (the URL with 'prds=' you get when you open a product) or the numeric product IDs from a previous run ('catalogId'). One row per product with its offers.",
            "items": {
              "type": "string"
            }
          },
          "gtins": {
            "title": "Barcodes: EAN / GTIN / UPC (optional)",
            "type": "array",
            "description": "Look up products by barcode, one code per line (EAN-13 such as 7891000100103, UPC-A, EAN-8 or GTIN-14). Each code returns one row: the product Google Shopping matches to that barcode, with its store offers (store, price, shipping, availability, direct link) already loaded. A barcode with no product in the chosen country returns a free row with errorCode GTIN_NOT_FOUND. Also accepts 'eans', 'upcs' and 'barcodes'.",
            "items": {
              "type": "string"
            }
          },
          "compareWithPreviousRun": {
            "title": "Compare prices with the previous run",
            "type": "boolean",
            "description": "Keeps the last price of every product in a key-value store on your account (named after this input, or after 'Snapshot name') and adds to each row: previousPrice, priceChange, priceChangePct, isNewProduct, isNewLowest (lowest price ever seen for that product), lowestSeenPrice, firstSeenAt and previousSeenAt. On the first run every product is new. Schedule the same Task daily to get price history and alerts.",
            "default": false
          },
          "onlyChanged": {
            "title": "Deliver only new products and price changes",
            "type": "boolean",
            "description": "With 'Compare prices with the previous run' on: rows whose price did not move since the previous run are not saved and not charged. 'Maximum products' still counts the products checked, so a daily run costs the same Google pages and you pay only for the rows you get. A search where nothing changed returns one free row with errorCode NO_PRICE_CHANGES.",
            "default": false
          },
          "snapshotName": {
            "title": "Snapshot name (optional)",
            "type": "string",
            "description": "Name of the price history to compare with. Leave empty to derive it from the search terms, barcodes, links and country of this input (the same input always compares with itself). Set it to share one history between different inputs, for example one per brand."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}