Lowe's Scraper icon

Lowe's Scraper

Scrape Lowe's (lowes.com) home improvement, tools, appliances and building supplies by keyword search. Extract product names, brands, prices,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Lowe's Scraper at a glance

Lowe's Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes product id, title, brand, price and price unavailable reason, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Other
Pricing
$2.00 per 1,000 results (Free plan), from $1.70 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
20 options

Scrape Lowe's (lowes.com) home improvement, tools, appliances and building supplies by keyword search. Extract product names, brands, prices, descriptions, specifications, stock availability, ratings and customer reviews. Ideal for price monitoring, competitor analysis and retail market research.

What Lowe's Scraper can do

  • Two ways in. Point it at keyword searches, or paste storefront links - search pages, category pages and product pages all walk with the same grammar.
  • Deep product records. Every listing row carries title, brand, price (with was-price), the per-unit price when the storefront publishes one, stock quantity, rating, review count, badges, promotions and the spec table; detail enrichment adds the description, model number, barcode, availability, variants and the full image gallery.
  • Customer reviews included. Rating summary, star distribution and up to 20 review texts per product, with verified-purchaser, recommendation and helpful-vote fields.
  • Scheduled-run friendly. Incremental mode classifies every product NEW / UPDATED / UNCHANGED / EXPIRED across runs, so a daily monitor pushes only what moved; a product whose listing data did not change is neither read again nor charged. A price-and-availability scope, compact change rows and a grace period before EXPIRED keep a price monitor cheap.
  • Resume that never double-charges. Paste the ID of an interrupted run and the products it already collected are skipped (and not billed again); a run the platform restarts continues by itself.
  • Built for the wall. The storefront's edge refuses most scripted readers, so the actor reads the storefront's own listing and product data over residential US exits and moves to a fresh exit automatically whenever one is refused.

Choose what to collect

These inputs let you configure Lowe's Scraper - Products, Prices, Stock & Reviews. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestringSearch mode walks keyword search result pages. Links mode walks the storefront links you paste: search pages, category pages and product pages.

Choices: search, urls

