TCGPlayer APItcgplayer.com ↗
Search TCGPlayer's trading card catalog, get market prices by condition, browse seller listings, and pull recent sold transactions for Pokemon, MTG, and more.
What is the TCGPlayer API?
The TCGPlayer API exposes 10 endpoints covering the full trading card marketplace: catalog search, per-condition pricing, seller listings, batch product lookup, and recent sales history. The search_cards endpoint returns market prices, listing counts, and up to three top seller listings per result, while get_card_listings surfaces individual seller names, prices, shipping costs, and verified-seller status across all TCGPlayer-supported card games.
curl -X GET 'https://api.parse.bot/scraper/5d1e8a71-43a6-400a-9f41-6f2a4ad5cbe7/search_cards?limit=10&query=charizard&offset=0' \ -H 'X-API-Key: $PARSE_API_KEY'
Full-text search over TCGPlayer's catalog of trading cards and sealed products. query matches product names and set names. Returns cards with current market prices, listing counts, and up to 3 top seller listings per card. Paginates via offset. Each card exposes a product_id usable with get_card_details and get_card_listings for deeper data.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results to return (max 50) |
| queryrequired | string | Search query (e.g. 'black lotus', 'dark magician', 'charizard base set') |
| offset | integer | Offset for pagination (0-based) |
| rarity | string | Filter results by card rarity (e.g. 'Rare', 'Common', 'Uncommon', 'Promo', 'Ultra Rare', 'Secret Rare'). Omitting returns all rarities. |
{
"type": "object",
"fields": {
"cards": "array of card summary objects with product_id, name, set_name, rarity, market_price, lowest_price, total_listings, top_listings",
"total_results": "integer, total number of matching cards",
"available_sets": "array of {name, url_value, count} for filtering by set"
},
"sample": {
"data": {
"cards": [
{
"name": "Mega Charizard X ex Ultra Premium Collection",
"rarity": "",
"set_name": "Miscellaneous Cards & Products",
"image_url": "https://tcgplayer-cdn.tcgplayer.com/product/654213_200w.jpg",
"product_id": 654213,
"card_number": null,
"product_url": "https://www.tcgplayer.com/product/654213",
"lowest_price": 39.89,
"market_price": 219.14,
"product_line": "Pokemon",
"top_listings": [
{
"price": 7.99,
"printing": "Normal",
"quantity": 95,
"condition": "Unopened",
"seller_name": "DrZard",
"seller_sales": "286",
"seller_rating": 100,
"shipping_price": 0,
"verified_seller": false
}
],
"total_listings": 206
}
],
"limit": 10,
"query": "charizard",
"offset": 0,
"total_results": 878,
"available_sets": [
{
"name": "SV4a: Shiny Treasure ex",
"count": 5,
"url_value": "sv4a-shiny-treasure-ex"
}
]
},
"status": "success"
}
}About the TCGPlayer API
Card Search and Pricing
search_cards accepts a free-text query (card name or set name) with optional rarity and offset filters, returning an array of card objects that each include product_id, market_price, lowest_price, total_listings, and up to three top_listings. The product_id field threads through every other endpoint. get_card_details expands a single product into full condition-level pricing via pricing_by_condition, an array of objects carrying sku_id, condition, variant, market_price, lowest_price, and highest_price. get_card_prices_by_condition lets you identify a card by card_name, set_name, and tcg (game name or slug) instead of a numeric ID, which is useful when you don't yet have a product_id in hand.
Seller Listings and Sales History
get_card_listings returns paginated seller-level rows with seller_name, price, shipping_price, total_price, condition, seller_rating, and verified_seller status. You can filter by condition (Near Mint through Damaged) and sort by total price ascending or descending. get_latest_sales returns recent sold transactions for a product, each with a sale date (ISO 8601), condition, variant, language, price in USD, and a separate shipping_price; a computed average_price is included over the returned window.
Set-Level and Batch Operations
get_card_prices_by_set lists every single-card product in a set with its near_mint_market_price, card_number, rarity, and foil_only flag, paginating up to 1,000 cards per call. get_set_cards_with_sales extends this with recent sales per card in one call; get_set_cards_with_sales_text adds a prose field that renders the whole result as plain text for direct use in AI prompts. get_cards_batch resolves up to 200 product_ids at once and appends last_sold_prices per condition to each result, isolating failures into a separate errors array without aborting the whole request.
Product Descriptions and Metadata
get_product_description returns the site's description text for any product — single card or sealed product such as a booster box — with HTML stripped and paragraphs separated by newlines. The response includes attributes (a label-to-value map covering fields like Card Text and Artist), contents (a parsed list of what a sealed product includes), image_url, set_code, and a sealed boolean.
The TCGPlayer API is a managed, monitored endpoint for tcgplayer.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when tcgplayer.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official tcgplayer.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track Near Mint market price trends over time for specific Pokemon or MTG cards using
get_card_detailspricing_by_condition data - Build a portfolio tracker that batch-resolves hundreds of product IDs at once via
get_cards_batchand stores last_sold_prices per condition - Compare seller listings by total price including shipping with
get_card_listingssorted by 'price+shipping' ascending - Generate a full set price list for arbitrage analysis using
get_card_prices_by_setacross Magic: The Gathering sets - Feed recent sales data from
get_latest_salesinto a price-alert system that notifies when a card sells below a threshold - Populate an AI prompt with structured set sales data using the
prosefield fromget_set_cards_with_sales_text - Identify sealed product contents for a booster box or bundle using
get_product_descriptioncontents and attributes fields
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does TCGPlayer have an official developer API?+
What condition values does `get_card_listings` accept for filtering?+
get_card_listings accepts the condition parameter with these values: 'Near Mint', 'Lightly Played', 'Moderately Played', 'Heavily Played', 'Damaged', and 'Unopened' (relevant for sealed products). The response also includes a condition_breakdown array showing how many listings exist per condition, so you can check availability before filtering.How many recent sales does `get_latest_sales` return?+
limit of 1 to 50, but the source currently serves at most 5 sales to non-authenticated sessions. In practice, unauthenticated calls will return up to 5 records regardless of the limit value. The total_results field indicates how many the site reports as accessible for the query.Does the API cover non-English card printings or prices for specific languages?+
get_latest_sales does include a language field on each sale record, so sold transactions for non-English copies may appear in that feed. Dedicated endpoints for filtering catalog or pricing data by language are not currently included. You can fork this API on Parse and revise it to add language-filtered catalog or pricing endpoints.Can I retrieve seller profile pages or store inventories beyond individual card listings?+
get_card_listings, but there is no endpoint for a full seller store inventory or seller profile page. You can fork this API on Parse and revise it to add a seller-centric inventory endpoint.