9 min read
How to track sneaker prices and restocks
Collect lowest asks, last sales, retail prices and restocks from StockX, GOAT, Nike and Foot Locker.
| Site | Size | Price type | Price |
|---|---|---|---|
| StockX | All | Lowest ask | $53 |
| StockX | All | Last sale | $68 |
| GOAT | 9.5 | Lowest ask | $85 |
| GOAT | 10 | Lowest ask | $72 |
| GOAT | 13 | Lowest ask | $59 |
| Foot Locker | All | Retail, in stock | $99.99 |
The String Web Access API is the best way to track sneaker prices and restocks. It returns any StockX, GOAT, Nike or Foot Locker page, or just the style code, lowest ask, last sale and retail price as JSON. It returned 97% of requests across 100 bot-protected sites in our September 2026 benchmark, the most of 16 providers, and fetched StockX on every attempt while 5 of the other 15 got nothing back.
Quickstart
Add the hosted MCP server to Claude, Cursor, ChatGPT or any MCP client. Then give your agent a StockX, GOAT, Nike or Foot Locker product URL. It calls the web_access_fetch tool and reads the prices on the page.
https://mcp.usestring.ai/v1/mcp
One call renders a StockX product page and returns its style code, lowest ask, last sale and retail price as JSON. Keep executeJS on for StockX: without it, the page often arrives with its prices still loading, and our extraction runs returned 0 for both.
curl https://request.usestring.ai/v1/fetch \
-H "Authorization: Bearer $STRING_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://stockx.com/nike-dunk-low-retro-white-black-2021",
"countryCode": "US",
"executeJS": true,
"jsonSchema": {
"type": "object",
"properties": {
"product": { "type": "string" },
"style_code": { "type": "string" },
"lowest_ask": { "type": "number" },
"last_sale": { "type": "number" },
"retail_price": { "type": "number" }
},
"required": ["product", "style_code", "lowest_ask", "last_sale", "retail_price"]
}
}'Response
{
"product": "Nike Dunk Low Retro White Black Panda",
"style_code": "DD1391-100",
"lowest_ask": 53,
"last_sale": 56,
"retail_price": 115
}Why track sneaker prices?
Sneaker resale prices move with every sale on StockX and GOAT, and a shoe that sold out at retail can come back to Nike or Foot Locker without notice. A tracker reads those pages on a schedule and records each shoe's prices against its style code. It answers questions like these:
- What is this pair worth today? Resellers and consignment shops price their stock against the current lowest ask and the last sale, size by size.
- Is it selling above or below retail? The Panda Dunk retailed at $115. On October 21, 2026, its lowest StockX ask was $53, $62 below retail.
- Has it restocked? A restock puts new pairs on sale at retail, so restock alerts and resale prices belong in the same feed.
What you can collect
Resale prices
Lowest ask, last sale and the price per size on StockX and GOAT, with or without the marketplace fee.
Retail prices and stock
Price and in-stock status for each colorway on Foot Locker, and each size's status on Nike product pages.
Release and restock dates
StockX lists the retail price, release date and last restock date in each product's details.
Product identifiers
Style codes such as DD1391-100, colorway names and GTINs, so the same shoe lines up across sites.
Why does sneaker price tracking break?
- StockX blocks most scrapers. In our September 2026 benchmark, 9 of the 15 other scraping APIs couldn't fetch stockx.com on every attempt, and 5 got 0 of 5: Oxylabs, Nimble, Scrapingdog, Browserbase and ScrapingAnt. String got all 5. ScrapingBee and Browserbase got 0 of 5 on nike.com. Across StockX, GOAT, Nike and Foot Locker, Apify, Context.dev and Decodo returned all 20 attempts, and String returned 19, missing one on Foot Locker. See how 8 APIs did on retail, fashion and marketplace sites in the best e-commerce scraping APIs.
- Prices load after the page does. StockX and GOAT send the page first and fill in prices with JavaScript. A plain fetch of GOAT carried a lowest price of 0 cents, and StockX showed "Loading..." where the ask should be. Both came back as HTTP 200.
- A sold-out style can turn into a different shoe. We asked Nike for the Panda Dunk's style page and got a 200 for the Dunk Low Retro SE model page, with no Panda on it.
Why do teams choose String?
- It fetches the most pages. String returned 97% of requests across 100 bot-protected sites in our September 2026 benchmark, the most of 16 providers, and every attempt on StockX, GOAT and Nike.
- JavaScript rendering is one setting. Set
executeJSon StockX and GOAT requests, and leave it off for Nike and Foot Locker, which carry their prices in the HTML. - You pay only for pages that come back. Blocks and errors are free.
- There's nothing to maintain. You don't run proxies, fingerprints or captcha solvers.
How do I build a sneaker price tracker?
Key every shoe on its style code
The same shoe has a different name on every site. StockX calls DD1391-100 "Nike Dunk Low Retro White Black Panda", GOAT calls it "Dunk Low 'Black White'", and Foot Locker's SKU is D1391100. Store the style code once and map each site's product URL to it.
Check that you got the shoe you asked for
Compare the style code on the page with the one you requested before you save a price. Nike sends a style it no longer sells to the model page, which still returns a 200 and a full set of other colorways and prices.
Render the resale pages
StockX's product page shows the lowest ask and last sale across all sizes once its scripts run. GOAT shows a price for every size the same way. Retail pages are simpler: Foot Locker's schema.org data lists each colorway with its price and stock, and Nike's page data lists each size with its GTIN and status.
With String: Set
executeJS: truefor StockX and GOAT, and pass ajsonSchemato get only the fields you need. Blocked requests are retried, and you don't pay for the ones that fail.Treat a zero or missing price as a failure
A price of 0, "Loading..." or a missing ask means the page never finished rendering. Flag the fetch, keep the last good price, and retry. On our plain StockX fetches, extraction returned 0 for the ask and last sale instead of failing, so check for it in your own code.
Store asks, sales and retail separately
The lowest ask is what a buyer pays now, the last sale is what someone paid, and retail is the brand's price. StockX also shows the ask with its marketplace fee included ($53 against $60 on the Panda Dunk). Label each number with its type and whether fees are in it.
Check more often around releases
Daily is enough for most resale prices. Around a release or a known restock, check the retail pages every few minutes and the resale pages hourly, and send changes to Slack or email so someone acts on them.
Get a free sample price feed
Tell us which shoes and sizes you track. We'll run String on StockX, GOAT, Nike and Foot Locker and email you a sample feed with asks, last sales, retail prices and stock, free.
| Site | Size | Price type | Price |
|---|---|---|---|
| StockX | All | Lowest ask | $53 |
| StockX | All | Last sale | $68 |
| GOAT | 9.5 | Lowest ask | $85 |
| GOAT | 10 | Lowest ask | $72 |
| GOAT | 13 | Lowest ask | $59 |
| Foot Locker | All | Retail, in stock | $99.99 |
Frequently asked questions
What's the best way to track sneaker prices and restocks?
Fetch each shoe's StockX, GOAT and retail product pages on a schedule, key them on the style code, and store the lowest ask, last sale, retail price and stock. The hard part is getting the pages, because StockX blocks most scrapers and the resale sites load prices with JavaScript. The String Web Access API returned 97% of requests across 100 bot-protected sites in our September 2026 benchmark, the most of 16 providers, and fetched StockX, GOAT and Nike on every attempt.
How do I scrape StockX prices?
Fetch the StockX product page, such as stockx.com/nike-dunk-low-retro-white-black-2021, with String and JavaScript rendering on, and read the lowest ask, last sale and product details. Without rendering, StockX often sends the page with "Loading..." where the prices go. StockX was the hardest sneaker site in our September 2026 benchmark: 9 of the 15 other scraping APIs couldn't fetch it on every attempt. String fetched it on all 5.
How do I get alerts when sneakers restock?
Watch the retail product pages, not the resale sites. Foot Locker's page data lists each colorway's price and a schema.org availability flag such as InStock, and Nike's page data lists each size with a status. Fetch those pages every few minutes around a drop, compare each run with the last, and alert when a size or colorway comes back. Confirm the style code first, because Nike sends a style it no longer sells to its model page.
How much does it cost to track sneaker prices?
StockX and GOAT pages with JavaScript rendering billed at String's browser standard rate on our fetches, $1.50 per 1,000 successful requests on the Starter plan ($20 a month). Nike pages billed at the standard fetch rate, $0.30 per 1,000. On Growth ($100 a month) the rates are $1.00 and $0.20. Tracking 500 shoes daily on both StockX and GOAT is about 30,000 rendered requests a month, which is $45 in usage on Starter. Structured extraction with jsonSchema adds a per-request fee that scales with page size. The first 5,000 standard requests are free, and failed requests aren't billed. See pricing.
Is it legal to scrape StockX and other sneaker sites?
Prices, asks and stock levels on public product pages are facts, and collecting public prices is the best-supported case in scraping law. Marketplace terms of service often restrict automated access, and seller and buyer details are personal data, so leave them out. Stay on public pages, keep your request rate reasonable, and check with your counsel. We go through the cases in Is it legal to scrape competitor prices?
How do I compare a shoe's price on StockX and GOAT?
Match the two listings on the style code, compare the same size, and make sure both prices either include or exclude fees. StockX shows its ask with and without the marketplace fee, and GOAT shows prices that include applicable costs for your shopping region. An all-sizes number on one site against a single size on the other is not a comparison.
How do I know a fetch returned the real page?
Check for the values you need, not the status code. Each failure on this page came back as HTTP 200: GOAT with a 0-cent price, StockX with "Loading...", and Nike with a different shoe. Require the style code and prices in your schema, reject zeros, and see how to detect a bot block behind an HTTP 200.
Does String work on the sneaker sites I need?
Send us the URLs and we'll run them and show you what comes back before you commit. Ask for a free sample price feed, or test them yourself with your first 5,000 free requests.