Trading Card Market Data
Individual sale records and catalog data for trading-card analytics — queryable through REST and accessible to AI agents through MCP.
200K
Pro daily sales-row allowance
7
Platforms covered
38+
Card categories
90 days
Pro query window
The problem with card market data today
Trading-card sales are fragmented across marketplaces and auction houses. Product teams often need a consistent way to query individual transaction detail across those sources.
The Card API makes supported sale records queryable through a single REST endpoint. You get transaction-level data — not an average or a 90-day rolling estimate — and you can slice it any way your application needs.
What other solutions provide
- ✗30/60/90-day average prices
- ✗Single-platform data (usually eBay only)
- ✗No Best Offer price capture
- ✗No listing type differentiation
- ✗Proprietary formats, no open API
What The Card API provides
- ✓Individual sale records — every transaction
- ✓eBay — all listing types
- ✓True Best Offer accepted prices
- ✓Auction, Fixed Price, Best Offer tagged
- ✓Clean JSON REST API + MCP server
Platform coverage
| Platform | Listing types | Update frequency | Best Offer prices |
|---|---|---|---|
| eBay | Auction, Fixed Price, Best Offer | As source data becomes available | Yes — actual accepted price |
The data model
Every sale record uses the same schema regardless of platform:
{
"id": "ebay_3941827461",
"title": "2011 Topps Update Mike Trout RC #US175 PSA 10",
"platform": "eBay",
"listing_type": "BestOffer",
"sale_price": 2450.00,
"sale_date": "2025-04-12",
"listing_url": "https://www.ebay.com/itm/...",
"category": "Baseball Cards"
}The listing_type field lets you separate auction hammer prices from buy-it-now sales from Best Offer accepted prices — which have meaningfully different market dynamics.
Querying the API
Search recent eBay sales:
import requests
API_KEY = "tca_your_key_here"
BASE = "https://thecardapi.com/api/v1/market"
def search_sales(card: str, platforms: list[str] | None = None) -> list[dict]:
params = {"q": card, "limit": 100}
if platforms:
params["platform"] = ",".join(platforms)
r = requests.get(
f"{BASE}/sales",
params=params,
headers={"x-market-api-key": API_KEY},
)
r.raise_for_status()
return r.json()["data"]
# Recent Luka Doncic RC PSA 10
sales = search_sales("Luka Doncic Rookie PSA 10")
for s in sales[:5]:
print(f"{s['platform']:15} {s['listing_type']:12} ${s['sale_price']:,.0f} {s['sale_date']}")const API_KEY = "tca_your_key_here";
const BASE = "https://thecardapi.com/api/v1/market";
async function searchSales(card, { platforms } = {}) {
const url = new URL(`${BASE}/sales`);
url.searchParams.set("q", card);
url.searchParams.set("limit", 100);
if (platforms) url.searchParams.set("platform", platforms.join(","));
const { data } = await fetch(url, {
headers: { "x-market-api-key": API_KEY },
}).then((r) => r.json());
return data;
}
const sales = await searchSales("Luka Doncic Rookie PSA 10");
sales.slice(0, 5).forEach((s) =>
console.log(s.platform, s.listing_type, s.sale_price, s.sale_date)
);AI agent access via MCP
The Card API includes an MCP server with five sold-price and market-analysis tools. Any MCP-compatible client — Claude Desktop, Cursor, Claude Code, or any custom agent — can query card market data without writing API integration code.
search_cardsSearch sold prices with market filters
grade_impact_analysisCompare prices across a card's grade ladder
grading_value_calculatorModel grading cost and potential value
grader_comparisonCompare market prices across graders
price_momentumCompare recent pricing windows
{
"mcpServers": {
"cardapi": {
"url": "https://thecardapi.com/api/mcp",
"headers": {
"Authorization": "Bearer tca_your_key_here"
}
}
}
}Pricing tiers
Free
$0
- ✓5,000 sales rows returned per UTC day
- ✓3-day lookback
- ✓Cursor pagination
- ✓MCP server access
Starter
$9/mo
- ✓10,000 sales rows returned per UTC day
- ✓14-day lookback
- ✓CSV export
- ✓Everything in Free
Pro
$199/mo
- ✓200,000 sales rows returned per UTC day
- ✓90-day lookback
- ✓Catalog API included
- ✓Add-ons available
Enterprise
Custom
- ✓Custom volume
- ✓Negotiated history
- ✓Bulk delivery options
- ✓Dedicated support
Frequently asked questions
What trading card platforms does the API cover?
eBay — Auction, Fixed Price, and Best Offer accepted prices. True Best Offer prices are captured at the accepted value, not the listing price.
Does the API return real sale prices or estimated values?
Real sale prices only. Every record is an individual transaction with a verified sale_price and sale_date. For eBay, this includes the actual accepted Best Offer price, not the listing price.
How many transactions are ingested per day?
New auction, fixed-price, and supported accepted-offer records are added daily.
Can AI agents use the card market data API?
Yes. The MCP server exposes five sold-price and market-analysis tools that work with MCP-compatible clients. Add the server config and your API key.
What card categories and sports are covered?
38+ categories including Baseball, Basketball, Football, Hockey, Soccer, Pokemon, Magic: The Gathering, and other TCGs. Search works across all categories by default.
Is there a free tier?
Yes. The Free tier provides 5,000 sales rows returned per UTC day, 3-day lookback, cursor pagination, and MCP server access — no credit card required. Paid plans start at $9/month.
Related resources
Sports Card Sales API
Recent sales from supported sources
eBay Sold Card Prices API
eBay Best Offer and auction data
Baseball Card Price Data
MLB card search and comp analysis
Card Price History API
Historical data with date filtering
Pokemon Card Prices API
Pokemon TCG sales and PSA grades
PSA Graded Card Prices
Graded card comps across all sports
Start building with card market data
Free tier: 5,000 sales rows returned per UTC day, no credit card required. Works for most hobby projects and AI agents.
Get Free API Key →