Comparison

Sneaker resale price API: ReefAPI vs Retailed

sneaker resale price API: A comp is a price several venues agree on. ReefAPI is the better choice when the item you are pricing trades in more than one place — a Stone Island jacket that only has real comps on Grailed, a Jordan whose ask sits on StockX and GOAT at once, a graded Charizard whose floor lives on SNKRDUNK in Japan — because all four are one key, one credit pool and one { ok, data, meta, error } envelope. Retailed is the better choice when StockX and GOAT are the whole job and you also want the retail side of the same catalogue: its documented endpoint index puts Chrono24, Nike, Zalando, Zara, Farfetch and Bestbuy beside the two resale venues, and five of its sources — StadiumGoods, Uniqlo, Dior, Macy's and Forever21 — are ones we have no engine for at all. It also sells an inventory-management product around the data, which we do not sell in any form.

vs Retailed4 ReefAPI enginesOne key · one credit poolFree tier
Table

ReefAPI vs Retailed

DimensionReefAPIRetailedBest fit
Venues covered for resale compsGrailed, StockX, GOAT and SNKRDUNK, plus the wider second-hand cluster on the same key: Vinted, Mercari, Depop, Poshmark, Vestiaire Collective, Kream, eBay, Yahoo Auctions, Catawiki, OfferUp, TCGplayer and Cardmarket. Every one of them is an engine on the live catalogue, and every one draws from the same credit balance.StockX and GOAT. Read from Retailed's own documentation index at docs.retailed.io/llms.txt on 2026-09-24, the StockX set is search, product and trends, and the GOAT set is search, product, prices and trends. Grailed is not in that index. Neither is SNKRDUNK.ReefAPI
Prices that actually clearedGrailed sold_listings returns the asking price, the price the item sold for and the timestamp of the sale on the same row — 40 of 40 rows carried all three when we measured it on 2026-08-28. StockX adds recent_sales, sales_history and price_history, which are separate endpoints over real trades. GOAT and SNKRDUNK publish no sold prices at all and the engines say so instead of inventing a trend. Worth knowing before you plan around official access: StockX's own published API spec, read on 2026-09-24, has no sales-history path in it either.Retailed's StockX endpoint set — search, product, trends — documents no sales-history or sold-listings call, and its 'trends' endpoint is trending products by category, not a price series. Its GOAT prices endpoint is keyed on lastSoldPriceCents per size, so a last sold figure is there on the GOAT side.ReefAPI
Per-size market depthStockX product_detail returns variants[] with a lowest_ask, highest_bid and last_sale per size, plus number_of_asks and number_of_bids so you can see which sizes are liquid. GOAT prices returns one row per size with lowest_ask_usd and listing_count — on the Jordan 1 'Chicago' the size-9 row read $425 across 19 listings while size 11 read $347 across 13, which is the difference between a thin size and a real market.Retailed's StockX product endpoint documents per-size variants with lowest ask and highest bid. Its GOAT prices endpoint returns sizeOption with boxCondition, shoeCondition, stockStatus and lastSoldPriceCents; the documented example does not carry a listing count.Depends
Product modelA data API and nothing else. There is no inventory tool, no dashboard, no CRM — you call an endpoint and you get JSON back. Every engine on the platform — 280 of them on the live catalogue on 2026-09-24 — answers in the same { ok, data, meta, error } envelope.An inventory-management platform for resellers first, with the data API sold beside it as 'Datasources'. The two are priced separately: inventory plans are counted in active items, API plans in credits. If you want the software as well as the feed, that is a real advantage and it is theirs.Alternative
Pricing modelOne prepaid credit pool. Pro is $15 a month for 10,000 credits, Ultra $50 for 50,000, Enterprise $200 for 300,000, which is $1.50, $1.00 and $0.67 per 1,000 credits. Paid yearly those halve to $0.75, $0.50 and $0.33. Credits do not expire and are not forfeited at a month boundary.Two products, two meters. API: 'Standard API Usage' starts at $49 a month for a band described as 18,000 to 110,000 credits, 'Enterprise API Usage' starts at $499 a month for 230,000 to over 1,000,000, and 'Datasets' starts at $1,000 a month. Inventory: Free at 25 active items, Starter $19, Professional $49, Warehouse $249, or $15, $39 and $199 billed annually.Depends
Free tier1,000 credits on signup, no card. At one credit for a Grailed sold_listings call, that is a thousand comp queries before you decide anything.'Get 50 free API credits upon signing-up!' on retailed.io/datasources, read 2026-09-24. The inventory product has its own separate free plan at 25 active items.ReefAPI
Failed or blocked callsNot charged — failed or blocked ReefAPI calls are not charged, except verified SHEIN NOT_FOUND on product/detail and price (4 credits). None of the four resale engines on this page is affected by that exception.Not published. Neither retailed.io/pricing, retailed.io/datasources nor the documentation introduction we read on 2026-09-24 says whether a failed request consumes a credit, so we are not going to guess on their behalf.ReefAPI
Units on the wireMoney is decimal and the unit is usually in the field name: GOAT returns lowest_ask_usd, SNKRDUNK returns price_usd and min_price_usd next to a printed min_price_display. GOAT's 257.0 means $257, not 257 cents. The one trap we found is that GOAT's local display block is not pinned by the country parameter, and the engine page says so.Retailed's GOAT prices response names its money fields lastSoldPriceCents and instantShipLowestPriceCents, so the values are integer cents and dividing by 100 is your job. That is a perfectly normal convention; it is simply a different one, and mixing the two in one pipeline is how a $425 ask becomes $4.25.Depends
Geography of the compFour venues in three markets. StockX takes a market parameter (US, GB, DE, FR, IT, ES, NL, CA, AU, JP, MX, HK, SG) and returns a genuinely different order book per market rather than a converted number. GOAT takes a country. Grailed is one dollar market with currency stated on every row. SNKRDUNK is the Japanese market, priced in US dollars on its English storefront.Retailed's StockX and GOAT endpoints take a country parameter; the GOAT prices documentation names UK, FR and US, defaulting to US. That covers the two venues it carries.ReefAPI
Breadth beyond resale280 engines on the live catalogue on 2026-09-24, across e-commerce, classifieds, real estate, jobs, reviews, social, travel, finance and search — so the same key that prices a shoe also reads Amazon, Zillow or Reddit. But inside sneaker retail specifically we do not have StadiumGoods, Macy's, Uniqlo, Dior or Forever21, and Retailed does.Its published index spans Bestbuy, Chrono24, Dior, Farfetch, Forever21, GOAT, Macy's, Nike, StadiumGoods, StockX, Uniqlo, Zalando and Zara, and its site names more brand storefronts besides. Inside the sneaker and fashion lane that is a deeper retail bench than ours.Alternative
Best fitPricing an item against several venues at once, or pricing categories that live outside the sneaker lane entirely — archive menswear, graded cards, European second-hand.A StockX-and-GOAT workflow that also wants the retail catalogue beside it, and resellers who want the inventory software and the data from one vendor.Depends
Pricing

