Baseball Card Price Data

Programmatic access to baseball card sold prices from eBay, Goldin, Heritage, REA, and other major platforms. Individual sale records — not averages. Pull comps by player, set, year, grade, or any combination via REST API.

What's covered

The API ingests baseball card sales from all major platforms continuously. Each record is a single completed transaction — one card, one sale, one price. Baseball cards represent the largest single category in the database, with over 195,000 new eBay records added per day across all card categories combined.

eBay — all listing types

  • Auction sales (hammer price)
  • Fixed Price (buy it now)
  • Best Offer (true accepted price)
  • All Baseball Cards subcategories on eBay

Auction houses

  • Goldin Auctions — premium vintage and modern
  • Heritage Auctions — all sports card lots
  • REA (Robert Edward Auctions) — vintage specialist
  • Pristine Auction

Marketplaces

  • Fanatics-Vault (authenticated collectibles)
  • Alt (fractionalized and whole cards)
  • New platforms added as coverage expands

Card types covered

  • Raw and all grading services (PSA, BGS, SGC, CSG, CGC)
  • Rookies, autos, parallels, refractors, patch cards
  • Pre-war through modern (1800s–present)
  • Short prints, variations, error cards

Search query examples

The q parameter handles natural card descriptions. Combine with other filters for precision.

Player + grade
GET /api/v1/market/sales?q=Mike+Trout+PSA+10&date_from=2025-01-01
Player + set + grade
GET /api/v1/market/sales?q=Fernando+Tatis+2020+Topps+Chrome+Prizm+BGS+9.5
Auction only, high-value vintage
GET /api/v1/market/sales?q=Mickey+Mantle&listing_type=Auction&min_price=1000&platform=Heritage
Specific set across all players
GET /api/v1/market/sales?q=2011+Topps+Update+Rookie&date_from=2025-03-01
Goldin auction results
GET /api/v1/market/sales?q=Aaron+Judge+Auto&platform=Goldin
Best Offer, mid-range rookies
GET /api/v1/market/sales?q=Wander+Franco+Rookie&listing_type=BestOffer&max_price=500

Code examples: pulling baseball card comps

Get the last 30 days of sales for a card and calculate market stats.

Python

import requests, statistics
from datetime import date, timedelta

API_KEY = "tca_your_key_here"
BASE = "https://thecardapi.com/api/v1/market"

def get_comps(search: str, days: int = 30) -> list[dict]:
    date_from = (date.today() - timedelta(days=days)).isoformat()
    all_sales, offset = [], 0
    while True:
        r = requests.get(
            f"{BASE}/sales",
            params={"q": search, "date_from": date_from, "limit": 500, "offset": offset},
            headers={"x-market-api-key": API_KEY},
        )
        r.raise_for_status()
        batch = r.json()["data"]
        all_sales.extend(batch)
        if len(batch) < 500:
            break
        offset += 500
    return sorted(all_sales, key=lambda s: s["sale_price"])

comps = get_comps("2011 Topps Update Mike Trout PSA 10")
prices = [s["sale_price"] for s in comps]
print(f"Sales:  {len(comps)}")
print(f"Range:  ${min(prices):,.0f} – ${max(prices):,.0f}")
print(f"Median: ${statistics.median(prices):,.0f}")
print(f"Mean:   ${statistics.mean(prices):,.0f}")

# Platform breakdown
by_platform = {}
for s in comps:
    by_platform.setdefault(s["platform"], []).append(s["sale_price"])
for plat, vals in sorted(by_platform.items()):
    print(f"  {plat}: {len(vals)} sales, avg ${sum(vals)/len(vals):,.0f}")

JavaScript

const API_KEY = "tca_your_key_here";
const BASE = "https://thecardapi.com/api/v1/market";

async function getComps(search, days = 30) {
  const dateFrom = new Date(Date.now() - days * 864e5).toISOString().slice(0, 10);
  const sales = [];
  let offset = 0;

  while (true) {
    const params = new URLSearchParams({ q: search, date_from: dateFrom, limit: "500", offset: String(offset) });
    const res = await fetch(`${BASE}/sales?${params}`, { headers: { "x-market-api-key": API_KEY } });
    const { data } = await res.json();
    sales.push(...data);
    if (data.length < 500) break;
    offset += 500;
  }
  return sales;
}

const comps = await getComps("2011 Topps Update Mike Trout PSA 10");
const prices = comps.map(s => s.sale_price);
const median = prices.slice().sort((a, b) => a - b)[Math.floor(prices.length / 2)];
console.log(`n=${comps.length}, median=$${median.toFixed(0)}, range=$${Math.min(...prices).toFixed(0)}–$${Math.max(...prices).toFixed(0)}`);

API quick reference

Base URL

thecardapi.com/api/v1/market

Auth header

x-market-api-key

Response format

JSON

Free tier

10,000 sales/day

Max records/page

500

Lookback — Free

7 days

Lookback — Pro

30 days

New records/day

200,000+

Platforms

eBay, Goldin, Heritage, REA…

Frequently asked questions

What baseball card sales data is available via the API?
The Card API provides individual sale records for baseball cards from eBay (Auction, Fixed Price, and Best Offer), Goldin Auctions, Heritage Auctions, REA (Robert Edward Auctions), Fanatics-Vault, Alt, and Pristine. Each record includes the card title, platform, listing type, true sale price, sale date, and a direct link to the original listing.
How do I search for baseball card comps programmatically?
Use the q parameter with a natural card description such as '2011 Topps Update Trout PSA 10' or 'Fernando Tatis Jr Prizm Silver'. The full-text search spans all platform titles simultaneously. Combine with date_from, min_price, max_price, platform, and listing_type to narrow results. The /sales endpoint returns paginated JSON with up to 500 records per page.
Does the API include Goldin and Heritage auction results for baseball cards?
Yes. The Card API ingests completed lots from Goldin Auctions, Heritage Auctions, and REA (Robert Edward Auctions). Auction houses are particularly important for vintage and premium baseball cards where eBay may have limited comparable sales. Use platform=Goldin or platform=Heritage to scope results to a specific auction house.
Can I get baseball card price data for a specific player?
Yes. Use the q parameter to search by player name: q=Aaron Judge, q=Shohei Ohtani Rookie, q=Mickey Mantle, etc. The search is full-text across the card title field, so you can combine player name with set, year, grade, or parallel variant in a single query. For example: q=Wander Franco 2021 Bowman Chrome Auto PSA 10.
What grading services are represented in the baseball card data?
Grading service information is embedded in the card title as entered by the seller. Common patterns: 'PSA 10', 'BGS 9.5', 'SGC 10', 'CSG 10', 'CGC 10', 'GAI 10'. Search with the grading service abbreviation in the q parameter to filter. For example: q=Trout PSA 10 returns cards with PSA 10 in the title. Raw (ungraded) cards appear without a grading suffix.
How accurate is the baseball card price data?
Each record is a real completed transaction — not an estimate, not an average, and not a listing price. For eBay Best Offer sales, we capture the true accepted offer price, not the listing price. This makes the data more accurate than most price guide sites which systematically overstate Best Offer transaction values. The listing_url field on every record links back to the original listing for verification.

Start pulling baseball card price data

Free tier: 10,000 sales/day, 7-day lookback. No credit card required.

Get Free API Key →