ScavioScavio
Pricing
Tools
Sign InsGet Startedg
Blog
Kohls11 min readNov 10, 2026

How to Get Kohl's Clearance Prices, Kohl's Cash Windows and Store Pickup Stock With an API

Get Kohl's clearance prices with Scavio's Kohl's API: the clearance list by percent off, SKU prices, Kohl's Cash windows, codes and pickup units at each store.

Scavio Team

Nov 10, 2026

Try the Kohl's API free
scavio
Ecommerce / Price monitoring
Kohls

To get Kohl's clearance prices programmatically, use Scavio's Kohl's API. POST /api/v1/kohls/deals with type: "clearance" returns the kohls.com Clearance list, 120 items a page, with price, regular price, percent off, the with-code price and pickup flags, and a Discount facet value in filters keeps only 70% off or more. /product returns every SKU's regular, clearance and with-code price, online units and the Kohl's Cash earn and redeem windows, /coupons lists today's public codes, and /store-availability counts the pickup units for one SKU at every store near a ZIP. Kohl's calls cost 2 credits, $2 per 1,000 requests on the Growth plan; the store finder is 1.

Every response below was captured on November 10, 2026, seventeen days before Black Friday, with Kohl's LOVE2SAVE extra-20% code and a Kohl's Cash earn period running. Prices are US dollars from kohls.com; the API covers the US site only. Listing calls (clearance, search, category, brand) took 4.0 to 15.5 seconds a page, so give your client a timeout of at least 90 seconds; product, coupons, stores and store availability answered in 2.3 to 4.6 seconds, apart from one store availability call at 12.7.

Step 1: Pull the Kohl's clearance list

Bash
curl -s https://api.scavio.dev/api/v1/kohls/deals \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type": "clearance"}'

The Clearance list came back in 6.7 seconds: 4,350 items over 37 pages. The header, the first item and the Discount facet, as captured (the image URL, 3 colors and 14 other facets trimmed):

JSON
{
  "type": "clearance",
  "label": "Clearance",
  "total": 4350,
  "page": 1,
  "total_pages": 37,
  "per_page": 120,
  "sort": "featured",
  "count": 121,
  "sponsored_count": 1,
  "items": [
    {
      "id": "3836990",
      "title": "Women's Croft & Barrow® Essential Long-Sleeve Classic Crewneck Tee",
      "url": "https://www.kohls.com/product/prd-3836990/womens-croft-barrow-essential-long-sleeve-classic-crewneck-tee.jsp",
      "price": 8.99,
      "price_max": null,
      "regular_price": 14.99,
      "regular_price_max": null,
      "sale_price": 8.99,
      "sale_price_max": null,
      "price_label": "clearance",
      "on_sale": true,
      "is_clearance": true,
      "percent_off": 40,
      "price_suppressed": false,
      "price_note": null,
      "with_code_price": 7.19,
      "with_code_price_max": null,
      "with_code_offer_codes": ["LOVE2SAVE"],
      "promotions": [],
      "rating": 4.5,
      "review_count": 15468,
      "badges": ["best_seller"],
      "colors": ["Maroon Rose", "Navy Nice Flowers"],
      "is_sephora": false,
      "coupon_eligible": true,
      "available_online": true,
      "available_pickup": false,
      "available_ship_to_store": true,
      "is_sponsored": false,
      "currency": "USD"
    }
  ],
  "facets": [
    {
      "id": "Discount",
      "label": "Discount",
      "values": [
        { "label": "30% off or more", "value": "Discount:30%25%20off%20or%20more", "count": 4225, "selected": false },
        { "label": "40% off or more", "value": "Discount:40%25%20off%20or%20more", "count": 3483, "selected": false },
        { "label": "50% off or more", "value": "Discount:50%25%20off%20or%20more", "count": 2158, "selected": false },
        { "label": "60% off or more", "value": "Discount:60%25%20off%20or%20more", "count": 1194, "selected": false },
        { "label": "70% off or more", "value": "Discount:70%25%20off%20or%20more", "count": 603, "selected": false },
        { "label": "80% off or more", "value": "Discount:80%25%20off%20or%20more", "count": 30, "selected": false }
      ]
    }
  ]
}

