# Kohl's Product Scraper (`axlymxp/kohls-product-scraper`) Actor

Scrape Kohl's (kohls.com) products — title, regular/sale/Your Price, ratings, review counts, SKUs, colors, availability, brand and category. Search by keyword (no proxy) or enrich with full detail. Clean JSON for Sheets, BI or your CRM. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/kohls-product-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** E-commerce, AI, Agents
- **Stats:** 4 total users, 2 monthly users, 92.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 dataset items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Kohl's Product Scraper

Extract structured product data from **Kohl's** (`kohls.com`) at scale — by keyword, by category, or by product ID. Get titles, full pricing (regular, sale, and Kohl's **Your Price**), ratings, review counts, SKUs, colors, availability, and — optionally — brand, descriptions, and category taxonomy. Clean JSON, ready for Sheets, BI, or your database.

The core keyword-search path runs on Kohl's own mobile product API, so it is **fast and needs no proxy** — no browser, no CAPTCHAs, no fragile page scraping.

### Who it's for

- **Price & deal monitoring** — track regular vs. sale vs. Your Price across the Kohl's catalog and spot discount cycles.
- **Competitive & assortment analysis** — monitor pricing, ratings, and product mix by brand or category.
- **E-commerce & PropTech/retail-tech devs** — a stable JSON schema for catalogs, comparison tools, and shopping assistants.
- **Researchers & analysts** — build large, structured Kohl's product datasets for study or modeling.

### What you get

Every row is one Kohl's product. Fields marked **(detail)** require the optional *Include full detail* toggle; everything else comes from the fast, no-proxy search path.

| Field                                                | Type             | Description                                       |
| ---------------------------------------------------- | ---------------- | ------------------------------------------------- |
| `web_id`                                             | string           | Kohl's numeric product ID                         |
| `product_id`                                         | string           | Product ID as `prd-<webID>`                       |
| `title`                                              | string           | Product title                                     |
| `brand`                                              | string           | Brand name **(detail)**                           |
| `url`                                                | string           | Product page URL                                  |
| `image` / `alt_image`                                | string           | Product image URLs (Adobe Scene7)                 |
| `regular_price`                                      | number           | Regular (list) price, USD                         |
| `sale_price`                                         | number           | Sale price, USD (when on sale)                    |
| `your_price`                                         | number           | Kohl's "Your Price" promotional price, USD        |
| `final_price`                                        | number           | Effective price paid: Your Price → sale → regular |
| `save_amount` / `save_percent`                       | number           | Discount vs. regular price                        |
| `price_label` / `sale_status`                        | string           | Price/sale status labels                          |
| `on_sale`                                            | boolean          | Whether the sale price beats the regular price    |
| `your_price_eligible` / `your_price_label`           | boolean / string | Your Price eligibility                            |
| `coupon_eligible`                                    | boolean          | Coupon eligibility                                |
| `rating`                                             | number           | Average rating (0–5)                              |
| `review_count`                                       | integer          | Number of customer reviews                        |
| `sku_ids`                                            | array            | SKU IDs for the product's variants                |
| `colors` / `display_color`                           | array / string   | Available colors and displayed color              |
| `swatches`                                           | array            | Color swatches `{color, image}`                   |
| `variations`                                         | string           | Variation axes, e.g. `SizeAndColor`               |
| `available_for_pickup` / `available_for_ship`        | boolean          | Fulfillment availability                          |
| `availability`                                       | string           | `InStock` / `OutOfStock`                          |
| `badges`                                             | array            | Value-added badges                                |
| `gender` / `department` / `category` / `subcategory` | string           | Taxonomy levels **(detail)**                      |
| `breadcrumbs`                                        | array            | Full breadcrumb trail `{name, url}` **(detail)**  |
| `description` / `description_long`                   | string           | Product descriptions **(detail)**                 |
| `source`                                             | string           | Which input produced the row                      |
| `scraped_at`                                         | string           | ISO-8601 scrape timestamp                         |

### High-value use cases

1. **Deal & promo tracking** — schedule daily runs on your top keywords/categories and diff `final_price`, `save_percent`, and `sale_status` to catch price drops as they happen.
2. **Brand & competitor monitoring** — follow a brand's Kohl's assortment, pricing, and ratings over time.
3. **Catalog enrichment** — hydrate an internal product catalog with Kohl's images, SKUs, colors, and taxonomy.
4. **Merchandising research** — analyze rating/review signals and Your-Price eligibility across departments.
5. **Shopping assistants / AI agents** — feed a normalized product feed straight into an LLM or MCP client.

### Input parameters

| Field                | Type    | Default                | Description                                                                        |
| -------------------- | ------- | ---------------------- | ---------------------------------------------------------------------------------- |
| `searchQueries`      | array   | `[]`                   | Keywords to search (one search per keyword). The fast, no-proxy path.              |
| `categoryDimensions` | array   | `[]`                   | Facet paths to browse, e.g. `Gender:Womens+Department:Clothing`. Uses a US proxy.  |
| `productIds`         | array   | `[]`                   | Web IDs or product URLs to fetch full detail for. Uses a US proxy.                 |
| `maxItems`           | integer | `200`                  | Global cap on total products pushed.                                               |
| `maxPagesPerQuery`   | integer | `5`                    | Search/category pages per query (120 products/page).                               |
| `sort`               | string  | `featured`             | `featured`, `new`, `bestsellers`, `priceAsc`, `priceDesc`, `rating`, `percentOff`. |
| `includeDetails`     | boolean | `false`                | Enrich each product with brand, descriptions, and taxonomy (uses a US proxy).      |
| `proxyConfiguration` | object  | Apify Residential (US) | Used only for the geo-gated add-ons above.                                         |

