The v1 surface
A curated map of the routes partners actually use. Catalog (cards, figures, sets, oracle), price (history, altCurrencies, aggregates), discovery (search, trending, recent). All GET-only in v1, all return JSON, all gated by bearer auth.
Catalog — single entity
The most-hit family. One canonical entity per request, ~2-5kb payload depending on history range.
GET /v1/cards/:id
GET /v1/figures/:id
GET /v1/oracle/:id # MTG concept view, aggregates printings
GET /v1/sets/:game/:setCode
# Optional query params on /v1/cards/:id:
# ?range=30d|3mo|6mo|12mo|all default 30d
#
# Optional query params on /v1/sets/:game/:setCode:
# ?page=1
# ?limit=60 capped server-side at 100Shapes — all responses carry a versioned envelope. See FigureDetailResponse / CardDetailResponse in apps/web/lib/api.ts for the canonical TS types.
Catalog — listing
GET /v1/search?q=charizard
GET /v1/search?q=mtg:lea # game prefix + free text supported
GET /v1/trending?game=mtg # top-N by 24h velocity
GET /v1/recent?game=pokemon # last-N added to canonical
GET /v1/artists/:slug # all printings by an artist
GET /v1/figures/series/:id # every figure in a seriesCatalog — discovery feeds
The discover surface family — aggregated rollups, not entity detail. Used by news aggregators + market-research tools.
GET /v1/discover/sets
GET /v1/discover/users # discover-feed users only — public showcase
# opt-ins. Anonymous user records are never
# returned.
GET /v1/discover/binders
GET /v1/discover/activity
GET /v1/discover/sparklinesPull-rate research
Community-aggregated pull rates per series, with Bayesian smoothing against a global prior. Distinct from vendor-reported rates (often optimistic) — these are observed pulls from real packs across the user base.
GET /v1/series/:id/pull-statsCatalog summary
GET /v1/catalog/summary
# {
# "cards": { "total": 187432, "byGame": { "mtg": 109281, "pokemon": 71284, "lorcana": 4923, "onepiece": 1944 } },
# "figures": { "total": 12087 },
# "sets": { "total": 1421 }
# }Snapshot counts. Useful as a sanity check before a full-catalog mirror — gives you the expected row count up front.
Not yet partner-callable
/v1/me/*— user-scoped surfaces, session auth only./v1/u/:handle/*— public showcase URL surfaces, available without bearer but with the same redaction rules as bearer paths./v1/admin/*— internal admin, never partner-readable./v1/observations— write surface, mobile-only.
Response idioms
- JSON, UTF-8, gzip-encoded if your client accepts.
Cache-Control: public, s-maxage=300, stale-while-revalidate=3600on most read routes — safe to mirror at your edge.- Money values: integer cents, USD canonical unless the field name carries a currency suffix.
- Timestamps: ISO-8601 strings (
2026-05-19T12:34:56.789Z). - Null vs missing: prefer
nullover absent keys — the wire shape stays stable across cache versions.