What each side actually charges

Both columns are published prices, not quotes. Ours are generated from the same plan file the checkout charges against, so they cannot drift from what you would pay. Retailed’s were read off Retailed’s own pricing page on and are reproduced with their plan names and their units. Prices change; check the linked page before you commit.

Read this before comparing the two tables

🔴 Both sides say "credit" and the two credits are not comparable, in two separate ways. First, Retailed does not publish what one credit buys or what one endpoint costs: the documentation pages for the StockX product and trends endpoints state no credit cost, and the pricing page gives a band (18,000 to 110,000) against a floor price ($49) without mapping one to the other. That makes their per-credit rate genuinely unknown rather than merely inconvenient to compute. Second, our own credit is a call, and not every call is one credit: on these four engines Grailed is 1 credit on all six actions, GOAT is 1 on all five, SNKRDUNK is 1 on everything except conditions which is 0, and StockX is 2 for product_detail, 3 for price_history, 1 for recent_sales, sales_history and suggest, and 1 per 40 rows for search, browse and trending. Across the whole catalogue, 67% of actions cost 1 credit, 18% cost 2 and 5% cost 3, measured on 1,124 actions on 2026-08-25. And the inventory rows in the table above are counted in ACTIVE ITEMS, which is not a data unit at all — they are in the table because a buyer comparing the two vendors will see them on the same page, not because they belong in the same column as a credit.

ReefAPI — published plans
PlanPriceIncludedPer 1,000 credits
Free$01,000 credits at signup, no card
Pro$15 / mo10,000 credits / mo$1.50
Ultra$50 / mo50,000 credits / mo$1.00
Mega$100 / mo125,000 credits / mo$0.80
Enterprise$200 / mo300,000 credits / mo$0.67
Retailed — published plans
PlanPriceIncluded
Free$0"Get 50 free API credits upon signing-up!" on the datasources page, alongside a "Free trial" option when creating an API token. The inventory product is a separate thing with its own free plan at 25 active items. Whether a card is required for either is not stated on the pages we read.
Standard API UsageStarts at $49 / moFrom 18,000 to 110,000 credits — the page prints the band and the starting price but maps no specific price to a specific credit count, so the rate inside the band is not published
Enterprise API UsageStarts at $499 / moFrom 230,000 to +1,000,000 credits — same band-with-a-floor shape as Standard
DatasetsStarts at $1,000 / mo+10 high quality datasets — a bulk product, not per-call reads
Inventory — Free$0 / mo25 active items — a different product from the API; items, not credits
Inventory — Starter$19 / mo300 active items — $15 / mo billed annually, a 20% discount
Inventory — Professional$49 / mo3,000 active items — $39 / mo billed annually; the page labels this one BEST VALUE
Inventory — Warehouse$249 / moUnlimited items — $199 / mo billed annually
ReefAPI, in one line