> Category browse, product-ID detail, and *Include full detail* read Kohl's US-only pages, so they run through a US residential proxy automatically. Plain keyword search does not.

#### Example input

```json
{
    "searchQueries": ["levis jeans", "nike shoes"],
    "maxItems": 200,
    "maxPagesPerQuery": 3,
    "sort": "percentOff",
    "includeDetails": false
}
```

#### Example output (one row)

```json
{
    "web_id": "5178",
    "product_id": "prd-5178",
    "title": "Men's Levi's® 505™ Regular Fit Jeans",
    "url": "https://www.kohls.com/product/prd-5178/levis-505-regular-jeans-men.jsp",
    "image": "https://media.kohlsimg.com/is/image/kohls/5178_Sounds_About_Right?wid=180&hei=180&op_sharpen=1",
    "regular_price": 74.95,
    "sale_price": 52.46,
    "your_price": null,
    "final_price": 52.46,
    "save_amount": 22.49,
    "save_percent": 30.0,
    "currency": "USD",
    "sale_status": "Mixed",
    "on_sale": true,
    "rating": 4.3,
    "review_count": 11201,
    "sku_ids": ["05541003", "69338863"],
    "colors": ["Stonewash", "Black", "Rinse"],
    "variations": "SizeAndColor",
    "availability": "InStock",
    "source": "search:levis jeans",
    "scraped_at": "2026-08-20T00:00:00+00:00"
}
```

### Scheduling & integrations

- **Schedule** runs (hourly/daily) from the Apify Console to keep price and availability data fresh.
- **Webhooks** can trigger on run completion to push new data into your systems.
- Export to **Google Sheets, Excel, JSON, CSV**, or send to **Make, Zapier, Airbyte, S3**, or a database via the Apify API and integrations.

### Use with AI agents (MCP)

This Actor works as a tool for AI assistants through the [Apify MCP server](https://mcp.apify.com). An agent can call it to fetch live Kohl's product data — prices, ratings, availability — and reason over the normalized JSON, no scraping code required.

### FAQ

**Do I need a Kohl's account or API key?** No. The Actor reads publicly available product data.

**Do I need a proxy?** Not for keyword search — it runs without one. Category browse, product-ID detail, and *Include full detail* read Kohl's US-only pages and use a US residential proxy automatically.

**How fresh is the data?** It's fetched live on every run. Schedule the Actor to keep your dataset current.

**How many products can I get?** Use `maxItems` and `maxPagesPerQuery` to control volume. Keyword search paginates automatically.

**Which fields need *Include full detail*?** Brand, descriptions, and taxonomy (gender/department/category/subcategory, breadcrumbs). Prices, ratings, SKUs, colors, and availability are always included. Detail enrichment is optional and best-effort — Kohl's geo-gates product pages, so these fields may be empty for some items, but the core product data is always returned.

**Is scraping Kohl's legal?** The Actor collects only publicly accessible data. You are responsible for using the data in line with applicable laws, Kohl's terms, and your jurisdiction.

**Something broke or you need a new field?** Open an issue on the Actor's page — reliability and schema stability are the priority.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on kohls.com (one search per keyword). This is the fast, no-proxy path and returns full product data. Leave empty if you only use category dimensions or product IDs.

## `categoryDimensions` (type: `array`):

Browse whole categories by Kohl's facet path, e.g. 'Gender:Mens+Product:Jeans+Department:Clothing' (the same value found after CN= in a Kohl's catalog URL). Category browse is US-geo-gated, so a US residential proxy is used automatically.

## `productIds` (type: `array`):

Fetch full detail for specific products by web ID (e.g. '5178' or 'prd-5178') or by product URL. Product detail is US-geo-gated (US residential proxy used automatically, with an Internet-Archive fallback).

## `maxItems` (type: `integer`):

Global cap across all queries, categories and product IDs. The run stops once this many products are pushed to the dataset.

## `maxPagesPerQuery` (type: `integer`):

Search/category pages to fetch per query (120 products per page).

## `sort` (type: `string`):

Result ordering for searches and category browses.

## `includeDetails` (type: `boolean`):

Enrich each product with brand, short/long description and breadcrumb taxonomy (department/category/subcategory) from the product page. This step is US-geo-gated, so a US residential proxy is used automatically and the run is slower. Best-effort: Kohl's blocks some product pages, leaving these fields empty for those items — the core product data (prices, ratings, SKUs, colors, availability) is always returned regardless.

## `proxyConfiguration` (type: `object`):

Proxy used only for the geo-gated add-ons (category browse, product-ID detail, and Include full detail). Keyword search runs without a proxy. A US residential proxy is recommended for the gated endpoints.

## Actor input object example

```json
{
  "searchQueries": [
    "levis jeans",
    "nike shoes"
  ],
  "categoryDimensions": [
    "Gender:Womens+Department:Clothing"
  ],
  "productIds": [
    "5178",
    "https://www.kohls.com/product/prd-5178/levis-505-regular-jeans-men.jsp"
  ],
  "maxItems": 200,
  "maxPagesPerQuery": 5,
  "sort": "featured",
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "levis jeans"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/kohls-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["levis jeans"] }

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/kohls-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "levis jeans"
  ]
}' |
apify call axlymxp/kohls-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/kohls-product-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/FAyXa6rwIpsBKlNC7/builds/lVnsNYyeXTPI8bYsa/openapi.json
