Kohl's Scraper at a glance
Kohl'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 max, 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.60 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.60 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 19 options
Scrape Kohl's (kohls.com) products by keyword search or category browsing. Extract product names, brands, prices, descriptions, ratings, customer reviews and detailed product information. Ideal for price comparison, competitor analysis, product research and retail market intelligence.
What Kohl's Scraper can do
- Two ways in. Point it at keyword searches, or paste any storefront links - search pages, category/catalog pages and product pages all walk with the same grammar.
- Deep product records. Every listing row carries title, price (with sale and was-price ranges), rating, review count, badges and the full colorway list; detail enrichment adds the description, brand, per-variant SKUs, availability, sizes, image gallery and breadcrumbs.
- Customer reviews included. Rating summary, star distribution and up to 20 review texts per product, with verified-purchaser and fit/size feedback fields.
- Scheduled-run friendly. Incremental mode classifies every product NEW / UPDATED / UNCHANGED / EXPIRED across runs, so a daily monitor pushes only what moved, and resume mode continues an interrupted walk exactly where it stopped.
- Fast and light. The actor reads the storefront's own page data directly over US connections, a few seconds per page, and moves to a fresh connection automatically when one is refused.
Choose what to collect
These inputs let you configure Kohl's Scraper - Products, Prices, Ratings & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | Search mode walks keyword search result pages. Links mode walks the storefront links you paste: search pages, category pages and product pages. |
searchTermsarray | Keyword searches to walk (search mode). Each term walks its result pages in order. |
urlsarray | Links to walk (links mode): keyword search pages, category/catalog pages and product pages. Bare search/catalog/product links all work. |
fetchDetailsboolean | Read each product's detail page: description, brand, per-variant SKUs, availability, colors (with out-of-stock markers), sizes, image gallery, breadcrumbs and specs. Billed per enriched record. |
fetchReviewsboolean | Collect customer reviews per product (rating summary, distribution and up to Max reviews review texts). Billed per record that delivered reviews. |
maxReviewsinteger | Cap on review texts collected per product (values above 1000 are treated as 1000). 0 skips review texts (rating summary still fetched with Fetch reviews on). |
resumeFromRunIdstring | Internal: continues an interrupted run. Records already collected by that run are skipped, and the walk picks up where it stopped. |
Show 12 more inputs
| Input | What it controls |
|---|---|
incrementalModeboolean | Track changes across scheduled runs: each product is classified NEW, UPDATED, UNCHANGED or EXPIRED against the previous run of the same scope, and unchanged rows are suppressed unless you ask for them. Rows from search and category pages compare only the fields on the listing card: title, price, price range, was price, discount, price label, rating, review count, image, badges and colours. Pasted product links compare the full product-page record (availability, colours out of stock, sizes, specs, sellers, description and categories as well). A change in a compared field marks the row UPDATED and lists it in changedFields. Never compared (kept in the output): reviews, scrape time, grid position and list name. Use Change scope to narrow the comparison to price and availability. |
stateKeystring | Internal: names the incremental baseline so several differently-scoped runs can track separately. Empty derives the key from the run's scope. |
emitUnchangedboolean | Incremental mode: also emit rows whose tracked fields did not change (changeType UNCHANGED) instead of suppressing them. |
emitExpiredboolean | Incremental mode: emit EXPIRED rows for tracked products that disappeared from a complete scan of the scope. |
expireAfterMissedScansinteger | Incremental mode with Emit expired records: a product is marked EXPIRED only after it was missing from this many consecutive complete scans. 1 expires it at the first complete scan that misses it. EXPIRED means the product dropped out of the scanned listing; without opening its page a listing drop and a delisting cannot be told apart, so use the price and availability fields for stock. |
changeScopestring | Incremental mode: all compares every field. priceAndStock marks a row UPDATED only when its price, was price, discount or price label moved; availability and colours out of stock are tracked only on pasted product-link rows (search and category rows carry no stock data when they are compared). Title, images, badges, descriptions and other metadata never create an UPDATED row. Changing the scope changes the automatic state key, so the first run under a new scope is all NEW; set a State key to keep one baseline. |
compactUpdatesboolean | Incremental mode: UPDATED and EXPIRED rows carry only identifiers, the current price and availability, priceChanges (old/new per moved field) and variantChanges. NEW rows stay full. Product-page and review fees are not charged on a compact row, because it no longer carries that data. |
ignoreFieldsForChangesarray | Incremental mode: field names that never decide UPDATED or appear in changedFields. They stay in the output. Use a plain name (rating) or a dotted path (offers.price) for a key inside every element of a list. |
mcpConnectorsarray | Internal: connector ids that receive the run's records as they push. |
notionParentPageUrlstring | Internal: parent page for the Notion connector. |
maxNotifyListingsinteger | Internal: cap on records sent to connectors per run. |
maxItemsinteger | Maximum records this run may push. Values above 100000 are treated as 100000. 0 means the 100000 cap. |
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)priceMaxPrice max (number)wasPriceWas price (number)discountPercentDiscount % (number)ratingRating (number)reviewsCountReviews (number)availabilityAvailability (text)colorsColors (json)badgesBadges (json)Show 30 more fields
positionPosition (number)urlURL (link)descriptionDescription (text)skuSKU (text)skusSKUs (json)colorsOutOfStockColors out of stock (json)sizesSizes (json)specsSpecs (json)imageUrlImage (link)imageUrlsImages (json)breadcrumbsBreadcrumbs (json)categoryPathCategory path (json)departmentDepartment (text)categoryCategory (text)subcategorySubcategory (text)reviewsreviewsidReview ID (text)textReview text (text)authorAuthor (text)locationLocation (text)submissionTimeSubmitted (text)verifiedPurchaserVerified (boolean)isRecommendedRecommended (boolean)helpfulVotesHelpful votes (number)fitFit (text)sizeSize feedback (text)changeTypeChange (text)changedFieldsChanged fields (json)firstSeenAtFirst seen (text)lastSeenAtLast seen (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordId": "kohls:7327369",
"productId": "7327369",
"title": "Nike V5 RNR Women's Running Shoes",
"brand": "Nike",
"price": 95,
"priceMax": null,
"wasPrice": null,
"currency": "USD",
"rating": 4.2,
"reviewsCount": 468,
"badges": [
"Best Seller"
],
"colors": [
"Pink Black",
"White",
"Silt Red"
],
"availability": "InStock",
"url": "https://www.kohls.com/product/prd-7327369/nike-v5-rnr-womens-running-shoes.jsp"
}Ways to use this data
- Who: pricing teams tracking Kohl's promos on competitive assortments - sale and was-price ranges land per row, updated per scheduled run.
- Who: sellers and brands auditing their shelf - badges (Best Seller, clearance), colorway coverage, availability and review velocity per product.
- Who: analysts building category datasets - walk any catalog page with the same card 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 Kohl's Scraper return?
The documented output for Kohl's Scraper includes product id, title, brand, price, price max, was price, discount % and rating. Availability of each field depends on the source page and the selected mode.
How much does Kohl's Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.60 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
How do I run Kohl's Scraper - Products, Prices, Ratings & Reviews?
Open the actor on Apify, review the input form and current pricing, then run it with your chosen input. Inspect the output before using it in a larger workflow.
Where can I request a different source or output?
Contact us with the source URLs, fields you need and expected collection frequency. We can discuss a custom scraper or data pipeline.
