StockX Scraper – Sneaker Prices, Resale Data & Product Details avatar

StockX Scraper – Sneaker Prices, Resale Data & Product Details

Pricing

from $0.75 / 1,000 product list rows

Go to Apify Store
StockX Scraper – Sneaker Prices, Resale Data & Product Details

StockX Scraper – Sneaker Prices, Resale Data & Product Details

Scrape StockX resale prices and product data: lowest ask, highest bid, last sale and retail price, plus per-size market data. Search by keyword or browse sneakers, streetwear, watches, handbags, electronics, collectibles and trading cards. No login and no browser automation.

Pricing

from $0.75 / 1,000 product list rows

Rating

0.0

(0)

Developer

R.L.

R.L.

Maintained by Community

Actor stats

0

Bookmarked

49

Total users

21

Monthly active users

4 days ago

Last modified

Categories

Share

StockX Scraper – Sneaker Prices, Resale Market Data & Product Details

Scrape StockX at scale. Extract sneakers, streetwear, watches, handbags, electronics, collectibles, and trading cards with live resale pricing — lowest ask, highest bid, and last sale — plus full product details, per-size market data and the individual sales behind the price chart. Search by keyword, look up products you already have ids for, or pull a product's whole sales history. No login, no browser automation, no rate-limit headaches.

Perfect for sneaker resellers, price monitoring, dropshipping, market research, arbitrage, and price-comparison apps.

What does this StockX scraper do?

  • Keyword search — find any product ("Jordan 1 Retro High", "Yeezy 350", "Rolex Submariner")
  • Three modes — keyword search (with category, brand, gender and activity filters plus server-side sorting), product lookup by id/slug/URL, and per-sale price history
  • Live resale pricing — lowest ask, highest bid, last sale, retail price
  • Per-size market data — pricing across every available size (optional PDP enrichment)
  • Rich product data — title, brand, model, colorway, style ID, images, description, release date
  • Fast API-based extraction — no headless browser, low memory (runs on 128 MB)
  • Built-in proxy support — routes through Apify Proxy by default

Who uses a StockX scraper?

WhoWhy
Sneaker resellersTrack lowest ask / last sale to spot arbitrage and price trends
E-commerce & dropshippingPull catalog + pricing to feed price-comparison and listing tools
Market researchersMonitor resale demand across brands, models, and categories
DevelopersGet clean StockX JSON via API without reverse-engineering the site

StockX pricing terms, explained

StockX runs as a bid/ask marketplace rather than a fixed-price store, so the numbers in the output mean something specific:

FieldWhat it means
lowestAskThe lowest ask across all sizes — the cheapest any seller will sell any size at right now.
highestBidThe highest bid across all sizes — the most any buyer will pay for any size right now.
lastSaleThe price the most recent completed transaction actually cleared at.
retailPriceThe original launch price from the brand, for comparison against resale value.

Do not subtract the two product-level numbers. They are aggregated across sizes and come from different sizes — measured across products, the lowest ask is typically a small size and the highest bid the largest — so highestBid - lowestAsk can come out positive and look like risk-free arbitrage when no such trade exists. They are faithful to the two headline numbers StockX itself shows, and they are not an order book.

