{
  "openapi": "3.0.1",
  "info": {
    "title": "Home Depot, Lowe's & Menards Prices + Store Availability (US)",
    "description": "Local prices, sale prices, ratings and nearby-store availability for Home Depot, Lowe's and Menards products, read from Google Shopping by keyword or model number and US ZIP code, plus the retailer's item ID and product URL when Google links it. Optional store address, phone and hours. No login.",
    "version": "0.1",
    "x-build-id": "eLX4eOY6tqOp6XnT5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yugenox~home-improvement-prices/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yugenox-home-improvement-prices",
        "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/yugenox~home-improvement-prices/runs": {
      "post": {
        "operationId": "runs-sync-yugenox-home-improvement-prices",
        "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/yugenox~home-improvement-prices/run-sync": {
      "post": {
        "operationId": "run-sync-yugenox-home-improvement-prices",
        "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": [
          "searchTerms"
        ],
        "properties": {
          "searchTerms": {
            "title": "🔎 Search terms or model numbers",
            "type": "array",
            "description": "Products to look up, e.g. \"cordless drill\" or \"LED shop light\". For one exact product, use the brand plus the model number, e.g. \"milwaukee 2904-22\" (for a bare model number Google mostly shows related products). Each term is searched separately for every retailer and ZIP code.",
            "items": {
              "type": "string"
            }
          },
          "retailers": {
            "title": "🏬 Retailers",
            "type": "array",
            "description": "Which stores' listings to keep. Each retailer is one Google Shopping search per term and ZIP code. Menards only has stores in the Midwest.",
            "items": {
              "type": "string",
              "enum": [
                "homedepot",
                "lowes",
                "menards"
              ],
              "enumTitles": [
                "The Home Depot",
                "Lowe's",
                "Menards"
              ]
            },
            "default": [
              "homedepot",
              "lowes",
              "menards"
            ]
          },
          "zipCodes": {
            "title": "📍 US ZIP codes",
            "type": "array",
            "description": "Localizes results to the stores near each ZIP code: local prices plus Google's nearby-store flag (\"In store, Marietta\" / \"Pickup, Marietta\"). Leave empty to search without a location: Google then picks a location itself, so prices may be one area's local price and listings get no nearby-store flag.",
            "items": {
              "type": "string"
            }
          },
          "storeCities": {
            "title": "Only these store cities",
            "type": "array",
            "description": "Keep only listings that Google flags at a store in one of these cities, e.g. \"Fort Worth\" or \"Marietta\". Case, dots and the usual abbreviations don't matter (\"Ft. Worth\" = \"Fort Worth\", \"St. Louis\" = \"Saint Louis\"). Needs ZIP codes. Listings at other stores or without a store flag are skipped and not charged; the status message lists the store cities Google showed, so you can pick from them.",
            "items": {
              "type": "string"
            }
          },
          "onlyInStore": {
            "title": "Only listings available at a nearby store",
            "type": "boolean",
            "description": "Keep only listings that Google flags as in store or pickup near the ZIP code. Needs at least one ZIP code.",
            "default": false
          },
          "onlyModelMatches": {
            "title": "Only exact model-number matches",
            "type": "boolean",
            "description": "For searches that contain a model number (e.g. \"milwaukee 2904-22\"): keep only listings whose title contains that model number. Related products Google also shows are skipped and not charged. Note that some retailer titles on Google leave the model number out, so this can skip the right product too. Keyword searches are not affected.",
            "default": false
          },
          "includeStoreInfo": {
            "title": "Add the nearest store's details",
            "type": "boolean",
            "description": "Adds one row per retailer and ZIP code with the store Google shows for \"<retailer> near <ZIP>\": name, address, phone, opening-hours line, rating, and the other nearby stores. Needs ZIP codes. Costs one extra search page per retailer and ZIP.",
            "default": false
          },
          "includeProductIds": {
            "title": "🏷️ Add the retailer's product ID and product page URL",
            "type": "boolean",
            "description": "Adds the Home Depot / Lowe's / Menards item ID (retailerProductId, also as sku) and the product page link (productUrl, also as url) to each listing. They come from the store's own link in Google Shopping's product listing for that listing (Google's product page, never the retailer's site itself). When that listing carries no link to the store, the ID is looked up in Google's index of the store's site by the listing's model number (exact model-number matches only). Charged per listing that gets an ID.",
            "default": true
          },
          "maxIdLookups": {
            "title": "Max ID lookups",
            "minimum": 0,
            "type": "integer",
            "description": "Every listing's ID comes from its own Google Shopping product listing (one lookup per listing). A listing whose product listing has no link to the store, and whose title names a model number, gets one more Google search for that model number; this caps those extra searches for the whole run. 0 = no extra searches. You pay per ID found, not per search.",
            "default": 100
          },
          "maxItemsPerQuery": {
            "title": "🔢 Max listings per search",
            "minimum": 0,
            "type": "integer",
            "description": "Listings to keep for each search term × retailer × ZIP code. One Google Shopping page holds about 40; to also use the second page, set 80 (or 0 = no limit) and turn on the option below.",
            "default": 40
          },
          "includePage2": {
            "title": "Also read the second results page",
            "type": "boolean",
            "description": "Reads a second Google Shopping page when the first one did not reach Max listings per search (about 40 more listings, mostly without a nearby-store flag). Costs one more search page per search.",
            "default": false
          },
          "maxItems": {
            "title": "Max rows (total)",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on rows for the whole run. 0 = no cap.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Google results are read through Apify's GOOGLE_SERP proxy. Keep the default.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "GOOGLE_SERP"
              ]
            }
          },
          "_noSerpProxy": {
            "title": "Run without the GOOGLE_SERP proxy",
            "type": "boolean",
            "description": "Internal (canaries): behave exactly like an account without the GOOGLE_SERP proxy group.",
            "default": false
          },
          "_concurrency": {
            "title": "Pages in flight",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Internal: Google pages fetched in parallel (1-8).",
            "default": 4
          },
          "_hedgeAfterSecs": {
            "title": "Hedge slow pages after (seconds)",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "Internal: a page with no answer after this many seconds gets a second request on another connection. 0 = off.",
            "default": 20
          },
          "_noIdCache": {
            "title": "Skip the product-ID cache",
            "type": "boolean",
            "description": "Internal: do not read or write the named key-value store that remembers product IDs between runs.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}