Public API v1

Free, auditable card-market data.

Every price on CardPricer is backed by observable comps from public marketplaces and verifiable on-chain sales. The Public API gives you read-only access to the same data that drives our front end — cards, players, sets, sales, and the full provenance behind every quoted price. Open CORS. No signup needed for the free tier.

Developer kit

One-click integrations: Postman collection, OpenAPI spec, and a freshness endpoint.

Quickstart

Two GET requests, no auth, in any HTTP client.

# Top basketball cards by current price
curl "https://cardpricer.co/api/v1/cards?sport=basketball&limit=10"

# Recent sales across the platform
curl "https://cardpricer.co/api/v1/sales?limit=25"

Every response is wrapped in a stable envelope so you can rely on the shape across releases:

{
  "ok": true,
  "apiVersion": "1.0.0",
  "generatedAt": "2026-05-17T18:30:00.000Z",
  "data": [ ... ],
  "meta": { "pagination": { ... }, "filters": { ... } }
}

Authentication

The free tier is anonymous (60 req/min). Pass ?apiKey=YOUR_KEY or set the X-Api-Key header for 600 req/min. CardPricer Pro subscribers can generate personal keys in settings. Partners can still request env keys via api@cardpricer.app.

TierPer minutePer hour
Anonymous601,000
Keyed60030,000

Limits are enforced per IP for anonymous traffic and per key for authenticated traffic. Every response includes X-RateLimit-Remaining-Minute and X-RateLimit-Reset-Hour headers.

Personal API keys (600 req/min) is part of CardPricer Pro.

Email alerts, personal API keys, portfolio exports, and portfolio value alerts — $19/mo. The terminal stays free.

View Pro plans

Endpoints

GET/api/v1

Self-documenting root. Lists every endpoint with its parameters.

GET/api/v1/cards

Paginated card directory. Filter by sport, player, year, manufacturer, grade, or price range.

qFree-form match against player / set / cardNumber / grade
sportCanonical slug: basketball, baseball, pokemon, mtg, yu-gi-oh, …
playerPlayer slug (preferred) or substring
year, manufacturer, gradeExact-match filters
minPrice, maxPriceBounds on current_price
sortprice_desc (default) · price_asc · recent · volume
limit, offsetPagination — limit max 200
/api/v1/cards?sport=pokemon&minPrice=500&sort=volume&limit=25
GET/api/v1/cards/{id}

Single card with inline provenance summary (comp count, source mix, confidence).

/api/v1/cards/00000000-0000-0000-0000-000000000000
GET/api/v1/cards/{id}/provenance

Full provenance: every comp behind the price, per-source breakdown, per-strategy match attribution (each comp records which matcher rule attributed it), confidence factors, and warnings.

/api/v1/cards/00000000-0000-0000-0000-000000000000/provenance
GET/api/v1/cards/{id}/history

OHLCV candles for a card. Daily, Weekly, Monthly, or Yearly buckets.

intervalD · W · M · Y (default D)
/api/v1/cards/00000000-0000-0000-0000-000000000000/history?interval=W
GET/api/v1/players

Paginated player directory backed by the canonical players table.

qSubstring match against canonical name
sportCanonical sport slug
sortvolume_desc · top_price_desc · total_value_desc · name_asc
limit, offsetPagination — limit max 500
/api/v1/players?sport=basketball&sort=top_price_desc&limit=20
GET/api/v1/players/{slug}

Full player profile including the card folder this player owns.

/api/v1/players/stephen-curry
GET/api/v1/sets

Sealed-product set directory with aggregate top product price and 30-day volume.

sport, manufacturer, yearExact-match filters
limit, offsetPagination — limit max 500
/api/v1/sets?sport=pokemon&year=2024&limit=20
GET/api/v1/sets/{slug}

Single set with all products and recent price history.

daysHistory window in days (1–365, default 90)
history0 to skip price history
/api/v1/sets/2024-topps-chrome-baseball
GET/api/v1/sales

Chronological feed of recent observed comps. Defaults to actual sales — pass include=listing,quote to expand.

sportCanonical sport slug filter
sourceComma-separated list, e.g. "ebay,collector-crypt"
includeComma-separated observation types: sale (default), listing, quote
minPrice, maxPricePrice bounds
since, untilISO timestamps to bound the window
cursorISO sold_date — paginate older with sold_date < cursor
limitPage size (max 200)
/api/v1/sales?sport=basketball&source=ebay,collector-crypt&limit=25
GET/api/v1/openapi.json

Machine-readable OpenAPI 3.1 spec. Drop into Postman, Insomnia, or any SDK generator.

/api/v1/openapi.json
GET/api/v1/census

Card census: supply, circulation, and coverage across the whole catalog — total cards, how many are tokenized on-chain (Web3) vs off-chain (Web2), known printed supply, 30-day circulation, and the priced/supply coverage gaps. Includes a per-category breakdown.

/api/v1/census
GET/api/v1/status

Data-freshness report per upstream source — when each venue was last ingested and how many rows landed in the last 24h / 7d.

/api/v1/status
GET/docs/api/postman

Auto-generated Postman v2.1 collection. Import into Postman or Insomnia and start hitting the API in one click.

/docs/api/postman

The provenance contract

Every card carries a confidence label (High / Medium / Low / Insufficient) backed by four independent factors: comp count, median age, dispersion (σ as % of mean), and source diversity. The breakdown lives at /api/v1/cards/{id}/provenance and is also embedded inline on every single-card response.

Today we feed comps from eBay (sold + active), Scryfall (MTG), the Pokémon TCG API, YGOPRODeck (Yu-Gi-Oh), and on-chain Collector Crypt sales (USDC, Solana). Adding a new venue does not change the response shape — it just adds rows to comps.bySource.

See the methodology page for the full recipe.

Terms of use

  • Attribution. If you display CardPricer data on a public surface, link back to cardpricer.co from the page that uses it.
  • No price manipulation. The API is read-only. Don't use it to feed an aggregator that obscures the source.
  • No guarantee of accuracy. Comps are observed prices, not quotes. Bad listings get through — verify before transacting.
  • No reselling raw bulk dumps. Build something useful on top of it. For bulk licensing, email api@cardpricer.app.

Next

Try it.

Hit the discovery root and follow the links — every endpoint includes self-referential links so you can crawl the API without leaving the response.

Open /api/v1