count is 121 on a 120-item page because one sponsored tile sits in the grid; it is flagged is_sponsored, so drop it before you count. with_code_price is the price after the code in with_code_offer_codes, here LOVE2SAVE's extra 20%. Walk the list with "page": 2 and on. The same call takes type: "sale", "kohls_cash" (items that earn Kohl's Cash now; 171,281 on November 10) or "sephora" (Sephora at Kohl's).

Step 2: Keep only the deep markdowns

Bash
curl -s https://api.scavio.dev/api/v1/kohls/deals \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type": "clearance", "filters": ["Discount:70% off or more"]}'

Any facet value from a response works in filters, encoded or not. This one returned 620 items over 6 pages in 15.5 seconds, and every one of the first 120 was 70% to 90% off. Two of them, as captured (other fields trimmed):

JSON
{
  "total": 620,
  "total_pages": 6,
  "count": 120,
  "applied_filters": [
    { "facet": "Promotions", "label": "Clearance", "value": "Promotions:Clearance" },
    { "facet": "Discount", "label": "70% off or more", "value": "Discount:70%25%20off%20or%20more" }
  ],
  "items": [
    {
      "id": "7007823",
      "title": "Women's LOFT Hipster Bikini Bottom",
      "price": 4.8,
      "regular_price": 48,
      "price_label": "clearance",
      "percent_off": 90,
      "with_code_price": 3.84,
      "with_code_offer_codes": ["LOVE2SAVE"],
      "rating": null,
      "review_count": null,
      "available_online": true,
      "available_pickup": false,
      "available_ship_to_store": true
    },
    {
      "id": "7590689",
      "title": "Women's Croft & Barrow® Cozy Sweater",
      "price": 5.24,
      "regular_price": 34.99,
      "price_label": "clearance",
      "percent_off": 85,
      "with_code_price": 4.19,
      "with_code_offer_codes": ["LOVE2SAVE"],
      "rating": 4.4,
      "review_count": 951,
      "available_online": false,
      "available_pickup": true,
      "available_ship_to_store": true
    }
  ]
}

Read the availability flags as a hint, not an answer: the Cozy Sweater tile said pickup, but its product call showed all 66 SKUs out of stock online and not pickup-eligible, and the SKU we checked had 0 units at the 48 stores near ZIP 60601. Step 7 is how you check.

Step 3: Narrow clearance by keyword, category or brand

clearance: true works on search, category and brand, with the same filters:

Bash
curl -s https://api.scavio.dev/api/v1/kohls/search \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "jeans", "clearance": true}'

Jeans returned 608 clearance items in 4.0 seconds, 3 of the 123 tiles sponsored. /brand with {"brand": "Croft & Barrow", "clearance": true} returned 106, and /category with the Small Appliances path (/catalog/small-appliances-kitchen-dining.jsp?CN=Category:Small%20Appliances+Department:Kitchen%20%26%20Dining) and clearance: true returned 2: a FoodSaver vacuum sealer at $244.99 against $349.99, and a Disney Dash removable-plate pack whose price is shown only in the cart:

JSON
{
  "id": "7507869",
  "price": null,
  "regular_price": 15.99,
  "price_label": null,
  "is_clearance": false,
  "price_suppressed": true,
  "price_note": "FOR PRICE,ADD TO CART",
  "with_code_price": 6.39,
  "with_code_offer_codes": ["LOVE2SAVE"]
}

Items like this sit in the clearance list with price_suppressed: true and no price label; keep them, but do not chart them as full price. Category paths come from a kohls.com category URL or a product's breadcrumbs[].url; brand names are spelled as the Brand facet lists them.

Step 4: Read the regular and clearance price of every SKU

Bash
curl -s https://api.scavio.dev/api/v1/kohls/product \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id": "4922640", "store_id": "725"}'

The Croft & Barrow Extra Soft V-Neck Sweater came back in 4.3 seconds with 95 SKUs: 72 "Sale" at $24.99 against $29.99 and 23 "Clearance" at $7.49 against $24.99. One of each, as captured:

JSON
{
  "status": "In Stock",
  "dept": "013",
  "price": 24.99,
  "regular_price": 29.99,
  "sale_status": "Sale",
  "percent_off": 17,
  "variant_count": 95,
  "variants": [
    {
      "sku": "48754963",
      "upc": "000400487549632",
      "color": "Blue Heather",
      "size": "X SMALL",
      "availability": "Out of Stock",
      "online_units": 0,
      "price": 7.49,
      "regular_price": 24.99,
      "sale_status": "Clearance",
      "with_code_price": 5.99,
      "with_code_offer_codes": ["LOVE2SAVE"],
      "percent_off": 70,
      "pickup_eligible": false,
      "in_store": false,
      "store": null
    },
    {
      "sku": "39331762",
      "upc": "000400393317622",
      "color": "Medium Oat Heather",
      "size": "LARGE",
      "availability": "In Stock",
      "online_units": 4580,
      "price": 24.99,
      "regular_price": 29.99,
      "sale_status": "Sale",
      "with_code_price": 19.99,
      "with_code_offer_codes": ["LOVE2SAVE"],
      "percent_off": 17,
      "pickup_eligible": true,
      "in_store": true,
      "store": { "store_id": "725", "availability": "Available", "price": 24.99, "regular_price": 29.99, "sale_price": 24.99, "sale_status": "SALE" }
    }
  ]
}

The product-level block describes the sale colors, not the clearance ones, so a clearance tracker reads variants[]. The two regular prices differ, $29.99 and $24.99, for the same sweater; Kohl's terms say "Actual sales may not have been made at the 'Regular' or 'Original' prices", which is a reason to record prices yourself (Step 8). store_id adds that store's availability and in-store price to each SKU; dept and sku are what Step 7 takes.

Step 5: Get the Kohl's Cash windows and the with-code price

Bash
curl -s https://api.scavio.dev/api/v1/kohls/product \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id": "3955549"}'

A NutriBullet blender from the Kohl's Cash list (/deals type kohls_cash), in 2.4 seconds (description, images, variants and the offer's full terms trimmed):

