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.
GET /api/v1/market/sales?q=Mike+Trout+PSA+10&date_from=2025-01-01GET /api/v1/market/sales?q=Fernando+Tatis+2020+Topps+Chrome+Prizm+BGS+9.5GET /api/v1/market/sales?q=Mickey+Mantle&listing_type=Auction&min_price=1000&platform=HeritageGET /api/v1/market/sales?q=2011+Topps+Update+Rookie&date_from=2025-03-01GET /api/v1/market/sales?q=Aaron+Judge+Auto&platform=GoldinGET /api/v1/market/sales?q=Wander+Franco+Rookie&listing_type=BestOffer&max_price=500Code 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.
Related resources
Start pulling baseball card price data
Free tier: 10,000 sales/day, 7-day lookback. No credit card required.
Get Free API Key →