{
  "openapi": "3.0.1",
  "info": {
    "title": "Lowe's Product Scraper · Prices, Store Stock, Specs & UPC",
    "description": "Scrape Lowe's by category, search or product URL, keyword or item number. Get price, was price, sale end date, rating, reviews, stock by fulfilment method, and one store's price, shelf count and pickup. Add full specs, description, UPC, dimensions and manuals per product. JSON, CSV, Excel.",
    "version": "0.0",
    "x-build-id": "iy1CcadBUIREY8bWA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~lowes-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-lowes-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/memo23~lowes-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-lowes-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/memo23~lowes-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-lowes-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": {
          "startUrls": {
            "title": "Lowe's URLs",
            "type": "array",
            "description": "Lowe's pages to scrape, in any mix: category listings (<code>lowes.com/pl/…/4294607728</code>, a brand in the path works too), best-seller pages (<code>lowes.com/best-sellers/…/{id}</code>), search pages (<code>lowes.com/search?searchTerm=cordless+drill</code>) and product pages (<code>lowes.com/pd/…/5013207487</code>). Every source yields product rows. Department landing pages (<code>lowes.com/c/…</code>) have no product list: open a category under them and paste its <code>/pl/</code> URL. Example: <code>https://www.lowes.com/pl/power-tools/drills-drivers/4294607728</code>.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Each keyword runs as its own Lowe's search, up to about 740 results. Rows carry national prices. When Lowe's answers a keyword with a category page, that category is paged instead, and a selected store applies there. An item or model number goes straight to its product. Example: <code>cordless drill</code>.",
            "items": {
              "type": "string"
            }
          },
          "itemIds": {
            "title": "Product IDs or item numbers",
            "type": "array",
            "description": "Lowe's product IDs (the 10-digit number at the end of a product URL, e.g. <code>5013207487</code>) or item numbers (the \"Item #\" on the product page and shelf tag, e.g. <code>4913878</code>), one per line. Each becomes one product row at national prices. <b>Product IDs are the reliable choice</b>: they load directly. An item number is first looked up through Lowe's search page, which is sometimes out of reach; when it is, that number is skipped and the run log says so.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on product rows across all sources. Every row is billed, so this is the spending limit. Rows removed by the filters below do not count toward it. Free-plan users get up to 25 products per run with every field included; paid plans have no cap. Default: 100.",
            "default": 100
          },
          "includeDetails": {
            "title": "Add product-page details",
            "type": "boolean",
            "description": "Open each product's own page for the long description, feature bullets, the full specification table, UPC, dimensions and weight, manuals, the ENERGY STAR and Lowe's-exclusive flags, and the date Lowe's first listed it. One extra page per product, so runs take longer, and each row that gets these fields is billed one extra <code>additional-data</code> event. Off by default: listing rows already carry price, sale, rating, stock and key specs.",
            "default": false
          },
          "storeId": {
            "title": "Lowe's store number",
            "type": "string",
            "description": "Store number, e.g. <code>0595</code> (Mooresville, NC); leading zeros are optional. Category and best-seller listings then carry that store's price, shelf quantity (<code>storeQuantity</code>) and pickup availability. Keyword searches and product pages stay at national prices. Leave empty for national prices."
          },
          "zipCode": {
            "title": "ZIP code",
            "type": "string",
            "description": "Five-digit US ZIP code, e.g. <code>28117</code>, used to find the nearest store when <b>Lowe's store number</b> is empty. The run log names the store it picked. If no store is found, prices stay national and the log says so; a store number skips the lookup."
          },
          "sort": {
            "title": "Sort category listings by",
            "enum": [
              "featured",
              "bestSellers",
              "highestRated",
              "newest",
              "priceLowToHigh",
              "priceHighToLow",
              "brand"
            ],
            "type": "string",
            "description": "Order of category listings, which decides which products come first when Max products ends the run early. <b>Price</b> sorts need a store (Store number or ZIP code): Lowe's sorts by price only within a store, and without one the listing keeps its featured order and the log says so. <b>Brand</b> returns the category brand by brand, A to Z, in Lowe's featured order within each brand; the few products Lowe's lists without a brand come last. Best-seller URLs keep their best-seller order unless you pick another sort here. Keyword searches keep Lowe's own relevance order. Default: Featured.",
            "default": "featured"
          },
          "splitLargeCategories": {
            "title": "Go past 600 products per category",
            "type": "boolean",
            "description": "One Lowe's listing pages through about 600 products. When a category holds more and Max products asks for more than 600, the run walks its subcategories (or, for a category without any, its brands) to reach the rest, with duplicates removed. Turn off to stop at the first 600 of each category. Default: on.",
            "default": true
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Keep only products with a was price, meaning Lowe's currently shows them marked down. With a store selected, category listings also use Lowe's own On Sale filter, so the run reaches sale items past the first ~600 products of a category. Default: off.",
            "default": false
          },
          "inStockOnly": {
            "title": "In stock only",
            "type": "boolean",
            "description": "Keep only products Lowe's can sell you now through at least one fulfilment method (parcel, delivery or pickup), as Lowe's own In stock filter does. With a store selected, that means available from that store, and category listings ask Lowe's for in-stock products only. To keep only units on the store's shelf, use On the shelf only. Default: off.",
            "default": false
          },
          "onShelfOnly": {
            "title": "On the shelf only",
            "type": "boolean",
            "description": "Needs a store (storeId or zipCode). Keep only products with units on the shelf at that store (storeQuantity above 0), for same-day pickup. Stricter than In stock only: Lowe's ships many in-stock products it does not shelve at every store. Keyword and product rows carry no store, so they are judged as In stock only. Default: off.",
            "default": false
          },
          "minPrice": {
            "title": "Min price (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Drop products priced below this many US dollars, e.g. <code>25</code>. For a product sold as a price range, the low end is compared. Empty means no lower bound."
          },
          "maxPrice": {
            "title": "Max price (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Drop products priced above this many US dollars, e.g. <code>200</code>. For a product sold as a price range, the low end is compared. Empty means no upper bound."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Category listings and product pages fetched in parallel, from 1 to 16. Raise it to speed up large runs with product-page details. Default: 6.",
            "default": 6
          },
          "cacheMaxAgeHours": {
            "title": "Reuse recent results (hours)",
            "minimum": 0,
            "maximum": 720,
            "type": "integer",
            "description": "When one of your earlier runs already fetched a Lowe's search or product page, reuse it if it is younger than this many hours instead of fetching it again. Repeat runs then finish in seconds instead of minutes, and the pages are kept per account: only your own runs' pages are reused, never another user's. Category listings are always fetched live. <b>What a longer window costs you:</b> a reused page carries the price, sale, fulfilment and stock that were on it when it was fetched, so at 24 hours you can be reading yesterday's price as today's. The default of 1 hour is chosen for that reason — it is long enough to stop one bulk job fetching the same product page twice, short enough that the figure is still current. The store a <code>zipCode</code> maps to is Lowe's public store directory, not your data, so it is remembered for 30 days and shared by all users, and a repeat ZIP skips the store lookup. Set 0 to always fetch fresh, store lookup included. Default: 1.",
            "default": 1
          },
          "proxy": {
            "title": "Own proxies (optional)",
            "type": "object",
            "description": "Leave empty and the actor uses its own US residential connection, which Lowe's requires. To use your own proxies instead, enter custom proxy URLs: they must be US residential exits, because Lowe's refuses datacenter and non-US IPs. They carry the category listings; keyword searches and product pages always go through the actor's own page service. Apify Proxy settings in this field are not used."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}