JSON
{
  "id": "3955549",
  "title": "NutriBullet® 1200 Watt Blender Combo with Single Serve Cups",
  "status": "In Stock",
  "price": 109.99,
  "regular_price": 149.99,
  "sale_status": "Sale",
  "percent_off": 27,
  "lowest_applicable_price": 87.99,
  "kohls_cash": {
    "earn_start": "2026-11-09T00:00:00",
    "earn_end": "2026-11-19T23:59:59",
    "redeem_start": "2026-11-20T00:00:00",
    "redeem_end": "2026-11-25T00:00:00",
    "earned_min": 10,
    "earned_max": null,
    "exclusions_url": "https://www.kohls.com/ecom/Kcash/EarnKohlsCash_20261109_20261119.html"
  },
  "kohls_cash_eligible": true,
  "offers": [
    {
      "code": "LOVE2SAVE",
      "description": "Save an extra 20% in store & online!",
      "discount_type": "percentOff",
      "discount_amount": 20,
      "starts": "2026-11-08T23:00:00",
      "ends": "2026-11-22T02:00:00"
    }
  ],
  "online_units": 559
}

This is the "kohls cash" answer a shopper's app gives, as data: buy between November 9 and 19, earn at least $10 (each SKU's kohls_cash_earned says how much), spend it from November 20. lowest_applicable_price was $87.99, 20% under the sale price, with the LOVE2SAVE offer listed. These are the public windows on the product page; a shopper's own Kohl's Cash balance, wallet offers and Kohl's Card pricing are not returned.

Step 6: List today's Kohl's coupon codes

Bash
curl -s https://api.scavio.dev/api/v1/kohls/coupons \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

5 public codes, in 4.6 seconds (2 trimmed):

JSON
{
  "count": 5,
  "offers": [
    {
      "code": "SHOP10",
      "description": "2 days only. Take $10 off your purchase of $25 or more with coupon. Ends November 11.",
      "ends": "2026-11-11",
      "requires_kohls_card": false,
      "details_url": "https://www.kohls.com/ecom/PrintPass/SHOP10_GENPUB/20261110.html",
      "shop_url": "https://www.kohls.com/catalog.jsp?CN=CouponEligible:Eligible"
    },
    {
      "code": "LOVE2SAVE",
      "description": "Take an extra 20% off. Ends November 21.",
      "ends": "2026-11-21",
      "requires_kohls_card": false,
      "details_url": "https://www.kohls.com/ecom/PrintPass/LOVE2SAVE/20261109.html",
      "shop_url": "https://www.kohls.com/catalog.jsp?CN=CouponEligible:Eligible"
    },
    {
      "code": "NOV30",
      "description": "Take an extra 30% off with a Kohl's Card. Ends November 21.",
      "ends": "2026-11-21",
      "requires_kohls_card": true,
      "details_url": "https://www.kohls.com/ecom/PrintPass/NOV30/20261109.html",
      "shop_url": "https://www.kohls.com/catalog.jsp?CN=CouponEligible:Eligible&BL=y"
    }
  ]
}

The other two were HOME10 and TOYS10, $10 off $50 in home and toys. This list is read from Kohl's deals page text, so its wording can change; for structured codes with dates and terms on a given item, read offers[] on the product (Step 5). Whether an item takes a code at all is coupon_eligible on every listing item.

Step 7: Count pickup units at every store near a ZIP (kohls in stock)

First find the stores, 1 credit:

Bash
curl -s https://api.scavio.dev/api/v1/kohls/stores \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"zip": "60601"}'

19 stores within the default 25 miles, nearest first, each with store_id, address, phone, distance, the week's hours with the UTC offset, badges (Sephora, Fine Jewelry, Lands' End...) and services (In-Store Pickup, Amazon Returns Outpost...). Bucktown, 3.7 miles away, is store 725, which Step 4 passed as store_id. Then send one SKU and its department code from Step 4:

Bash
curl -s https://api.scavio.dev/api/v1/kohls/store-availability \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sku": "39331762", "dept": "013", "zip": "60601"}'

In 3.1 seconds (47 of 48 stores and 6 of 7 days of hours trimmed):

JSON
{
  "sku": "39331762",
  "zip": "60601",
  "dept": "013",
  "count": 48,
  "in_stock_count": 45,
  "total_pickup_units": 114,
  "stores": [
    {
      "store_id": "725",
      "name": "BUCKTOWN",
      "pickup_units": 6,
      "stock_level": "In Stock",
      "in_stock": true,
      "ship_to_store_units": 499,
      "pickup_eligible": true,
      "ship_to_store_eligible": true,
      "ship_to_store_window": "Thu, Nov 12 - Tue, Nov 17",
      "is_clearance": false,
      "has_sephora": true,
      "distance_miles": 3.68,
      "address": "2140 N ELSTON AVE",
      "city": "CHICAGO",
      "state": "IL",
      "zip": "60614",
      "phone": "(773) 342-9032",
      "hours": [{ "day": "Tuesday", "date": "2026-11-10", "open": "09:00", "close": "22:00" }]
    }
  ]
}

That is 114 units of this color and size across 45 of the 48 stores within about 50 miles; 1 or 2 units read "Low Stock". The same call for the clearance SKU from Step 4, 48754963, returned 0 units at all 48. The call needs a ZIP, not a city, and the radius is fixed. Counts are what the site shows at that moment.

Step 8: Build a Kohl's price tracker

kohls.com shows no price history, and no API can return prices from before you started recording them. A tracker is a daily loop over Step 1 or Step 2 that stores each row with the date:

Python
import os, sqlite3, requests
from datetime import date

db = sqlite3.connect("kohls_clearance.db")
db.execute("""CREATE TABLE IF NOT EXISTS clearance (
  checked_on TEXT, id TEXT, title TEXT, price REAL, regular_price REAL,
  percent_off INTEGER, with_code_price REAL, available_online INTEGER, available_pickup INTEGER)""")

today, page, pages = date.today().isoformat(), 1, 1
while page <= pages:
    r = requests.post(
        "https://api.scavio.dev/api/v1/kohls/deals",
        headers={"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"},
        json={"type": "clearance", "filters": ["Discount:70% off or more"], "page": page},
        timeout=120,
    )
    r.raise_for_status()
    d = r.json()["data"]
    pages = d["total_pages"]
    for i in d["items"]:
        if i["is_sponsored"]:
            continue
        db.execute("INSERT INTO clearance VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
                   (today, i["id"], i["title"], i["price"], i["regular_price"], i["percent_off"],
                    i["with_code_price"], int(bool(i["available_online"])), int(bool(i["available_pickup"]))))
    page += 1
db.commit()

That is 6 pages, 12 credits a day, for the 620 items in the 70%-off slice on November 10. A new id is a new deep markdown; a lower price on an id you already have is a further markdown. Ids are strings. For a handful of items you care about, poll /product instead and keep the SKU rows.

Step 9: Pull search suggestions

Bash
curl -s https://api.scavio.dev/api/v1/kohls/suggestions \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "coff"}'
JSON
{
  "query": "coff",
  "type": "terms",
  "count": 8,
  "suggestions": ["coffee makers", "keurig coffee makers", "ninja coffee makers", "coffee mugs", "cuisinart coffee makers", "coffee", "coffee grinder", "keurig single serve coffee maker"]
}

Send "type": "products" for matching products with id, title, URL and image instead of terms.

All nine endpoints

