Public API
Last updated: October 5, 2026
The Index's headline price and expected-value data is available as a free, read-only JSON API with no API key or signup. Bulk sealed-model output uses a separate server credential. Three endpoints cover card prices, sealed EV, and card search. If you'd rather not write HTTP calls at all, there's an MCP server that plugs the same data into Claude, ChatGPT, and other AI assistants.
Ground rules
Attribution required. Every response includes
source, url, and terms fields.
If you display or republish this data, credit "TCG Strat" and link
to the url in the payload. That's the whole price of
admission.
Data updates daily. Prices sync from TCGplayer, Card Kingdom, Cardsphere, and Cardmarket nightly. Responses are edge-cached for one hour, so polling more often than that just gets you the same cached bytes.
Fair use. Free for non-commercial use. Keep request volume reasonable (the cache means you rarely need more than one request per query per hour). Anonymous REST access allows up to 600 uncached function requests per 10 minutes and 5,000 per UTC day per client; MCP's shared-service allowance is twice that. Bulk scraping, resale of the raw data, or hammering the origin will get an IP rate-limited or blocked. For commercial licensing, get in touch.
None of this is financial advice, and prices can be delayed or wrong. See the methodology page for how the data is collected.
Endpoints
GET /api/public/v1/card-price
Current price and up to ten printings for a single card. Requires a
name query parameter (exact card name; minor punctuation
differences are tolerated, maximum 120 characters).
curl "https://www.tcgstrat.com/api/public/v1/card-price?name=Lightning%20Bolt" Response (printings trimmed for brevity; up to 10 are returned, cheapest first):
{
"source": "TCG Strat",
"url": "https://www.tcgstrat.com/mtg/index/cards/lightning-bolt",
"terms": "Free for non-commercial use with attribution. Data updates daily.",
"data": {
"name": "Lightning Bolt",
"setCode": "2x2",
"rarity": "uncommon",
"cheapestPrice": 1.02,
"printingsCount": 84,
"printings": [
{
"setCode": "clu",
"collectorNumber": "141",
"finish": "nonfoil",
"treatment": "standard",
"tcgMarket": 1.02,
"ckRetail": 1.49,
"ckBuylist": 0.60,
"mpPrice": 0.89,
"mpQuantity": 42
}
]
}
} cheapestPrice is the cheapest playable nonfoil printing
(TCGplayer market). tcgMarket / ckRetail /
ckBuylist are TCGplayer market, Card Kingdom retail, and
Card Kingdom buylist prices in USD. mpPrice /
mpQuantity are Mana Pool's cheapest listing and listing
depth (both null when Mana Pool has no listings for the
printing). Returns 404 when the card isn't found and
400 when name is missing.
GET /api/public/v1/sealed-ev
Without parameters, returns five high-signal rows plus full-universe
counts for citations and discovery. Pass a productId to
get one product. Both forms remain public and require no key.
curl "https://www.tcgstrat.com/api/public/v1/sealed-ev"
curl "https://www.tcgstrat.com/api/public/v1/sealed-ev?productId=<id>" {
"source": "TCG Strat",
"url": "https://www.tcgstrat.com/mtg/index/sealed",
"terms": "Free for non-commercial use with attribution. Data updates daily.",
"data": [
{
"productId": "c1f3a2...",
"name": "Bloomburrow Play Booster Box",
"setCode": "blb",
"productType": "play_booster_box",
"unitKind": "booster_display",
"currentUnitPrice": 119.99,
"boxPrice": 119.99,
"headlineEv": 96.40,
"engine": "analytical",
"medianEv": null,
"evRatio": 0.80,
"signal": "hold",
"pctChange7d": -1.2,
"pctChange30d": 3.4
}
],
"meta": {
"totalTracked": 870,
"returned": 5,
"truncated": true,
"bulkRequiresApiKey": true
}
} headlineEv is the primary expected value: the median of
simulated openings, an analytical mean, or a fixed-contents value,
depending on engine.
unitKind is the product's unit: pack,
booster_display, case, bundle,
deck, kit, or sealed_product.
A missing or unrecognized unit is returned as sealed_product.
currentUnitPrice is that unit's current market price, and
evRatio is headlineEv divided by it.
signal is one of crack,
neutral, hold, or
strong_hold. When productId is given, the
envelope's url points at that product's page on The
Index. Product IDs are limited to 128 URL-safe characters.
Compatibility: boxPrice is a deprecated
v1 alias kept for existing integrations. It always equals
currentUnitPrice, including when both are
null, and meta.deprecatedFields lists it.
New integrations should read unitKind and
currentUnitPrice.
Server-only bulk sealed-model access
The complete sealed-model response is no longer an anonymous export.
Licensed server applications can request view=bulk with a
dedicated bearer credential. The response is private, is never shared-cacheable,
and intentionally omits browser CORS headers so the key is not placed in frontend code.
Contact admin@tcgstrat.com for access.
curl -H "Authorization: Bearer $TCGSTRAT_API_KEY" \
"https://www.tcgstrat.com/api/public/v1/sealed-ev?view=bulk" GET /api/public/v1/search
Card name search. Requires a q query parameter; returns
matches with each card's cheapest tracked price, an image of the
matched printing, and its TCG Strat page URL. Optional
limit (default 10, max 10). Search text is limited to 80 characters.
curl "https://www.tcgstrat.com/api/public/v1/search?q=ragavan&limit=10" {
"source": "TCG Strat",
"url": "https://www.tcgstrat.com/mtg/index",
"terms": "Free for non-commercial use with attribution. Data updates daily.",
"data": [
{
"name": "Ragavan, Nimble Pilferer",
"setCode": "mh2",
"rarity": "mythic",
"cheapestPrice": 34.55,
"imageUri": "https://cards.scryfall.io/large/front/...",
"url": "https://www.tcgstrat.com/mtg/index/cards/ragavan-nimble-pilferer"
}
]
} Errors and caching
Errors come back as JSON with an error field:
400 for missing parameters, 404 for
not-found, 413 for an oversized MCP body, 429
when a generous abuse ceiling is exceeded, and 503 when a
required dependency is unavailable. A 429 or retryable
503 includes Retry-After. Successful anonymous responses carry
Cache-Control: public, s-maxage=3600,
stale-while-revalidate=600 and
Access-Control-Allow-Origin: *, so you can call these
endpoints directly from a browser app.
MCP server: use this data in Claude or ChatGPT
Both are the same Model Context Protocol tools
(get_card_price, get_sealed_ev,
search_cards) wrapping the endpoints above: headline
data plus a link back here for the full picture. This is read-only,
capped citation data with no auth; MCP never exposes the bulk model
view, and the attribution envelope rides along in every result.
ChatGPT, or Claude's connector UI
No install. Add this URL as a custom connector / remote MCP server:
https://www.tcgstrat.com/mcp Claude Desktop or Claude Code
These spawn a local process instead, via the tcgstrat-mcp npm package. For Claude Code, one command:
claude mcp add tcgstrat -- npx -y tcgstrat-mcp
For Claude Desktop (or any client that takes JSON config), add this
to your claude_desktop_config.json:
{
"mcpServers": {
"tcgstrat": {
"command": "npx",
"args": ["-y", "tcgstrat-mcp"]
}
}
} Then ask things like "what's the cheapest printing of Lightning Bolt?" or "which sealed products are trading below EV right now?", and the assistant calls the tools and cites The Index as the source.