KLEKT Sneaker & Apparel Resale Scraper avatar

KLEKT Sneaker & Apparel Resale Scraper

Pricing

from $1.00 / 1,000 product records

Go to Apify Store
KLEKT Sneaker & Apparel Resale Scraper

KLEKT Sneaker & Apparel Resale Scraper

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.

Pricing

from $1.00 / 1,000 product records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

14 days ago

Last modified

Categories

Features

Limited permissions

Share

KLEKT Scraper: Sneaker & Streetwear Resale Prices

KLEKT Scraper turns KLEKT (klekt.com), a sneaker and apparel resale marketplace, into structured product data. Get catalogue prices alongside the product page's own last sold price, lowest listing price and highest bid, plus brand, SKU, size, box condition and availability. Browse the site's own catalogue with real filters (brand, category, price, On sale), paste exact product URLs, or stream the entire catalogue from the official sitemaps, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • 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.
  • Fails loudly, not quietly. A run that could not reach the source at all stops with a clear error instead of returning an empty dataset that looks like "nothing matched".

Use Cases

  • 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.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id"a1b2c3d4-1111-2222-3333-000000000000"
type"catalog_listing" (every catalogue row is an individual listing)
name"Sample Runner 1 'Example' (2024)"
brand"Sample Brand" (from the product page; catalogue rows carry no brand)
sku / slug"XX1234-000" / "sample-runner-example-2024"
urlKLEKT link to the product or, on Used/On sale, the individual listing
descriptionproduct description text (detail enrichment only)
colorway"Sample/White" (product page and listing page; detail enrichment only)
size"US 9" (every catalogue card carries its own size)
boxCondition"good" (on the catalogue card, from the listing)
condition"Deadstock / New" (the listing's own condition badge)
likesCount / postedAgo424 / "17m ago" (catalogue card only)
priceAmount / priceCurrency134.0 / "EUR": the catalogue asking price (in the two URL modes, the lowest live listing, else the last sale)
lastSoldPrice162.4: the most recent completed sale (from the catalogue row when it carries one, refreshed from the product page)
lowestListingPrice / lowestListingSize / highestBid136.5 / "US 9" / 101.0 (detail enrichment only; highestBid only when the page shows a bid)
averageDeadstockPrice / totalSales / priceFluctuation244.37 / 520 / 4.0: the model's average deadstock sale price, total completed sales and recent price fluctuation (new-product pages with price history; detail enrichment only)
sizeAsksper-size market data: the lowest live ask for each size that has a listing, as {sizes: {us, eu, uk, cm, ...}, lowestListingPrice} (new-product pages; detail enrichment only)
questionsup to 10 buyer questions with KLEKT's answers: text, askedAt, answer, answeredAt (new-product pages; the asker's name is not included)
releaseYear / releaseDate / imageUrl"2024" / "2023-08-07" / catalogue thumbnail (releaseDate is the exact release date from the product page, detail enrichment only; releaseYear is the year in the product link)
imagesproduct-page photo list (detail enrichment only)
seller / model"KLEKT" (KLEKT authenticates every sale itself) / product-page model name (detail enrichment only)
reviewsup to Max reviews per product community reviews (default 20, max 1000): reviewer, rating, appearanceRating, qualityRating, sizeRating, sizeFeeling, reviewSize, text, date (always null today: KLEKT shows no review date), helpfulVotes, replyCount, reviewId, reviewImages (product-page rows only); always an array, empty when none were requested or found; reviewsSummary holds averageRating, per-aspect averages and reviewCount (product-page rows only)
detailScrapedtrue once the product page was fetched, else false
changeType / changedFields / firstSeenAt / lastSeenAtincremental mode only: NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED, the fields that moved on an UPDATED row, and when the product was first and last seen; with compact updates, priceChanges holds the old and new value of each moved price field

Output views

The dataset has four views in the Console: Products (catalogue price, size, condition), Market detail (last sold, lowest listing, highest bid, average deadstock price, total sales, price fluctuation, release date, colorway), Reviews (one row per review: reviewer, review stars, size feeling, size bought, text) and Changes since the last run (changeType, changedFields, priceChanges, first and last seen; incremental mode).

How to Use

  1. Pick a Scrape mode: Browse the catalogue (default), Product URLs, or Full catalogue via sitemaps.
  2. For Browse, choose a catalogue section and any filters (brand, product category, price range). For Product URLs, paste KLEKT URLs, one per line (see the URL table below).
  3. Set Max items to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Browse Trending, the default:

{
"mode": "browse",
"strategy": "trending",
"maxItems": 20
}

Browse the On sale section for one brand and price band:

{
"mode": "browse",
"strategy": "sale",
"brand": "Nike",
"priceFrom": 80,
"priceTo": 200,
"maxItems": 30
}

Product URLs mode: supported URL shapes

URL shapeExampleWhat happens
New producthttps://klekt.com/product/new/yeezy-boost-350-v2-boneone product row
New product without /new/https://klekt.com/product/yeezy-boost-350-v2-boneKLEKT redirects it; same row as above
Pre-owned listinghttps://klekt.com/listing/stussy-x-dries-van-noten-hoodie-very-good-1bzz1x7pone listing row
Locale-prefixed (/nl/, /it/, ...)https://klekt.com/nl/product/new/yeezy-boost-350-v2-bonethe prefix is removed, so it is the same product and the same id as the unprefixed URL
Browse gridhttps://klekt.com/browse (also /catalog)walks the catalogue like Browse mode
Browse pagehttps://klekt.com/browse?page=2starts the walk at page 2; a partial scope, so incremental mode never marks products EXPIRED from it
Brandhttps://klekt.com/browse?brand=Nikewalks that brand's catalogue
On salehttps://klekt.com/catalog?strategy=salewalks the On sale section
Sorted / text searchhttps://klekt.com/browse?sort=newest, https://klekt.com/browse?q=yeezyKLEKT applies sort and search in the browser only (measured: the server returns the same grid), so the whole grid is walked and a warning in the run log says so
Sitemap indexhttps://klekt.com/sitemap.xmlstreams products from the official sitemaps

The legacy /product/used/<id> form redirects to the pre-owned listing page and is scraped like a listing URL; unsupported URLs get a warning in the run log and are skipped. Left untouched, Product URLs mode now scrapes one example of each shape above (this field used to default to empty), and Max items is shared between the grids and the sitemap so none of them starves the others.

Scrape specific product pages:

{
"mode": "product-urls",
"productUrls": [
"https://klekt.com/product/new/sample-runner-example-2024"
]
}

Stream the full catalogue from the official sitemaps:

