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.
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
| Condition | Response |
|---|---|
| Header missing | 401 {"error":"missing X-API-Key header"} |
| Unknown key | 401 {"error":"invalid API key"} |
| Disabled key | 403 {"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
pokemon
lang = en
lang = ja
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 —
*_usdfields come straight from TCGplayer (USD).market_myris a snapshot computed at ingest usingfx_rate(USD→MYR). - Freshness — prices are refreshed from the source about daily;
captured_atis the source's publish time. - Variants — a product has one price row per
sub_type_name(e.g.Holofoil,Normal,Reverse Holofoil, orUnopenedfor 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.
—Search cards
Fuzzy name search over single cards. 20 results per page, ranked by similarity.
| Param | Type | Notes |
|---|---|---|
q required | string | Search text (matched against the card name). |
game optional | string | e.g. pokemon. Omit for all games. |
lang optional | string | en or ja. |
page optional | int | 1-based; default 1. |
Example
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.tcgvendorbase.com/api/v1/cards?q=charizard&game=pokemon&lang=en"
{
"page": 1,
"total": 161,
"results": [
{
"product_id": 84189,
"group_id": 1863,
"product_type": "card",
"lang": "en",
"game": "pokemon",
"name": "Charizard",
"image_url": "https://...",
"tcgplayer_url": "https://...",
"set_name": "SM Base Set",
"similarity": 0.6
}
]
}
Get a card
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" }
]
}
Search sealed
Same as Search cards but limited to sealed products (booster boxes, ETBs, bundles, …). Accepts q (required), game, lang, page.
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.tcgvendorbase.com/api/v1/sealed?q=booster%20box&game=pokemon"
Get a sealed product
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").
Search all products
Searches cards and sealed together; each result carries its own product_type. Use the optional type filter to narrow.
| Param | Type | Notes |
|---|---|---|
q required | string | Search text. |
type optional | string | card or sealed. Omit for both. |
game optional | string | e.g. pokemon. |
lang optional | string | en or ja. |
page optional | int | default 1. |
Batch prices
Current prices for up to 200 products in one call. Returns one row per variant; works for cards and sealed alike.
| Param | Type | Notes |
|---|---|---|
ids required | string | Comma-separated product_ids. Max 200. |
picked optional | string | auto 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
Daily market-price time series for one product variant.
| Param | Type | Notes |
|---|---|---|
{id} required | int | Path: the product_id. |
sub_type_name required | string | Variant, e.g. Holofoil. Alias: variant. |
days optional | int | Look-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)
| Field | Type | Description |
|---|---|---|
product_id | int | Stable id (TCGplayer productId). Use it for prices/history. |
group_id | int | Set id. |
set_name | string | Set name (search results only). |
product_type | string | card or sealed. |
game / lang | string | e.g. pokemon / en|ja. |
name | string | Product name. |
image_url / tcgplayer_url | string | Image and TCGplayer page. |
similarity | float | Match score 0–1 (search results only). |
extended | array | Raw attribute list (detail only): rarity, number, etc. |
Price
| Field | Type | Description |
|---|---|---|
sub_type_name | string | Variant. |
market_usd | number | Market price (USD). |
market_myr | number | MYR snapshot at ingest. |
low_usd / mid_usd / high_usd / direct_low_usd | number | Other TCGplayer price points (USD). |
fx_rate | number | USD→MYR rate used. |
captured_at | timestamp | Source publish time. |
Errors
Errors return a JSON body {"error":"…"} with the matching status code.
| Status | Meaning |
|---|---|
| 400 | Bad request — missing q/ids, invalid lang, unknown game, bad id, etc. |
| 401 | Missing or invalid X-API-Key. |
| 403 | API key disabled. |
| 404 | Not found — including type mismatches (a card id on /sealed/{id} or vice-versa). |