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.
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=1000GET /api/v1/market/sales?q=2011+Topps+Update+Rookie&date_from=2025-03-01GET /api/v1/market/sales?q=Aaron+Judge+Auto&listing_type=best_offerGET /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+
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.
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 →