$0.67–$1.50 / 1,000 credits on monthly billing, or $0.33–$0.75 / 1,000 credits paid yearly (−50%). Credits roll over and never expire, and every engine draws from the same balance. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits). Credits are not requests: measured across 1,124 catalog actions on 2026-08-25, 67% cost one credit, 18% cost two and 5% cost three.

Does Retailed charge for failed or blocked calls?

Not published. We read retailed.io/pricing, retailed.io/datasources and the documentation introduction on 2026-09-24 and none of them says whether a failed or blocked request consumes a credit, so we are not putting an answer in their mouth. On our side a failed or blocked call is not charged, except verified SHEIN NOT_FOUND on product/detail and price (4 credits), which does not touch any engine on this page.

Where Retailed beats us

Three things run their way and one of them may be decisive. (1) Their rate may be cheaper than ours and we cannot rule it out: $49 for the bottom of their band is $2.72 per 1,000 credits, which is dearer than our $1.50 Pro rate, but $49 for the 110,000 at the top of the same band would be $0.45 per 1,000, cheaper than anything we sell monthly and cheaper than our $0.67 Enterprise rate. Their page does not say which end $49 buys, so neither do we — ask them before you believe our column. (2) Their sneaker-adjacent retail bench is deeper than ours: StadiumGoods, Macy's, Uniqlo, Dior and Forever21 are in their documented endpoint index and we have no engine for any of them, and their site names Palace, Stone Island, Adidas, Gap, Mango, Hermes, Revolve, Stüssy, EndClothing, Sports Direct, La Redoute and Anthropologie besides. If your job is retail-versus-resale arbitrage across brand storefronts, they are simply further along. (3) They sell the reseller software — inventory, analytics, expense tracking, a public inventory page — from $0 to $249 a month, and we sell no software at all, only endpoints. (4) And Retailed is not the only thing you are weighing us against. Read on 2026-09-24, the cheapest StockX row on Apify is $0.00075 and the one SNKRDUNK actor is $0.001 a record after a $0.10 start, so anyone whose workload is a handful of single rows a day can beat our per-call price somewhere in that market — and one commercial StockX-and-GOAT vendor publishes $400 a month for under 300,000 calls, falling to about $0.00016 a request above two million a month, which is an order of magnitude under our best rate at volumes we do not price for. What runs our way is narrower and specific: four resale venues instead of two, sold prices on Grailed and StockX where StockX's own official API has no sales-history endpoint at all, 1,000 free credits against 50, a published per-action credit cost on every endpoint, a page of 40 rows for one credit rather than a charge per row, and no charge for a call that fails.

Retailed prices read from retailed.io — pricing page on . ReefAPI prices from reefapi.com/pricing, generated at build time.

Pick ReefAPI

When ReefAPI is the better fit

  • The item you are pricing does not trade in one place. A Stone Island jacket has no StockX page and its only real comps are Grailed sold rows; a Jordan has an ask on StockX and a different ask on GOAT; a PSA 10 card has a floor on SNKRDUNK that no US venue quotes. One key covers all four.
  • You need the price something sold for, not the price somebody is asking. Grailed's sold_listings carries sold_price, sold_at and the original asking price on the same row, and StockX carries recent_sales, sales_history and price_history as separate endpoints.
  • You want size-level depth rather than a single headline number: StockX variants[] with number_of_asks and number_of_bids per size, GOAT's per-size lowest_ask_usd with listing_count.
  • Your product already needs data from outside the sneaker lane — Vinted, Mercari, Depop, Poshmark, Vestiaire, eBay, TCGplayer or Cardmarket are engines on the same key and the same credit pool.
  • You would rather not pay for calls that fail. A blocked or timed-out call is not charged on any of these four engines.
  • You want a larger free tier to evaluate with: 1,000 credits against 50.
Pick Retailed

When the alternative is better

  • StockX and GOAT are the entire job and you do not need Grailed or SNKRDUNK. Retailed is purpose-built for exactly that pair and has been shipping to resellers around it.
  • You want the retail side of the same catalogue in the same key — StadiumGoods, Macy's, Uniqlo, Dior and Forever21 are in their published index and are not engines of ours.
  • You want inventory management, analytics and expense tracking as software rather than as an API you have to build a product on top of. Retailed sells that, with a free plan at 25 active items and paid tiers from $19 a month; we sell nothing of the kind.
  • You want their Datasets product, published from $1,000 a month, rather than live per-call reads.
  • Cents-integer money fields fit your existing pipeline better than our decimal dollar fields.