EndpointWhat it returnsCredits
/api/v1/kohls/dealsClearance, Sale, Kohl's Cash earn or Sephora at Kohl's lists, 120 items a page with price, regular, sale and with-code price, percent off, rating, review count, badges, pickup flags and every facet2
/api/v1/kohls/searchKeyword search, the same grid; brand, color, size, on-sale, clearance and facet filters, 7 sorts; corrected_query when the site autocorrects2
/api/v1/kohls/categoryOne catalog listing by path or URL, the same grid and filters, plus name and breadcrumbs2
/api/v1/kohls/brandOne brand by name or URL, the same grid and filters2
/api/v1/kohls/productOne product with every SKU: UPC, color, size, availability, online units, regular, sale and with-code price; offer codes, Kohl's Cash windows, rating, review count, return policy, dept; store_id adds one store's availability and price2
/api/v1/kohls/storesStores near a ZIP, city and state or a point, within 25 miles by default: id, address, phone, distance, hours, badges, services1
/api/v1/kohls/store-availabilityOne SKU at every store within about 50 miles of a ZIP: pickup units, stock level, ship-to-store units and window, address, hours; total units and in-stock store count2
/api/v1/kohls/suggestionsThe search box's keyword completions, or matching products2
/api/v1/kohls/couponsToday's public coupon codes: code, description, end date, Kohl's Card flag, details and shop URLs2

What the API does not return: price history (start polling to build one), review text (only the average rating and the count), a shopper's Kohl's Cash balance, wallet or Kohl's Card offers, checkout, and anything outside kohls.com in the United States. Totals move between calls, so compare them day to day: three clearance calls within four minutes, with different sort orders, counted 4,292, 4,350 and 4,782 items. For a side-by-side of every Kohl's data option, see the best Kohl's clearance tracker APIs; for checking a sold-out item at the stores near you, see Kohl's drop sold out online?

Getting started

  1. Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required, enough for 25 Kohl's calls.
  2. Copy your API key from the dashboard.
  3. Send a POST to /api/v1/kohls/deals with {"type": "clearance"} and your key in the Authorization header.

Try the Kohl's API free in the playground first, or call it from Claude and other agents through the MCP server. It covers kohls.com in the United States; for other department-store clearance, see the Macy's API and the Nordstrom Rack API, and for Sephora's own stores the Sephora API.

Reference: Kohl's API overview · deals · search · category · brand · product · stores · store availability · suggestions · coupons

Frequently asked questions

How do I get Kohl's clearance prices with an API?

Call Scavio's /api/v1/kohls/deals with type clearance. Each of the 120 items on a page comes back with price, regular price, sale price, percent off, the with-code price and its offer codes, rating, review count and pickup flags. On November 10, 2026, the list held 4,350 items; adding the filter "Discount:70% off or more" narrowed it to 620.

Which brands are not eligible for coupons at Kohl's?

Kohl's marks it per item, and the API returns that mark as coupon_eligible on every listing item; the Coupon Eligible facet counted 3,483 eligible items out of 4,350 on the Clearance list on November 10, 2026. The LOVE2SAVE terms on the product endpoint that day excluded "Sephora at Kohl's; and/or any other categories and brands of merchandise identified as coupon ineligible".

How do I see when Kohl's Cash can be earned and redeemed?

The product endpoint returns a kohls_cash object when the item earns Kohl's Cash: earn_start, earn_end, redeem_start, redeem_end, the minimum earned and the exclusions page. A NutriBullet blender on November 10, 2026 earned from November 9 to November 19 and redeemed from November 20. These are the public windows on the product page, not a shopper's own balance.

Can I return a Kohl's clearance item?

The product endpoint returns the return policy the product page states. Every product we read on November 10, 2026, clearance items included, said "Free in-store returns for 90 days or 120 for Kohl's Card Holders". Check Kohl's own returns page for exceptions before you rely on it.

How much does Kohl's data cost with Scavio?

Eight of the nine Kohl's endpoints cost 2 credits a call, $2 per 1,000 requests at the Growth rate of $1 per 1,000 credits; the store finder costs 1 credit. New accounts get 50 free credits with no card.

Kohl's clearance prices as JSON

  • The clearance list, 120 items a page, filtered by percent off
  • Kohl's Cash windows and the with-code price per SKU
  • Pickup units at every store near a ZIP
Try the Kohl's API free

50 free credits, no credit card

On this page

  1. Step 1: Pull the Kohl's clearance list
  2. Step 2: Keep only the deep markdowns
  3. Step 3: Narrow clearance by keyword, category or brand
  4. Step 4: Read the regular and clearance price of every SKU

Related articles

View all
  • scavio
    Ecommerce / Price monitoring
    Dicks sporting goods
    How to Get Dick's Sporting Goods Clearance Prices, Per-Size Stock and Store Availability With an API
  • scavio
    Comparison / Price monitoring
    Kohls
    7 Best Kohl's Clearance Tracker APIs in 2026: Scavio Filters Clearance to 70% Off and Shows Pickup Units at Every Store Near a ZIP
ScavioScavio

One scraper API for every social, search, e-commerce and real estate platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

Ask AI about Scavio

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy