KLEKT Sneaker & Apparel Resale Scraper at a glance
KLEKT Sneaker & Apparel Resale Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes product, brand, sku, asking price and last sold, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.90 per 1,000 results on the Apify Free plan and from $1.00 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
- Web data
- Pricing
- $1.90 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 29 options
Scrape sneaker and streetwear listings from KLEKT (klekt.com). Browse the catalog with filters and extract product details, prices, and availability for resale market research and price monitoring.
What KLEKT Sneaker & Apparel Resale Scraper can do
- Three ways in. Browse KLEKT's own catalogue with filters, paste exact product URLs, or stream the whole catalogue from the official sitemaps. No need to build URLs by hand.
- Full market picture per product. Every record carries the catalogue asking price plus the product page's own last sold price, lowest listing price and highest bid, each under its own field, so the numbers never get mixed up.
- Listing-level catalogue cards. Every catalogue row is an individual marketplace listing carrying its own price, size, box condition, condition badge, seller and likes count - and every listing URL opens its own product page for enrichment.
- Only the filters KLEKT actually applies. A filter the site would silently ignore, or apply to nothing, is dropped and reported in the run log instead of being sent for show.
- Price-accurate rows. In Browse mode the price on every record is the same number KLEKT's own price filter matched on, whether or not product-page enrichment is switched on.
- Works with zero input. Leave everything blank and it browses the full catalogue straight away.
Choose what to collect
These inputs let you configure KLEKT Sneaker & Apparel Resale Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Browse walks the KLEKT catalogue page by page using the strategy and filters below, this is the default and needs no other input. Product URLs scrapes the exact listing pages you paste. Full catalogue streams every product from the official sitemaps (about 15,000 products) and ignores the browse filters. |
productUrlsarray | KLEKT URLs to scrape (one per line), routed by shape: product pages https://klekt.com/product/new/ (or /product/, with an optional /nl/ or /it/ prefix), pre-owned listings https://klekt.com/listing/-, catalogue grids https://klekt.com/browse or /catalog (?page=N starts the walk at page N?brand=Nike?search=jordan and ?strategy=sale narrow server-side; /catalog// and the legacy /product/used/ also work; ?q and ?sort are not honoured by KLEKT's server and are reported in the run log) and the sitemap https://klekt.com/sitemap.xml. Left untouched, Product URLs mode scrapes one example of each shape, sharing Max items between them. Unsupported URLs are reported in the run log. |
strategystring | Which KLEKT catalogue section to walk. After KLEKT rebuilt its storefront (October 2026) only 'On sale' still narrows the catalogue as its own section; the other names are kept for saved tasks but walk the full catalogue (the run log says so when one is picked). 'Trending' (the default) walks the full catalogue. |
brandstring | Filter to one brand, written the way KLEKT displays it (capitals and spaces, not a slug). Observed brands: Nike, Adidas, Air Jordan, New Balance, Yeezy, Asics, Nike SB, Crocs, On, Vans, Saucony, Supreme, Reebok, Converse, Puma, Travis Scott, Luxury, The North Face, Under Armour, Off White, Palace, Rick Owens, Stussy, Timberland, Mizuno, Karhu, Clarks, Fear Of God, Axel Arigato, Kaws, Ugg, Brooks, Brands Other. KLEKT's brand list differs per section, so this is free text; a brand that section does not carry simply returns no products. |
brandLinestring | Optional narrower model family inside a brand. KLEKT's rebuilt catalogue no longer offers a server-side brand-line filter, so this is dropped with a note in the run log when set. |
productCategorystring | Limit to one KLEKT product category. These three are the complete set, their counts add up to the unfiltered total. Leave on Any for everything. |
sizeCategorystring | Limit to one KLEKT size category. KLEKT's rebuilt catalogue no longer offers a server-side size-category filter, so this is dropped with a note in the run log when set. |
Show 22 more inputs
| Input | What it controls |
|---|---|
sizeMetricstring | The size system the Size field is written in. KLEKT's rebuilt catalogue no longer offers a server-side size filter, so this is dropped with a note in the run log when set. |
sizestring | One size, written the way KLEKT writes it (e.g. 10, 10.5, 44, M4/W6). KLEKT's rebuilt catalogue no longer offers a server-side size filter, so this is dropped with a note in the run log when set. |
boxConditionstring | Condition of the shoe box. KLEKT's rebuilt catalogue no longer offers a server-side box-condition filter, so this is dropped with a note in the run log when set. The listing cards still carry each listing's own box condition in the dataset output. |
listingTypestring | Split into genuinely used pairs and new-with-defect pairs. KLEKT's rebuilt catalogue no longer offers a server-side listing-type filter, so this is dropped with a note in the run log when set. |
availabilitystring | Limit to products KLEKT flags as available. KLEKT's rebuilt catalogue no longer offers a server-side availability filter, so this is dropped with a note in the run log when set. |
priceFrominteger | Only return products priced at or above this many euros. Whole euros, not cents. Leave empty for no lower bound. |
priceTointeger | Only return products priced at or below this many euros. Whole euros, not cents. Leave empty for no upper bound. |
fetchDetailsboolean | Fetch each product's own page for the full record (description, images, seller, last sold price, lowest listing price). Applies to Browse mode ONLY: switching it off there keeps the lighter catalogue row instead, with no per-product enrichment charge. Product URLs mode and Full catalogue mode have no catalogue row behind them, the product page is their only source of data, so detail fetching always runs in those two modes and the run log says so. |
maxItemsinteger | Maximum number of products to scrape (up to 1,000,000). 0 = no cap (stop only at the end of the catalogue). Counts records actually returned, not pages read. |
maxPagesinteger | Safety bound on how many catalogue pages Browse mode walks (20 products per page). 0 (the default) means no input limit: the walk stops at the end of the section or at Max items, and code enforces a hard ceiling of 5000 pages. |
maxReviewsPerProductinteger | Community reviews to attach to each product row (reviewer, ratings, size, text, helpful votes), 20 per page. 0 = none. Capped at 1000 per product to bound run time. Applies wherever the product page is fetched. |
resumeFromRunIdstring | Optional. ID of a previous run of this Actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only NEW products (a delta) and is not billed for the skipped ones. Combine both runs' datasets for the full set. Max items then counts only the new products. A resumed run never marks anything EXPIRED. For recurring monitoring of the same scope, use Incremental mode below instead. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to derive a key automatically from the scope; changing the ignore fields or change scope on an automatic key starts a fresh baseline (first run returns everything as NEW), so set a State key to keep one baseline across such changes. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns (and bills) rows you already have, so leave it off unless you want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were tracked before but are no longer found, marked EXPIRED. Only produced after a COMPLETE scan: never when Max items or Max pages stopped the walk, when any request failed, or when Resume was used. EXPIRED means the product dropped out of this scope's listing, not that it is sold; read availability for stock. Returns (and bills) extra rows. |
changeScopestring | All fields (default): any change to the product record, except the always-ignored postedAgo, likesCount and detailScraped, returns an UPDATED row. Price and availability only: only a change to the asking price, currency, lowest listing, highest bid, last sold price or availability returns an UPDATED row; name, images, description, seller and other details never do. |
compactUpdatesboolean | Off by default. When on, UPDATED and EXPIRED rows are short: id, url, name, current price and availability plus priceChanges (old and new value of each moved price field). NEW rows always carry the complete record. Compact rows carry no product-page data, so they do not trigger the detail-enrichment charge. |
expireAfterMissedScansinteger | Only used with Emit expired products. A product is marked EXPIRED only after it has been missing from this many complete scans in a row (default 1). Raise it (e.g. 3) so a listing that briefly drops out is not reported as gone. A product that comes back resets the count. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (postedAgo, likesCount and detailScraped never count). Use it when another field turns out to be noisy in your setup, e.g. imageUrl or images if the image host rotates. A dotted name such as images.url drops that key inside every element of a nested value. Ignored fields are still returned on every row. |
mcpConnectorsarray | Optionally send scraped KLEKT products into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-product export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which one page per product is created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on products written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
nameProduct (text)brandBrand (text)skuSKU (text)priceAmountAsking price (number)lastSoldPriceLast sold (number)priceCurrencyCurrency (text)sizeSize (text)availabilityAvailability (text)boxConditionBox condition (text)urlURL (link)lowestListingPriceLowest listing (number)lowestListingSizeLowest listing sizeShow 20 more fields
highestBidHighest bid (number)averageDeadstockPriceAverage deadstock price (number)totalSalesTotal sales (number)priceFluctuationPrice fluctuation (number)modelModelreleaseYearRelease yearreleaseDateRelease datecolorwayColorwayreviewsreviewsreviewerReviewerratingReview stars (number)sizeFeelingSize feelingreviewSizeSize boughttextReviewhelpfulVotesHelpful votes (number)replyCountReplies (number)changeTypeChangechangedFieldsChanged fields (array)firstSeenAtFirst seenlastSeenAtLast seenExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "a1b2c3d4-1111-2222-3333-000000000000",
"type": "catalog_product_variant",
"name": "Sample Runner 1 'Example' (2024)",
"brand": "Sample Brand",
"sku": "XX1234-000",
"slug": "sample-runner-example-2024",
"url": "https://klekt.com/product/new/sample-runner-example-2024",
"description": "Sample product description text.",
"colorway": "Sample/White",
"availability": "InStock",
"priceAmount": 134,
"priceCurrency": "EUR",
"lastSoldPrice": 162.4,
"lowestListingPrice": 136.5,
"lowestListingSize": "US 9",
"highestBid": 101,
"averageDeadstockPrice": 244.37,
"totalSales": 520,
"priceFluctuation": 4,
"releaseYear": "2024",
"imageUrl": "https://images.klekt.com/sample/thumb.jpg",
"images": [
"https://images.klekt.com/sample/1.jpg",
"https://images.klekt.com/sample/2.jpg"
],
"seller": "KLEKT",
"detailScraped": true
}Ways to use this data
- Resale price tracking: compare catalogue asking prices against last sold price and highest bid to spot under or over priced listings.
- New-release monitoring: sort the catalogue by the freshest listings and watch prices move from day one.
- Marketplace and arbitrage research: compare KLEKT prices, by size and box condition, against other resale platforms.
- Product catalogue enrichment: pull structured brand, SKU, colorway and size data into a database or price-comparison tool.
- Sale and pre-owned research: track the On sale section and per-listing box condition and condition badges.
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 KLEKT Sneaker & Apparel Resale Scraper return?
The documented output for KLEKT Sneaker & Apparel Resale Scraper includes product, brand, sku, asking price, last sold, currency, size and availability. Availability of each field depends on the source page and the selected mode.
How much does KLEKT Sneaker & Apparel Resale Scraper cost?
It costs $1.90 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Why did my run return fewer products than Max items?
A few reasons: the catalogue section, brand or size combination genuinely has fewer matching products than requested; a filter you set was dropped because KLEKT would have ignored it (check the run log for a note); or, rarely, the section was re-ranked or received a burst of new listings mid-run, so a later catalogue page came back holding only products already collected earlier in the same run, which the walk treats as reaching the end (the log says the page "repeated the previous page's products"). That last case mostly affects large, unfiltered runs deep into a section; re-running, or narrowing with filters, works around it.
Why does brand come back empty on some products?
KLEKT's catalogue rows carry no brand field at all. With Fetch product details on (the default in Browse, and always on in the other two modes), it is filled from the product page. With it off in Browse mode, catalogue-only rows have no brand. Pre-owned listing pages also do not publish a brand, so it can stay empty on Used and On sale rows even with detail fetching on.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
