TCG Vendor Base API

A read API for trading-card catalog data and market prices — cards and sealed products across multiple games, sourced from TCGplayer via tcgcsv. Prices in USD with a daily MYR snapshot.

Overview

Base URL

https://api.tcgvendorbase.com

All endpoints live under /api/v1/, accept GET only, and return JSON. Every request needs an API key (see below). Responses are edge-cached, so repeat reads are fast.

Quick start:
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.tcgvendorbase.com/api/v1/cards?q=charizard&game=pokemon"

Authentication

Pass your key in the X-API-Key request header on every call. Keys are issued per partner; contact the API owner to request one.

X-API-Key: YOUR_API_KEY
ConditionResponse
Header missing401 {"error":"missing X-API-Key header"}
Unknown key401 {"error":"invalid API key"}
Disabled key403 {"error":"API key disabled"}

Games & languages

Every product carries a game and a lang. Search endpoints accept both as optional filters (omit to search across all).

Currently available

game = pokemon lang = en lang = ja
Japanese cards use English names. The catalog stores Japanese-set cards with their English names (TCGplayer is a US source). To find Japanese printings, search by the English name and filter with lang=ja — e.g. ?q=charizard&lang=ja.

Caching & prices

  • Caching — GET responses are cached at the edge (s-maxage=3600, stale-while-revalidate=86400). Expect data up to ~1 hour old.
  • Currency*_usd fields come straight from TCGplayer (USD). market_myr is a snapshot computed at ingest using fx_rate (USD→MYR).
  • Freshness — prices are refreshed from the source about daily; captured_at is the source's publish time.
  • Variants — a product has one price row per sub_type_name (e.g. Holofoil, Normal, Reverse Holofoil, or Unopened for sealed).

Try it — live console

Requests run against this same API (same origin, so no CORS setup needed). Your key is sent only to this API; tick remember to keep it in this browser only. Inputs are pre-filled with working examples.

Request
Response

Get a card

GET /api/v1/cards/{id}

Full detail for one card by its product_id. Returns 404 if the id is not a card (e.g. it's a sealed product).

curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.tcgvendorbase.com/api/v1/cards/84189"
{
  "product_id": 84189,
  "group_id": 1863,
  "game": "pokemon",
  "lang": "en",
  "product_type": "card",
  "name": "Charizard",
  "image_url": "https://...",
  "tcgplayer_url": "https://...",
  "extended": [
    { "name": "Number", "displayName": "Number", "value": "4/102" },
    { "name": "Rarity", "displayName": "Rarity", "value": "Holo Rare" }
  ]
}

Get a sealed product

GET /api/v1/sealed/{id}

Detail for one sealed product by product_id. Returns 404 if the id is not sealed. Same response shape as Get a card (with product_type: "sealed").

Batch prices

GET /api/v1/prices

Current prices for up to 200 products in one call. Returns one row per variant; works for cards and sealed alike.

ParamTypeNotes
ids requiredstringComma-separated product_ids. Max 200.
picked optionalstringauto collapses each product to a single variant by priority (Holofoil > Normal > Reverse Holofoil, else first priced).
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.tcgvendorbase.com/api/v1/prices?ids=84189,91601"
{
  "results": [
    {
      "product_id": 84189,
      "sub_type_name": "Holofoil",
      "product_type": "card",
      "lang": "en",
      "game": "pokemon",
      "market_usd": 138.08,
      "market_myr": 547.86,
      "low_usd": 105.00,
      "mid_usd": 572.12,
      "high_usd": 1390.55,
      "direct_low_usd": 999.99,
      "fx_rate": 3.9677,
      "captured_at": "2026-05-30T20:04:57+00:00"
    }
  ]
}

Price history

GET /api/v1/prices/{id}/history

Daily market-price time series for one product variant.

ParamTypeNotes
{id} requiredintPath: the product_id.
sub_type_name requiredstringVariant, e.g. Holofoil. Alias: variant.
days optionalintLook-back window; default 90, max 365.
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.tcgvendorbase.com/api/v1/prices/84189/history?sub_type_name=Holofoil&days=90"
{
  "product_id": 84189,
  "sub_type_name": "Holofoil",
  "days": 90,
  "results": [
    { "captured_date": "2026-05-30", "market_usd": 138.08, "market_myr": 547.86, "fx_rate": 3.9677 }
  ]
}

History only gains a row when the market price changes, so gaps between dates mean the price held steady.

Response fields

Product (search results & detail)

FieldTypeDescription
product_idintStable id (TCGplayer productId). Use it for prices/history.
group_idintSet id.
set_namestringSet name (search results only).
product_typestringcard or sealed.
game / langstringe.g. pokemon / en|ja.
namestringProduct name.
image_url / tcgplayer_urlstringImage and TCGplayer page.
similarityfloatMatch score 0–1 (search results only).
extendedarrayRaw attribute list (detail only): rarity, number, etc.

Price

FieldTypeDescription
sub_type_namestringVariant.
market_usdnumberMarket price (USD).
market_myrnumberMYR snapshot at ingest.
low_usd / mid_usd / high_usd / direct_low_usdnumberOther TCGplayer price points (USD).
fx_ratenumberUSD→MYR rate used.
captured_attimestampSource publish time.

Errors

Errors return a JSON body {"error":"…"} with the matching status code.

StatusMeaning
400Bad request — missing q/ids, invalid lang, unknown game, bad id, etc.
401Missing or invalid X-API-Key.
403API key disabled.
404Not found — including type mismatches (a card id on /sealed/{id} or vice-versa).