StockX Scraper – Sneaker Prices, Resale Data & Product Details
Pricing
from $0.75 / 1,000 product list rows
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.
Maintained by CommunityActor 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?
| Who | Why |
|---|---|
| Sneaker resellers | Track lowest ask / last sale to spot arbitrage and price trends |
| E-commerce & dropshipping | Pull catalog + pricing to feed price-comparison and listing tools |
| Market researchers | Monitor resale demand across brands, models, and categories |
| Developers | Get 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:
| Field | What it means |
|---|---|
lowestAsk | The lowest ask across all sizes — the cheapest any seller will sell any size at right now. |
highestBid | The highest bid across all sizes — the most any buyer will pay for any size right now. |
lastSale | The price the most recent completed transaction actually cleared at. |
retailPrice | The 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
| Field | Type | Description |
|---|---|---|
mode | select | search (keyword), product (look up ids/slugs/URLs you already have), salesHistory (one row per individual sale). Default search |
q | string | Search keyword (e.g. Jordan 1 Retro High) |
productIds | array | For 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 |
country | string | Two-letter market code selecting whose order book is quoted. Default US |
currency | select | 30 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 |
includeDetails | boolean | Fetch 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 / maxPrice | integer | Keep only products in this price band, in the selected currency. Applied by the Actor before billing, so filtered-out products cost nothing |
maxItems | integer | Max products to scrape. 0 = no limit (default 100) |
maxPages | integer | Stop 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 |
maxSalesPerProduct | integer | salesHistory only: sales per product, newest first. 0 = the whole history (one popular Jordan 1 has 18,000+) |
salesSince | string | salesHistory only: stop at the first sale older than this date, e.g. 2026-01-01 |
category | select | Scope 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 |
brand | select | Scope 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 |
gender | select | men, women, kids, unisex, infant, toddler, preschool, child — the complete set StockX accepts |
activity | select | running, basketball, soccer, football, skateboarding, tennis, golf, hiking, baseball |
sortBy | select | Server-side ordering: featured, most-active, lowest_ask, highest_bid, recent_bids, recent_asks, deadstock_sold, release_date, price_premium, last_sale |
proxyConfiguration | object | Proxy 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 / currency | lowest ask | highest bid | last sale |
|---|---|---|---|
US / USD | 245 | 645 | 345 |
GB / GBP | 300 | 461 | 260 |
DE / EUR | 366 | 554 | 308 |
JP / JPY | 52,300 | 68,900 | 54,700 |
GB / USD | 398 | 612 | 345 |
Every row echoes the currency it is denominated in, so a dataset collected across markets stays
unambiguous.
Modes
| Mode | What you give it | What you get |
|---|---|---|
search | q and/or any of category / brand / gender / activity, optionally sortBy, minPrice/maxPrice, maxItems, maxPages | One row per product |
product | productIds | One row per product, always detail-enriched. No search needed if you already have ids |
salesHistory | productIds, maxSalesPerProduct, salesSince | One 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 run | Events billed per product | Cost per 1,000 products |
|---|---|---|
search without details | plp-row | $0.75 |
search with Include product details | plp-row + pdp-row | $1.50 |
product mode | pdp-row only | $0.75 |
salesHistory | sales-history-row per sale | see 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
| Field | What it means |
|---|---|
salesLast72Hours / last72HoursSalesCount | How many pairs actually sold in the last three days — the "can I sell it, and how fast" number |
annualSalesCount / annualAveragePrice | 12-month sales count and average clearing price |
annualHigh / annualLow | 12-month price range |
volatility | StockX's own volatility measure for the product |
changeValue / changePercentage | Movement over StockX's current comparison window |
premiumOverRetail / premiumOverRetailPct | lastSale - retailPrice, and that as a percentage of retail. Derived here |
pricePremium | StockX's own premium figure, passed through unchanged — not the same number as premiumOverRetailPct |
last90DaysAveragePrice / last90DaysSalesCount | 90-day average clearing price and sales count |
annualRangeHigh / annualRangeLow | 12-month range as StockX charts it (tighter than the absolute high/low) |
lastLowestAskTime / lastHighestBidTime | When each side of the book was last set — how stale the quote is |
deadstockSold / deadstockAveragePrice | All-time deadstock units sold and their average price |
variantSizes[].spread | That 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:
- Runs a keyword search, a product lookup, or a sales-history walk
- Paginates results up to
maxItems - Optionally enriches each product with PDP details and per-size market data
- 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
- Apify Platform documentation
- Apify API reference
- Integrations: Make, Zapier, Google Sheets, and more
- n8n community node for this Actor
- Join the Apify Discord community
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.