Reference

API

Base URL https://cardmods.com. Send your key as Authorization: Bearer cm_live_… (or x-api-key). JSON in, JSON out. Every keyed response carries usage: plan, callsToday, limit. Limits reset at 00:00 UTC; over the limit returns 429. Keys live in your dashboard.

curl -H "Authorization: Bearer cm_live_…" \
  "https://cardmods.com/api/v1/movers?signal=rising&n=20"

Card keys

A card is season|set|player|number|parallel, lower case, hyphenated: 2026-27|young-guns|james-hagens|206|base. Keys come back on every movers and young-guns row, so you rarely type one.

Endpoints

GET /api/v1/movers ?sport=hockey&signal=rising|cooling|steady&n=50

The latest day's volume read, best score first. Each mover: key, card, signal, score (0–100), listings {perDay, perDayPriorWeek, newThisWeek, newPriorWeek, goneThisWeek, velocity}, ask {now, weekAgo, changePct}, daysObserved, reasons[]. Cards with fewer than 5 observed days are left out.

GET /api/v1/buy-windows

heat[]: NHL skaters in a buy window or with the market reacting — statHeat, streaks, last-5, surge, and our read of his key card's market (listings, new7d, askMedian, reacting). youngGuns.calls[]: the Young Guns formula's buy_raw / buy_psa9 / stage calls with jump, hold, expected pct14 / pct30 and reasons.

GET /api/v1/value ?key=2026-27|young-guns|james-hagens|206|base

One card. days[]: per observed day — listings, newListed, gone, sellers, auctions, ask {low,p25,median,p75,high}, shipMedian. reads[]: our price reads by source. volume: today's mover row. openCalls[]: every unscored call on this card (model, horizonDays, direction, baseline, predicted, confidence) with track {scored, hitRate, maePct} for that model and window. Starter sees 30 days.

GET /api/v1/history ?key=…&days=90

The daily market rows alone, for charting. Starter: 30 days.

GET /api/v1/young-guns ?season=2026-27&week=2026-W44

Every Young Guns card's weekly read: raw {median, low, high, listings}, psa10 {median, listings}. Defaults to the newest week.

GET /api/v1/scorecard (no key)

Per model × window × metric: n scored, hits, hit_rate, mae_pct, pending, up/down/flat splits. Public and cached 15 minutes.

Errors

401 no key, unknown key or revoked key · 402 the plan is past due or cancelled · 429 daily limit reached (header Retry-After) · 400 a missing or malformed parameter. Every error body is { error: "…" } in plain words.

How a call is graded

A call names a direction (up, down, flat) on a metric (asking median, listings, new listings) at a horizon (7 or 14 days; 30 for the Young Guns formula). It is a hit when the metric moved that way by more than 3% by the due day, read from our own market rows within three days of it. Flat calls are graded too. A model’s line is proven at 30 graded calls with a 60% hit rate, and openCalls[].track always tells you where that line stands.

What you will not find