API Documentation
Base URL: https://chipworth.xyz. All endpoints accept GET (query string) or POST (JSON body). No API key required. CORS is open on all /api/* routes. A machine-readable spec is at /openapi.json.
Catalog
GET /api/cards
Returns every card in the catalog with basic identifying fields. Useful for building an autocomplete or a card picker.
Response
{
"cards": [
{ "slug": "rtx-4090", "name": "NVIDIA GeForce RTX 4090", "brand": "NVIDIA", "category": "gpu", "vram_gb": 24, "msrp_usd": 1599 },
...
],
"disclaimer": "...",
"attribution": {},
"as_of": "2026-09-21T00:00:00.000Z"
}
Price lookup
GET /api/price?card=&condition=
| Param | Required | Description |
|---|---|---|
card | yes | Free text: model number, alias, or full name (e.g. "4090", "rtx 5060 ti 16gb"). |
condition | no | One of new, open_box, used, refurbished. Default: used. |
Example request
GET /api/price?card=4090&condition=used
Example response
{
"card": { "slug": "rtx-4090", "name": "NVIDIA GeForce RTX 4090", "brand": "NVIDIA", "category": "gpu", "vram_gb": 24, "msrp_usd": 1599 },
"msrp": 1599,
"condition": "used",
"new": { "anchor": 2900, "source": "bestbuy", "url": "https://www.bestbuy.com/..." },
"figures": { "fair": 2350, "low": 2200, "high": 2550, "sample": 42, "confidence": "high", "source": "ebay", "url": "https://www.ebay.com/sch/i.html?_nkw=RTX%204090" },
"disclaimer": "...",
"attribution": { "ebay": "https://www.ebay.com/sch/i.html?_nkw=RTX%204090" },
"as_of": "2026-09-21T00:00:00.000Z"
}
404 with suggestions (up to 3 candidate slugs) when card can't be resolved.
Price check (with verdict)
GET /api/check?card=&condition=&price=
| Param | Required | Description |
|---|---|---|
card | yes | Same as above. |
condition | no | Default: used. |
price | yes | The asking price you want judged, in USD. |
Example request
GET /api/check?card=4090&condition=used&price=1400
Example response
{
"card": { "slug": "rtx-4090", "name": "NVIDIA GeForce RTX 4090", ... },
"msrp": 1599,
"condition": "used",
"price": 1400,
"figures": { "fair": 2350, "low": 2199, "high": 2800, "sample": 0, "confidence": "catalog_only", "source": "catalog" },
"range": { "low": 2199, "high": 2800 },
"verdict": "underpriced",
"summary": "At $1400, this is well below the typical range ($2199-$2800) — verify the listing is legitimate before buying.",
"disclaimer": "...",
"attribution": {},
"as_of": "2026-09-21T00:00:00.000Z"
}
400 if price is missing or not a number. 404 with suggestions if card can't be resolved.
Sell pricing
GET /api/sell?card=&condition=
| Param | Required | Description |
|---|---|---|
card | yes | Free text card identifier. |
condition | no | used or refurbished. Default: used. |
Example response
{
"card": { "slug": "rtx-3080", "name": "NVIDIA GeForce RTX 3080", "brand": "NVIDIA", "category": "gpu" },
"condition": "used",
"range": { "fair": 340, "low": 300, "high": 400, "sample": 0, "confidence": "catalog_only" },
"list_price": 368,
"quick_sale_price": 276,
"disclaimer": "...",
"attribution": {},
"as_of": "2026-09-21T00:00:00.000Z"
}
list_price is a "take your time" asking price (92% of the observed 75th percentile). quick_sale_price is a "move it fast" price (92% of the observed 25th percentile).
Best value ranking
GET /api/value?max_price=&condition=&resolution=
| Param | Required | Description |
|---|---|---|
max_price | no | Budget cap in USD. Omit for no cap. |
condition | no | new or used. Default: new. |
resolution | no | 1080p, 1440p, or 4k. Only 1440p performance data is available in v0 — other values are accepted but noted in the response. |
Example request
GET /api/value?max_price=600&condition=new
Example response
{
"condition": "new",
"resolution": "1440p",
"max_price": 600,
"results": [
{ "slug": "rx-9060-xt-16gb", "name": "AMD Radeon RX 9060 XT 16GB", "price": 465, "perf_index": 48, "perf_per_dollar": 0.103 },
...
],
"disclaimer": "...",
"attribution": {},
"as_of": "2026-09-21T00:00:00.000Z"
}
AI-category cards (DGX Spark, RTX PRO 6000 Blackwell, RTX 6000 Ada) are excluded from ranking since they have no gaming performance index.
Refresh (internal / cron)
GET /api/refresh
Rebuilds the pricing snapshot for every card. Called automatically once a day by a Vercel cron job. Requires Authorization: Bearer <CRON_SECRET> or ?secret=<CRON_SECRET>. Returns 401 without a valid secret.
{ "ok": true, "cards_refreshed": 30, "blob_written": true }
Health
GET /api/health
Reports which optional data sources are configured and how fresh the current snapshot is. Useful for confirming a deployment is running with (or without) live pricing keys.
{ "ok": true, "keys": { "ebay": false, "bestbuy": false, "blob": false }, "snapshot_as_of": "2026-09-21T00:00:00.000Z" }
Verdict table
| Verdict | Condition |
|---|---|
underpriced | price < 0.90 × low |
good_deal | 0.90 × low ≤ price < low |
fair | low ≤ price ≤ high |
slightly_high | high < price ≤ 1.10 × high |
overpriced | price > 1.10 × high |
Methodology
For each card, ChipWorth builds a "new" anchor price and a "used"/"refurbished" range:
- New anchor: the lowest current in-stock Best Buy price, if available; otherwise the 25th percentile of current new eBay listings; otherwise the midpoint of a hand-curated fallback range.
- Used/refurbished range: current eBay listings for that condition are cleaned (obvious mispriced or unrelated listings are dropped — anything under 40% or over 110% of the new anchor, plus titles matching known junk patterns like "box only" or "for parts"), then the 25th/50th/75th percentiles are computed and a 8% haircut applied (listings tend to ask slightly above what they settle for). Fewer than 8 clean listings widens the range by 10% on each side and marks confidence as
low. Zero listings falls back to the hand-curated catalog range with confidencecatalog_only. - Open-box: derived as 85% of the new anchor (no independent data source for this condition yet).
- Performance index:
perf_index_1440is a hand-curated relative index of 1440p gaming performance built by reading public review consensus (TechPowerUp, Tom's Hardware, Gamers Nexus, Hardware Unboxed), with the RTX 4090 fixed at 100. It is not a copied benchmark dataset — treat it as a rough ordering, not a precise measurement.
Everything above runs even with zero API keys configured, falling back entirely to the hand-curated catalog in lib/catalog.json. Responses get more accurate as eBay and Best Buy credentials are added.
Attribution
Every response includes an attribution object with links to the eBay search and/or Best Buy listing used to build that response, so you can verify the underlying data yourself. ChipWorth is not affiliated with or endorsed by eBay or Best Buy.
Refresh cadence & rate limits
The pricing snapshot refreshes on a daily cron (0 10 * * * UTC) and is cached for up to 36 hours. There is no hard rate limit, but please use the API fairly — high-volume or automated scraping-style traffic may be throttled.