---
title: "Variant object — JustTCG API"
description: "Field reference for the JustTCG Variant object: a condition and printing of a card with its price, lastUpdated, and 24h, 7d, 30d, and 90d statistics."
url: https://justtcg.com/docs/schema/variant
markdown_url: https://justtcg.com/docs/schema/variant.md
---

# Variant object

A variant is a specific condition × printing combination of a card, with its price and statistics.

Current production schema. Returned by every v1 endpoint.

## Core

| Property | Type | Description |
| --- | --- | --- |
| uuid | string | Stable, canonical identifier for the variant (UUID v5). **Recommended** as your primary key — see [Identifiers](https://justtcg.com/docs/identifiers). |
| id | string | Legacy human-readable slug (the `variantId`). Format: `cardId_condition_printing`. Still queryable, but no longer the recommended key. |
| condition | string | Condition of the card (e.g. 'Near Mint', 'Lightly Played'). |
| printing | string | Printing type (e.g. 'Normal', 'Foil', '1st Edition'). |
| language | string | Language of the card (e.g. 'English', 'Japanese'). Only recorded for non-English printings, so a missing value means English. Filter on it with the `language` parameter on [/cards](https://justtcg.com/docs/api/cards). |
| tcgplayerSkuId | string | TCGplayer SKU ID for this variant. |
| price | number \| null | Current price in USD: the last price the market reported for this condition. `null` when there is no current market report; `priceStatus` says why. |
| lastUpdated | number \| null | Unix timestamp (seconds) of when the price was last observed. For an expired variant this is when the last price was seen. |
| priceStatus | string | `current`: a market report is in effect. `expired`: the market stopped reporting this variant and the last price aged out (see [thin markets](https://justtcg.com/docs/thin-markets)), so `price` is `null` and `lastKnownPrice` carries the last observed value. `unpriced`: this condition has never had a price. |
| lastKnownPrice | number \| null | The last observed price in USD when `priceStatus` is `expired`; `null` otherwise. The same value is the last point of the variant's price history. |

## 24-hour stats

| Property | Type | Description |
| --- | --- | --- |
| priceChange24hr | number \| null | Percentage price change over the last 24 hours. |

## 7-day stats

| Property | Type | Description |
| --- | --- | --- |
| 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 {p, t} points over the requested priceHistoryDuration. Default 7d. |
| 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. |
| covPrice7d | number \| null | Coefficient of variation for prices over the last 7 days. |
| iqrPrice7d | number \| null | Interquartile range of prices over the last 7 days. |
| trendSlope7d | number \| null | Linear regression trend slope for prices over the last 7 days. |
| priceChangesCount7d | number \| null | Count of distinct price changes in the last 7 days. |

## 30-day stats

| Property | Type | Description |
| --- | --- | --- |
| priceChange30d | number \| null | Percentage price change over the last 30 days. |
| avgPrice30d | number \| null | Average price over the last 30 days. |
| priceHistory30d | array \| null | Array of historical price points over 30 days. |
| 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 over the last 30 days. |
| covPrice30d | number \| null | Coefficient of variation over the last 30 days. |
| iqrPrice30d | number \| null | Interquartile range over the last 30 days. |
| trendSlope30d | number \| null | Trend slope over the last 30 days. |
| priceChangesCount30d | number \| null | Count of distinct price changes in the last 30 days. |
| priceRelativeTo30dRange | number \| null | Position within the 30-day min/max range, 0..1. |

## 90-day stats

| Property | Type | Description |
| --- | --- | --- |
| 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 over the last 90 days. |
| covPrice90d | number \| null | Coefficient of variation over the last 90 days. |
| iqrPrice90d | number \| null | Interquartile range over the last 90 days. |
| trendSlope90d | number \| null | Trend slope over the last 90 days. |
| priceChangesCount90d | number \| null | Count of distinct price changes in the last 90 days. |
| priceRelativeTo90dRange | number \| null | Position within the 90-day min/max range, 0..1. |

## Longer-term

| Property | Type | Description |
| --- | --- | --- |
| minPrice1y | number \| null | Minimum price in the last year. |
| maxPrice1y | number \| null | Maximum price in the last year. |
| minPriceAllTime | number \| null | Lowest price recorded for this variant since tracking began (March 2025). |
| minPriceAllTimeDate | string \| null | ISO 8601 timestamp of when the all-time minimum was first reached. |
| maxPriceAllTime | number \| null | Highest price recorded for this variant since tracking began (March 2025). |
| maxPriceAllTimeDate | string \| null | ISO 8601 timestamp of when the all-time maximum was first reached. |

**Thin markets:** `price` is the last price the market recorded, never smoothed or clamped, so a rarely traded condition can carry one sale's price for a long time. A variant priced at $100 or more that goes 14 days without a reported price expires: `price` becomes `null`, `priceStatus` is `"expired"`, and `lastKnownPrice` keeps the value that expired. History and statistics are untouched. [Thin markets and price expiry](https://justtcg.com/docs/thin-markets) covers syncing and how to judge confidence.

## Example

```json
{
  "uuid": "a1b2c3d4-5e6f-5a7b-8c9d-0e1f2a3b4c5d",
  "id": "pokemon-battle-academy-fire-energy-22-charizard-stamped-promo_near-mint",
  "condition": "Near Mint",
  "printing": "Normal",
  "language": "English",
  "tcgplayerSkuId": "1234567",
  "price": 4.99,
  "lastUpdated": 1743100261,
  "priceStatus": "current",
  "lastKnownPrice": null,
  "priceChange24hr": 0.5,
  "priceChange7d": -2.1
}
```
