{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/tcgdata-dev/json-schema/tcgdata-dev-catalogue-card-list-schema.json",
  "title": "CatalogueCardList",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/tcgdata-dev-openapi.json#/components/schemas/CatalogueCardList",
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/CatalogueCard"
      }
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "data",
    "next_cursor"
  ],
  "$defs": {
    "CatalogueCard": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^cat_[a-f0-9]{64}$",
          "description": "Stable Japanese source-card identity. It is not a tcg_ price-variant ID or a readable slug."
        },
        "slug": {
          "type": [
            "string",
            "null"
          ],
          "description": "Readable-address fields can be null for source cards without a verified price-variant route. Use the cat_ ID for source-card details."
        },
        "catalogue_language": {
          "type": [
            "string",
            "null"
          ],
          "description": "Readable-address fields can be null for source cards without a verified price-variant route. Use the cat_ ID for source-card details."
        },
        "name": {
          "type": "string",
          "description": "Source-card name. A name change does not create a new catalogue ID."
        },
        "game": {
          "const": "pokemon_jp",
          "description": "The independent source-card catalogue currently supports Japanese Pokémon only. Stored tcg_ variants have a separate six-game catalogue."
        },
        "set_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "Source-set identifier, or null when unavailable. This is a catalogue membership, not proof of a unique physical printing."
        },
        "set_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Available source-set display name, or null."
        },
        "number": {
          "type": [
            "string",
            "null"
          ],
          "description": "Source catalogue number. Preserve prefixes and leading zeroes; a catalogue ordinal is not necessarily printed on the card."
        },
        "printed_number": {
          "type": [
            "string",
            "null"
          ],
          "description": "Verified printed Pokémon collector notation, or null. Never derived from catalogue counts or ordinals."
        },
        "language": {
          "type": "string",
          "description": "Physical source-card locale, such as ja. It does not filter Cardmarket prices or certify the language of every metadata text field."
        },
        "images": {
          "$ref": "#/$defs/Images",
          "description": "Nullable authenticated image paths for this cat_ card. A verified source image is independent of current price availability."
        },
        "metadata": {
          "anyOf": [
            {
              "$ref": "#/$defs/Metadata_pokemon_jp",
              "description": "Validated Pokémon metadata. Its field meanings are in the Japanese game reference; source-card data remains available without a current price."
            },
            {
              "type": "null",
              "description": "Validated Pokémon metadata. Its field meanings are in the Japanese game reference; source-card data remains available without a current price."
            }
          ],
          "description": "Validated Pokémon metadata. Its field meanings are in the Japanese game reference; source-card data remains available without a current price."
        },
        "metadata_status": {
          "$ref": "#/$defs/MetadataStatus",
          "description": "Availability, supported applicability and inferred text-language diagnostics for the core metadata. The nested source variants have their own diagnostics."
        },
        "metadata_quality": {
          "$ref": "#/$defs/MetadataQuality",
          "description": "Availability, supported applicability and inferred text-language diagnostics for the core metadata. The nested source variants have their own diagnostics."
        },
        "metadata_text": {
          "$ref": "#/$defs/MetadataText",
          "description": "Availability, supported applicability and inferred text-language diagnostics for the core metadata. The nested source variants have their own diagnostics."
        },
        "finish_details": {
          "$ref": "#/$defs/FinishDetails",
          "description": "A source-card core does not choose a price guide bucket; guide_finish is null. Physical source-variant facts remain separate."
        },
        "locale": {
          "type": "string",
          "description": "Physical source-card locale, such as ja. It does not filter Cardmarket prices or certify the language of every metadata text field."
        },
        "release_status": {
          "enum": [
            "released",
            "unreleased",
            "unknown"
          ],
          "description": "Core release classification. Lists default to released; all or an explicit state includes other cores. A detail lookup can retain an approved published core with another state."
        },
        "data_provenance": {
          "enum": [
            "structured_source",
            "physical_minimum",
            "source_record"
          ],
          "description": "Structured source facts, a physically checked minimum or a retained source record, respectively. These labels do not promise equal metadata completeness or certify every field."
        },
        "snapshot_built_at": {
          "type": "string",
          "format": "date-time",
          "description": "Build time of this catalogue snapshot. It is distinct from pricing.price_variants[].observed_at and is not a price-freshness indicator."
        },
        "variants": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/CatalogueVariant"
          },
          "description": "Source variant assertions with catv_ IDs. Default output includes released verified/source_asserted variants; variant_release_status=all includes other labelled assertions. A source variant does not inherit a price from the core."
        },
        "pricing": {
          "$ref": "#/$defs/PricingAvailability"
        },
        "canonical_membership": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "canonical_card_id": {
                  "type": "string",
                  "pattern": "^cat_[a-f0-9]{64}$",
                  "description": "Existing HeartGold source-card record to which this reviewed membership points."
                },
                "canonical_set_id": {
                  "const": "l1hg_ja",
                  "description": "Canonical HeartGold source-set membership in this reviewed relation."
                },
                "alias_set_id": {
                  "const": "l1ss_ja",
                  "description": "Retained SoulSilver source-set membership. Both source records can exist; catalogue counts do not count unique physical printings."
                }
              },
              "required": [
                "canonical_card_id",
                "canonical_set_id",
                "alias_set_id"
              ],
              "description": "The narrowly reviewed SoulSilver/HeartGold shared energy-card membership. Other cores return null. It does not assert an edition, foil finish or a new price variant."
            },
            {
              "type": "null",
              "description": "The narrowly reviewed SoulSilver/HeartGold shared energy-card membership. Other cores return null. It does not assert an edition, foil finish or a new price variant."
            }
          ],
          "description": "The narrowly reviewed SoulSilver/HeartGold shared energy-card membership. Other cores return null. It does not assert an edition, foil finish or a new price variant."
        }
      },
      "required": [
        "id"
      ]
    },
    "CatalogueVariant": {
      "type": "object",
      "properties": {
        "printed_number": {
          "type": [
            "string",
            "null"
          ],
          "description": "Printed notation supplied in the variant's own validated metadata, or null."
        },
        "id": {
          "type": "string",
          "pattern": "^catv_[a-f0-9]{64}$",
          "description": "Stable source-variant identity inside the parent cat_ record. There is no separate catv_ detail endpoint; tcg_ IDs identify price variants."
        },
        "label": {
          "type": "string",
          "description": "Source-variant display label. It is not a guide bucket or a permanent identity."
        },
        "finish": {
          "type": [
            "string",
            "null"
          ],
          "description": "Supplied physical finish assertion. Its reliability is described by evidence_status; it does not define the price-guide finish filter."
        },
        "edition": {
          "type": [
            "string",
            "null"
          ],
          "description": "Supplied physical edition assertion, when known. It never makes an unfiltered guide quote edition-specific."
        },
        "number": {
          "type": [
            "string",
            "null"
          ],
          "description": "Source-variant catalogue number, kept separate from verified printed_number."
        },
        "metadata": {
          "anyOf": [
            {
              "$ref": "#/$defs/Metadata_pokemon_jp",
              "description": "The source variant's own Pokémon metadata. It can differ from or be unavailable independently of the core metadata."
            },
            {
              "type": "null",
              "description": "The source variant's own Pokémon metadata. It can differ from or be unavailable independently of the core metadata."
            }
          ],
          "description": "The source variant's own Pokémon metadata. It can differ from or be unavailable independently of the core metadata."
        },
        "metadata_status": {
          "$ref": "#/$defs/MetadataStatus",
          "description": "Diagnostics for this source variant's metadata, not the core record's quality or translation evidence."
        },
        "metadata_quality": {
          "$ref": "#/$defs/MetadataQuality",
          "description": "Diagnostics for this source variant's metadata, not the core record's quality or translation evidence."
        },
        "metadata_text": {
          "$ref": "#/$defs/MetadataText",
          "description": "Diagnostics for this source variant's metadata, not the core record's quality or translation evidence."
        },
        "images": {
          "$ref": "#/$defs/Images",
          "description": "Verified released variant artwork only. Other assertions keep null images. catv_ paths include catalogue_card_id for the parent; preserve that parameter when downloading."
        },
        "release_status": {
          "enum": [
            "released",
            "unreleased",
            "unknown"
          ],
          "description": "Release classification of the assertion, separate from the core release_status. The variant_release_status filter controls which assertions are returned."
        },
        "evidence_status": {
          "enum": [
            "verified",
            "source_asserted",
            "uncertain"
          ],
          "description": "Verified means reviewed evidence establishes the variant; source_asserted identifies a reviewed vendor assertion; uncertain is unresolved. Source assertions never become physical facts by guessing."
        },
        "pricing": {
          "$ref": "#/$defs/PricingAvailability",
          "description": "This assertion's own pricing status and exact price references. Only an explicit verified released variant bridge can attach a quote here."
        }
      }
    },
    "FinishDetails": {
      "type": "object",
      "properties": {
        "guide_finish": {
          "type": [
            "string",
            "null"
          ]
        },
        "physical_finish": {
          "type": [
            "string",
            "null"
          ]
        },
        "possible_physical_finishes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "guide_finish",
        "physical_finish",
        "possible_physical_finishes"
      ],
      "description": "Use guide_finish as the finish query parameter on readable price/history routes. Guide buckets and physical printing facts are independent: One Piece physical_finish nonfoil can use guide_finish normal while legacy finish is null. A sole explicit finish is exposed as physical_finish; multiple possible finishes never select a physical variant by guessing."
    },
    "Images": {
      "type": "object",
      "properties": {
        "base": {
          "type": "null"
        },
        "small": {
          "type": [
            "string",
            "null"
          ]
        },
        "large": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "base",
        "small",
        "large"
      ],
      "description": "Available small/large images are root-relative API paths, fetched server-side with Bearer authentication against the API origin; null means unavailable. Follow the complete path, including catalogue_card_id for catv_ variants or face for Magic metadata.faces images. base is null. No public CDN URL or token is returned. Every admitted image response consumes one request from the shared daily and monthly limits; image and byte counters are diagnostic."
    },
    "MetadataQuality": {
      "type": "object",
      "properties": {
        "state": {
          "enum": [
            "complete",
            "partial",
            "unavailable"
          ]
        },
        "scope": {
          "const": "emitted_fields"
        },
        "unknown_fields": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "not_applicable_fields": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "known_empty_fields": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "unverified_empty_fields": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "state",
        "scope",
        "unknown_fields",
        "not_applicable_fields",
        "known_empty_fields",
        "unverified_empty_fields"
      ]
    },
    "MetadataStatus": {
      "type": "object",
      "properties": {
        "state": {
          "enum": [
            "available",
            "unavailable"
          ]
        },
        "unknown_fields": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "unverified_empty_fields": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "state",
        "unknown_fields",
        "unverified_empty_fields"
      ]
    },
    "MetadataText": {
      "type": "object",
      "properties": {
        "state": {
          "enum": [
            "mixed",
            "single_language",
            "unknown",
            "unavailable"
          ]
        },
        "languages": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "fields": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "JSON Pointer relative to the metadata object."
              },
              "languages": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "evidence": {
                "enum": [
                  "inferred",
                  "unknown"
                ]
              }
            },
            "required": [
              "path",
              "languages",
              "evidence"
            ]
          }
        }
      },
      "required": [
        "state",
        "languages",
        "fields"
      ],
      "description": "Best-effort language observations per nonempty rule/name text. Inferred languages are unverified, not printed-locale or translation provenance. Short/ambiguous text may remain unknown; card locale is never used to fill missing evidence."
    },
    "Metadata_pokemon_jp": {
      "type": "object",
      "properties": {
        "category": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Source card category. Its values depend on the game and card type."
            },
            {
              "type": "null",
              "description": "Source card category. Its values depend on the game and card type."
            }
          ],
          "description": "Source card category. Its values depend on the game and card type."
        },
        "subtypes": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 500
          },
          "description": "Source classifications below the main category; an empty list may be unverified."
        },
        "hp": {
          "default": null,
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "description": "Hit points. Supporter and Energy cards do not have Pokémon HP; other nulls can be unknown."
            },
            {
              "type": "null",
              "description": "Hit points. Supporter and Energy cards do not have Pokémon HP; other nulls can be unknown."
            }
          ],
          "description": "Hit points. Supporter and Energy cards do not have Pokémon HP; other nulls can be unknown."
        },
        "types": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 500
          },
          "description": "Pokémon energy-type labels, such as Fire. These are separate from attack energy costs."
        },
        "level": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Printed level label when available. It stays text and is not derived from HP or evolution."
            },
            {
              "type": "null",
              "description": "Printed level label when available. It stays text and is not derived from HP or evolution."
            }
          ],
          "description": "Printed level label when available. It stays text and is not derived from HP or evolution."
        },
        "printed_number": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Verified printed collector notation, including prefixes and denominators. Never inferred from set size."
            },
            {
              "type": "null",
              "description": "Verified printed collector notation, including prefixes and denominators. Never inferred from set size."
            }
          ],
          "description": "Verified printed collector notation, including prefixes and denominators. Never inferred from set size."
        },
        "evolves_from": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Source name of the preceding evolution. Null does not establish that the card is a Basic Pokémon."
            },
            {
              "type": "null",
              "description": "Source name of the preceding evolution. Null does not establish that the card is a Basic Pokémon."
            }
          ],
          "description": "Source name of the preceding evolution. Null does not establish that the card is a Basic Pokémon."
        },
        "rarity": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Source rarity label for this printing; labels are not normalized across games."
            },
            {
              "type": "null",
              "description": "Source rarity label for this printing; labels are not normalized across games."
            }
          ],
          "description": "Source rarity label for this printing; labels are not normalized across games."
        },
        "illustrator": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Source illustrator credit, preserved as text."
            },
            {
              "type": "null",
              "description": "Source illustrator credit, preserved as text."
            }
          ],
          "description": "Source illustrator credit, preserved as text."
        },
        "flavor_text": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 10000,
              "description": "Available flavor text, preserved in its source language; no translation is performed."
            },
            {
              "type": "null",
              "description": "Available flavor text, preserved in its source language; no translation is performed."
            }
          ],
          "description": "Available flavor text, preserved in its source language; no translation is performed."
        },
        "pokedex_numbers": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "description": "Supplied National Pokédex numbers; no species identity is inferred from a card name."
        },
        "abilities": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Source ability name."
                  },
                  {
                    "type": "null",
                    "description": "Source ability name."
                  }
                ],
                "description": "Source ability name."
              },
              "type": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Source classification such as Ability or Pokémon Power; not a closed enum."
                  },
                  {
                    "type": "null",
                    "description": "Source classification such as Ability or Pokémon Power; not a closed enum."
                  }
                ],
                "description": "Source classification such as Ability or Pokémon Power; not a closed enum."
              },
              "text": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 10000,
                    "description": "Source ability effect text. Text language can differ from the card locale."
                  },
                  {
                    "type": "null",
                    "description": "Source ability effect text. Text language can differ from the card locale."
                  }
                ],
                "description": "Source ability effect text. Text language can differ from the card locale."
              }
            },
            "required": [
              "name",
              "type",
              "text"
            ],
            "additionalProperties": false
          },
          "description": "Available abilities or Pokémon Powers. An empty array alone does not prove that no ability is printed."
        },
        "attacks": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Source attack name."
                  },
                  {
                    "type": "null",
                    "description": "Source attack name."
                  }
                ],
                "description": "Source attack name."
              },
              "cost": {
                "default": [],
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 500
                },
                "description": "Ordered energy symbols. Repeated symbols are retained; do not deduplicate them."
              },
              "energy_cost": {
                "default": null,
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100000,
                    "description": "Supplied total attack energy cost. Null is unknown; zero is a known zero cost."
                  },
                  {
                    "type": "null",
                    "description": "Supplied total attack energy cost. Null is unknown; zero is a known zero cost."
                  }
                ],
                "description": "Supplied total attack energy cost. Null is unknown; zero is a known zero cost."
              },
              "damage": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Printed damage expression, such as 40+, 20× or 100. Preserve it as text; null may be a non-damaging attack or missing data."
                  },
                  {
                    "type": "null",
                    "description": "Printed damage expression, such as 40+, 20× or 100. Preserve it as text; null may be a non-damaging attack or missing data."
                  }
                ],
                "description": "Printed damage expression, such as 40+, 20× or 100. Preserve it as text; null may be a non-damaging attack or missing data."
              },
              "text": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 10000,
                    "description": "Available attack effect text, without automatic translation."
                  },
                  {
                    "type": "null",
                    "description": "Available attack effect text, without automatic translation."
                  }
                ],
                "description": "Available attack effect text, without automatic translation."
              }
            },
            "required": [
              "name",
              "cost",
              "energy_cost",
              "damage",
              "text"
            ],
            "additionalProperties": false
          },
          "description": "Available attacks. Supporter-only exclusions do not apply to every Trainer: Technical Machine and Fossil cards may have attacks."
        },
        "weaknesses": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Energy-type label of the weakness."
                  },
                  {
                    "type": "null",
                    "description": "Energy-type label of the weakness."
                  }
                ],
                "description": "Energy-type label of the weakness."
              },
              "value": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Printed modifier, such as ×2 or +20; keep it as text."
                  },
                  {
                    "type": "null",
                    "description": "Printed modifier, such as ×2 or +20; keep it as text."
                  }
                ],
                "description": "Printed modifier, such as ×2 or +20; keep it as text."
              }
            },
            "required": [
              "type",
              "value"
            ],
            "additionalProperties": false
          },
          "description": "Available weakness modifiers. Empty does not establish verified absence."
        },
        "resistances": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Energy-type label of the resistance."
                  },
                  {
                    "type": "null",
                    "description": "Energy-type label of the resistance."
                  }
                ],
                "description": "Energy-type label of the resistance."
              },
              "value": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Printed modifier, such as -30; keep it as text."
                  },
                  {
                    "type": "null",
                    "description": "Printed modifier, such as -30; keep it as text."
                  }
                ],
                "description": "Printed modifier, such as -30; keep it as text."
              }
            },
            "required": [
              "type",
              "value"
            ],
            "additionalProperties": false
          },
          "description": "Available resistance modifiers. Empty does not establish verified absence."
        },
        "retreat_cost": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 500
          },
          "description": "Supplied retreat energy symbols. A missing list is different from a known retreat value of zero."
        },
        "retreat": {
          "default": null,
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "description": "Supplied total retreat cost. Zero is meaningful; null may be unknown or not applicable."
            },
            {
              "type": "null",
              "description": "Supplied total retreat cost. Zero is meaningful; null may be unknown or not applicable."
            }
          ],
          "description": "Supplied total retreat cost. Zero is meaningful; null may be unknown or not applicable."
        },
        "rules": {
          "default": [],
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 10000
          },
          "description": "Available rule-box text, including special card rules. Empty remains unverified unless diagnostics establish otherwise."
        },
        "regulation_mark": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Source regulation mark when available; not a guarantee of current format legality."
            },
            {
              "type": "null",
              "description": "Source regulation mark when available; not a guarantee of current format legality."
            }
          ],
          "description": "Source regulation mark when available; not a guarantee of current format legality."
        },
        "legalities": {
          "default": {
            "standard": null,
            "expanded": null,
            "unlimited": null,
            "gym_leader_challenge": null
          },
          "type": "object",
          "properties": {
            "standard": {
              "default": null,
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 500,
                  "description": "Source legality label for standard. Null means no supplied status."
                },
                {
                  "type": "null",
                  "description": "Source legality label for standard. Null means no supplied status."
                }
              ],
              "description": "Source legality label for standard. Null means no supplied status."
            },
            "expanded": {
              "default": null,
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 500,
                  "description": "Source legality label for expanded. Null means no supplied status."
                },
                {
                  "type": "null",
                  "description": "Source legality label for expanded. Null means no supplied status."
                }
              ],
              "description": "Source legality label for expanded. Null means no supplied status."
            },
            "unlimited": {
              "default": null,
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 500,
                  "description": "Source legality label for unlimited. Null means no supplied status."
                },
                {
                  "type": "null",
                  "description": "Source legality label for unlimited. Null means no supplied status."
                }
              ],
              "description": "Source legality label for unlimited. Null means no supplied status."
            },
            "gym_leader_challenge": {
              "default": null,
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 500,
                  "description": "Source legality label for gym leader challenge. Null means no supplied status."
                },
                {
                  "type": "null",
                  "description": "Source legality label for gym leader challenge. Null means no supplied status."
                }
              ],
              "description": "Source legality label for gym leader challenge. Null means no supplied status."
            }
          },
          "required": [
            "standard",
            "expanded",
            "unlimited",
            "gym_leader_challenge"
          ],
          "additionalProperties": false,
          "description": "Catalogue legality labels with no separate freshness guarantee; do not infer current tournament eligibility."
        }
      },
      "required": [
        "category",
        "subtypes",
        "hp",
        "types",
        "level",
        "printed_number",
        "evolves_from",
        "rarity",
        "illustrator",
        "flavor_text",
        "pokedex_numbers",
        "abilities",
        "attacks",
        "weaknesses",
        "resistances",
        "retreat_cost",
        "retreat",
        "rules",
        "regulation_mark",
        "legalities"
      ],
      "additionalProperties": false
    },
    "PriceVariantReference": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Permanent price-variant key. Use it on /v1/cards/{id}/prices or independent stored-variant history; a cat_ or catv_ ID is not a substitute."
        },
        "catalogue_variant_id": {
          "type": "string",
          "description": "Present only when a reviewed bridge explicitly links the price to a verified released source variant. Match it to variants[].id. Its absence means the reference is not attributed to one source-variant assertion."
        },
        "guide_finish": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price-provider bucket, normally normal or foil. Use this for readable finish filters, regardless of the asserted physical finish."
        },
        "currency": {
          "const": "EUR",
          "description": "Currency of the linked guide measurement."
        },
        "observed_at": {
          "type": "string",
          "format": "date-time",
          "description": "Source observation time of the linked price; distinct from the catalogue snapshot build time."
        },
        "quote_scope": {
          "const": "product_guide",
          "description": "General measurement of the approved product and guide bucket, not an individual listing or sale."
        },
        "language_scope": {
          "const": "unfiltered",
          "description": "Guide prices are not filtered by physical language, edition or condition. Catalogue ja locale or edition evidence does not change that market scope."
        },
        "edition_scope": {
          "const": "unfiltered",
          "description": "Guide prices are not filtered by physical language, edition or condition. Catalogue ja locale or edition evidence does not change that market scope."
        },
        "condition_scope": {
          "const": "unfiltered",
          "description": "Guide prices are not filtered by physical language, edition or condition. Catalogue ja locale or edition evidence does not change that market scope."
        }
      },
      "required": [
        "id",
        "guide_finish",
        "currency",
        "observed_at"
      ]
    },
    "PricingAvailability": {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "available",
            "unmapped",
            "unpriced",
            "stale",
            "unapproved",
            "identity_conflict",
            "unreleased"
          ],
          "description": "Core price availability: available, unmapped, unpriced, stale, unapproved, identity_conflict or unreleased. A safe available bridge can remain visible while a separate conflicting bridge is withheld."
        },
        "price_variants": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/PriceVariantReference"
          },
          "description": "Exact approved, fresh and meaningful guide references. Follow each tcg_ ID to prices or history; the list can be empty while metadata stays readable."
        }
      },
      "required": [
        "status",
        "price_variants"
      ]
    }
  }
}