Proof point

Real ReefAPI snapshot

ReefAPI captured this live stockx example on . It is committed in the SEO snapshot store and used as page evidence, not generated copy.

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/stockx/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "jordan 1"
  }
}
Captured response excerpt
{
  "ok": true,
  "meta": {
    "api": "stockx",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1555.8,
    "record_count": 40,
    "bytes": 32434,
    "cache_hit": false,
    "currency": "USD",
    "market": "US",
    "page": 1,
    "total": 1000,
    "pagination": {
      "page": 1,
      "has_more": true
    }
  },
  "data": {
    "query": "jordan 1",
    "results": [
      {
        "id": "019cfdb4-3545-7b24-8773-11f7411145fb",
        "url_key": "air-jordan-1-retro-low-og-sp-travis-scott-sail-tropical-pink",
        "url": "https://stockx.com/air-jordan-1-retro-low-og-sp-travis-scott-sail-tropical-pink",
        "title": "Jordan 1 Retro Low OG SP Travis Scott Sail Tropical Pink",
        "brand": "Jordan",
        "sku": "IQ7604-101",
        "category": "sneakers",
        "gender": "men",
        "image": "https://images.stockx.com/images/Air-Jordan-1-Retro-Low-OG-SP-Travis-Scott-Sail-Tropical-Pink-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1779381546",
        "lowest_ask": 262,
        "highest_bid": 640,
        "last_sale": 262
      },
      {
        "id": "c21909e2-c5ca-48b4-a1db-66d6f6c5b55c",
        "url_key": "air-jordan-1-retro-high-virgil-abloh-archive-alaska",
        "url": "https://stockx.com/air-jordan-1-retro-high-virgil-abloh-archive-alaska",
        "title": "Jordan 1 Retro High Virgil Abloh Archive Alaska",
        "brand": "Jordan",
        "sku": "AA3834-100",
        "category": "sneakers",
        "gender": "men",
        "image": "https://images.stockx.com/images/Air-Jordan-1-Retro-High-Off-White-Alaska-Product.jpg?fit=fill&bg=FFFFFF&w=700&h=500&fm=webp&auto=compress&q=90&dpr=2&trim=color&updated_at=1784258612",
        "lowest_ask": 236,
        "highest_bid": 624,
        "last_sale": 400
      }
    ],
    "page_info": {
      "page": 1,
      "limit": 40,
      "total": 1000
    }
  }
}
Measured

What we found when we called our own endpoints

Every comparison page on the internet will tell you its own product is good. These are numbers we got by calling ReefAPI and writing down what came back, including where the answer went against us. Each one is dated and each one is repeatable against the same endpoint.

stockxmeasured

A product's lowest ask and highest bid are not a spread, and reading them as one prices the wrong size

This is the field that goes wrong most often in resale pricing, so it is worth being exact. market.lowest_ask is the cheapest ask ACROSS ALL SIZES and market.highest_bid is the dearest bid across all sizes, so a product can correctly report a highest_bid of $286 against a lowest_ask of $154 — those are two different shoes in two different sizes and the difference is not arbitrage. Only variants[] gives a real per-size spread, and there the ask sits above the bid as it should: size 3.5 asked $188 against a bid of $115 on the same run. If your comp engine subtracts the product-level bid from the product-level ask, it is computing a number that does not exist.

stockxmeasured

retail_price does not convert, so a premium computed against it in euros is wrong

Against us. Reading the same product on the German market in EUR changed every market number — the lowest ask went from $154 to 103, and the per-size asks changed entirely, because it is a different order book rather than a converted one. retail_price stayed at 180 through the change. So retail_price is a USD figure whatever currency you asked for, and a price premium of (last_sale − retail) / retail is only meaningful in USD. The variant count stayed at the same 26 sizes on both markets, so the size grid is global and the prices are not.

stockxmeasured

price_history samples the last 400 sales, not the window you asked for

Against us, and it costs 3 credits, the dearest action on the engine, so check before you pay for a long one. Asking a 365-day window bucketed by month returned ONE point, with summary.sales_sampled at 400 and window_complete false — on a shoe selling that fast, 400 sales is a few weeks, not a year. A 90-day window bucketed by week returned five points from the same product. The endpoint does tell you it is incomplete, which is the behaviour you want, but a trend line built without reading window_complete will be a trend line over an unknown and variable period.

stockxmeasured

The manufacturer style code is filled on sneakers and almost nowhere else

