Resale price sites usually give you one number with no source, no date and no sample size. I wanted the opposite, so I built SoldSignal: a free weekly resale price index where every price says what it is (SOLD = finished sales, ASK = current listings), how many data points sit behind it, and what a seller actually keeps after fees on each platform.
It covers 29 items this week: sneakers, gaming hardware, Pokémon/Labubu/Stanley, and Rolex/Omega/Tudor/Cartier/Seiko watches.
What the data says (week 2026-W44, collected Oct 29, 2026)
Sneakers (GOAT, median of the last recorded sale per size, men's 7–13, new in box)
| Shoe | Median last sale | Retail | vs retail |
|---|---|---|---|
| Travis Scott x Jordan 1 Low 'Mocha' | $2,109 | $130 | +1,522% |
| Travis Scott x Air Force 1 'Ice Blue' | $554 | $120 | +362% |
| Air Jordan 1 High 'Chicago Lost & Found' | $293 | $180 | +63% |
| Air Jordan 11 'Gamma Blue' (2025) | $342 | $230 | +49% |
| Air Jordan 4 'Bred Reimagined' | $248 | $215 | +15% |
| Yeezy 350 V2 'Bone' | $245 | $220 | +11% |
Gaming (Mercari US sold listings): Nintendo Switch OLED $170 (18 sales), Switch Lite $100 (31 sales), Xbox Series X $502 (10 sales).
Collectibles (Mercari US sold): Labubu 'Have a Seat' blind box $34 (66 sales), Stanley Quencher 40 oz $44.50 (30 sales), Pokémon Prismatic Evolutions ETB $112 (19 sales).
Watches (Chrono24 asking prices, USD, exact reference only): Rolex Daytona 126500LN $36,534, GMT-Master II 'Pepsi' $27,997, Submariner Date 126610LN $15,500, Tudor Black Bay 58 $4,099, Seiko SPB143 $999. These are asks, so real sales usually close lower.
Fees change the answer
Same $248 sale, different platform, different payout (2026 US fee rules, sources linked on the methodology page):
- eBay (sneakers $150+): you keep about $228
- Mercari: about $223
- GOAT: about $213
The site only calls a platform "best" when it has real prices from at least two of them. Otherwise it shows the fee-only comparison and says so. There's also a fee calculator.
Use the data (free, no key, CC BY 4.0)
import requests base = "https://www.aiplannermail.com/api/v1" items = requests.get(f"{base}/items.json").json()["items"] for i in items[:5]: print(i["name"], i["price"], i["priceType"], "n =", i["sampleSize"]) one = requests.get(f"{base}/items/nintendo-switch-oled.json").json() print(one["summary"]) # a dated, citable sentence - API index:
/api/v1/items.json, one file per item:/api/v1/items/<slug>.json, OpenAPI spec - CSV/JSON per ISO week, frozen forever: Data & API
- For LLMs and agents:
llms.txt,llms-full.txt, and a Markdown copy of every item page (<page>/index.md)
How it's built
- Weekly Apify runs (my own open actors for StockX, GOAT, Mercari and Chrono24), about $0.15 a week.
- Exact-item matching: GOAT products pinned by hand-verified title; Mercari titles need key words, no exclusion words ("bundle", "for parts", "Zelda edition"...) and a sane price band; Chrono24 needs the exact reference number and USD. Hand-checking matches caught 6 wrong products before launch.
- Python + Jinja2 static site on Netlify, 155 pytest tests (including one that checks the browser fee calculator matches the Python fee engine to the cent). If any test fails, the weekly deploy stops and last week's site stays up.
- StockX shows prices in the visitor's local currency, and one run quietly mixed in euros. The StockX actor now labels every row with its
currency, and the site only uses StockX rows that are in USD (and never lets StockX alone publish an item).
Every week is archived, so price history builds up from here. Feedback and item requests welcome in the comments.

