Changelog
Reverse-chronological log of every API change. Watch [BREAKING] entries closely.
Machine-readable: RSS feed · JSON feed · Markdown
- changedOct 30, 2026
Graded prices on /v2/cards use the weighted median of recent sales#
A current graded price is now the weighted median of the slab's sales in the last 90 days, with each sale counting half as much for every 14 days of age, instead of always its most recent sale. It is always one of the actual sale prices, never an average. A fresh sale weighs more than older ones, so the price is usually still the newest sale; it differs once a slab has three or more sales close together in time. That is rare for slabs today, so few prices change now; the difference grows as slabs sell more often. Expiry is unchanged: a graded price expires 90 days after the slab's most recent sale, and
last_sale_atandprice_expires_atstill refer to that sale. Graded browse and search (graded=only) sort by the served price. See Thin markets. - changedOct 30, 2026
Graded prices on /v2/cards expire after 90 days without a sale, and updated_after now returns graded variants#
A graded variant's price is its most recent sale. It now expires when that sale is more than 90 days old:
markets[].pricebecomesnull,price_statusisexpired,last_pricekeeps the sale, andupdated_atstays the time of the sale. Until now a graded price stayedcurrenthowever old its sale was. Every graded market also gainslast_sale_at(when the sale behind the price happened) andprice_expires_at(when it ages out); both arenullon raw variants. Graded browse and search (graded=only) list expired slabs after priced ones.updated_afternow returns a graded variant when we record a new sale for it, when a sale moves out of one of itsperiodswindows, and when its price expires. Before, it never returned graded variants.periodsis unchanged. See Thin markets.Note: Graded sales can reach us days after they happen, so a graded variant counts as changed when we record the sale, not when it sold. An `updated_after` sync now picks up late sales and expiries, but a variant may come back with an `updated_at` older than your last sync. - addedOct 19, 2026
Barcode lookup for sealed product on /v2/cards#
Look up sealed product by its retail barcode with the new
gtinparameter:GET /v2/cards?gtin=820650850714. It accepts a 12-digit UPC-A, a 13-digit EAN-13 or JAN, an 8-digit EAN-8 and a 14-digit GTIN-14, and ignores spaces and hyphens. A barcode sent asq(12 to 14 digits) is now matched the same way, then falls back to a normal name search if no product carries it, so apps that pass scanner input straight toqget the product instead of an empty result. One barcode can match several listings, sodatamay hold more than one card. See v2 identifiers.Note: Coverage starts with sealed Magic: The Gathering, Pokémon and Yu-Gi-Oh! product and will grow. A code with an invalid check digit returns `400`; a valid code we don't recognize returns `404`. - changedOct 19, 2026
changes_count on /v2/cards now counts price changes#
markets[].periods.<window>.changes_countnow counts the number of times the sale price changed during the window. Five sales all at the same price count 0. Until now it carried the same value assales_count, which is unchanged. See periods fields. - addedOct 19, 2026
Sales counts on /v2/cards#
Every window in
markets[].periodsnow carriessales_count: the number of sales recorded for the variant in that market over the window (7d,30d,90d,1y,all_time). It is on browse, search, direct lookups andPOST /v2/cards, for raw and graded variants, and followsinclude=periods[.<window>]like every other period statistic. It counts sales, not units, and leaves out refunded and voided sales. A window with no recorded sales is omitted, so read a missing window as zero. See periods fields.Note: `changes_count` keeps working and carries the same value; its description has been corrected, since in v2 it was always a count of sales rather than of price changes. Individual sale records are not exposed. - changedOct 12, 2026
All-time price statistics now cover full history#
v1
minPriceAllTime/maxPriceAllTimewere computed over the trailing year only, so they always matchedminPrice1y/maxPrice1y. They now cover everything recorded since tracking began in March 2025, and existing values have been backfilled.minPriceAllTimeDate/maxPriceAllTimeDatenow give the date the extreme was first reached; previously a price that stayed at its extreme was stamped with its most recent update.Note: Expect all-time lows to drop and highs to rise for many variants, and their dates to move earlier. The 1y fields are unchanged. - addedOct 12, 2026
v2 batch (POST /v2/cards) documented#
POST /v2/cardsfetches many cards in one request and returns them in the v2 schema. Send a JSON array of lookup objects with snake_case keys (card_id,variant_id,tcgplayer_id,tcgplayer_sku_id,mtgjson_id,scryfall_id);include,updated_afterandregionsgo on the query string. See v2 batch.Note: v1-style camelCase items (`cardId`) return `400` on v2. The v2 lookup parameter for a SKU is `tcgplayer_sku_id`; earlier docs listed it as `tcgplayer_sku`. - addedOct 5, 2026
Price status and last known price on every variant#
Since 2026-10-01 a variant priced at $100 or more that goes 14 days without a reported price expires to a
nullprice (see Thin markets). The response now says so explicitly. v1 variants carrypriceStatus(current,expired,unpriced) andlastKnownPrice; v2markets[]entries carryprice_statusandlast_price.lastUpdated/updated_atis defined as when the price was last observed, so for an expired variant it is when the last price was seen. Price history and window statistics are never modified by an expiry.Note: An expiry now counts as a price change: `updated_after` returns the expired variant once, with its `null` price, without `include_null_prices=true`. If your incremental sync assumed every returned price is non-null, handle `null` (or branch on `priceStatus`). - changedSep 22, 2026
OpenAPI (Swagger) spec now covers /v2/cards#
The public OpenAPI spec at
https://justtcg.com/docs/swagger.json(now version 1.1.0) describes the/v2/cardsbeta alongside v1:GET /v2/cardsandGET /v2/cards/{id}, with graded variants, the per-regionmarketsarray, cursor pagination headers, andapplication/problem+jsonerrors. v2 operations are taggedv2 (beta)and markedx-beta: true.Note: The spec's server URL is now `https://api.justtcg.com` and every path carries its version prefix (`/v1/cards` rather than `/cards`). The URLs clients call are unchanged, but if you generated a client from the old spec, regenerate it. v2 batch is not live yet, so it is not in the spec. - addedSep 11, 2026
New Games: Palworld OFFICIAL CARD GAME and Cyberpunk TCG#
Added support for two new games: Palworld OFFICIAL CARD GAME (
palworld-official-card-game) and Cyberpunk TCG (cyberpunk-tcg). - addedSep 1, 2026
Filter variants by language#
Added the
languagequery parameter toGET /v1/cardsandGET /v2/cards. Pass one or more languages, comma-separated, to narrow thevariantsarray on each returned card:?language=Japaneseor?language=English,Japanese. Values are case-insensitive, and an unrecognized value returns an error rather than being ignored. Accepted values are English, Japanese, French, German, Spanish, Italian, Chinese (S), Chinese (T), Portuguese, Russian, and Korean. See the /v1/cards and /v2/cards references.Note: This filters variants, not cards. Result counts and pagination are unchanged whether or not you send it, which means a card with no variant in the language you asked for is still returned, with an empty `variants` array. Filter those out client-side if you only want matches. Variants with no language recorded are English. - changedJul 27, 2026
Commercial use rights clarified#
Expanded Section 7 of the Terms of Service to spell out what paid subscribers may do with the data: display prices and history to end users, derive your own analytics and valuations, cache and store price points with no retention limit, and combine our data with other lawful sources. The boundary is unchanged (no reselling raw data and no building an API substitute), but it's now stated explicitly rather than implied. Also published a plain-English Commercial Use Guidelines page.
Note: No rights were removed. If you're on a paid plan and building your own product, this change only clarifies what was already intended. The free tier remains personal, non-commercial use. - addedJul 9, 2026
/v2/cards is now in Beta#
Opened the beta of
/v2/cards, see the /v2/cards reference. Headline changes: graded cards as first-class variants, multi-region localized pricing via a per-variantmarketsarray, an optionalregionsparameter (defaults toNA),snake_caseeverywhere, cursor pagination (RFC 8288Linkheader), andapplication/problem+jsonerrors. v2 covers the/cardsendpoint only;/gamesand/setsstay on v1.Note: Beta: the contract is finalized but may still change before GA. v1 is unchanged and remains the default for every endpoint; adopt v2 per call at your own pace. - addedJun 8, 2026
UUIDs added to both Card and Variant objects.#
Added
uuidto both Card and Variant objects. This provides a stable, globally unique identifier for each entity, independent of the human-readableid. We recommend using this as your primary key moving forward. API v2 will use UUIDs as the primaryidfield. The slug-basedidwill still be supported for backwards compatibility. - addedApr 15, 2026
Price History [1 Year Duration]#
Added
1yas a new allowed value for thepriceHistoryDurationquery parameter on theGET /cardsendpoint. When requested, thepriceHistoryarray on each variant returns one data point per day over the trailing 365 days, sourced from a daily materialized aggregate. Existing values (7d,30d,90d,180d) are unchanged, and the default remains7d. - addedFeb 25, 2026
min_price Parameter Added to /cards Endpoint#
Added the
min_priceoptional query parameter to theGET /cardsendpoint. This allows users to filter results by a minimum market price (e.g.,min_price=1.00), significantly reducing noise from low-value cards in analytics and trending lists. - addedFeb 19, 2026
MCP Endpoint Added#
The MCP endpoint provides comprehensive pricing data to your agentic workflows.
- addedFeb 17, 2026
UniVersus Game Support Added#
Added support for UniVersus. Use
universusas the game query parameter to access UniVersus card data. - addedDec 29, 2025
Sorcery Game Support Added#
Added support for Sorcery: Contested Realm. Use
sorcery-contested-realmas the game query parameter to access Sorcery card data. - changedDec 19, 2025
90-Day and 180-Day Price History Support Added#
Added support for 90d and 180d price history. Deprecated
priceHistory30din the process. Use query parampriceHistoryDurationto select desired durations (7d, 30d, 90d, 180d). Defaults to 7d.priceHistory30dwill be removed in a future major release. - addedDec 15, 2025
New Games: hololive OFFICIAL CARD GAME and Dragon Ball Super: Fusion World#
Added support for two new games: hololive OFFICIAL CARD GAME (
hololive-official-card-game) and Dragon Ball Super: Fusion World (dragon-ball-super-fusion-world). - addedDec 13, 2025
Game and Set Value Index Fields Added#
Added
game_value_usdto/gamesandset_value_usdto/sets. These represent the total value of all cards in the game/set, calculated by taking the highest price of any variant for each card. - addedDec 9, 2025
include_null_prices Parameter Added#
Added the
include_null_pricesboolean query parameter to/cards. Whentrue, the response includes cards that don't have any pricing data. Defaultfalse. - addedDec 8, 2025
Card Number Filter Added to /cards#
Added the
numberquery parameter to/cardsso you can filter cards by their specific card number within a set. - changedNov 21, 2025
Introduced sealed_count and variants_count Fields#
Fixed card counts in
/setsand/gamesto exclude sealed products. Introducedsealed_counton both endpoints andvariants_counton/sets. - addedNov 19, 2025
updated_after Parameter Added to /cards#
Added
updated_afterto bothGET /cardsandPOST /cards(Batch). Filters results to variants whose pricing was updated at or after the provided Unix timestamp. Cannot be combined with the search query parameter (q). - addedOct 27, 2025
External Identifiers Added#
Added support for querying cards by MTGJSON and Scryfall IDs. Variants can be queried using TCGplayer SKU IDs.
- addedOct 17, 2025
Set Release Dates Added to /sets#
The
/setsendpoint now includes the release date of each set. - changedSep 30, 2025
Set IDs Standardized and set_name Added to Card Object#
Set IDs standardized to lowercase-hyphenated format including the game name. Added
set_nameto the card object. - addedSep 29, 2025
Payload Reduction Parameters Added#
Added
include_price_historyandinclude_statisticsquery parameters to/cards. Available windows:7d,30d,90d,allTime. - addedSep 23, 2025
JavaScript and TypeScript SDKs Released#
Released the official JS / TS SDKs. Install via npm:
npm install justtcg-js. - addedAug 26, 2025
90-Day Analytics on /cards#
Added a suite of 90-day statistical fields for deeper quarterly market analysis.
Note: Statistical fields only — the full point-by-point `priceHistory90d` is deferred to a future major release. - addedAug 12, 2025
Language Field Added to Variant Object#
Added
languageto the variant object. - addedAug 10, 2025
New Games: Grand Archive TCG and Pokemon Japan#
Added support for Grand Archive TCG (
grand-archive-tcg) and Pokemon Japan (pokemon-japan). - addedAug 1, 2025
Multi-Condition and Multi-Printing Support#
The
/cardsendpoint now acceptsconditionandprintingquery parameters with multiple comma-separated values, e.g./cards?condition=NM,LP&printing=First Edition,Unlimited. - Jul 11, 2025
The
idformat forcardsandvariantsnow includes the card's rarity. Old formatgame-set-name, new formatgame-set-name-rarity. All previously stored IDs are invalid and must be re-fetched. - addedJul 4, 2025
OrderBy Parameters Added#
Added
orderBy(price,24h,7d,30d) andorder(asc,desc) for sorting. - Jul 1, 2025
Card IDs now include the full game name. Some IDs with invalid characters have been standardized.
- changedJun 14, 2025
Rate Limit Policy Update#
API rate limits adjusted for free users. See the Rate Limits page for details.
- deprecatedMay 15, 2025
Deprecated /variants and /cards-search#
Their functionality is merged into
/cards. - addedApr 2, 2025
v1 API Launched#
Version 1 introduces initial endpoints and card structure.