Against us, though it is the source's doing. sku was filled on 20 of 20 sneaker rows, 2 of 14 watch rows and 0 of 20 trading-card rows. Streetwear and collectibles have no manufacturer style code to carry. If the key you join on across venues is the style code — the natural choice, because DZ5485-612 means the same shoe on StockX, GOAT and a retailer — this engine will join sneakers to your catalogue and very little else. Outside sneakers you are matching on title and colourway, which is a different and worse problem.

stockxmeasured

A zero-ask product is not a cheap product, it is an unbuyable one

Measured over three queries of 40 cards each. Eighteen cards came back with zero asks and every one of the eighteen had lowest_ask null; 102 cards had asks and every one of those was priced. So in_stock is derived from the source's own market.state.numberOfAsks rather than from a price being present, and a product with bids but no asks is false, because nobody can buy it. A comp set that silently drops the null-priced rows loses exactly the items whose market has gone. In the same session the cheaper price action returned the same market numbers from 6,105 upstream bytes against product_detail's 10,976, at 0.99 s against 1.06 s.

grailedmeasured

Forty of forty sold rows carried the asking price and the real one together

This is the single reason Grailed is on this page. Every sold row we measured carried sold_price, sold_at and the original asking price side by side. Eleven of the forty sold at exactly the asking price; the rest closed below it, in a band running from a few per cent under to roughly half off. You do not have to infer the discount from two separate calls, and you do not have to treat an asking price as a comp. The forty newest sold rows for one query spanned three days, so sorted newest-first this is a rolling window of what actually cleared rather than an archive dump — which is what makes it usable for pricing an item today.

grailedmeasured

Paging stops at exactly one thousand rows, and the reported total is much larger

Against us, and it decides how you build the crawl. Page 25 returned a full forty rows. Page 26 returned zero, with has_more false and the reported total dropping to zero — a clean stop, but a stop, and it lands at 25 pages of 40 against the 22,929 results the same query claimed. Narrow with designer, size, category and a price band instead of walking a broad query to the end, because there is no end to reach. Run twice, the same comp query returned the identical forty listing ids both times, and page one and page two shared nothing, so a nightly diff over a narrowed query is signal rather than noise.

goatmeasured

The per-size grid is the comp, and the sizes without a live ask are simply absent

On the Air Jordan 1 'Chicago' the used grid returned real per-size asks: size 8 at $378 across 10 listings, size 9 at $425 across 19, size 9.5 at $503 across 17, size 10.5 at $451 across 15, size 11 at $347 across 13, with the overall lowest at size 8.5 for $268 — a spread of $235 between the cheapest and dearest size of one shoe, which is why a single headline price is not a comp. The call took 4.2 s because it fans out one request per size under a bounded concurrency cap. The same run returned the catalogue record for the shoe with a GOAT display price of $160, so the resale premium on the cheapest size was already over 60%.

goatmeasured

The local display price is not pinned by the country parameter

Against us, twice over. First, the same product answered USD 160.00 and then EUR 139.00 minutes apart while the country parameter did not change, so the display_price_local block is display-only and must not be computed on — do the arithmetic on the *_usd fields, which are decimal dollars rather than cents, where 257.0 means $257 and dividing by 100 puts you out by two orders of magnitude. Second, only sizes with a live ask come back: 15 of the 23 sizes we probed returned a row and the other 8 were absent rather than null, so join product_detail.size_range if you need the gaps marked as gaps. The condition parameter has exactly two values, used and new_no_defects; used is the deep resale pool and new_no_defects is often honestly empty in smaller markets.

snkrdunkmeasured

No sales history exists upstream, and we probed it properly before saying so

Against us, and it is the first thing a price tracker needs to know. Sold-listings, price-history, offers and rankings routes all answer 404 — and those 404s mean the route does not exist rather than that we were blocked, because every route verdict was taken by first confirming that a known-good endpoint answered 200 under exactly the same conditions, and only then probing the unknown one. Without that control call, ten non-existent routes read as "exists but walled". What the source does publish is live listings and the current floor per grade, so a trend line has to come from your own snapshots over time. Over 77 live calls the engine returned 76 ok, 98.7%, with search at a 3.0 s median and the 30-product batch at 1.6 s.

snkrdunkmeasured

Listing counts are strings capped at "99+", and the cap hits exactly the busiest cards

Against us, caught in review before the engine shipped. The source returns counts as strings and caps them at "99+", so int() failed and the field vanished for precisely the cards with the deepest markets — 5 of 5 rows on a popular search. It is now parsed to 99 with count_is_lower_bound true beside it. The proof is one card reading 99 on a search row, capped, and 599 on its own detail record. Two other traps from the same review: the price and the listing count are siblings of the product object rather than inside it, so parsing the product alone silently dropped both, and epoch zero is the source's way of saying "unknown date", returned as null rather than as 1 January 1970.

FAQ

