# Lowes Scraper API > Source: https://scrape.do/documentation/lowes-api/ Fetch Lowes product pages, search results, and category listings scoped to a specific store The Lowes API fetches `lowes.com` pages through a store-scoped session. Every request carries a store ID and zip code, so prices, stock, and fulfillment options come back as that specific store serves them rather than from a default location. > [!NOTE] > The response format depends on which URL you send. Product and search pages return **HTML**, while Lowes' own product APIs (`/wpd/…` and `/pl/…/products`) return **JSON**. See [URL patterns](#url-patterns). ## Endpoint ``` https://api.scrape.do/plugin/lowes/store ``` Each successful request costs **10 credits**. Requests rejected with `400` are not charged. ### Basic Example ```bash curl "https://api.scrape.do/plugin/lowes/store?token=YOUR_TOKEN&url=https%3A%2F%2Fwww.lowes.com%2Fpd%2FDisney-Airblown-Holiday-Stitch%2F5016066683&zipcode=28202&storeid=0595" ``` ### Request Parameters `url`, `zipcode`, and `storeid` are all required. Omitting any of them returns `400` before the page is fetched, so the request costs nothing. | Parameter | Type | Description | |-----------|------|-------------| | `token` | string | Your Scrape.do API authentication token | | `url` | string | Full Lowes URL, URL-encoded. Must be on `lowes.com` and match an accepted [pattern](#url-patterns) | | `zipcode` | string | Numeric zip code, digits only, for example `28202` | | `storeid` | string | Numeric Lowes store ID, digits only, for example `0595` | ### Optional Parameters | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `disableretry` | `true` / `false` | `false` | Disables retry logic for the request | | `transparentresponse` | `true` / `false` | `false` | Returns the raw upstream response on timeout instead of a `502` | | `timeout` | number | system max | Per-request timeout in milliseconds | --- ## URL Patterns Only these paths are accepted. Anything else returns `400 valid lowes url expected`. | Pattern | Returns | Example | |---------|---------|---------| | `/pd//` | HTML | `https://www.lowes.com/pd/Disney-Airblown-Holiday-Stitch/5016066683` | | `/search…` | HTML | `https://www.lowes.com/search?searchTerm=socket+holder` | | `/pl///products` | JSON | `https://www.lowes.com/pl/power-tools/4294607842/products` | | `/wpd//productdetail///` | JSON | `https://www.lowes.com/wpd/1000002288/productdetail/0208/Guest/92253` | | `/collections/api/items//COLL_MANDATORY///` | JSON | Collections API. Needs a real collection group ID; an invalid one returns Lowes' own `400 Invalid request params input` | | `/purchase/api/cart/cartitems` | JSON | Cart-add endpoint. Lowes expects `POST` here, and async plugin jobs always issue `GET`, so a plain request returns `404` | ### Path Segments Must Match Your Parameters For `/wpd/…` and `/collections/…` URLs, the `` and `` segments inside the path must match the `storeid` and `zipcode` parameters exactly. A mismatch returns: ```json { "error": "valid lowes url expected", "message": "Please ensure that url match with the provided zipcode and storeid parameters." } ``` ### JSON Responses `/pl/…/products` returns a paginated category listing: ```json { "itemCount": 6878, "sponsoredItemCount": 4, "adjustedNextOffset": 20, "categories": [{ "name": "Power Tools", "nValue": "4294607842" }] } ``` `itemCount` reflects Lowes' live catalog and changes between requests. Use `adjustedNextOffset` to page through results. `/wpd/…` returns product detail keyed by item ID: ```json { "productDetails": { "5016066683": { "product": { "omniItemId": "5016066683", "brand": "Disney", "additionalBadges": ["Only at Lowes"] } } } } ``` --- ## Notes - Store scoping is real, not cosmetic. The same product URL fetched with different `storeid` values returns pages carrying those respective store numbers, along with their own pricing and availability. - Search result pages are the largest responses, often exceeding 500 KB. - The last two patterns in the table pass the plugin's URL check but still depend on Lowes accepting the request. A `400` or `404` coming back as JSON or HTML from Lowes itself is a target-side rejection, not a plugin error. ## Error Responses | Status | Body | Cause | |--------|------|-------| | `400` | `{"error":"invalid url provided"}` | `url` parameter missing | | `400` | `{"error":"zipcode is required"}` | `zipcode` parameter missing | | `400` | `{"error":"storeid is required"}` | `storeid` parameter missing | | `400` | `{"error":"valid lowes url expected"}` | URL is not on `lowes.com`, or does not match an accepted pattern | | `400` | `{"error":"valid lowes url expected","message":"Please ensure that url match with the provided zipcode and storeid parameters."}` | `/wpd/…` path segments do not match the `storeid` and `zipcode` parameters | Rejected requests are not charged.