searchTermsarrayKeyword searches to walk (search mode). Each term walks its result pages in order.
urlsarrayLinks to walk (links mode): keyword search pages, category pages (/pl// links from the storefront's menus) and product pages.
fetchDetailsbooleanRead each product's detail JSON: description, model, availability, full spec table, image gallery and breadcrumbs. Billed per enriched record.
fetchReviewsbooleanCollect customer reviews per product (rating summary, distribution and up to Max reviews review texts). Billed per record that delivered reviews.
maxReviewsintegerCap on review texts collected per product. Values above 100 are treated as 100. 0 skips review texts.
zipCodestringNot applied in this version: prices and stock come from the storefront's default store regardless of the connection country, and the row's storeNumber names it. Leave empty.
Show 13 more inputs
More input fields
InputWhat it controls
maxItemsintegerMaximum records this run may push (up to 100000). 0 means no limit.
resumeFromRunIdstringPaste the run ID or dataset ID of an interrupted run to continue it without returning, or charging for, the products it already collected. A run that is restarted by the platform (for example after a server move) continues by itself and needs no ID. Combine it with Incremental mode to finish an interrupted monitoring run: the products it already returned are not returned again and are tracked as seen. EXPIRED detection never runs on a resumed run. For recurring monitoring of the same scope use Incremental mode below instead.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to derive a key automatically from the scope, so two different scopes never mix state. A shared key with a different scope never produces EXPIRED rows.
emitUnchangedbooleanOff by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED, with the product-page details the last run collected for them. This returns, and bills, rows you already have, so leave it off unless you want a full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return products that were present in a previous run but are no longer in the results, marked EXPIRED. Only produced after a run that read the whole scope to its end: never when Max items capped it, a page could not be read, the time or spending limit stopped it, or Resume was used. A product that left the results is not necessarily unavailable, so consider 'Expire after missed scans' above 1. EXPIRED rows count against Max items (a run returns at most the room left under it; the rest follow on a later complete run) and are returned and billed like any row, so leave it off unless you need expiry tracking.
changeScopestringAll fields (default): any change to the compared product data marks a product UPDATED. Price and availability only: just price, was-price, savings, sale end, unit price, in-stock, pickup and parcel availability, free shipping and per-option price and stock, so title, description or specification edits never produce a billable UPDATED row. Changing this never starts a new baseline: the saved state is kept and each stored product is compared under the new setting.

Choices: all, priceAndStock

compactUpdatesbooleanOff by default. When on, UPDATED and EXPIRED rows are slim: ids, link, title, current price and availability, plus priceChanges (old and new value of each field that moved) and variantChanges (per-option ADDED, REMOVED or CHANGED). NEW rows stay full. A compact row carries no product-page detail or reviews, so no detail or review charge applies to it and the product page is not read.
watchStockQuantitybooleanOff by default. The units-in-stock counter ticks as the product sells, so counting it marks fast sellers UPDATED, and bills them, on most scans. Turn on to compare it anyway. In-stock, pickup and parcel availability are always compared.
expireAfterMissedScansintegerUsed with 'Emit expired products'. A product is marked EXPIRED only after it was missing from this many COMPLETE scans in a row (default 1). Dropping out of a result list is not the same as being unavailable, so 2 or more avoids false expiries; a product that returns resets the count.
ignoreFieldsForChangesarrayA list of field names that must not count as a change, for example ["title", "badges"]. Use a dotted path to ignore a key inside every element of a list, for example variants.label. Ignored fields are still returned in the row. Scrape time, rank, nearest store, delivery detail, stock units, review count and average rating are already ignored by default. Changing this list never starts a new baseline: the saved state is kept and every stored product is re-compared under the new list.
mcpConnectorsarrayInternal: connector ids that receive the run's records as they push.
notionParentPageUrlstringInternal: parent page for the Notion connector.
maxNotifyListingsintegerInternal: cap on records sent to connectors per run.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

productIdProduct ID (text)
titleTitle (text)
brandBrand (text)
pricePrice (number)
priceUnavailableReasonPrice unavailable reason (text)
wasPriceWas price (number)
stockQuantityStock qty (number)
ratingRating (number)
reviewsCountReviews (number)
availabilityAvailability (text)
sponsoredSponsored (boolean)
badgesBadges (json)
Show 51 more fields
positionPosition (number)
urlURL (link)
savingsPercentSavings % (number)
inStockIn stock (boolean)
descriptionDescription (text)
modelIdModel (text)
linLIN (text)
barcodeBarcode (text)
pricePerUnitPrice per unit (text)
specsSpecs (json)
variantsVariants (json)
imageUrlImage (link)
imageUrlsImages (json)
breadcrumbsBreadcrumbs (json)
categoryPathCategory path (json)
brandIdBrand ID (text)
groupsCollections (json)
collectionCollection (json)
categoriesCategory IDs (json)
merchandisingHierarchyMerchandising hierarchy (json)
measurementsDimensions (json)
guidesGuides (json)
imagesImages (json)
videosVideos (json)
statusStatus (text)
lowesExclusiveExclusive (boolean)
energyStarEnergy Star (boolean)
priceInfoPrice details (json)
savingsAmountSavings (number)
saleEndsAtSale ends (text)
promotionsPromotions (json)
inventoryAvailability by method (json)
storeInfoPricing store (json)
pickupEligiblePickup (boolean)
parcelEligibleParcel (boolean)
freeShippingFree shipping (boolean)
reviewsreviews
idReview ID (text)
textReview text (text)
authorAuthor (text)
submissionTimeSubmitted (text)
verifiedPurchaserVerified (boolean)
isRecommendedRecommended (boolean)
helpfulVotesHelpful votes (number)
photosPhotos (number)
changeTypeChange (text)
changedFieldsChanged fields (json)
firstSeenAtFirst seen (text)
lastSeenAtLast seen (text)
priceChangesPrice changes (json)
variantChangesOption changes (json)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "recordId": "lowes:5016412045",
  "productId": "5016412045",
  "title": "20-volt 1/2-in Keyless Brushless Cordless Drill",
  "brand": "CRAFTSMAN",
  "price": 129,
  "wasPrice": null,
  "currency": "USD",
  "stockQuantity": 423,
  "rating": 4.9,
  "reviewsCount": 96,
  "badges": [
    "LOWES EXCLUSIVE"
  ],
  "availability": "In Stock",
  "url": "https://www.lowes.com/pd/CRAFTSMAN-20-volt-Max-1-2-in-Keyless-Brushless-Cordless-Drill/5016412045"
}

Ways to use this data

  • Who: pricing teams tracking Lowe's promos on competitive assortments - price and was-price land per row (plus a per-unit price where the storefront lists one), updated per scheduled run.
  • Who: sellers and brands auditing their shelf - badges, promotions, stock quantities and review velocity per product.
  • Who: analysts building home-improvement datasets - walk any keyword search with the same grammar and export straight to CSV/Excel or a warehouse.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Lowe's Scraper return?

The documented output for Lowe's Scraper includes product id, title, brand, price, price unavailable reason, was price, stock qty and rating. Availability of each field depends on the source page and the selected mode.

How much does Lowe's Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

What happens if a monitoring run is interrupted?

The rows a run returned before it ended are remembered (a run that reaches its time limit finishes cleanly with them, and a run that is aborted or moved by the platform saves them as it ends), so the next run does not return them again, and Resume skips the products an interrupted run already collected. If a run is killed outright without notice (for example out of memory), the last few rows it returned can come back once more on the next run; pasting that run's ID into Resume closes even that gap.

Ready to collect with Lowe's Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.