Questions developers ask before switching

Does this include sold prices, or only what sellers are asking?

Both, but not from every venue, and the difference matters more than anything else on this page. Grailed's sold_listings returns the price the item actually sold for, the price that had been asked, and the timestamp of the sale, all on the same row — 40 of 40 rows carried all three when we measured it on 2026-08-28. StockX publishes cleared trades through three separate endpoints: recent_sales with timestamps, sales_history which is cursor-paged and reports the total number of sales on record, and price_history which buckets them, at 1, 1 and 3 credits. GOAT and SNKRDUNK publish no sold prices to a logged-out reader, so those two engines return live asks and current floors and say so. If your valuation needs a cleared price rather than an ask, build it on Grailed and StockX and use GOAT and SNKRDUNK to check the ask side.

Which venue covers which region, and can I compare their prices directly?

StockX is regional in the strongest sense: the market parameter takes US, GB, DE, FR, IT, ES, NL, CA, AU, JP, MX, HK and SG, and US and DE returned different asks, bids and last sales for the same product on the same minute — a different order book, not a converted number. GOAT takes a country parameter across US, GB, DE, FR, IT, CA, AU, JP, KR, HK, NL and ES. On Grailed, every listing and every comp we measured carried currency USD on the row itself rather than leaving it to be inferred from a locale, and its price filters are dollars too, so a price band means the same thing on the request and on the response. SNKRDUNK is the Japanese market, quoted in US dollars on its English storefront with nothing converted by us. You can compare them, but only after you have fixed a currency and a market yourself — and never against StockX's retail_price, which stays a USD figure whatever currency you asked in.

What does a size-level price actually mean, and why isn't one number enough?

On the Jordan 1 'Chicago' the GOAT used grid returned size 8 at $378, size 9 at $425, size 9.5 at $503, size 10.5 at $451, size 11 at $347 and an overall low of $268 at size 8.5 — a $235 spread across sizes of one shoe. Quoting a customer the product-level figure is quoting them a size they may not own. On StockX the trap is sharper: market.lowest_ask is the cheapest ask across all sizes and market.highest_bid is the dearest bid across all sizes, so the same product can report a highest_bid of $286 against a lowest_ask of $154 without anything being wrong. Only variants[] gives a per-size spread, where size 3.5 asked $188 against a bid of $115. Price the size, not the shoe.

What breaks, and what should I check for in the response?

Four things, all of which we hit ourselves. Paging: Grailed stops at exactly 1,000 rows — page 25 is full at 40 rows, page 26 is empty with has_more false, against a reported total of 22,929 — so narrow by designer, size, category and price band rather than walking a broad query. Windows: StockX price_history samples the last 400 sales rather than the window you asked for, and a 365-day request returned one point with window_complete false while a 90-day request returned five, so read window_complete before trusting a trend. Absence: GOAT omits sizes with no live ask entirely, 15 of 23 probed sizes came back, so join product_detail.size_range if you need the gaps marked. Caps: SNKRDUNK returns listing counts capped at "99+", now parsed to 99 with count_is_lower_bound true, and the same card read 99 on a search row against 599 on its own detail record.

Is there an official StockX API, and does it solve this?

There is one, and the honest answer is that it solves a different problem. We read its OpenAPI specification, which StockX publishes openly at developer.stockx.com/swagger.json, on 2026-09-24 rather than relying on anybody's summary. It is titled "StockX Public API" version 2.0.0 and describes itself as being to "Manage StockX seller account using APIs". Of its 32 documented paths, most are selling and order management — creating and updating listings, batch operations, active orders, order history, shipping documents. The market data is deliberately shallow: the product market-data endpoint is documented as returning "basic market data - the highest Bid and lowest Ask amount for all variants of given product", and there is no sales-history, price-history or sold-comps path anywhere in the spec. Access is gated twice: the getting-started page tells you to "complete the developer sign up form" and then that "When your account is approved, an API key will be automatically generated for you". No price is published. So if you want to list and ship on StockX, use the official API. If you want the price something sold for, it is not there — which is exactly why the whole third-party market in this answer exists.

And GOAT, Grailed and SNKRDUNK — do they have official APIs?

No, and we checked rather than assumed, on 2026-09-24. goat.com/developers returns a 404 and developers.goat.com does not resolve in DNS. grailed.com/developers returns HTTP 200, but it is a member profile — a Grailed user literally named "Developers", joined 2023, zero listings, zero transactions — not a portal. developer.snkrdunk.com does not resolve, snkrdunk.com/api is a 404, and the word "API" does not appear anywhere on the English storefront. Retailed's endpoint index, the most complete commercial one we found, listed 13 marketplaces that day — Bestbuy, Chrono24, Dior, Farfetch, Forever21, GOAT, Macy's, Nike, StadiumGoods, StockX, Uniqlo, Zalando and Zara — and neither Grailed nor SNKRDUNK is among them. For those three venues the routes that actually exist are a maintained engine like ours, a third-party actor or vendor, or a scraper you keep alive yourself.

