Card catalogBetaRequest access →

Baseball Card Price Data

Programmatic access to baseball card sold prices from eBay — Auction, Fixed Price, and Best Offer. 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

What's captured per sale

  • True sold price (not listing price)
  • Listing type: auction, fixed price, Best Offer
  • Sale date and direct link to original listing
  • Card title as listed by seller

Search & filter

  • Full-text search across card titles
  • Filter by listing type, price range, date range
  • Paginated JSON — up to 500 records per page
  • Sorted by date descending (most recent first)

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
Specific set across all players
GET /api/v1/market/sales?q=2011+Topps+Update+Rookie&date_from=2025-03-01
Best Offer, premium rookies
GET /api/v1/market/sales?q=Aaron+Judge+Auto&listing_type=best_offer
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+

Platform

eBay

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). Each record includes the card title, 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.
What eBay listing types are covered for baseball cards?
All three eBay listing types are covered: Auction (hammer price), Fixed Price (buy it now), and Best Offer (true accepted offer price). Best Offer is particularly valuable — most price guides show the listing price, not the negotiated price. Use listing_type=auction, listing_type=fixed_price, or listing_type=best_offer to filter.
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 →