StockX Scraper at a glance
StockX Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, row is a, item, brand and size, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.40 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
- Ecommerce
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.40 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 40 options
- Run success
- 98.4% of completed public runs in the last 30 days
Scrape StockX market data by keyword, category or URL. Every row carries lowest ask, highest bid, last sale, bid ask spread, ask counts, 72 hour and 90 day sales volume, 12 month average price, volatility and premium over retail. Pick a size and every row becomes that size's own order book.
What StockX Scraper can do
- Two ways to start. Search by keyword or paste StockX product, search, category or brand links; most filters apply to both, except a pasted product URL, which always returns that one product in full. Most filters narrow the site's own pages read; four (minimum last sale, minimum recent sales, live-ask-only, live-bid-only) are checked after a page is read instead.
- The live market is on every row, no surcharge. Lowest ask, highest bid, last sale, the bid/ask spread, ask depth by shipping speed and 72 hour, 90 day and 12 month sales volume come back whether or not full product details are switched on.
- Size level order books. Set a size scale and a size and every row becomes that one size's own market. Turn on full product details instead and each row carries the whole size table, every size with its own order book and its own sale history.
- Filter honesty. StockX echoes back the filter set it actually resolved on every result page. The run reports that echo and warns when a filter you asked for was not applied, so a page that quietly widened never reads as a narrower result than it is.
- Multi market pricing. Seven StockX country markets, each with its own live order book and its own currency, not a currency conversion of one market.
- Built for monitoring. Incremental mode tracks a saved search over time and returns only new and updated records by default; reappeared and expired ones need Emit expired too. Resume continues one interrupted run without paying twice for what it already collected.
Choose what to collect
These inputs let you configure StockX Scraper - Ask, Bid, Last Sale by Size. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start the scrape. 'search' runs StockX keyword searches. 'url' processes the StockX URLs you paste: a product URL is fetched as a single product, and a search, category or brand URL is paged like a search. Only where the scope comes from differs: the filters below apply in BOTH modes. 'salesHistory' returns one row per completed sale (price, time, size, order type) for the products you list under Product ids. |
searchTermsarray | One or more things to search StockX for, for example 'air jordan 1', 'nike dunk low', 'yeezy 350'. Each term is scraped independently. Search mode only: in URL mode the scope is read out of each pasted StockX URL instead. Leave this empty and the run browses the category you picked below (sneakers when you pick none), narrowed by the filters. |
urlsarray | Paste StockX product URLs (https://stockx.com/nike-dunk-low-retro-white-black-2021), search URLs (https://stockx.com/search?s=jordan+1), category URLs (https://stockx.com/category/sneakers) or brand pages (https://stockx.com/brands/nike). Add ?page=3 to any browse URL to start walking from that page instead of the first. The filters below are NOT ignored here: every pasted search, category or brand URL is re-run with them applied, and anything already in the URL wins for that URL. A pasted product URL is the one exception, since it returns that single product in full. |
productIdsarray | StockX product ids (UUIDs), product page URLs or product slugs such as air-jordan-1-retro-high-og-chicago-2015. Used by salesHistory mode only. |
maxSalesPerProductinteger | The most sale rows returned for each product, drawn across all of its sizes. Between 1 and 5000; 0 or empty uses the default of 100. salesHistory mode only. |
salesSincestring | Only return sales on or after this date, written YYYY-MM-DD (for example 2026-01-01). Leave empty for no date limit. salesHistory mode only. |
currencystring | Currency the sale amounts are quoted in. Applies to salesHistory mode; search and URL modes quote in the currency of the selected Market. |
Show 33 more inputs
| Input | What it controls |
|---|---|
categorystring | Only return items in this StockX category. Both top level categories (sneakers, apparel, collectibles) and sneaker sub categories (lifestyle, performance, luxury) are accepted. Applies in BOTH search mode and URL mode. |
brandsarray | Only return items from these brands, for example 'nike', 'adidas', 'jordan', 'new-balance'. Several brands are combined with OR. Leave empty for every brand. Applies in BOTH search mode and URL mode. A pasted brand page URL overrides this filter for that URL only. |
modelsarray | Only return items in these StockX models, for example 'dunk', 'air-force-1', 'air-max-90', 'campus-00s'. Use the slug StockX itself uses in its filter panel; spaces are converted for you. Several models are combined with OR. Applies in BOTH search mode and URL mode. |
productLinesarray | Only return items in these StockX product lines, for example 'blazer', 'cortez', '860v2'. StockX rebuilds this list per category and brand, so it is free text rather than a fixed list. Several product lines are combined with OR. Applies in BOTH search mode and URL mode. |
genderstring | Only return items cut for this audience. Applies in BOTH search mode and URL mode. |
colorstring | Only return items StockX files under this colour. Applies in BOTH search mode and URL mode. |
activitystring | Only return items StockX files under this activity. Applies in BOTH search mode and URL mode. |
shoeHeightstring | Only return low, mid or high cut shoes. Applies in BOTH search mode and URL mode. |
sizeScalestring | Which size scale the Size below is written in. Setting a scale AND a size changes what one row means: instead of one row per product with the cheapest ask across all sizes, you get one row per SIZE, carrying that size's own lowest ask, highest bid, last sale, spread, ask counts and sales volume. Leave on 'Off' for one row per product. Applies in BOTH search mode and URL mode. |
sizestring | The size to price, in the scale picked above, for example '10' or '9.5' for men's, '8' for women's, '4' for kids. Ignored unless Size scale is set. When both are set, every row is that size and every price on the row is that size's own price. Applies in BOTH search mode and URL mode. |
minPriceUsdinteger | Only return items whose lowest ask is at least this many US dollars. Sent to StockX as a price range together with the maximum. Applies in BOTH search mode and URL mode. |
maxPriceUsdinteger | Only return items whose lowest ask is at most this many US dollars. Sent to StockX as a price range together with the minimum. Applies in BOTH search mode and URL mode. |
availableNowboolean | Only return items that have at least one live ask right now, so they can be bought immediately. Applies in BOTH search mode and URL mode. |
xpressShipOnlyboolean | Only return items available with Xpress Ship, meaning stock already verified and held, which ships in a few days instead of a couple of weeks. Applies in BOTH search mode and URL mode. |
belowRetailOnlyboolean | Only return items whose lowest ask is below the original retail price. Applies in BOTH search mode and URL mode. |
minLastSaleUsdinteger | Only keep rows whose most recent sale was at least this many US dollars. StockX has no server side filter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
minSalesLast72Hoursinteger | Only keep rows that sold at least this many times in the last 72 hours, which is the quickest way to separate liquid items from dead stock. StockX has no server side filter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
hasLiveAskOnlyboolean | Only keep rows that currently have a lowest ask. Applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
hasLiveBidOnlyboolean | Only keep rows that currently have a highest bid. Applied to the rows this run reads. Applies in BOTH search mode and URL mode. |
orderBystring | Ordering sent to StockX itself, so it decides WHICH items you get first across the whole catalogue, not just how this run's rows are arranged. Each value here was checked against StockX and genuinely reorders results. Applies in BOTH search mode and URL mode, and a sort already present in a pasted URL wins for that URL. |
sortResultsBystring | Arranges the rows this run collected, after they are read. This is a local tidy up of one run's output, not a catalogue wide ordering: to change WHICH items you get, use 'Ask StockX to order results by' above. Applies in BOTH search mode and URL mode. |
fetchDetailsboolean | Fetch each item's product page for the style code (SKU), colourway, original retail price, release and restock dates, the complete size run in six size systems (US M, US W, UK, EU, CM, KR), the product line breadcrumb, the available conditions, tags and the full image set. Slower, and charged once per record. Leave off for a fast market crawl: identity, images, release date and the whole market block are included either way. |
maxItemsinteger | The single cap on this run: stop after collecting this many records across all search terms and URLs. With a size scale set, one record is one size. Set 0 for the hard maximum of 100000 records. |
maxPagesinteger | Safety bound on how many result pages to walk per search term or URL. Leave empty (0) for no page limit: the run then stops at Max items, not here. Does not impose a separate cap below Max items. StockX itself returns at most 1000 results per search or category, so a very broad scope needs the filters above rather than more pages. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or weekly recurring monitoring of the same search. The first run returns everything matching as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Compared: the market and catalogue fields (asks, bids, last sale, sales counts and averages, sizes and their per-size prices, title, images, tags), except the fields listed next. Ask, bid and last sale moves ARE reported as UPDATED: on a resale marketplace they are the signal, not noise. Excluded from the comparison (still returned in each row), at any depth including availableSizes and saleHistory: scrapedAt, detailCarriedForward, lowestAskUpdatedAt and highestBidUpdatedAt (restamped when an ask is re-listed at the same amount), annualRangeHigh, annualRangeLow, lastSaleDate, premiumOverRetail, premiumOverRetailPct, orderType, lastSaleChange, lastSaleChangePercent, salesPrevious72Hours, annualHighPrice and annualLowPrice (added after earlier baselines existed, so they never flag a record as UPDATED), and the query string of image URLs (resize and cache-bust parameters). On markets other than the US the per-size prices are now quoted in the row's own currency; the first run after the upgrade compares older saved records without availableSizes so this never flags them as UPDATED. Add more with Ignore fields below. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per search, URL, filter and size setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search terms, URLs, filters and size setup, so two different searches never mix state. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want a full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search: not when Max items capped it, not when Resume was used, not when the run was refused, and not when StockX's 1000 result limit truncated the scope. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to leave out when deciding whether a record changed, at any depth (for example salesLast72Hours, or saleHistory). They are still returned in every row and never show up in changedFields. Changing this list does not cause a one-time wave of UPDATED rows: the saved baseline is compared with the same list. Only used when Incremental changes is on. |
mcpConnectorsarray | Optionally send results 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 page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this 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 record pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on records 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.
recordIdID (text)rowTypeRow is a (text)titleItem (text)brandBrand (text)sizeSize (text)requestedSizeSize you asked for (text)styleIdStyle code (text)colorwayColourway (text)retailPriceRetail (USD) (number)lowestAskLowest ask (USD) (number)highestBidHighest bid (USD) (number)lastSaleLast sale (USD) (number)Show 31 more fields
currencyCurrency (text)marketMarket (text)bidAskSpreadBid ask spread (USD) (number)pricePremiumPremium over retail (number)salesLast72HoursSales, 72h (number)salesLast90DaysSales, 90d (number)averagePriceLast90DaysAverage price, 90d (USD) (number)priceVolatilityVolatility, 12m (number)standardAskCountAsks listed (number)releaseDateReleased (text)genderGender (text)productCategoryCategory (text)imageUrlImage (image)urlURL (link)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)sizeTypeSize scale (text)sizeConversionsSize in other scales (array)expressNextDayLowestAskXpress next day ask (USD) (number)expressNextDayAskCountXpress next day asks (number)availableSizesFull size run (array)availableSizeCountSizes offered (number)saleHistoryPointsRecorded sales in the size table (number)productNameItem (text)amountSale price (number)soldAtSold at (text)orderTypeOrder type (text)variantIdSize ID (text)productIdProduct ID (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"rowType": "variant",
"recordId": "a1b2c3d4-2222-4a2b-9c3d-000000000002",
"productId": "a1b2c3d4-1111-4a2b-9c3d-000000000001",
"variantId": "a1b2c3d4-2222-4a2b-9c3d-000000000002",
"title": "Northaven Trailcore 02 Storm Grey Ember",
"brand": "Northaven",
"model": "Northaven Trailcore 02",
"urlKey": "northaven-trailcore-02-storm-grey-ember",
"url": "https://stockx.com/northaven-trailcore-02-storm-grey-ember",
"size": "9",
"sizeType": "us m",
"requestedSize": "US M 9",
"sizeConversions": [
{
"size": "US M 9",
"type": "us m"
},
{
"size": "UK 8",
"type": "uk"
},
{
"size": "EU 42.5",
"type": "eu"
},
{
"size": "CM 27",
"type": "cm"
},
{
"size": "US W 10.5",
"type": "us w"
}
],
"lowestAsk": 210,
"lowestAskUpdatedAt": "2026-09-14T03:20:00Z",
"highestBid": 178,
"highestBidUpdatedAt": "2026-09-12T18:05:00Z",
"lastSale": 205,
"bidAskSpread": 32,
"standardAskCount": 54,
"standardLowestAsk": 210,
"expressNextDayAskCount": 9,
"expressNextDayLowestAsk": 228,
"salesLast72Hours": 21,
"salesLast90Days": 640,
"averagePriceLast90Days": 198,
"salesLast12Months": 2100,
"averagePriceLast12Months": 205,
"priceVolatility": 0.087,
"pricePremium": 0.45,
"currency": "USD",
"market": "US",
"releaseDate": "2022-11-05",
"gender": "men",
"productCategory": "sneakers",
"imageUrl": "https://images.stockx.com/images/Northaven-Trailcore-02-Storm-Grey-Ember-Product.jpg",
"scrapedAt": "2026-09-20T09:15:00Z"
}Ways to use this data
- Resale trading and arbitrage: compare lowest ask, highest bid and spread across sizes to find where a flip is actually worth doing.
- Pricing and inventory tools: feed live ask, bid and last sale data into your own storefront or pricing engine.
- Market research: build historical sales volume, volatility and price premium datasets across sneakers, apparel or collectibles.
- Drop and price monitoring: track a search or category on a schedule and get only new items and items whose price or sales statistics changed, not a full re-download.
- Demand modeling and data science: use per size sale history and 72 hour, 90 day and 12 month volume to model demand and seasonality.
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 StockX Scraper return?
The documented output for StockX Scraper includes id, row is a, item, brand, size, size you asked for, style code and colourway. Availability of each field depends on the source page and the selected mode.
How much does StockX Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.40 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 rows than I expected?
StockX returns at most 1000 results for any one search or category; a broad scope is truncated there rather than read in full, and the run tells you so. Narrow it with the category, brand, size, colour, price or availability filters, or raise Max items and Max pages. With multiple search terms or URLs, Max items is also split evenly across them and not rebalanced if one comes up short, so a search term with few results doesn't hand its unused budget to the others; the four client-side filters (minimum last sale, minimum recent sales, live-ask-only, live-bid-only) and cross-source deduplication can also leave a run with fewer rows than Max items alone would suggest.
Why did my run fail instead of returning an empty dataset?
If the connection is refused on every request, the run stops with a clear message so "nothing matched" is never confused with "nothing could be read." Run it again in a few minutes, or change the Connection setting. A search that genuinely matches nothing still succeeds, with an explanation instead of rows.
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.