What about the open-source repos I keep finding on GitHub?

Check the commit dates before you build on one, because the search results are misleading. The repository almost everybody lands on is Sneaks-API, which bundles StockX, GOAT, Flight Club and Stadium Goods and has 498 stars — and whose last commit was 2021-12-08, nearly four years before this page was written. The next one down, stockx-api at 181 stars, last committed 2022-02-19 and its own README says its product search is "deprecated and non-functional at the moment". For Grailed the entire open-source supply peaks at a 10-star monitor last touched in February 2023, and everything below it is a one-to-six-star student scraper from 2017 to 2021. For SNKRDUNK the top result has 4 stars and is an account generator, not a data tool. Two of the better-starred, genuinely maintained repos in this space are not open source at all — they are READMEs serving as storefronts for paid Chinese services. Star count measures how many people once hoped a repo would work.

Can I get all four venues from one vendor anywhere else?

Not from one product that we could find on 2026-09-24, and we went and counted rather than assuming. Retailed, the strongest specialist in the lane, publishes StockX and GOAT and neither of the other two. Apify has 65 actors across these four venues and every one of them is pay-per-event, with no monthly rentals at all — but they are 65 separate products from dozens of separate developers, each with its own input schema, its own output shape and its own price, and Apify's own pricing page warns that "pay-per-event Actors include the Apify platform usage in the event price, but some charge for it separately, so check the pricing section on the Actor's page". Their plans are $0, $19, $199 and $999 a month for $5, $19, $199 and $999 of platform usage. The concentration there is thinner than it looks: the busiest Grailed actor has 4,612 lifetime runs and 23 users, the busiest StockX actor 4,034 runs and 87 users, the busiest GOAT actor 590 runs and 6 users — and SNKRDUNK has exactly one actor in the entire store, 330 lifetime runs, search only, no sold history. So yes, one Apify token technically reaches all of them; what it does not give you is one schema, one price or one maintainer. With ReefAPI it is four endpoints, one key, one credit pool and the same { ok, data, meta, error } envelope on every one.

What will this cost me compared with the actors and listings I found?

Here is the honest spread, all read on 2026-09-24, and some of it goes against us. Our credit is $0.0015 on Pro at $15 a month, $0.001 on Ultra, $0.00067 on Enterprise, and half those paid yearly — and one credit is a whole call returning a whole page of rows, not one row. On Apify, the cheapest credible StockX actor charges $0.00075 per row and the busiest charges $0.002 per listing row and $0.006 per detail; the busiest Grailed actor charges $0.003 per listing and $0.012 for a full detail; the one SNKRDUNK actor charges a $0.10 actor start plus $0.001 per record. Bright Data sells StockX and GOAT as bulk datasets at "up to $0.0025 per record" with a $250 minimum order — 46,800-plus records on the StockX set and 2.1 million-plus on GOAT. On RapidAPI the only SNKRDUNK vendor is $149 a month for 10,000 requests and $499 for 50,000, which is $0.0149 and $0.00998 a request, roughly ten times our credit; the best-rated StockX listing there is $50 for 2,000 and $100 for 5,000 requests, or $0.02 a request. Do the division before you believe any of it, because the unit flips the answer. On a page of 40 Grailed or StockX rows, one credit at $0.0015 works out at $0.0000375 a row, which is twenty times cheaper than the cheapest per-row actor at $0.00075, and one SNKRDUNK batch credit covering 30 products is $0.00005 a product. Where the per-row vendors win is the opposite shape: if all you ever pull is a single product detail and never a page, $0.00075 for that one row beats our 1-credit Grailed detail at $0.0015 and our 2-credit StockX detail at $0.003. So: we are much cheaper by the page, they can be cheaper by the single row, and Bright Data at up to $0.0025 a record with a $250 floor is a different purchase altogether — a bulk dump rather than a live read.

Is anyone actually buying second-hand data, or is this a niche?

It is the busiest thing on our catalogue. Counting distinct customers who called an engine over the last 30 days, the second-hand cluster is the strongest demand we have: Vinted 28, Mercari 13, StockX 12, Grailed 12, GOAT 9. Read that for what it is and not for more. It counts customers, not calls, and it says nothing about whether our data is better than anyone else's — it is a measurement of what people are trying to build, which is resale pricing, and of the fact that StockX and Grailed sit level with each other rather than one of them being the whole market. It is also the reason the four engines on this page are maintained rather than parked: they are used every day, so a schema change gets noticed by us before it gets noticed by you.

