{
  "openapi": "3.0.1",
  "info": {
    "title": "Kohl's Scraper - Products, Prices, Ratings & Reviews",
    "description": "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.",
    "version": "0.1",
    "x-build-id": "oDxLkUz33wfaPRyGe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~kohls-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-kohls-com-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/abotapi~kohls-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-kohls-com-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/abotapi~kohls-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-kohls-com-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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "urls"
            ],
            "type": "string",
            "description": "Search mode walks keyword search result pages. Links mode walks the storefront links you paste: search pages, category pages and product pages.",
            "default": "urls"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keyword searches to walk (search mode). Each term walks its result pages in order.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Storefront links",
            "type": "array",
            "description": "Links to walk (links mode): keyword search pages, category/catalog pages and product pages. Bare search/catalog/product links all work.",
            "default": [
              {
                "url": "https://www.kohls.com/search.jsp?search=womens+jeans&PPP=120"
              },
              {
                "url": "https://www.kohls.com/catalog/mens-clothing.jsp"
              },
              {
                "url": "https://www.kohls.com/product/prd-7327369/nike-v5-rnr-womens-running-shoes.jsp"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Automatic US proxies are the default and work for most runs. Residential US proxies give the most reliable results; choosing them is your call, and they use more of your plan's proxy traffic. The Apify Free plan includes no proxy access, so supply your own proxy URLs or use a paid plan.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyCountry": "US"
            }
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "fetchReviews": {
            "title": "Fetch reviews",
            "type": "boolean",
            "description": "Collect customer reviews per product (rating summary, distribution and up to Max reviews review texts). Billed per record that delivered reviews.",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "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).",
            "default": 20
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Internal: continues an interrupted run. Records already collected by that run are skipped, and the walk picks up where it stopped."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Internal: names the incremental baseline so several differently-scoped runs can track separately. Empty derives the key from the run's scope."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records",
            "type": "boolean",
            "description": "Incremental mode: also emit rows whose tracked fields did not change (changeType UNCHANGED) instead of suppressing them.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records",
            "type": "boolean",
            "description": "Incremental mode: emit EXPIRED rows for tracked products that disappeared from a complete scan of the scope.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after missed scans",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "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.",
            "default": 1
          },
          "changeScope": {
            "title": "Change scope (incremental mode only)",
            "enum": [
              "all",
              "priceAndStock"
            ],
            "type": "string",
            "description": "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.",
            "default": "all"
          },
          "compactUpdates": {
            "title": "Compact UPDATED and EXPIRED rows (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "mcpConnectors": {
            "title": "MCP connectors",
            "type": "array",
            "description": "Internal: connector ids that receive the run's records as they push.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "Internal: parent page for the Notion connector."
          },
          "maxNotifyListings": {
            "title": "Max listings to notify",
            "type": "integer",
            "description": "Internal: cap on records sent to connectors per run.",
            "default": 50
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum records this run may push. Values above 100000 are treated as 100000. 0 means the 100000 cap.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}