How to Scrape StockX & GOAT Resale Data for Market Research
The official StockX API is built for sellers and capped at 25,000 calls a day. For market research you go to the public pages — here is how to extract price history, size spreads and hype signals cleanly.
Sneaker resale is a real market with real price discovery, and StockX and GOAT are its two biggest order books. If you want to study that market — track price history, measure size spreads, spot which releases are heating up — the instinct is to reach for the official StockX API. That is usually the wrong tool. The StockX developer API is built for sellers: it authenticates with OAuth 2.0 behind an approval gate, exists to place and manage listings and orders, and is capped at 25,000 requests per 24-hour period at one request per second, with a hard 429 the moment you exceed it. It gives a seller their own inventory, not a researcher the whole market. For market research, the data lives on the public product pages. This guide shows how to collect it cleanly.
Why the official StockX API is the wrong tool for research
The developer portal is explicit about its purpose: catalog search, listing management and order management. Even sellers on the platform report long waits and rejections getting API access approved in the first place. And the rate ceiling — 25,000 calls a day, batch operations throttled to 500 items every 5 minutes up to 50,000 items daily — is generous for running your own shop but tiny for surveying thousands of styles across multiple sizes and both marketplaces. Crucially, it does not hand you a historical market feed: the numbers a researcher wants — annual highs and lows, volatility, price premium over retail, sales velocity per size — are computed and displayed on the public pages, not exposed as a bulk research endpoint.
So the practical split is simple. Use the official API if you are a seller automating your own asks. Use the public pages, collected responsibly, if you are doing price intelligence or trend research. The same logic applies across resale and retail — we walk the general version in price monitoring at scale.
There is also a coverage problem the API cannot solve. Resale prices are geo-sensitive: the same pair carries a different premium in a US market than in a European or Japanese one, because supply, taxes and demand differ by region. A researcher measuring the global market needs to read each product from several countries, which the seller API is not designed to do but a rotating residential pool with country targeting handles by default. That geographic dimension is often where the interesting arbitrage hides.
What data a StockX or GOAT product page holds
Each product page carries a surprisingly rich payload once you parse the embedded JSON that hydrates it. Per style you can read a stable SKU and UPC, and per size a whole order-book slice:
- Lowest ask and highest bid per size — the live bid/ask spread that tells you real liquidity.
- Total asks per size — depth of supply; a size with 200+ asks is not scarce, one with 3 is.
- Sales counts over 15, 30 and 60-day windows — velocity, which is the closest thing to a demand signal.
- Annual statistics — high, low, average price, sales count and a volatility figure per style.
- Price premium over retail — a hyped release can sit ~25% or more above its retail price; a dud sits below it.
- Weekly order count — a blunt but honest popularity rank across the catalogue.

Fetching the pages without getting blocked
StockX and GOAT sit behind serious bot management, and a datacenter IP hitting product JSON repeatedly gets challenged within a handful of requests. Two things keep collection alive: residential exit IPs that look like ordinary shoppers, and per-request rotation so no single address builds a suspicious pattern. Through residential proxies — 90M+ IPs across 200+ countries — each request lands from a different household address:
import requests, json
proxies = {
"http": "http://USER:PASS@gate.quantumproxies.io:PORT",
"https": "http://USER:PASS@gate.quantumproxies.io:PORT",
}
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"}
url = "https://stockx.com/air-jordan-1-retro-high-og-example"
html = requests.get(url, proxies=proxies, headers=headers, timeout=(5, 30)).text
# Product data hydrates from an embedded JSON blob, not the visible HTML.
start = html.find('{"props":')
blob = json.loads(html[start:html.rindex("}", 0, html.find("</script>", start)) + 1])
# Walk blob -> product -> market to reach asks, bids and statistics.
When the page returns a near-empty shell instead of the JSON, it has been served a client-side-rendered or challenge version — a symptom we break down in empty page, missing data. That is the point to escalate from raw proxies to a managed fetch. The Scraper API renders JavaScript on demand and returns clean JSON or markdown, so you stop maintaining headless browsers and parsers yourself:
curl -G "https://api.quantumproxies.io/scrape" \
--data-urlencode "url=https://stockx.com/air-jordan-1-retro-high-og-example" \
--data-urlencode "render=true" \
--data-urlencode "country=us" \
-H "Authorization: Bearer YOUR_API_KEY"
Turning raw asks into research signals
Once the variants are parsed, the analysis is small arithmetic that turns a wall of numbers into decisions. The size spread — the gap between the cheapest and most expensive size — reveals which sizes are scarce, and the premium over retail separates genuine hype from marketing noise:
def size_spread(variants):
asks = [v["lowest_ask"] for v in variants if v.get("lowest_ask")]
return {
"cheapest_size": min(asks),
"priciest_size": max(asks),
"spread_pct": round((max(asks) - min(asks)) / min(asks) * 100, 1),
}
def hype_score(stats, retail):
premium = (stats["annual_average_price"] - retail) / retail
return round(premium * 100, 1) # % over retail; negative = a dud
Run that across a watchlist on a daily schedule and you have a resale index: rising velocity plus a widening premium is an early heat signal, while falling sales and a shrinking premium mark a fade. Cross-referencing StockX against GOAT for the same SKU exposes arbitrage and confirms which platform leads price discovery for a given category. If your watchlist runs into thousands of styles, control your bill with the tactics in cutting proxy bandwidth costs — you rarely need images, only the JSON.
One note on conduct: this is market research on public, non-personal pricing data, which is the low-risk end of scraping, but you should still respect each platform's terms of service and rate-limit yourself politely. This is guidance, not legal advice.

Frequently asked questions
Does StockX have an official API?
Yes, but it is a seller tool, not a market-data service. The StockX developer API authenticates with OAuth 2.0 behind an approval process and covers catalog search, listing management and order management. It is capped at 25,000 requests per 24 hours at one request per second, and returns your own selling activity rather than a bulk historical feed of the wider market.
Is there a GOAT API for sneaker prices?
GOAT does not offer a public pricing API for researchers. Third-party aggregators and open-source projects pull GOAT data by scraping its public pages, the same approach you would take for StockX. Because both platforms use strong bot management, reliable collection depends on residential IPs and per-request rotation rather than a datacenter endpoint.
What sneaker data can I get without the official API?
The public product pages expose lowest ask and highest bid per size, total asks, sales counts over 15, 30 and 60-day windows, annual high/low/average prices, a volatility figure, weekly order velocity and stable SKU/UPC identifiers. That is enough to build price history, size-spread analysis and a hype index without ever touching the seller API.
How do I avoid getting blocked scraping StockX?
Use residential proxies so requests look like ordinary shoppers, rotate the exit IP on every request, set a realistic User-Agent and pace yourself. When pages return an empty shell instead of the embedded JSON, switch to a rendering scraper API that executes the page's JavaScript and returns structured data, rather than fighting the challenge yourself.
The resale market rewards whoever measures it best. The official API will not give you that measurement — it was never meant to. Public pages, collected on clean residential IPs and reduced to velocity and premium, turn a chaotic order book into a signal you can trade research decisions on.