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.

GET /api/cards GET /api/price GET /api/check GET /api/sell GET /api/value GET /api/refresh GET /api/health Verdict table Methodology Attribution Refresh cadence & rate limits

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=

ParamRequiredDescription
cardyesFree text: model number, alias, or full name (e.g. "4090", "rtx 5060 ti 16gb").
conditionnoOne 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=

ParamRequiredDescription
cardyesSame as above.
conditionnoDefault: used.
priceyesThe 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=

ParamRequiredDescription
cardyesFree text card identifier.
conditionnoused 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=

ParamRequiredDescription
max_pricenoBudget cap in USD. Omit for no cap.
conditionnonew or used. Default: new.
resolutionno1080p, 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

VerdictCondition
underpricedprice < 0.90 × low
good_deal0.90 × low ≤ price < low
fairlow ≤ price ≤ high
slightly_highhigh < price ≤ 1.10 × high
overpricedprice > 1.10 × high

Methodology

For each card, ChipWorth builds a "new" anchor price and a "used"/"refurbished" range:

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.