Kohl's
Kohl's regular or sale price (a range when options differ), rating and review count, colours and image, by product id, about 5 million products per credit. Search and category browsing too. No stock, no brand.
Kohl's regular or sale price (a range when options differ), rating and review count, colours and image, by product id, about 5 million products per credit. Search and category browsing too. No stock, no brand.
At a glance
Property | Value |
|---|---|
|
|
Item id | The digits after |
Marketplaces | Live: |
Tier |
|
Ids per call | 600 |
Typical call | 2–6 s for 600 ids |
Search |
|
Stock is not reported
Kohl's product data has no stock we can trust, so results carry no availability. A product being listed does not mean it is in stock in any size or colour, and there is no store or pickup stock.
`price` is not the price Kohl's page leads with
Kohl's product pages lead with a lower price that already applies a 20% coupon. price is Kohl's regular price, or its sale price when the product is marked down, and no coupon price is given. A product with options at different prices (sizes, colours) has no single price: price is null and kohls.priceRange is its lowest and highest. A range is not a discount, even when Kohl's labels it a sale. Prices change during the day; ask again for a current one.
Example
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "kohls",
"ids": [
"4952594",
"https://www.kohls.com/product/prd-8363284/mens-vintage-america-straight-fit-denim-jeans.jsp"
]
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={
"platform": "kohls",
"ids": [
"4952594",
"https://www.kohls.com/product/prd-8363284/mens-vintage-america-straight-fit-denim-jeans.jsp",
],
},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
print(p["id"], p["status"], (p.get("price") or {}).get("amount"), p["kohls"]["rating"])const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'kohls',
ids: [
'4952594',
'https://www.kohls.com/product/prd-8363284/mens-vintage-america-straight-fit-denim-jeans.jsp',
],
}),
signal: AbortSignal.timeout(30_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();
for (const p of data.results) console.log(p.id, p.status, p.price?.amount, p.kohls?.rating);Full reference → POST /v1/products
Kohl's fields
Besides the common fields, each result carries a kohls object.
Field | Description |
|---|---|
| Kohl's regular price, or the sale price when marked down. |
| Kohl's regular price, when the product is on sale at one price. |
| The lowest and highest current price when options differ (then |
| True when Kohl's hides the product's price on its pages. No price is given then. |
| Kohl's own review average (0 to 5) and the number of reviews. Both are |
| The colour names the product comes in. |
| The product page on Kohl's and one picture. |
Not given | Brand (Kohl's data has none), stock, and the price of a single size or colour. |
kohls/search also lists a category: send category with the CN= part of a Kohl's catalog link, for example Gender:Mens+Category:Bottoms+Department:Clothing, with or without a query.
Statuses on Kohl's
partial: Kohl's answered without a title. Ask again later.not_found: Kohl's has no such product id.unavailable: no usable answer after retries. Not charged; ask again.