API Documentation

Learn how to integrate the JustTCG API into your applications.

API Version:

Overview

The JustTCG API provides real-time pricing data for trading card games including Magic: The Gathering, Pokémon, Yu-Gi-Oh!, Disney Lorcana, One Piece TCG, Digimon, and Union Arena. Our API is designed to be simple, fast, and reliable.

Using Node.js or TypeScript?

We strongly recommend using our official justtcg-js SDK. It provides type safety, automatic authentication, and cleaner data models to accelerate your development.

View SDK Installation Guide →

Base URL

https://api.justtcg.com/v1

Authentication

All API requests require authentication using an API key. You can obtain an API key by signing up for an account and subscribing to a plan.

SDK Users: The SDK automatically handles authentication using the JUSTTCG_API_KEY environment variable.Learn more about SDK configuration →

Manual API Key Authentication

Include your API key in the request headers:

x-api-key:tcg_your_api_key_here
Keep your API key secure and never expose it in client-side code.
If you suspect your API key has been compromised, regenerate it immediately.

SDK Authentication Example

The SDK handles authentication automatically:

import { JustTCG } from 'justtcg-js';

// Automatic authentication via environment variable
const client = new JustTCG();

// Or provide the key directly
const client = new JustTCG({ apiKey: 'your_api_key_here' });

API Reference

Our API is focused on three main endpoints for a more intuitive and seamless experience:

  • Games and Sets: For discovering available games and sets.
  • Cards: For searching and direct lookups. If you pass an id, you get a direct lookup. If you do not pass an id, the endpoint serves as a flexible search.

Collection Resources

These endpoints provide information about the available trading card games and sets in our database. Start with these endpoints to understand what's available before diving into the cards endpoint.

Games

GET

Retrieve a list of all games.

https://api.justtcg.com/v1/games

Response Object

Name
Type
Description
id
string
Unique identifier for the game
name
string
Name of the game
cards_count
integer
Number of cards in the game
variants_count
integer
Number of variants in the game
sealed_count
integer
Number of sealed products in the game
sets_count
integer
Number of sets in the game
last_updated
integer
Timestamp of the last update to the game data (in seconds since Unix epoch).
game_value_index_cents
integer
Total value of all cards in the game, in cents. Takes the highest price of any variant for each card.
game_value_change_7d_pct
float
Percentage change in game value index over the last 7 days.
game_value_change_30d_pct
float
Percentage change in game value index over the last 30 days.
game_value_change_90d_pct
float
Percentage change in game value index over the last 90 days.
cards_pos_7d_count
integer
Number of cards with positive price change in the last 7 days.
cards_neg_7d_count
integer
Number of cards with negative price change in the last 7 days.
sealed_cards_pos_7d_count
integer
Number of sealed products with positive price change in the last 7 days.
sealed_cards_neg_7d_count
integer
Number of sealed products with negative price change in the last 7 days.
cards_pos_30d_count
integer
Number of cards with positive price change in the last 30 days.
cards_neg_30d_count
integer
Number of cards with negative price change in the last 30 days.
sealed_cards_pos_30d_count
integer
Number of sealed products with positive price change in the last 30 days.
sealed_cards_neg_30d_count
integer
Number of sealed products with negative price change in the last 30 days.
cards_pos_90d_count
integer
Number of cards with positive price change in the last 90 days.
cards_neg_90d_count
integer
Number of cards with negative price change in the last 90 days.
sealed_cards_pos_90d_count
integer
Number of sealed products with positive price change in the last 90 days.
sealed_cards_neg_90d_count
integer
Number of sealed products with negative price change in the last 90 days.

Sets

GET

Retrieve a list of all sets.

https://api.justtcg.com/v1/sets

Query Parameters

Name
Type
Required
Default
Description
q
string
Optional

Search query for finding sets by name.

game
string
Required

Filter by game ID (e.g., mtg, pokemon).

orderBy
string
Optional
name

Field to sort by: name or release_date.

order
string
Optional
desc

Sort order for results: asc or desc.

Response Object

Name
Type
Description
id
string
Unique identifier for the set
name
string
Name of the set
game_id
string
ID of the game this set belongs to
game
string
Name of the game this set belongs to
cards_count
integer
Number of cards in the set
variants_count
integer
Number of variants in the set
sealed_count
integer
Number of sealed products in the set
release_date
string
Release date of the set (ISO 8601 format).
set_value_usd
float
Total value of all cards in the set, in USD. Takes the highest price of any variant for each card.
set_value_change_7d_pct
float
Percentage change in set value over the last 7 days.
set_value_change_30d_pct
float
Percentage change in set value over the last 30 days.
set_value_change_90d_pct
float
Percentage change in set value over the last 90 days.

Cards

This high-performance endpoint provides rapid access to card data whether you already have identifier values or not. For the best performance when retrieving specific cards, use this endpoint with IDs obtained from the games or sets endpoints.

Quick tip: Use "Card ID" for retrieving all variants of a single card. Use "Variant ID" when you need specific variant information for ultra-fast performance.

Card Lookup

GET

Retrieve a card and its variant prices by ID or search query. You can optionally filter the returned variants by condition and printing type.

https://api.justtcg.com/v1/cards

Note: Any identifier will take precedence over any search query if multiple of those are provided.

Query Parameters

Name
Type
Required
Default
Description
tcgplayerId
string
Required

TCGplayer ID of the card.

mtgjsonId
string
Optional

MTGJSON ID of the card.

scryfallId
string
Optional

Scryfall ID of the card.

tcgplayerSkuId
string
Optional

TCGPlayer SKU ID of the variant. Note, printing and condition filters do not apply when this is defined.

printing
string
Optional

Filter by printing type (e.g., Normal, Foil).

condition
string
Optional
S,NM,LP,MP,HP,DMG

An array of conditions to filter by. Supports fully spelled names or abbreviations. Full names: "Sealed", "Near Mint", "Lightly Played", "Moderately Played", "Heavily Played", "Damaged". Abbreviations: "S", "NM", "LP", "MP", "HP", "DMG".

priceHistoryDuration
string
Optional
7d

Specify the duration of price history to include. Options are 7d, 30d, 90d, or 180d. This is ignored if include_price_history is set to false.

include_price_history
boolean
Optional
true

Include price history data in the response.

include_statistics
string
Optional
7d,30d,90d,1y,allTime

Specify which timeframe statistics to include in the response. Defaults to all timeframes.

Options:

  • 7d
  • 30d
  • 90d
  • 1y
  • allTime

You can provide a comma-separated list (e.g., 7d,30d,1y) to include multiple statistics.

include_null_prices
boolean
Optional
false

Include cards with no pricing data in the response. Defaults to false. This parameter is ignored if a search query is passed in.

Response Object

Name
Type
Description
data
Card[]
Array of card objects. Please see below for detailed information about the Card object.

Batch Card Lookup

POST

Retrieve multiple cards and their variants in a single request. For each card, you can optionally filter variants by specifying condition and printing parameters.

https://api.justtcg.com/v1/cards

Request Body Parameters

Send an array of objects, each containing the following properties:

Name
Type
Required
Default
Description
tcgplayerId
string
Optional

TCGplayer ID of the card.

mtgjsonId
string
Optional

MTGJSON ID of the card.

scryfallId
string
Optional

Scryfall ID of the card.

tcgplayerSkuId
string
Optional

TCGPlayer SKU ID of the variant. Note, printing and condition filters do not apply when this is defined.

cardId
string
Optional

Card ID of the card.

variantId
string
Optional

Variant ID of the card.

updated_after
string (timestamp)
Optional

Filters results to include only card variants whose pricing information has been updated at or after the provided timestamp. Format: Unix Timestamp in seconds. Compatible with most filters (e.g., game, set, cardId, orderBy), but cannot be combined with the search query parameter (q).

printing
string
Optional

Filter by printing type (e.g., Normal, Foil).

condition
string
Optional
S,NM,LP,MP,HP,DMG

An array of conditions to filter by. Supports fully spelled names or abbreviations. Full names: "Sealed", "Near Mint", "Lightly Played", "Moderately Played", "Heavily Played", "Damaged". Abbreviations: "S", "NM", "LP", "MP", "HP", "DMG".

Avoid using multiple identifiers in the same object.
If multiple identifiers are provided, precedence is as follows: variantId > tcgplayerSkuId > tcgplayerId > mtgjsonId > scryfallId > cardId.

Note: The maximum number of items supported in a single request is 200 for "Enterprise" plans, 100 for "Starter" and "Pro" plans, and 20 for the free plan. For larger queries, please consider batching your requests.

Response Object

Name
Type
Description
data
Card[]
Array of card objects. Please see below for detailed information about the Card object.

Card Object

The Card object contains detailed information about a trading card, including its variants with pricing information.

Property
Type
Description
id
string
Unique identifier for the card. Frequently referred to as "cardId"
name
string
Name of the card
game
string
Name of the game the card belongs to (e.g., "Pokemon", "Magic: The Gathering")
set
string
Unique ID of the set the card belongs to
set_name
string
Name of the set the card belongs to
number
string
Card number within the set
tcgplayerId
string
TCGplayer product ID
mtgjsonId
string
MTGJSON UUID for this card.
scryfallId
string
Scryfall UUID for this card.
rarity
string
Rarity of the card (e.g., "Common", "Rare", "Promo")
details
string | null
Additional card-specific details (when applicable)
variants
Variant[]
Array of variant objects with pricing information
Cards don't directly contain pricing information. Instead, pricing is stored in variant objects within the "variants" array.

Variant Object

Each variant represents a specific combination of condition and printing for a card, with its associated price.

Property
Type
Description
id
string
Unique identifier for this specific variant. Frequently referred to as 'variantId'
condition
string
Condition of the card (e.g., "Near Mint", "Lightly Played")
printing
string
Printing type (e.g., "Normal", "Foil")
language
string
Language of the card (e.g., "English", "Japanese")
tcgplayerSkuId
string
TCGPlayer SKU ID for this variant.
price
number
Current price in USD
lastUpdated
number
Unix timestamp (in seconds) of when the price was last updated
priceChange24hr
number | null
Percentage price change over the last 24 hours
priceChange7d
number | null
Percentage price change over the last 7 days
avgPrice
number | null
Average price over the last 7 days
priceHistory
array | null
Array of historical price points over x days, each containing price (p) and a Unix timestamp (t). This is defaulted to 7d unless specified with the priceHistoryDuration parameter.
minPrice7d
number | null
Minimum price in the last 7 days
maxPrice7d
number | null
Maximum price in the last 7 days
stddevPopPrice7d
number | null
Population standard deviation of prices over the last 7 days, indicating volatility
covPrice7d
number | null
Coefficient of variation for prices over the last 7 days (StdDev / Mean)
iqrPrice7d
number | null
Interquartile range (75th - 25th percentile) of prices over the last 7 days
trendSlope7d
number | null
Slope of the linear regression trend line for prices over the last 7 days
priceChangesCount7d
number | null
Count of distinct price changes in the last 7 days
priceChange30d
number | null
Percentage price change over the last 30 days
avgPrice30d
number | null
Average price over the last 30 days
priceHistory30d [DEPRECATED]
array | null
Array of historical price points over the last 30 days. [DEPRECATED - use priceHistory with priceHistoryDuration instead]
minPrice30d
number | null
Minimum price in the last 30 days
maxPrice30d
number | null
Maximum price in the last 30 days
stddevPopPrice30d
number | null
Population standard deviation of prices over the last 30 days
covPrice30d
number | null
Coefficient of variation for prices over the last 30 days
iqrPrice30d
number | null
Interquartile range of prices over the last 30 days
trendSlope30d
number | null
Price trend slope over the last 30 days
priceChangesCount30d
number | null
Count of distinct price changes in the last 30 days
priceRelativeTo30dRange
number | null
The current price's position within the 30-day min/max range, scaled from 0 (at min) to 1 (at max)
priceChange90d
number | null
Percentage price change over the last 90 days
avgPrice90d
number | null
Average price over the last 90 days
minPrice90d
number | null
Minimum price in the last 90 days
maxPrice90d
number | null
Maximum price in the last 90 days
stddevPopPrice90d
number | null
Population standard deviation of prices over the last 90 days
covPrice90d
number | null
Coefficient of variation for prices over the last 90 days
iqrPrice90d
number | null
Interquartile range of prices over the last 90 days
trendSlope90d
number | null
Price trend slope over the last 90 days
priceChangesCount90d
number | null
Count of distinct price changes in the last 90 days
priceRelativeTo90dRange
number | null
The current price's position within the 90-day min/max range, scaled from 0 (at min) to 1 (at max)
minPrice1y
number | null
Minimum price in the last year
maxPrice1y
number | null
Maximum price in the last year
minPriceAllTime
number | null
The lowest price ever recorded for this variant
minPriceAllTimeDate
string | null
ISO 8601 timestamp of when the all-time minimum price occurred
maxPriceAllTime
number | null
The highest price ever recorded for this variant
maxPriceAllTimeDate
string | null
ISO 8601 timestamp of when the all-time maximum price occurred

Example Card Object

{
  "id": "pokemon-battle-academy-fire-energy-22-charizard-stamped",
  "name": "Fire Energy (#22 Charizard Stamped)",
  "game": "Pokemon",
  "set": "battle-academy-pokemon",
  "set_name": "Battle Academy",
  "number": "N/A",
  "tcgplayerId": "219042",
  "rarity": "Promo",
  "details": null,
  "variants": [
    {
      "id": "pokemon-battle-academy-fire-energy-22-charizard-stamped_near-mint",
      "printing": "Normal",
      "condition": "Near Mint",
      "price": 4.99,
      "lastUpdated": 1743100261
    },
    {
      "id": "pokemon-battle-academy-fire-energy-22-charizard-stamped_lightly-played",
      "printing": "Normal",
      "condition": "Lightly Played",
      "price": 3.50,
      "lastUpdated": 1743101175
    }
  ]
}

Card IDs

Each card object has a unique id, sometimes referred to as the cardId or "Card ID".

The card ID is structured as game-set-name-rarity. This ID can be used for direct lookups using the /cards endpoint.

Note: Multiple variants of the same card ID may exist, each with its own unique variant ID. The card ID is not guaranteed to be unique across all variants.

Variant IDs

Each variant has a unique id, sometimes referred to as variantId or "Variant ID".

The variant ID is structured as cardId_condition_printing and can be used for direct, high-performance lookups using the /cards endpoint.

If you already have the variant ID, using it directly is the fastest way to retrieve pricing information.

Filtering Variants

When retrieving cards, you can filter the variants by adding optional printing and condition parameters to your requests. This helps reduce response size and narrow down results to specific variants you're interested in.

Consistency Note

All endpoints that return card data use this same structure. Every card will have at least one variant in its variants array.

Response Format

All API responses follow a consistent format with a data field containing the requested information, a meta field with pagination details (when applicable), and a _metadata field with API usage statistics.

Response Structure

Field
Type
Description
data
array | null
The requested data. An array of card objects.
meta
object | null
Metadata about the pagination details, if available.
meta.total
integer
Total number of cards available for this query.
meta.limit
integer
Total results to limit this query to.
meta.offset
integer
The current offset for these results.
meta.hasMore
boolean
Indicates if there are more pages available for this query.
_metadata
object
API usage metadata and rate limit information included with each response.
_metadata.apiPlan
string
The name of your current API subscription plan.
_metadata.apiRequestLimit
integer
Total number of API requests allowed for your plan.
_metadata.apiRequestsUsed
integer
Number of API requests you have used so far.
_metadata.apiRequestsRemaining
integer
Number of API requests remaining before you reach your total limit.
_metadata.apiDailyLimit
integer
Maximum number of API requests allowed per day.
_metadata.apiDailyRequestsUsed
integer
Number of API requests used today.
_metadata.apiDailyRequestsRemaining
integer
Number of API requests remaining for today.
_metadata.apiRateLimit
integer
Maximum number of requests allowed per minute.
error
string | null
Detailed error message if an error occurred, otherwise null.
code
string | null
Error code indicating the type of error, if applicable.

Error Handling

The JustTCG API uses standard HTTP status codes and returns consistent error response formats to help you quickly identify and resolve issues.

HTTP Status Codes

Status Code
Error Type
Description
400
Bad Request
The request was malformed or missing required parameters.
401
Unauthorized
Missing or invalid API key.
403
Forbidden
Valid API key, but insufficient permissions for the requested resource.
404
Not Found
The requested resource could not be found.
429
Too Many Requests
Rate limit exceeded. Slow down your requests.
500
Server Error
An unexpected error occurred on the server.

Error Response Format

All error responses follow a consistent format with an error object containing details about the error.

{
    "error": "Invalid game parameter. Must be one of: magic-the-gathering, mtg, pokemon, yugioh, age-of-sigmar, warhammer-40000, union-arena, flesh-and-blood-tcg, disney-lorcana, digimon-card-game, one-piece-card-game",
    "code": "INVALID_REQUEST"
}

Common Error Codes

Error Code
Description
MISSING_API_KEY
The API key is missing from the request.
INVALID_API_KEY
The API key provided is invalid or has been revoked.
INVALID_REQUEST
A required parameter is missing or invalid from the request. Check the error message for more details.
RATE_LIMIT_EXCEEDED
You have exceeded your minute-by-minute rate limit. Please slow down your requests or upgrade your plan.
DAILY_LIMIT_EXCEEDED
You have exceeded your daily API usage limit. Please wait until the limit resets or upgrade your plan. Daily resets are at midnight UTC.
REQUEST_LIMIT_EXCEEDED
You have exceeded your monthly API usage limit. Please wait until your billing cycle resets or upgrade your plan.
Pro tip: We recommend implementing error handling that gracefully retries requests in case of temporary server errors (500 status codes) or rate limiting (429 status codes), with exponential backoff for best results.

Code Examples

Practical examples showing how to integrate the JustTCG API in real-world scenarios.

Price Sync for Inventory
Automatically fetch and update prices for all cards in a specific set
// Set your API key
const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://api.justtcg.com/v1';

// Fetch all cards from a set (automatically handles pagination)
async function updatePricesForSet(gameId, setId) {
    console.log(`Updating prices for ${gameId} set: ${setId}...`);

    let allCards = [];
    let hasMoreResults = true;
    let offset = 0;
    const LIMIT = 20;

    // Keep fetching until we've got all cards
    while (hasMoreResults) {
        try {
            // Create URL with query parameters
            const url = new URL(`${BASE_URL}/cards`);
            url.searchParams.append('game', gameId);
            url.searchParams.append('set', setId);
            url.searchParams.append('limit', LIMIT);
            url.searchParams.append('offset', offset);

            // Make the API request
            const response = await fetch(url, {
                headers: { 'X-API-Key': API_KEY }
            });

            const result = await response.json();

            if (!response.ok) {
                throw new Error(result.error?.message || 'API request failed');
            }

            const cards = result.data;
            console.log(`Fetched ${cards.length} cards (offset: ${offset})`);

            // Add cards to our collection
            allCards = [...allCards, ...cards];

            // Check if we've reached the end
            hasMoreResults = cards.length === LIMIT;
            offset += LIMIT;

            // For demo purposes, just log first card's variants
            if (offset === LIMIT && cards.length > 0) {
                console.log('Sample card variation prices:');
                cards[0].variants.forEach(v => {
                    console.log(`- ${v.condition} / ${v.printing}: $${v.price}`);
                });
            }
        } catch (error) {
            console.error('Error fetching cards:', error);
            break;
        }
    }
    console.log(`✅ Updated prices for ${allCards.length} cards`);
    return allCards;
}

// Example usage
updatePricesForSet('magic-the-gathering', 'modern-horizons-2-magic-the-gathering');
Product Page Display
Fetch card data for a product page using batch lookup for better performance
// Set your API key
const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://api.justtcg.com/v1';

// Display a product page with multiple cards
async function fetchProductPageCards(cardIds) {
  console.log('Fetching data for product display...');
  
  try {
    // Batch card lookup for efficiency
    const response = await fetch(`${BASE_URL}/cards`, {
      method: 'POST',
      headers: {
        'X-API-Key': API_KEY,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(cardIds.map(id => ({ tcgplayerId: id })))
    });
    
    const result = await response.json();
    
    if (!response.ok) {
      throw new Error(result.error?.message || 'Failed to fetch cards');
    }
    
    // Display the cards (in a real app, you'd render these to the DOM)
    console.log(`Displaying ${result.data.length} cards:`);
    
    result.data.forEach(card => {
      console.log(`${card.name} - ${card.set_name}`);
      
      // Get the lowest price for display
      const lowestPrice = Math.min(
        ...card.variants.map(v => v.price)
      );
      
      console.log(`  Starting from: $${lowestPrice.toFixed(2)}`);
    });
    
    return result.data;
  } catch (error) {
    console.error('Error fetching product data:', error);
    return [];
  }
}

// Example usage
fetchProductPageCards(['219042', '25788', '1369']);
Shopping Cart Calculation
Calculate the total for a shopping cart with specific card variants
// Set your API key
const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://api.justtcg.com/v1';

// Calculate shopping cart total with specific variants
async function calculateShoppingCart(cartItems) {
    console.log('Calculating shopping cart total...');

    try {
        // Get up-to-date prices for all variants in cart
        const response = await fetch(`${BASE_URL}/cards`, {
            method: 'POST',
            headers: {
                'X-API-Key': API_KEY,
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(cartItems)
        });

        const result = await response.json();

        if (!response.ok) {
            throw new Error(result.error?.message || 'Failed to fetch prices');
        }

        // Calculate total (in a real app, you'd update the cart UI)
        let total = 0;

        result.data.forEach(item => {
            const subtotal = item.variants[0].price;
            total += subtotal;

            console.log(
                `${item.name} (${item.variants[0].condition}, ${item.variants[0].printing}): $${item.variants[0].price.toFixed(2)}`
            );
        });

        console.log(`Cart Total: $${total.toFixed(2)}`);
        return total;
    } catch (error) {
        console.error('Error calculating cart:', error);
        return 0;
    }
}

// Example usage
calculateShoppingCart([
    { tcgplayerId: '219042', condition: 'Near Mint', printing: 'Normal' },
    { tcgplayerId: '25788', condition: 'Lightly Played', printing: '1st Edition' }
]);

Rate Limits & Usage

The JustTCG API has rate limits based on your subscription plan. You can monitor your API usage in your dashboard.

Rate Limits by Plan

Plan
Monthly Limit
Daily Limit
Rate Limit
Free
1,000 requests
100 requests
10 requests/min
Starter
10,000 requests
1,000 requests
50 requests/min
Professional
50,000 requests
5,000 requests
100 requests/min
Enterprise
500,000 requests
50,000 requests
500 requests/min
If you exceed your rate limit, the API will return a 429 Too Many Requests response. If you exceed your monthly limit, you'll need to upgrade your plan to continue using the API.

Note: Rate limits are enforced per API key. If you have multiple keys, each key has its own rate limit.

Reset Times

Plan Type
Daily Limit
Monthly Limit
Free
Midnight (00:00) UTC
On day of month which the account was created at Midnight (00:00) UTC.
Paid
Midnight (00:00) UTC
On successful payment at the start of each billing cycle.

Support

If you have any questions or need help with the API, please contact our support team.

Change Log

  • Changed90-Day and 180-Day Price History Support AddedDec 19, 2025

    Added support for 90d and 180d price history. Deprecated priceHistory30d in the process. Use query param priceHistoryDuration to select desired durations (7d, 30d, 90d, 180d). Defaults to 7d. Notice to developers: priceHistory30d will be removed in a future major release. Update your integrations accordingly, asap.

  • AddedNew Games Added: hololive OFFICIAL CARD GAME and Dragon Ball Super: Fusion WorldDec 15, 2025

    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).

  • AddedGame and Set Value Index Fields AddedDec 13, 2025

    Added new fields game_value_usd to the /games endpoint and set_value_usd to the /sets endpoint. These fields represent the total value of all cards in the game or set, calculated by taking the highest price of any variant for each card. This addition provides developers with a quick overview of the market value of entire games and sets.

  • Addedinclude_null_prices Parameter AddedDec 9, 2025

    Added the include_null_prices boolean query parameter to the /cards endpoint. When set to true, this parameter includes cards that do not have any pricing data in the response. By default, this parameter is set to false, meaning only cards with pricing data are returned. This enhancement allows users to retrieve a more comprehensive list of cards, including those without current market prices.

  • AddedCard Number Filter Added to /cards EndpointDec 8, 2025

    Added the number query parameter to the /cards endpoint. This allows users to filter cards by their specific card number within a set, enhancing search precision and usability.

  • ChangedIntroduced sealed_count and variants_count FieldsNov 21, 2025

    Fixed card counts in /sets and /games endpoints to not include sealed products. Introduced sealed_count to both endpoints and variants_count field to /sets endpoint to provide more accurate data.

  • Addedupdated_after Parameter Added to /cards EndpointNov 19, 2025

    Added the updated_after parameter to both GET /cards and POST /cards (Batch) endpoints. This parameter filters results to include only card variants whose pricing information has been updated at or after the provided Unix timestamp (in seconds). This enables efficient delta synchronization workflows. The parameter is compatible with most filters (e.g., game, set, cardId, orderBy) but cannot be combined with the search query parameter (q).

  • AddedExternal Identifiers AddedOct 27, 2025

    Added support for querying cards by MTGJSON and Scryfall IDs. Furthermore, variants can be queried using TCGPlayer SKU IDs.

  • AddedSet Release Dates Added to /sets EndpointOct 17, 2025

    The /sets endpoint now includes the release date of each set. This information is crucial for developers looking to query based on set release dates.

  • ChangedSet IDs Standardized and set_name Added to Card ObjectSep 30, 2025

    To improve consistency and usability, set IDs have been standardized to use lowercase letters and hyphens instead of spaces and special characters. Furthermore, the set ID now includes the game name to eliminate ambiguity across different games with identical set names. Additionally, a new field set_name has been added to the card object to provide the human-readable name of the set.

  • AddedPayload Reduction Parameters AddedSep 29, 2025

    The API has been updated to include new include_price_history and include_statistics parameters in the query. These parameters allow users to specify the level of data reduction for the /cards endpoint. The available options are 7d, 30d, 90d and allTime. The default value is a comma-separated list of all the values, which returns the full payload. The include_price_history option returns the priceHistory array fields when set to true.

  • AddedJavaScript and TypeScript SDKs ReleasedSep 23, 2025

    Released official JavaScript and TypeScript SDKs to facilitate easier integration with the API. Check out the official GitHub repository for more details. Install via npm: npm install justtcg or yarn: yarn add justtcg.

    [GitHub Repository](https://github.com/justtcg/justtcg-js)
  • Added90-Day Analytics to /cards EndpointAug 26, 2025

    The /cards endpoint has been enhanced with a new suite of 90-day statistical data fields to provide a deeper, quarterly view of market performance. This update is designed to help developers build more sophisticated valuation and trend analysis tools.

    Note

    This update includes the calculated statistical fields only. The full, point-by-point priceHistory90d JSON object has been intentionally deferred to a future major release (API v2) to ensure continued API performance and stability for all users. Please see the full API reference for detailed descriptions of each new field.

  • AddedLanguage Field Added to Variant ObjectAug 12, 2025

    Added a new field language to the variant object to specify the language of the card.

  • AddedNew Games AddedAug 10, 2025

    Added support for two new games: Grand Archive TCG and Pokemon Japan (grand-archive-tcg, pokemon-japan).

  • AddedMulti-Condition and Multi-Printing SupportAug 1, 2025

    Added support for querying for multiple conditions (e.g., Near Mint, Lightly Played) and multiple printings (e.g., First Edition, Unlimited). The cards endpoint now accepts condition and printing query parameters that can take multiple values comma-separated. Example: /cards?condition=NM,LP&printing=First Edition,Unlimited. This allows for more granular searches and better filtering of card data.

  • Changed[BREAKING] Card ID Standardization CompletedJul 11, 2025

    To more accurately represent card variations, the id format for cards and variants has been updated to include the card's rarity. This is a breaking change that primarily affects any application that stores card or variant IDs.

    • Old ID Format: game-set-name
    • New ID Format: game-set-name-rarity

    API consumers must update their code to generate and use the new ID format. All previously stored IDs are now invalid and must be re-fetched or programmatically updated.

    We recognize this is the second breaking change to Card IDs in a short period, and we sincerely apologize for the inconvenience this causes. JustTCG is experiencing steady adoption, and our developer community is growing every day. We made the difficult but necessary decision to implement this fix now, as delaying it would have exposed a much larger number of developers to this issue in the near future. This update was essential to correctly support cards that exist in multiple rarities, which a few of you had pointed out were missing. We have now stabilized the ID schema, and we are confident this will prevent future breaking changes to these specific identifiers. ---- Should you have any questions, or if you find that re-fetching data has significantly impacted your monthly quota, please contact our support team for assistance.
  • AddedOrderBy Parameters AddedJul 4, 2025

    Added support for sorting by price and price changes using the orderBy and order parameters. orderBy can accept the following values: 'price', '24h', '7d' and '30d'. order is the direction of the ordering: 'desc' or 'asc'.

  • Changed[BREAKING] Card ID StandardizationJul 1, 2025

    Card IDs now include the full game name. Some IDs with invalid characters have been standardized. Backwards compatibility is maintained for the old game names.

  • ChangedRate Limit Policy UpdateJun 14, 2025

    API rate limits have been adjusted for free users. See the Rate Limits section for details.

  • DeprecatedDeprecated /variants and /cards-search endpointsMay 15, 2025

    Deprecated the /variants and /cards-search endpoints. The functionality of these endpoints are merged into the /cards endpoint.

  • Addedv1 API LaunchedApr 2, 2025

    Version 1 introduces initial endpoints and card structure.