What does a comp actually cost in credits?

Grailed is 1 credit on all six actions, so search, sold_listings, listing_detail, designers, designer_detail and seller_listings are a credit each. GOAT is 1 credit on all five, including the per-size prices grid. SNKRDUNK is 1 credit on everything except conditions, which is 0 because it is a day-long enum, and the 30-product batch is 1 credit for 30 products, which is what makes a daily catalogue refresh affordable. StockX is 2 for product_detail, 3 for price_history, 1 for price, recent_sales, sales_history and suggest, and 1 per 40 rows for search, browse and trending. That StockX price action matters if you refresh daily: for half the credits of product_detail it returns the product-level and per-size lowest ask, highest bid, last sale, ask and bid counts and in_stock, dropping the description, traits, media and the derived statistics block — 6,105 upstream bytes against product_detail's 10,976 on the same shoe. So a full cross-venue comp on one shoe — Grailed sold rows, StockX detail, GOAT grid, plus a StockX search to resolve the slug — is about 5 credits, which is under a cent on the Pro plan at $1.50 per 1,000, and a daily refresh of 1,300 products across StockX price and the GOAT grid is 2,600 credits a day. A failed or blocked call among them costs nothing. Every one of these numbers is served from the live catalogue rather than typed into this page, so it cannot drift from what you are actually billed.

Is ReefAPI cheaper than Retailed?

We do not know, and anyone who tells you they do has made it up. Retailed publishes a band, not a rate: 'Standard API Usage' starts at $49 a month for 'From 18,000 to 110,000 credits', and the page maps no price to a specific credit count. At the bottom of that band $49 buys 18,000 credits, which is $2.72 per 1,000 and dearer than our $1.50 Pro rate. At the top of the same band $49 would be $0.45 per 1,000, which undercuts every monthly rate we publish including the $0.67 Enterprise one; only our yearly Enterprise rate of $0.33 per 1,000 would still be lower, and that is paid twelve months up front. Their documentation also states no per-endpoint credit cost, so you cannot convert a workload into a bill in advance the way you can here, where every action's credit price is printed in the catalogue. Ask them what $49 buys before you compare the two columns.

Method

Source notes and hedges

Competitor pricing, quotas, free tiers and feature limits change. This page uses official public pages for product-positioning claims and keeps unstable commercial details general.

  • Retailed pricing: Read 2026-09-24 for the inventory plans ($0 / $19 / $49 / $249, annual $15 / $39 / $199) and the API bands ($49 and $499 starting prices).
  • Retailed datasources: Read 2026-09-24 for the credit bands (18,000-110,000 and 230,000-1,000,000+), the Datasets price from $1,000 a month and the '50 free API credits upon signing-up' line.
  • Retailed documentation index: Read 2026-09-24 for the full list of documented endpoints by marketplace — the source for StockX being search/product/trends, GOAT being search/product/prices/trends, and Grailed and SNKRDUNK being absent.
  • Retailed StockX product endpoint: Read 2026-09-24 for the per-size variant, lowest ask, highest bid and last sale fields, and for the absence of a stated credit cost.
  • Retailed GOAT prices endpoint: Read 2026-09-24 for sizeOption, boxCondition, shoeCondition, stockStatus and the cents-integer money fields lastSoldPriceCents and instantShipLowestPriceCents.
  • StockX Public API — OpenAPI specification: Read 2026-09-24. The source for the API being titled 'StockX Public API' v2.0.0, described as 'Manage StockX seller account using APIs', for the market-data endpoint returning 'basic market data - the highest Bid and lowest Ask amount for all variants of given product', and for there being no sales-history path among its 32 documented paths.
  • StockX developer portal — getting started: Read 2026-09-24 for the approval gate: 'complete the developer sign up form' and 'When your account is approved, an API key will be automatically generated for you'. The page renders client-side; the quoted copy was read from the rendered page.
  • Apify Store: Read 2026-09-24 for the 65 actors matching these four venues, all pay-per-event, and for the per-actor prices, run counts and user counts quoted in the FAQs.
  • Bright Data StockX dataset: Read 2026-09-24 for 'up to $0.0025 per record', the $250 minimum order and the 46.8K+ record count. The companion GOAT dataset on the same terms lists 2.1M+ records.
  • Apify pricing: Read 2026-09-24 for the $0 / $19 / $199 / $999 plans and their matching platform-usage allowances, used only for the one FAQ that explains why a marketplace of actors is not one product.
  • StockX developer portal: Attempted 2026-09-24. The portal renders client-side and returned no readable text, so nothing from it is quoted on this page — read it yourself before planning around official access.
Start building

Try the relevant ReefAPI endpoints with 1,000 free credits, or open the docs to inspect params, examples and live proof before wiring them into production.