TCGCSV

Documentation

See something wrong or out of place? Reach out on discord or submit an issue on Github to ask a question or offer a correction!

TCGplayer

The bulk of the information offered here from TCGplayer is a direct export from their API endpoints. When relevent, this documentation will link to the TCGplayer API endpoints that yielded the cached response.

Almost all endpoints from their API yield responses with the following format:

{ "totalItems": 440, "success": true, "errors": [], "results": [ // ... ] }

The Market Price Collection does not include totalItems for some mysterious reason.

totalItems int32
Total number of result objects.
success boolean
Indicates whether the request was successful.
errors list
A list of error descriptions if the request was unsuccessful.
results list
An array of JSON objects containing result objects.

Categories Collection

TCGplayer uses categories to roughly translate to a card game or a collection of merchandise.

The cached response returns information from TCGplayer's List All Categories endpoint.

Example URL: https://tcgcsv.com/tcgplayer/categories

Example JSON response:

{ "totalItems": 89, "success": true, "errors": [], "results": [ // ... { "categoryId": 3, "name": "Pokemon", "modifiedOn": "2025-11-19T15:58:35.27", "displayName": "Pokemon", "seoCategoryName": "Pokemon", "categoryDescription": "Trainers, your Pokémon adventure starts here! Whether you're a champ in the making or trying to catch 'em all from the latest sets, browse and buy Pokémon cards, booster boxes, Elite Trainer Boxes, and card packs at the best prices from thousands of sellers.", "categoryPageTitle": "TCGplayer - Buy Pokémon TCG Cards, Singles, and Pack", "sealedLabel": "Sealed Products", "nonSealedLabel": "Single Cards", "conditionGuideUrl": "https://store.tcgplayer.com/help/cardconditionguide", "isScannable": true, "popularity": 576635, "isDirect": true }, // ... ] }
categoryId int32
Unique incrementing integer ID. Safe to use as a primary key.
name string
Internal name. Frequently, this is identical to the displayName. It is occasionally shortened. For example, the displayName "Magic: The Gathering" has the name "Magic".
modifiedOn string
Timestamp when the category was last updated. Beware, the timezone is unclear and unknown. These timestamps seem to update quite frequently, implying they at least track when groups are added or removed.
displayName string
Name intended for display.
seoCategoryName string
Name intended for SEO purposes. Frequently, "&" signs are expanded into the word "and" and acronyms can be fully spelled out. For example, the displayName "Final Fantasy TCG" has the seoCategoryName "Final Fantasy Trading Card Game".
categoryDescription nullable string
A bit of marketing copy describing this category.
categoryPageTitle nullable string
TCGplayer's title and call to action for the category.
sealedLabel nullable string
Enumerated string value: "Sealed Product", "Sealed Products", "Bulk Lot", null
nonSealedLabel nullable string
A complete mess of an enumerated string value: "Single Cards", "Singles", "Single Card", "Event Kits", "Single Card ", "Products", "Non-Sealed Products", "Figures", "Cards", "Miniatures", "Unopened Games", "Card & Die", null
conditionGuideUrl string
A URL that links to a condition guide to help assess condition for products in this category.
isScannable boolean
Indicates whether products in this category can be scanned using the TCGplayer app's scanning feature.
popularity int32
An integer value representing the relative popularity or ranking.
isDirect boolean
Indicates whether products in this category can be purchased through TCGplayer Direct.

Groups Collection

TCGplayer uses groups to represent collections of products within a category. Each group roughly translates to a set in a card game.

The cached response returns information from TCGplayer's List All Category Groups endpoint.

URL Scheme: https://tcgcsv.com/tcgplayer/{categoryId}/groups
Example URL: https://tcgcsv.com/tcgplayer/3/groups

Example JSON response:

{ "totalItems": 212, "success": true, "errors": [], "results": [ // ... { "groupId": 3170, "name": "SWSH12: Silver Tempest", "abbreviation": "SWSH12", "isSupplemental": false, "publishedOn": "2022-11-11T00:00:00", "modifiedOn": "2025-12-12T22:37:34.34", "categoryId": 3 }, // ... ] }
groupId int32
Unique incrementing integer ID. Safe to use as a primary key.
name string
Name of the group or set.
abbreviation string
Abbrieviation for the group or set. This abbreviation can be used for Mass Entry lookups.
isSupplemental boolean
A dubious boolean value indicating whether a group is considered a "supplemental" group rather than a main expansion. TCGplayer seems to play fast and loose with what they consider "supplemental" however. Pokemon's McDonald's Promos 2019 is considered supplemental=false however McDonald's Promos 2018 is considered supplemental=True. Probably best ignored.
publishedOn string
Timestamp when the group was first created. Beware, the timezone is unclear and unknown.
modifiedOn string
Timestamp when the group was last updated. Beware, the timezone is unclear and unknown. These timestamps seem to update quite frequently, implying they at least track when products are added or removed.
categoryId int32
Reference to the category this group is related to.

Products Collection

TCGplayer uses products to represent sealed boxes, packs, code cards, individual trading cards, and more! Products have nested extendedData which is where TCGplayer usually stores a card's text, rarity, and set number. Products have separate Market Price objects available in a parallel collection that need to be joined via their productId.

The cached response returns information from TCGplayer's List All Products endpoint with the query parameter getExtendedFields set to true.

URL Scheme: https://tcgcsv.com/tcgplayer/{categoryId}/{groupId}/products
Example URL: https://tcgcsv.com/tcgplayer/3/3170/products

Example JSON response:

{ "totalItems": 254, "success": true, "errors": [], "results": [ // ... { "productId": 451396, "name": "Lugia VSTAR", "cleanName": "Lugia VSTAR", "imageUrl": "https://tcgplayer-cdn.tcgplayer.com/product/451396_200w.jpg", "categoryId": 3, "groupId": 3170, "url": "https://www.tcgplayer.com/product/451396/pokemon-swsh12-silver-tempest-lugia-vstar", "modifiedOn": "2025-12-04T15:00:29.8", "imageCount": 1, "presaleInfo": { "isPresale": false, "releasedOn": null, "note": null }, "extendedData": [ { "name": "Number", "displayName": "Card Number", "value": "139/195" }, { "name": "Rarity", "displayName": "Rarity", "value": "Ultra Rare" }, { "name": "Card Type", "displayName": "Card Type", "value": "Colorless" }, { "name": "HP", "displayName": "HP", "value": "280" }, { "name": "Stage", "displayName": "Stage", "value": "VSTAR" }, { "name": "CardText", "displayName": "Card Text", "value": `<span style="color:gold"><strong>VSTAR Power</strong></span>\r\n<br>\r\n<strong>Ability — Summoning Star</strong>\r\n<br>\r\…game.)</em>\r\n<br><br>\r\n<em>VSTAR rule — When your Pokémon VSTAR is Knocked Out, your opponent takes 2 Prize cards.</em>` }, { "name": "Attack 1", "displayName": "Attack 1", "value": "[4] Tempest Dive (220)\r\n<br>\r\nYou may discard a Stadium in play." }, { "name": "Weakness", "displayName": "Weakness", "value": "Lx2" }, { "name": "Resistance", "displayName": "Resistance", "value": "F-30" }, { "name": "RetreatCost", "displayName": "Retreat Cost", "value": "2" } ] }, // ... ] }
productId int32
Unique incrementing integer ID. Safe to use as a primary key.
name string
Name of the product or card.
cleanName nullable string
Name of the product or card, with some special characters removed ()[]&-'!?/:. etc.
imageUrl string
Image URL to TCGplayer's image CDN. For a slightly higher quality image, replace the _200w, at the end of the URL with _in_1000x1000, however the image may still end up being pretty small.
categoryId int32
Reference to the category this product is related to.
groupId int32
Reference to the group this product is related to.
url string
URL linking to the product's page on TCGplayer
modifiedOn string
Timestamp when the product was last updated. Beware, the timezone is unclear and unknown. I am not sure what these timestamps track.
imageCount int32
Number of available product images. Usually between 0 and 6.
presaleInfo object
├─── isPresale bool
Indicates whether the product is available for immediate delivery. Purchases of isPresale=true products will be shipped at a later time.
├─── releasedOn nullable string
No idea. My best guess is that this is a timestamp indicating when the presale note was written/last updated. Beware, the timezone is unclear and unknown.
└─── note nullable string
If present, a note detailing expected shipping dates.
extendedData list
An array of JSON sub-objects containing additional category-specific information about each product. You can think of this list as a key-value store. Most of the relevent card information will be stored here. If you would like to know if the product is a "Card", checking the extendedData for a property names Rarity or Number is a good indicator.

Property Definitions for Extended Data:

name string
Name of the extended data property. You can think of this as the property's key.
displayName string
Name intended for display. Frequently, this is identical to the name with spaces added for readability.
value string
Value of the extended data property.

I currently do not have any meta endpoints that publicise or vendor the extendedData items one can expect from a category or group. Users will need to sample products and inspect the extendedData they find there to see if it's present and useful.

Market Prices Collection

Products have Market Price objects available that need to be joined via their productId. Note: Products are one-to-many with Prices. One product can have multiple price objects.

The cached response returns information from TCGplayer's Product Prices by Group endpoint.

URL Scheme: https://tcgcsv.com/tcgplayer/{categoryId}/{groupId}/prices
Example URL: https://tcgcsv.com/tcgplayer/3/3170/prices

Example JSON response:

{ "success": true, "errors": [], "results": [ // ... { "productId": 451784, "lowPrice": 0.1, "midPrice": 0.51, "highPrice": 25.51, "marketPrice": 0.53, "directLowPrice": 0.44, "subTypeName": "Holofoil" }, { "productId": 451784, "lowPrice": 0.35, "midPrice": 0.7, "highPrice": 2.99, "marketPrice": 0.74, "directLowPrice": null, "subTypeName": "Reverse Holofoil" } // ... ] }

Note the lack of a totalItems property. Prices are in United States Dollars (USD)

productId int32
Incrementing integer ID. Not safe to use as a primary key. Must be combined into a composite key with subTypeName
lowPrice double
The lowest listed price of a card sans condition. Does not include shipping.
midPrice double
Median listing price. The discrepancy between midPrice and marketPrice is usually what people look at.
highPrice double
The highest price of a card. Generally not a very helpful property due to price parking.
marketPrice nullable double
Represents the vague "selling price of the card". In TCGplayer's words: "TCGplayer Market Price uses the value at which a card has recently been selling as a key data point in the calculation of that card's worth." The marketPrice for a newer cards will roughly center around Near Mint (NM) or Lightly Played (LP) listings, but not always. Older cards will tend to settle on whatever's available and whatever's moving including Heavily Played (HP) sales. Extremely low sales volume will result in the market price yielding null or behaving slowly.
directLowPrice nullable double
The "low price" if you are ordering cards from the TCGplayer's direct program. Buyers will recieve one package when they order cards directly from TCGplayer, but that usually means there's a premium included in the card price.
subTypeName string
A name given to the printing or variation of the product. Needed when a product may have multiple prices. Examples include: Normal, Holofoil, and Reverse Holofoil.