{
"mode": "sitemap",
"maxItems": 500
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/klekt-com-scraper").call(run_input={"mode": "browse", "strategy": "trending", "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["name"], product.get("priceAmount"), product.get("priceCurrency"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/klekt-com-scraper').call({ mode: 'browse', strategy: 'trending', maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

About the browse filters

Working filters: brand, product category, minimum and maximum price, and the On sale section. No-op filters (dropped with a run-log note): brand line, size category, size system, size, box condition, listing type and availability, plus the Trending, Used, Drops, Upcoming and Gift cards sections (they walk the full catalogue). Pasted ?q= and ?sort= URL parameters are likewise not applied by KLEKT's server.

The filters under Browse filters apply to Browse mode only; Product URLs mode and Full catalogue mode fetch specific product pages, so nothing in that section changes what they return. Since KLEKT rebuilt its storefront (October 2026), the catalogue narrows server-side on Brand (written the way KLEKT displays it, e.g. Nike), Product category, Minimum/Maximum price (whole euros) and the On sale section. The size, box-condition, listing-type, availability and brand-line options no longer have a server-side filter on the rebuilt catalogue, so setting one drops it with a note in the run log rather than sending it for show - the listing cards themselves still carry each listing's size, box condition and condition badge. Naming any section other than On sale (Trending, Used, Drops, Upcoming, Gift cards) walks the full catalogue and says so in the run log; an unrecognised section value is replaced with the default. Every drop is reported in the run log.

Tip: Max items, Max pages, and a fast-moving catalogue

Max items stops the run once that many products have been returned (0 = unlimited). Max pages is a safety bound on how many catalogue pages Browse walks (about 20 listing cards per page); the walk also stops on its own at the natural end of a section, or when a page repeats products already collected earlier in the same run.

That repeat check compares each page against every product seen so far in the run, not just the page before it. KLEKT's section order is stable while nothing changes, but if the section is re-ranked while a long Browse walk is in progress, or a burst of new listings lands ahead of the walk, a later page can come back holding only products the run already collected. The walk treats that as the end and stops, even though further pages may still hold new products. The deeper into a section the walk already is, the more likely this becomes, so it mainly affects large, unfiltered runs (a large Max items with no narrowing filters) and tends to cut off the tail of the section. The run log then says the page "repeated the previous page's products". If a run seems to stop short of Max items, narrow with filters to shorten the walk, or run it again.

Send results into your apps (MCP connectors)

Optionally pipe scraped KLEKT products into the apps you already use via Model Context Protocol (MCP) connectors (Notion, Linear, Airtable, Apify). This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify โ†’ Settings โ†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
  3. For Notion, also set Notion parent page to the page where products should be created.

Use Max products to export per connector to cap how many are sent; that number is what is actually delivered. The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials, and a connector error is logged as a warning without failing or stalling the run. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringbrowsebrowse, product-urls, or sitemap.
productUrlsarrayone example of each URL shapeKLEKT URLs, one per line (Product URLs mode); see the URL shapes table.
strategystringtrendingCatalogue section to walk (Browse mode). Only sale narrows as its own section since the storefront rebuild; the other names walk the full catalogue and say so in the run log.
brandstring""Filter to one brand, written the way KLEKT displays it (Browse mode).
brandLinestring""Optional narrower model family inside a brand (Browse mode).
productCategorystring""Sneakers, Streetwear, or Accessories. Leave empty for any.
sizeCategorystring""Men, Women, Youth, or Default. Dropped with a run-log note (the rebuilt catalogue has no server-side size filter).
sizeMetricstring""Size system for size (e.g. US, UK, EU, CM). Dropped with a run-log note (no server-side size filter).
sizestring""One size in the chosen sizeMetric, exactly as KLEKT writes it. Dropped with a run-log note (no server-side size filter).
boxConditionstring""good, missing_lid, damaged, no_box, or replacement_box. Dropped with a run-log note (no server-side box-condition filter).
listingTypestring""used or new_with_defect. Dropped with a run-log note (no server-side listing-type filter).
availabilitystring""0 (Available), 1 (Express dispatch), or 2 (Used available). Dropped with a run-log note (no server-side availability filter).
priceFrominteger(none)Minimum price in whole euros.
priceTointeger(none)Maximum price in whole euros.
fetchDetailsbooleantrueFetch each product's own page for the full record. Browse mode only; always on in Product URLs and Full catalogue mode.
maxItemsinteger50Stop after this many products (0 = unlimited).
maxPagesinteger0Safety bound on catalogue pages walked in Browse mode. 0 means no input limit (the walk ends at the end of the section or at Max items); a hard ceiling of 5000 pages is enforced in code.
maxReviewsPerProductinteger20Community reviews attached to each product row, 20 per page; 0 = none, capped at 1000.
proxyobjectApify ProxyConnection settings.
resumeFromRunIdstring""Run id or dataset id of an earlier run; products already in it are skipped (not returned, not billed).
incrementalModebooleanfalseReturn only NEW / UPDATED / REAPPEARED products compared with the last run of the same scope.
stateKeystring""Name a monitoring campaign (incremental mode).
emitUnchangedbooleanfalseAlso return UNCHANGED products (incremental mode).
emitExpiredbooleanfalseAlso return EXPIRED products after a complete scan (incremental mode).
changeScopestringallall or priceAndStock (incremental mode).
compactUpdatesbooleanfalseShort UPDATED / EXPIRED rows with priceChanges (incremental mode).
expireAfterMissedScansinteger1Complete scans a product must be missing before it is EXPIRED.
ignoreFieldsForChangesarray[]Extra fields (or dotted paths) that never count as a change (incremental mode).
mcpConnectorsarray[]Optional: send a summary of each product to apps you authorized under Integrations.
notionParentPageUrlstring""Notion connector only: page under which products are created.
maxNotifyListingsinteger50Cap on products written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"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.0,
"priceCurrency": "EUR",
"lastSoldPrice": 162.4,
"lowestListingPrice": 136.5,
"lowestListingSize": "US 9",
"highestBid": 101.0,
"averageDeadstockPrice": 244.37,
"totalSales": 520,
"priceFluctuation": 4.0,
"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
}

Plan Requirement

KLEKT showed no block or challenge on a plain direct connection. The actor reads pages through your selected Apify Proxy and, if that connection is refused, continues on a backup connection. We have not measured whether Apify's datacenter proxy group alone is enough for large runs, so treat it as unproven.

  • Free Apify plans do not include proxies. The run log then shows: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." Pages served that way are noted as "Served over the backup connection (the default connection was unavailable)."
  • If nothing could be read the run fails with a clear message instead of an empty dataset: "The proxy connection was refused for this account, so no page could be read..." (a paid plan or your own proxy URLs are needed), "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested KLEKT pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."
  • A paid plan with a residential group gives the most headroom for large or frequent runs. Whichever groups you select under Proxy & connection are the ones used; turning Apify Proxy off connects directly.

FAQ

How much does it cost?

Pay-per-event, with these events: Actor Start (apify-actor-start, once per run), Product record (apify-default-dataset-item, once per product row returned) and Detail enrichment (detail-enrichment, once per product-page row returned, only when the product page was fetched: always in Product URLs and Full catalogue modes, and in Browse mode when Fetch product details is on, which is the default). Switching Fetch product details off in Browse mode removes the Detail enrichment charge. Reviews are part of that product-page record: attaching up to Max reviews per product reviews adds no further charge. Rows that are not returned (duplicates, unchanged, skipped by Resume, failed pages) are never charged. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.

This actor collects only publicly available marketplace data. You are responsible for how you use it: follow KLEKT's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product prices and availability are generally facts, but photos and descriptions may be subject to third-party rights.

Can I run this on a schedule to track price changes?

Yes. Schedule it from the Schedules tab and switch on Incremental mode. The first run returns every product as NEW; later runs return only what changed since the last run: NEW, UPDATED (with changedFields naming exactly what moved) and REAPPEARED.

  • What is compared: asking price and currency, the market numbers (lowestListingPrice, highestBid, lastSoldPrice), availability, name, brand, size, box condition, seller, images and description. postedAgo, likesCount, detailScraped, reviews, reviewsSummary, questions, sizeAsks, releaseDate, colorway, totalSales, priceFluctuation and averageDeadstockPrice never count as a change (they tick by themselves) but are still returned on every row. Add more with Ignore fields when detecting changes; a dotted name such as images.url drops that key inside a nested value.
  • Only price and stock: set What counts as a change to Price and availability only so that a changed description, image or seller never returns a row. Add Compact update rows for short UPDATED rows with priceChanges (old and new value of each moved price field).
  • State: kept per scope (mode, section, brand, category, price range, product URLs, Fetch product details and the ignore settings). Set a State key to keep one baseline across changes to those settings; without one, changing the ignore fields or change scope starts a fresh baseline.
  • Expired: switch on Emit expired products to also get EXPIRED rows, produced only after a complete scan (never when Max items or Max pages stopped the walk, when a request failed, or when Resume was used). EXPIRED means the listing dropped out of the scope, not that it sold; read availability for stock. Expire after N missed full scans (default 1) delays the tombstone.
  • Unchanged rows: off by default; Emit unchanged products returns them too.

Reviews and billing: reviews ride the product row and add no separate charge: the Detail enrichment event stays one charge per product-page record returned, whatever the number of reviews attached. Set Max reviews per product to 0 to skip them.

Billing in incremental mode: you pay for the rows that are returned. An UNCHANGED row that is not returned is not billed, and neither is its product-page charge. The Detail enrichment event is charged once per product-page record that is actually returned: a product skipped as a duplicate within the run, skipped by Resume from a previous run, or not returned because it is unchanged is not charged. A compact UPDATED row carries no product-page data, so it does not trigger that charge. Resume from a previous run (a run id or dataset id) is a separate feature: it continues one interrupted run and returns only products not in that dataset.

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.

Why did my run fail instead of returning an empty dataset?

If every request to KLEKT is refused, the run stops with a clear error so "no products matched" is never confused with "the source could not be reached". Run it again in a few minutes, or try a different proxy group.

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.

๐Ÿ”— Want more fashion data?

Pair this actor with these related scrapers from the same team:

๐Ÿ‘— GOAT Scraper
Scrape GOAT (goat.com), the sneaker and streetwear resale marketplace. Search or paste...
๐Ÿ‘— KREAM Scraper
Scrape KREAM (kream.co.kr) sneaker and fashion resale data by keyword search, filters...
๐Ÿ‘— SNKRDUNK Scraper
Scrape SNKRDUNK (snkrdunk.com), Japan's sneaker and streetwear resale marketplace: JP and...
๐Ÿ‘— StockX Scraper
Scrape StockX market data by keyword, category or URL. Every row carries lowest ask...
๐Ÿท๏ธ Poshmark Scraper
Scrape Poshmark fashion-resale listings: keyword search, brand and category browse, sold...
๐Ÿ‘— Rent the Runway Scraper
Scrape Rent the Runway (renttherunway.com) designer clothing and accessories by category...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.
⌂ ๆข็ฝ‘ๅ€