The bid-ask spread exists per size. With Include product details enabled, variantSizes breaks the book down per size and carries a spread field (that size's own ask minus its own bid), which is the number to trade on — a shoe can sit above retail in one size and below it in another.

Input

FieldTypeDescription
modeselectsearch (keyword), product (look up ids/slugs/URLs you already have), salesHistory (one row per individual sale). Default search
qstringSearch keyword (e.g. Jordan 1 Retro High)
productIdsarrayFor product and salesHistory: a product id, a slug (air-jordan-1-retro-low-og-chicago-2025) or a full stockx.com URL — StockX accepts the id and the slug interchangeably
countrystringTwo-letter market code selecting whose order book is quoted. Default US
currencyselect30 currencies — USD, EUR, GBP, JPY, CAD, AUD, CHF, HKD, KRW, MXN, SEK, PLN, SGD, NZD, NOK, DKK, BRL, CLP, CNY, HUF, IDR, ILS, KWD, MOP, MYR, PEN, PHP, THB, TWD, VND. Default USD
includeDetailsbooleanFetch PDP fields (description, release date, per-size variantSizes with spread, 12-month statistics). Off by default for speed — and it bills two events per product, see Cost below
minPrice / maxPriceintegerKeep only products in this price band, in the selected currency. Applied by the Actor before billing, so filtered-out products cost nothing
maxItemsintegerMax products to scrape. 0 = no limit (default 100)
maxPagesintegerStop after this many result pages (~40 products each; StockX clamps to 40 but has been seen returning 43), for a predictable per-run cost. 0 = no page limit
maxSalesPerProductintegersalesHistory only: sales per product, newest first. 0 = the whole history (one popular Jordan 1 has 18,000+)
salesSincestringsalesHistory only: stop at the first sale older than this date, e.g. 2026-01-01
categoryselectScope to one StockX category: sneakers, apparel, accessories, collectibles, shoes, trading-cards, electronics. Works on its own or with a keyword. streetwear → Apparel, watches/handbags → Accessories
brandselectScope to one brand, server-side — Nike, Jordan, adidas, New Balance, Pokemon, Louis Vuitton, … Spelling- and case-exact, and it matches the brandName in the output, so a brand you see can be pasted back in. Other brands can be typed
genderselectmen, women, kids, unisex, infant, toddler, preschool, child — the complete set StockX accepts
activityselectrunning, basketball, soccer, football, skateboarding, tennis, golf, hiking, baseball
sortByselectServer-side ordering: featured, most-active, lowest_ask, highest_bid, recent_bids, recent_asks, deadstock_sold, release_date, price_premium, last_sale
proxyConfigurationobjectProxy settings (Apify Proxy on by default)

Markets and currencies

country and currency are independent. country picks which market's order book is quoted; currency only denominates it. For one product on the same day:

country / currencylowest askhighest bidlast sale
US / USD245645345
GB / GBP300461260
DE / EUR366554308
JP / JPY52,30068,90054,700
GB / USD398612345

Every row echoes the currency it is denominated in, so a dataset collected across markets stays unambiguous.

Modes

ModeWhat you give itWhat you get
searchq and/or any of category / brand / gender / activity, optionally sortBy, minPrice/maxPrice, maxItems, maxPagesOne row per product
productproductIdsOne row per product, always detail-enriched. No search needed if you already have ids
salesHistoryproductIds, maxSalesPerProduct, salesSinceOne row per completed sale (amount + timestamp) — the price history itself, not a summary

Filters

category, brand, gender and activity are all applied by StockX, not by this Actor — so they narrow the result set itself, and you are never charged for a row that was filtered out. They combine: brand adidas + gender men + category sneakers returns only adidas men's sneakers, and any of them works on its own with no keyword at all.

A contradictory combination returns nothing rather than quietly widening — brand Pokemon with activity running is zero rows, and the run says so.

Two notes on values. Brand is spelling- and case-exact: Hoka One One works, HOKA ONE ONE does not. And a brand also matches its collaborations, so asking for Nike includes Palace x Nike. The brand and activity lists are the values verified to return results rather than a complete catalogue, so you can type others; gender is a closed set of eight, and the plausible-but-wrong guesses (boys, girls, youth, male, female) are refused with an explanation instead of returning an empty run.

minPrice / maxPrice are the exception — StockX has no working server-side price filter (its lowest-ask-range is accepted and ignored), so those two are applied by the Actor, before billing.

Sorting

sortBy is applied by StockX, not by this Actor, so it orders the whole result set rather than the page in hand. Each option carries the direction StockX declares for it — "Price: low to high" is ascending, "Last sale: high to low" descending — which is why there is no separate direction input: sending any other direction returns the default feed instead.

On search depth: StockX reports a constant total: 1000 for every query — an empty query and a hyper-specific product title both come back with 1000 — so it is not a result count and not a ceiling. Paging continues past it and keeps returning new products, so this Actor stops when a page delivers nothing new rather than at a reported total. To collect a wide slice of the catalogue, combine category with several narrower keywords rather than running one broad search, and use sortBy to take the top of a slice (cheapest, most-sold, newest) rather than paging through all of it.

Cost

What you runEvents billed per productCost per 1,000 products
search without detailsplp-row$0.75
search with Include product detailsplp-row + pdp-row$1.50
product modepdp-row only$0.75
salesHistorysales-history-row per salesee the Pricing tab

A detail-enriched product is charged twice, because two units of work happened: it was returned by a search and then enriched from its product page. That is still the cheapest detail-enriched StockX output on the Store, but it is $1.50 per 1,000 and not $0.75 — budget accordingly. Products removed by minPrice/maxPrice are never charged, and product mode is not billed for a list row it never had. Platform usage (compute, proxy, transfer) is passed through on top, as shown on the Pricing tab.

Give a search keyword (search mode) or product ids (product / salesHistory mode). An input with neither has no way in: the run finishes with a message saying so and charges nothing.

Example input

{
"mode": "search",
"q": "Jordan 1 Retro High",
"country": "GB",
"currency": "GBP",
"includeDetails": true,
"maxItems": 50
}

Filters need no keyword — women's adidas running shoes, cheapest first:

{
"mode": "search",
"category": "sneakers",
"brand": "adidas",
"gender": "women",
"activity": "running",
"sortBy": "lowest_ask",
"maxItems": 100
}

A product lookup, for ids you already have:

{
"mode": "product",
"productIds": [
"air-jordan-1-retro-low-og-chicago-2025",
"https://stockx.com/air-jordan-1-retro-high-og-chicago-reimagined-lost-and-found"
]
}

The last 200 sales of one product:

{
"mode": "salesHistory",
"productIds": ["air-jordan-1-retro-high-og-chicago-reimagined-lost-and-found"],
"maxSalesPerProduct": 200
}

Output

Each product is one dataset record:

{
"id": "...",
"name": "Jordan 1 Retro High OG Chicago",
"title": "Jordan 1 Retro High OG Chicago Lost & Found",
"brandName": "Jordan",
"model": "Jordan 1 Retro High",
"colorway": "Varsity Red/Black-Sail-Muslin",
"styleId": "DZ5485-612",
"retailPrice": 180,
"currency": "USD",
"lowestAsk": 310,
"highestBid": 275,
"lastSale": 295,
"thumbUrl": "https://images.stockx.com/...",
"images": ["https://images.stockx.com/..."],
"productUrl": "https://stockx.com/...",
"productSlug": "air-jordan-1-...",
"description": "...",
"releaseDate": "2021-11-19",
"lastSaleDate": "2026-10-14T10:18:05.701Z",
"salesLast72Hours": 158,
"salesThisPeriod": 158,
"volatility": 0.432846,
"pricePremium": 1.226,
"premiumOverRetail": 115,
"premiumOverRetailPct": 63.89,
"changeValue": -80,
"changePercentage": -0.188235,
"annualHigh": 1899,
"annualLow": 230,
"annualAveragePrice": 273,
"annualSalesCount": 5257,
"last72HoursAveragePrice": 341,
"last72HoursSalesCount": 48,
"deadstockSold": 18321,
"deadstockAveragePrice": 404,
"variantSizes": [
{ "size": "10", "lowestAsk": 320, "highestBid": 280, "spread": 40,
"lastSale": 300, "lastSaleDate": "2026-10-13T...", "salesLast72Hours": 2 }
]
}

Market depth

FieldWhat it means
salesLast72Hours / last72HoursSalesCountHow many pairs actually sold in the last three days — the "can I sell it, and how fast" number
annualSalesCount / annualAveragePrice12-month sales count and average clearing price
annualHigh / annualLow12-month price range
volatilityStockX's own volatility measure for the product
changeValue / changePercentageMovement over StockX's current comparison window
premiumOverRetail / premiumOverRetailPctlastSale - retailPrice, and that as a percentage of retail. Derived here
pricePremiumStockX's own premium figure, passed through unchanged — not the same number as premiumOverRetailPct
last90DaysAveragePrice / last90DaysSalesCount90-day average clearing price and sales count
annualRangeHigh / annualRangeLow12-month range as StockX charts it (tighter than the absolute high/low)
lastLowestAskTime / lastHighestBidTimeWhen each side of the book was last set — how stale the quote is
deadstockSold / deadstockAveragePriceAll-time deadstock units sold and their average price
variantSizes[].spreadThat size's own ask minus its own bid — the only level at which a spread is meaningful

description, releaseDate, variantSizes, the annual* / last72Hours* statistics and the deadstock* fields are populated only when Include product details is enabled (or in product mode, which always enriches).

Sales history rows

salesHistory mode emits one row per completed sale instead of one row per product, and bills per row — so maxSalesPerProduct and salesSince are the knobs that bound a run's cost:

{
"productId": "019cfdb4-3545-7b24-8773-11f7411145fb",
"productName": "Jordan 1 Retro High OG Chicago Lost and Found",
"productSlug": "air-jordan-1-retro-high-og-chicago-reimagined-lost-and-found",
"styleId": "DZ5485-612",
"amount": 345,
"currency": "USD",
"soldAt": "2026-10-14T10:18:05.701Z",
"size": "11",
"variantId": "019cfdb6-e638-72d1-a095-f063f172217b",
"orderType": "EXPRESS"
}

Newest first, 50 sales per request, billed per sale row, and each sale carries the size it sold in — so the series can be pivoted per size even though the feed itself is product-level. Use maxSalesPerProduct or salesSince to take a window instead of the whole history.

Export formats

Download results as JSON, CSV, Excel, or XML, or pull them programmatically via the Apify API. Push to Google Sheets, Airtable, Zapier, Make, and more through Apify integrations.

n8n integration

Use the n8n-nodes-stockx-scraper community node (source) to run this Actor directly from an n8n workflow — search or look products up by id, get Simplified/Raw/Selected output, and use it as an AI Agent tool.

How does it work?

The scraper talks directly to StockX's data API instead of rendering pages, so it's fast and cheap:

  1. Runs a keyword search, a product lookup, or a sales-history walk
  2. Paginates results up to maxItems
  3. Optionally enriches each product with PDP details and per-size market data
  4. Stores structured records in the dataset

FAQ

Is scraping StockX legal? This tool collects publicly available data. You are responsible for complying with StockX's terms and applicable law. Don't collect personal data.

Do I need an account or API key? No StockX account needed. Runs on Apify with built-in proxy.

Can I get per-size prices? Yes — enable Include product details to get variantSizes with per-size ask/bid/last-sale.

Which categories are supported? Sneakers, streetwear, watches, handbags, electronics, collectibles, and trading cards.

What is the difference between lowest ask and highest bid? The lowest ask is the cheapest price a seller will accept right now; the highest bid is the most a buyer will currently pay. See the pricing terms table above.

Can I track sneaker prices over time? Yes. StockX exposes the current market state, not a price history, so build a history by scheduling the Actor and appending each run to the same dataset. Running daily gives you a daily price series per product and size.

Does it work for Jordan, Yeezy, Dunk, New Balance and other popular models? Yes — search by keyword ("Jordan 1 Retro High", "Yeezy 350", "Dunk Low Panda"), scope to a category, or pass product ids/URLs directly in product mode. There is no per-brand restriction.

Can I get prices for a specific shoe size? Yes — enable Include product details and read variantSizes, which carries ask, bid and last sale for every size StockX lists.

Resources

Sneaker & streetwear resale toolkit

Part of the Sneaker & streetwear resale toolkit — resale-market pricing and product data across the major sneaker/streetwear marketplaces and brands:

  • GOAT API Scraper — Scrapes GOAT.com product listings by search query or category.
  • Supreme API Scraper — Supreme catalogue: categories, full product detail, every colour/size variant.
  • Nike API Scraper — Scrape Nike.com listings and full product detail from api.nike.com.
  • Puma API Scraper — Scrapes PUMA.com product listing and detail via mobile app GraphQL API.

Did you find this useful?

Rate this actor on Apify! Your feedback helps other users find it and helps us keep improving it.