π StockX Sneaker & Streetwear Market Data
Pricing
from $5.00 / 1,000 results
π StockX Sneaker & Streetwear Market Data
Live StockX price, bid/ask, sales history, and size-by-size market data by product URL or search keyword. Reads StockX's own internal market-data API, not scraped page text.
Pricing
from $5.00 / 1,000 results
Rating
0.0
(0)
Developer
Hitman studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Live price, bid/ask, sales history, and a full size-by-size breakdown for any sneaker or streetwear item on StockX β by product URL or search keyword. No login, no API key.
Keywords: stockx scraper, stockx api, sneaker price api, sneaker resale data, stockx market data, sneaker bid ask, jordan price tracker, yeezy price tracker, sneaker reseller tool.
π Why this one
StockX protects its pages with a real Cloudflare managed JS-challenge β confirmed by direct testing: a plain HTTP request (even with full browser headers) and even a stealth Firefox browser both get stuck on StockX's "Just a moment..." interstitial. Most scrapers either give up here or lean on an expensive paid residential proxy + CAPTCHA-solving service.
This Actor gets through using CloakBrowser, a free, open (MIT-licensed) stealth-Chromium wrapper β confirmed by direct, repeated testing on the real site. No paid proxy, no CAPTCHA-solving subscription.
- Reads the real market-data API, not page text β once past the
challenge, this Actor doesn't scrape visible numbers off the page. It
reads the exact internal GraphQL responses (
GetMarketData,GetProductListings) that StockX's own frontend uses to render price/bid/ask/sales β the same numbers a logged-in buyer sees, straight from the source, not re-typed from the DOM. - Full size-by-size breakdown β lowest ask, highest bid, last sale, and 90-day average/count per size, not just one blended number for the whole product. Built by joining StockX's own variant IDs to their size labels β most scrapers skip this because it isn't on the surface of a single API call.
- Search by keyword, not just by URL β give it "air jordan 4" or "yeezy 350" and it finds and fetches every matching product itself.
- Honest about the one real limitation: Cloudflare's challenge is probabilistic, not absolute β confirmed by repeated direct testing (most page loads pass immediately; occasionally one needs a retry). The Actor launches one browser session per run and reuses it for every item, so only the very first page in a run typically needs a retry β everything after that reuses the already-cleared session. A page that still can't clear it after retrying comes back as one clear error row, never a silent empty result.
βοΈ How it works
- Launches a free, open-source stealth Chromium session (no proxy, no CAPTCHA solver).
- For each search keyword, loads StockX's own search results page and pulls out every matching product's URL directly from the rendered page.
- For each product (direct or found via search), loads its StockX page and
captures the real
GetMarketData+GetProductListingsAPI responses StockX's own frontend fires to render the page. - Joins the per-size variant IDs to their size labels (from the listings response) and normalizes everything into one clean row per product.
π Quick start
{ "searchQueries": ["air jordan 4"], "maxResultsPerSearch": 10 }
Or by direct product URL:
{ "productUrls": ["https://stockx.com/air-jordan-4-retro-black-cat-2025"] }
Or via the API, once published:
curl "https://api.apify.com/v2/acts/stockx-sneaker-market-data/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries": ["yeezy 350"], "maxResultsPerSearch": 5}'
π₯ Input
| Field | Type | Default | Description |
|---|---|---|---|
productUrls | array | [] | Full StockX URLs or bare slugs β one per line |
searchQueries | array | [] | Keywords to search StockX for |
maxResultsPerSearch | integer | 10 | Max products fetched per search (1β50) |
includeSampleListings | boolean | true | Attach a sample of individual seller listings per product |
β οΈ At least one of
productUrlsorsearchQueriesis required β if both are empty, the Actor runs one example search ("air jordan 4") so a first run never comes back completely empty.
π€ Output
| Field | Description |
|---|---|
title, style_id, colorway, retail_price, release_date | Product identity |
lowest_ask, highest_bid, number_of_asks, number_of_bids | Current market state (blended across all sizes) |
last_sale, sales_last_72h, last_sale_change_pct | Most recent sale |
avg_price_90d, sales_count_90d, avg_price_annual, sales_count_annual | Trailing price/volume stats |
size_variants | Full per-size breakdown β lowest ask, highest bid, last sale, 90-day avg/count, for every size StockX lists |
sample_listings | A sample of individual seller listings (size, condition, price), when includeSampleListings is on |
product_url | Direct link to the product on stockx.com |
{"record_type": "product","title": "Jordan 4 Retro Black Cat (2025)","style_id": "FV5029-010","colorway": "Black/Black/Light Graphite","retail_price": 220,"lowest_ask": 259,"highest_bid": 542,"last_sale": 333,"avg_price_90d": 316,"sales_count_90d": 5963,"size_variants": [{ "size": "9", "lowest_ask": 263, "highest_bid": 197, "last_sale": 357, "avg_price_90d": 310 }],"product_url": "https://stockx.com/air-jordan-4-retro-black-cat-2025"}
A product that fails outright (bad slug, or a challenge that never clears)
produces one record_type: "error" row with a real error message β never a
silent empty result.
π― Use cases
- Reseller price tracking β monitor lowest ask / last sale across a whole catalog of SKUs
- Size-level arbitrage research β spot which specific sizes are under/over-priced relative to the rest of the size run
- Market research β track 90-day/annual average price and sales volume by model or release
- Drop monitoring β run searches on a schedule to catch new releases and their opening market price
π Integration examples
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_TOKEN>")run = client.actor("stockx-sneaker-market-data").call(run_input={"searchQueries": ["air jordan 4"], "maxResultsPerSearch": 10})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["lowest_ask"], item["last_sale"])
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_TOKEN>' });const run = await client.actor('stockx-sneaker-market-data').call({productUrls: ['https://stockx.com/air-jordan-4-retro-black-cat-2025'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
π Performance & reliability
| Metric | Value (measured, not estimated) |
|---|---|
| Cost per product | ~$0.0001β0.0005 when no retry is needed; up to ~$0.006/product on a run where some items needed a retry (real cloud runs, tracked via Apify REST API) |
| Proxy required | No β confirmed by direct testing with a free, open stealth browser |
| CAPTCHA-solving service required | No |
| Login / API key required | No |
| Data source | StockX's own internal GraphQL API (the one stockx.com's own page calls) |
| Challenge handling | Up to 4 automatic retries per item; a sustained failure surfaces as one clear error row, never a silent gap |
| Typical time per item | ~5β10s once the run's first page has cleared Cloudflare (polls for data instead of a fixed wait) |
β FAQ
Does this need a StockX login or API key? No β it reads the same public, logged-out market-data API StockX's own product page calls.
Is this affiliated with StockX? No. It's an independent tool reading the same public data StockX's own website serves to any visitor β not an official StockX product.
Why do I sometimes see an error row instead of data? StockX's Cloudflare challenge is probabilistic β most loads pass straight through, but an occasional one needs a retry. The Actor retries automatically; a row only comes back as an error if every retry failed (e.g. the product slug doesn't exist).
Can I place bids or offers with this? No. This Actor only reads public market data β it doesn't bid, buy, sell, or touch your StockX account in any way.
βοΈ Notes
Reads only StockX's own public, already-listed market data β no login, no bidding, no private account data.