diff --git a/.gitignore b/.gitignore index 1a292a0..c835763 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ /*.xlsx /*.xlsx.bak* +# Profiling data +*.prof + # Created by https://www.gitignore.io/api/python ### Python ### diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ed9b325..f17d0c7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,6 @@ repos: name: Check import order language: system entry: isort - args: [--apply, --recursive] types: [python] - id: pylint name: Static analysis from pylint diff --git a/.travis.yml b/.travis.yml index 414e8ab..60077e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,9 +17,9 @@ script: jobs: include: - - python: "3.6" - - python: "3.7" - python: "3.8" + - python: "3.9" + - python: "3.10" - stage: lint python: "3.8.5" diff --git a/README.rst b/README.rst index 84d9275..184b446 100644 --- a/README.rst +++ b/README.rst @@ -137,6 +137,7 @@ Changelog Upcoming -------- +- Switch over to pydantic for Scryfall data deserialization - Bug fixes for newer sets that do not include a numeric component to ther collector numbers. diff --git a/mtg_ssm/containers/bundles.py b/mtg_ssm/containers/bundles.py index cee5db8..3bf19d4 100644 --- a/mtg_ssm/containers/bundles.py +++ b/mtg_ssm/containers/bundles.py @@ -1,12 +1,8 @@ """Data bundle definitions.""" -from typing import List -from typing import NamedTuple -from typing import Set +from typing import List, NamedTuple, Set -from mtg_ssm.scryfall.models import ScryCard -from mtg_ssm.scryfall.models import ScrySet -from mtg_ssm.scryfall.models import ScrySetType +from mtg_ssm.scryfall.models import ScryCard, ScrySet, ScrySetType class ScryfallDataSet(NamedTuple): diff --git a/mtg_ssm/containers/counts.py b/mtg_ssm/containers/counts.py index 7d2ee50..a0ddfa5 100644 --- a/mtg_ssm/containers/counts.py +++ b/mtg_ssm/containers/counts.py @@ -2,10 +2,7 @@ import collections import enum -from typing import Any -from typing import Dict -from typing import Iterable -from typing import MutableMapping +from typing import Any, Dict, Iterable, MutableMapping from uuid import UUID from mtg_ssm.containers import legacy @@ -15,8 +12,8 @@ class CountType(enum.Enum): """Enum for possible card printing types (nonfoil, foil).""" - nonfoil = enum.auto() - foil = enum.auto() + NONFOIL = "nonfoil" + FOIL = "foil" ScryfallCardCount = Dict[UUID, MutableMapping[CountType, int]] @@ -38,7 +35,7 @@ def aggregate_card_counts( scryfall_id = UUID(scryfall_id) counts = card_counts.get(scryfall_id, {}) for count_type in CountType: - value = int(card_row.get(count_type.name) or 0) + value = int(card_row.get(count_type.value) or 0) if value: counts[count_type] = value + counts.get(count_type, 0) if counts: diff --git a/mtg_ssm/containers/indexes.py b/mtg_ssm/containers/indexes.py index e72f1f4..0cf0e10 100644 --- a/mtg_ssm/containers/indexes.py +++ b/mtg_ssm/containers/indexes.py @@ -2,18 +2,12 @@ import collections import string -from typing import Dict -from typing import Iterable -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import Dict, Iterable, List, Optional, Set, Tuple from uuid import UUID from mtg_ssm.containers.bundles import ScryfallDataSet from mtg_ssm.mtg import util -from mtg_ssm.scryfall.models import ScryCard -from mtg_ssm.scryfall.models import ScrySet +from mtg_ssm.scryfall.models import ScryCard, ScrySet def name_card_sort_key(card: ScryCard) -> Tuple[str, int, str]: diff --git a/mtg_ssm/containers/legacy.py b/mtg_ssm/containers/legacy.py index 35308d0..0647ff8 100644 --- a/mtg_ssm/containers/legacy.py +++ b/mtg_ssm/containers/legacy.py @@ -1,11 +1,6 @@ """Legacy record lookup capabilities for older file versions.""" -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import Any, Dict, List, Optional, Set, Tuple from uuid import UUID from mtg_ssm.containers.indexes import Oracle diff --git a/mtg_ssm/mtg/util.py b/mtg_ssm/mtg/util.py index d7d208e..30ecfa0 100644 --- a/mtg_ssm/mtg/util.py +++ b/mtg_ssm/mtg/util.py @@ -2,8 +2,7 @@ import functools import string -from typing import Optional -from typing import Tuple +from typing import Optional, Tuple from mtg_ssm.scryfall.models import ScryCard diff --git a/mtg_ssm/scryfall/fetcher.py b/mtg_ssm/scryfall/fetcher.py index c737123..6a915c8 100644 --- a/mtg_ssm/scryfall/fetcher.py +++ b/mtg_ssm/scryfall/fetcher.py @@ -1,27 +1,18 @@ """Scryfall data fetcher.""" -from concurrent.futures import ProcessPoolExecutor import gzip import json import os import pickle -from typing import Any -from typing import List -from typing import Mapping -from typing import Union -from typing import cast import uuid +from concurrent.futures import ProcessPoolExecutor +from typing import Any, List, Mapping, Union, cast import appdirs import requests from mtg_ssm.containers.bundles import ScryfallDataSet -from mtg_ssm.scryfall import schema -from mtg_ssm.scryfall.models import ScryBulkData -from mtg_ssm.scryfall.models import ScryCard -from mtg_ssm.scryfall.models import ScryObject -from mtg_ssm.scryfall.models import ScryObjectList -from mtg_ssm.scryfall.models import ScrySet +from mtg_ssm.scryfall.models import ScryBulkData, ScryCard, ScryObjectList, ScrySet DEBUG = os.getenv("DEBUG", "0") @@ -36,20 +27,21 @@ CHUNK_SIZE = 8 * 1024 * 1024 DESERIALIZE_BATCH_SIZE = 50 -_OBJECT_SCHEMA = schema.ScryfallUberSchema() JSON = Union[str, int, float, bool, None, Mapping[str, Any], List[Any]] -def _cache_path(endpoint: str) -> str: +def _cache_path(endpoint: str, extension: str) -> str: + if not extension.startswith("."): + extension = "." + extension cache_id = uuid.uuid5(uuid.NAMESPACE_URL, endpoint) - return os.path.join(CACHE_DIR, str(cache_id)) + return os.path.join(CACHE_DIR, f"{cache_id}{extension}") def _fetch_endpoint(endpoint: str, *, dirty: bool, write_cache: bool = True) -> JSON: print(f"Retrieving {endpoint}") os.makedirs(CACHE_DIR, exist_ok=True) - cache_path = _cache_path(endpoint) + cache_path = _cache_path(endpoint, ".json.gz") if not os.path.exists(cache_path): dirty = True if dirty: @@ -59,7 +51,7 @@ def _fetch_endpoint(endpoint: str, *, dirty: bool, write_cache: bool = True) -> if not write_cache: return response.json() print(f"Caching {endpoint}") - with gzip.open(cache_path, "wb") as cache_file: + with gzip.open(cache_path, "wb", compresslevel=1) as cache_file: for chunk in response.iter_content(chunk_size=CHUNK_SIZE): cache_file.write(chunk) else: @@ -69,10 +61,6 @@ def _fetch_endpoint(endpoint: str, *, dirty: bool, write_cache: bool = True) -> return json.load(cache_file) -def _deserialize_object(obj_json: JSON) -> Union[ScryObject, List[ScryObject]]: - return _OBJECT_SCHEMA.load(obj_json).data - - def _deserialize_cards(card_jsons: List[JSON]) -> List[ScryCard]: cards_data: List[ScryCard] if DEBUG == "1": @@ -80,49 +68,45 @@ def _deserialize_cards(card_jsons: List[JSON]) -> List[ScryCard]: cards_data = [] for card_json in card_jsons: try: - cards_data.append(cast(ScryCard, _deserialize_object(card_json))) + cards_data.append(ScryCard.parse_obj(card_json)) except Exception: print("Failed on: ", repr(card_json)) raise else: with ProcessPoolExecutor() as executor: cards_futures = executor.map( - _deserialize_object, card_jsons, chunksize=DESERIALIZE_BATCH_SIZE + ScryCard.parse_obj, card_jsons, chunksize=DESERIALIZE_BATCH_SIZE ) - cards_data = cast(List[ScryCard], list(cards_futures)) + cards_data = list(cards_futures) return cards_data def scryfetch() -> ScryfallDataSet: """Retrieve and deserialize Scryfall object data.""" cached_bulk_json = None - if os.path.exists(_cache_path(BULK_DATA_ENDPOINT)): + if os.path.exists(_cache_path(BULK_DATA_ENDPOINT, ".json.gz")): cached_bulk_json = _fetch_endpoint(BULK_DATA_ENDPOINT, dirty=False) bulk_json = _fetch_endpoint(BULK_DATA_ENDPOINT, dirty=True, write_cache=False) cache_dirty = bulk_json != cached_bulk_json - bulk_list: ScryObjectList = cast(ScryObjectList, _deserialize_object(bulk_json)) - sets_list = cast( - ScryObjectList, - _deserialize_object(_fetch_endpoint(SETS_ENDPOINT, dirty=cache_dirty)), + bulk_list = ScryObjectList[ScryBulkData].parse_obj(bulk_json) + sets_list = ScryObjectList[ScrySet].parse_obj( + _fetch_endpoint(SETS_ENDPOINT, dirty=cache_dirty) ) - sets_data = cast(List[ScrySet], sets_list.data) + sets_data = list(sets_list.data) while sets_list.has_more: - sets_list = cast( - ScryObjectList, - _deserialize_object( - _fetch_endpoint(str(sets_list.next_page), dirty=cache_dirty) - ), + sets_list = ScryObjectList[ScrySet].parse_obj( + _fetch_endpoint(str(sets_list.next_page), dirty=cache_dirty) ) - sets_data += cast(List[ScrySet], sets_list.data) + sets_data += sets_list.data - bulk_data = cast(List[ScryBulkData], bulk_list.data) + bulk_data = bulk_list.data [cards_endpoint] = [bd.download_uri for bd in bulk_data if bd.type == BULK_TYPE] cards_json = cast(List[JSON], _fetch_endpoint(cards_endpoint, dirty=cache_dirty)) _fetch_endpoint(BULK_DATA_ENDPOINT, dirty=cache_dirty, write_cache=True) - object_cache_path = _cache_path(OBJECT_CACHE_URL) + object_cache_path = _cache_path(OBJECT_CACHE_URL, ".pickle.gz") if os.path.exists(object_cache_path): if cache_dirty or DEBUG == "1": os.remove(object_cache_path) @@ -140,6 +124,6 @@ def scryfetch() -> ScryfallDataSet: cards_data = _deserialize_cards(cards_json) scryfall_data = ScryfallDataSet(sets=sets_data, cards=cards_data) - with gzip.open(object_cache_path, "wb") as object_cache: - pickle.dump(scryfall_data, object_cache) + with gzip.open(object_cache_path, "wb", compresslevel=1) as object_cache: + pickle.dump(scryfall_data, object_cache, protocol=pickle.HIGHEST_PROTOCOL) return scryfall_data diff --git a/mtg_ssm/scryfall/models.py b/mtg_ssm/scryfall/models.py index 87027ad..ec4ea73 100644 --- a/mtg_ssm/scryfall/models.py +++ b/mtg_ssm/scryfall/models.py @@ -1,23 +1,13 @@ """Scryfall object models.""" -from dataclasses import dataclass import datetime as dt from decimal import Decimal from enum import Enum -from typing import ClassVar -from typing import Dict -from typing import NewType -from typing import Optional -from typing import Sequence +from typing import Dict, Generic, Literal, Optional, Sequence, TypeVar, Union from uuid import UUID -URI = NewType("URI", str) - - -class ScryObject: - """Base object class for scryfall response objects.""" - - object: ClassVar[str] = "object" +from pydantic import AnyUrl, BaseModel +from pydantic.generics import GenericModel class ScryColor(str, Enum): @@ -54,6 +44,8 @@ class ScrySetType(str, Enum): PROMO = "promo" TOKEN = "token" MEMORABILIA = "memorabilia" + ALCHEMY = "alchemy" + ARSENAL = "arsenal" class ScryCardLayout(str, Enum): @@ -66,6 +58,7 @@ class ScryCardLayout(str, Enum): MODAL_DFC = "modal_dfc" MELD = "meld" LEVELER = "leveler" + CLASS = "class" SAGA = "saga" ADVENTURE = "adventure" PLANAR = "planar" @@ -78,6 +71,7 @@ class ScryCardLayout(str, Enum): HOST = "host" ART_SERIES = "art_series" DOUBLE_SIDED = "double_sided" + REVERSIBLE_CARD = "reversible_card" class ScryCardFrame(str, Enum): @@ -114,6 +108,9 @@ class ScryFrameEffect(str, Enum): COMPANION = "companion" FULLART = "fullart" ETCHED = "etched" + SNOW = "snow" + LESSON = "lesson" + TEXTLESS = "textless" class ScryBorderColor(str, Enum): @@ -126,6 +123,24 @@ class ScryBorderColor(str, Enum): WHITE = "white" +class ScryFinish(str, Enum): + """Enum for card finishes""" + + FOIL = "foil" + NONFOIL = "nonfoil" + ETCHED = "etched" + GLOSSY = "glossy" + + +class ScryImageStatus(str, Enum): + """Enum for card image_status""" + + MISSING = "missing" + PLACEHOLDER = "placeholder" + LOWRES = "lowres" + HIGHRES_SCAN = "highres_scan" + + class ScryGame(str, Enum): """Enum for card games""" @@ -143,6 +158,17 @@ class ScryRarity(str, Enum): UNCOMMON = "uncommon" RARE = "rare" MYTHIC = "mythic" + SPECIAL = "special" + BONUS = "bonus" + + +class ScrySecurityStamp(str, Enum): + """Enum for card security_stamp""" + + OVAL = "oval" + TRIANGLE = "triangle" + ACORN = "acorn" + ARENA = "arena" class ScryFormat(str, Enum): @@ -162,6 +188,12 @@ class ScryFormat(str, Enum): VINTAGE = "vintage" HISTORIC = "historic" PIONEER = "pioneer" + GLADIATOR = "gladiator" + EXPLORER = "explorer" + HISTORICBRAWL = "historicbrawl" + ALCHEMY = "alchemy" + PAUPERCOMMANDER = "paupercommander" + PREMODERN = "premodern" class ScryLegality(str, Enum): @@ -173,23 +205,30 @@ class ScryLegality(str, Enum): BANNED = "banned" -@dataclass(frozen=True) -class ScryObjectList(ScryObject): +T = TypeVar("T") + + +class ScryRootList(GenericModel, Generic[T]): + """Model for unstructured list of scryfall objects (e.g. bulk file data)""" + + __root__: Sequence[T] + + +class ScryObjectList(GenericModel, Generic[T]): """Model for https://scryfall.com/docs/api/lists""" - object: ClassVar[str] = "list" - data: Sequence[ScryObject] + object: Literal["list"] = "list" + data: Sequence[T] has_more: bool - next_page: Optional[URI] + next_page: Optional[AnyUrl] total_cards: Optional[int] warnings: Optional[Sequence[str]] -@dataclass(frozen=True) -class ScrySet(ScryObject): +class ScrySet(BaseModel): """Model for https://scryfall.com/docs/api/sets""" - object: ClassVar[str] = "set" + object: Literal["set"] = "set" id: UUID code: str mtgo_code: Optional[str] @@ -206,39 +245,41 @@ class ScrySet(ScryObject): digital: bool foil_only: bool nonfoil_only: Optional[bool] - icon_svg_uri: URI - search_uri: URI - scryfall_uri: URI - uri: URI + icon_svg_uri: AnyUrl + search_uri: AnyUrl + scryfall_uri: AnyUrl + uri: AnyUrl -@dataclass(frozen=True) -class ScryRelatedCard(ScryObject): +class ScryRelatedCard(BaseModel): """Model for https://scryfall.com/docs/api/cards#related-card-objects""" - object: ClassVar[str] = "related_card" + object: Literal["related_card"] = "related_card" id: UUID component: str name: str type_line: str - uri: URI + uri: AnyUrl -@dataclass(frozen=True) -class ScryCardFace(ScryObject): +class ScryCardFace(BaseModel): """Model for https://scryfall.com/docs/api/cards#card-face-objects""" - object: ClassVar[str] = "card_face" + object: Literal["card_face"] = "card_face" artist: Optional[str] artist_id: Optional[UUID] + cmc: Optional[Decimal] color_indicator: Optional[Sequence[ScryColor]] colors: Optional[Sequence[ScryColor]] + flavor_name: Optional[str] flavor_text: Optional[str] illustration_id: Optional[UUID] - image_uris: Optional[Dict[str, URI]] + image_uris: Optional[Dict[str, AnyUrl]] + layout: Optional[ScryCardLayout] loyalty: Optional[str] mana_cost: str name: str + oracle_id: Optional[UUID] oracle_text: Optional[str] power: Optional[str] printed_name: Optional[str] @@ -249,20 +290,18 @@ class ScryCardFace(ScryObject): watermark: Optional[str] -@dataclass(frozen=True) -class CardPreviewBlock: +class CardPreviewBlock(BaseModel): """Model for card preview block.""" source: str - source_uri: str # TODO: should be uri + source_uri: Union[AnyUrl, Literal[""], str] previewed_at: dt.date -@dataclass(frozen=True) -class ScryCard(ScryObject): +class ScryCard(BaseModel): """Model for https://scryfall.com/docs/api/cards""" - object: ClassVar[str] = "card" + object: Literal["card"] = "card" # Core Card Fields arena_id: Optional[int] id: UUID @@ -271,16 +310,17 @@ class ScryCard(ScryObject): mtgo_foil_id: Optional[int] multiverse_ids: Optional[Sequence[int]] tcgplayer_id: Optional[int] + tcgplayer_etched_id: Optional[int] cardmarket_id: Optional[int] - oracle_id: UUID - prints_search_uri: URI - rulings_uri: URI - scryfall_uri: URI - uri: URI + oracle_id: Optional[UUID] + prints_search_uri: AnyUrl + rulings_uri: AnyUrl + scryfall_uri: AnyUrl + uri: AnyUrl # Gameplay Fields all_parts: Optional[Sequence[ScryRelatedCard]] card_faces: Optional[Sequence[ScryCardFace]] - cmc: Decimal + cmc: Optional[Decimal] colors: Optional[Sequence[ScryColor]] color_identity: Sequence[ScryColor] color_indicator: Optional[Sequence[ScryColor]] @@ -297,6 +337,7 @@ class ScryCard(ScryObject): nonfoil: bool oracle_text: Optional[str] oversized: bool + penny_rank: Optional[int] power: Optional[str] produced_mana: Optional[Sequence[ScryColor]] reserved: bool @@ -307,10 +348,11 @@ class ScryCard(ScryObject): artist_ids: Optional[Sequence[UUID]] booster: bool border_color: ScryBorderColor - card_back_id: UUID + card_back_id: Optional[UUID] collector_number: str content_warning: Optional[bool] digital: bool + finishes: Sequence[ScryFinish] flavor_name: Optional[str] flavor_text: Optional[str] frame_effect: Optional[ScryFrameEffect] @@ -320,43 +362,45 @@ class ScryCard(ScryObject): games: Sequence[ScryGame] highres_image: bool illustration_id: Optional[UUID] - image_uris: Optional[Dict[str, URI]] + image_status: ScryImageStatus + image_uris: Optional[Dict[str, AnyUrl]] prices: Optional[Dict[str, Optional[Decimal]]] # TODO: enum keys printed_name: Optional[str] printed_text: Optional[str] printed_type_line: Optional[str] promo: bool promo_types: Optional[Sequence[str]] - purchase_uris: Optional[Dict[str, URI]] + purchase_uris: Optional[Dict[str, AnyUrl]] rarity: ScryRarity - related_uris: Optional[Dict[str, URI]] + related_uris: Optional[Dict[str, AnyUrl]] released_at: dt.date reprint: bool - scryfall_set_uri: URI + scryfall_set_uri: AnyUrl set_name: str - set_search_uri: URI + set_search_uri: AnyUrl set_type: str - set_uri: URI + set_uri: AnyUrl set: str + set_id: UUID story_spotlight: bool textless: bool variation: bool variation_of: Optional[UUID] + security_stamp: Optional[ScrySecurityStamp] watermark: Optional[str] preview: Optional[CardPreviewBlock] -@dataclass(frozen=True) -class ScryBulkData(ScryObject): +class ScryBulkData(BaseModel): """Model for https://scryfall.com/docs/api/bulk-data""" - object: ClassVar[str] = "bulk_data" + object: Literal["bulk_data"] = "bulk_data" id: UUID - uri: URI + uri: AnyUrl type: str name: str description: str - download_uri: URI + download_uri: AnyUrl updated_at: dt.datetime compressed_size: int content_type: str diff --git a/mtg_ssm/scryfall/schema.py b/mtg_ssm/scryfall/schema.py deleted file mode 100644 index e2ef1cf..0000000 --- a/mtg_ssm/scryfall/schema.py +++ /dev/null @@ -1,192 +0,0 @@ -"""Marshmallow schemas for Scryfall api data.""" - -import collections -from decimal import Decimal -from enum import EnumMeta -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Sequence -from typing import Tuple -from typing import Type -from typing import Union - -import marshmallow -from marshmallow import fields -from marshmallow_annotations import AnnotationSchema -from marshmallow_annotations import BaseConverter -from marshmallow_annotations import registry -from marshmallow_enum import EnumField -from marshmallow_oneofschema import OneOfSchema - -from mtg_ssm.scryfall import models -from mtg_ssm.scryfall.third_party import marshmallow_fields - -registry.register_field_for_type(models.URI, fields.Url) - - -@registry.field_factory(Decimal) -def decimal_converter( - _converter: BaseConverter, _subtypes: Any, opts: Dict[str, Any] -) -> fields.Field: - """Decimal field factory that always sets as_string.""" - return fields.Decimal(as_string=True, **opts) - - -@registry.field_factory(dict) -@registry.field_factory(Dict) -def dict_converter( - converter: BaseConverter, subtypes: Any, opts: Dict[str, Any] -) -> fields.Field: - """Dictionary field factory for marshmallow annotations.""" - sub_opts = opts.pop("_interior", ({}, {})) - return marshmallow_fields.Dict( - keys=converter.convert(subtypes[0], sub_opts[0]), - values=converter.convert(subtypes[1], sub_opts[1]), - **opts, - ) - - -class TupleField(fields.List): - """Tuple field based on tuple() wrapping List field.""" - - def _serialize(self, value: Any, attr: Any, obj: Any) -> Optional[Tuple[Any, ...]]: - ret = super()._serialize(value, attr, obj) - if ret is None: - return None - return tuple(ret) - - def _deserialize( - self, value: Any, attr: Any, data: Any - ) -> Optional[Tuple[Any, ...]]: - ret = super()._deserialize(value, attr, data) - if ret is None: - return None - return tuple(ret) - - -@registry.field_factory(Sequence) -@registry.field_factory(collections.abc.Sequence) -def sequence_converter( - converter: BaseConverter, subtypes: Any, opts: Dict[str, Any] -) -> fields.Field: - """Sequence field factory that treats sequences as lists.""" - sub_opts = opts.pop("_interior", {}) - return TupleField(converter.convert(subtypes[0], sub_opts), **opts) - - -def _register_enum(enum_class: EnumMeta) -> None: - """Enum field registration helper function.""" - - @registry.field_factory(enum_class) - def _enum_converter( - _converter: BaseConverter, _subtypes: Any, opts: Dict[str, Any] - ) -> fields.Field: - return EnumField(enum_class, by_value=True, **opts) - - -STR_ENUMS: Sequence[EnumMeta] = ( - models.ScryBorderColor, - models.ScryCardFrame, - models.ScryCardLayout, - models.ScryRarity, - models.ScryColor, - models.ScryFormat, - models.ScryFrameEffect, - models.ScryGame, - models.ScryLegality, - models.ScrySetType, -) -for _str_enum in STR_ENUMS: - _register_enum(_str_enum) - - -class BaseSchema(AnnotationSchema): - """Shared marshmallow schema helper class.""" - - @marshmallow.validates_schema(pass_original=True) - def disallow_unknown_fields( - self, _: Any, original_data: Union[Dict[str, Any], List[Dict[str, Any]]] - ) -> None: - """Check that no extra fields have been passed in.""" - if isinstance(original_data, (list, tuple)): - unknowns = [sorted(set(o) - set(self.fields)) for o in original_data] - if any(unknowns): - raise marshmallow.ValidationError( - f"{type(self).__name__} Unknown fields: {repr(unknowns)}" - ) - else: - unknown = sorted(set(original_data) - set(self.fields)) - if unknown: - raise marshmallow.ValidationError( - f"{type(self).__name__} Unknown fields: {repr(unknown)}" - ) - - @marshmallow.post_load - def make_target(self, data: Dict[str, Any]) -> Any: - """Post load, deserialize to target class.""" - return self.opts.target(**data) - - @marshmallow.post_dump - def remove_none( # pylint: disable=no-self-use - self, data: Dict[str, Any] - ) -> Dict[str, Any]: - """Post dump, strip null values.""" - return {k: v for k, v in data.items() if v is not None} - - -class PreviewBlockSchema(BaseSchema): - """Schema for CardPreviewBlock.""" - - class Meta: - """Marshmallow configuration options.""" - - target = models.CardPreviewBlock - register_as_scheme = True - strict = True - - -@registry.field_factory(models.ScryObject) -def _scryfall_converter( - _converter: BaseConverter, _subtypes: Any, opts: Dict[str, Any] -) -> fields.Field: - """Treat ScryfallObject references as OneOfSchema lookups.""" - return fields.Nested("ScryfallUberSchema", **opts) - - -MODELS: Sequence[Type[models.ScryObject]] = ( - models.ScryRelatedCard, - models.ScryCardFace, - models.ScryCard, - models.ScrySet, - models.ScryBulkData, - models.ScryObjectList, -) -OBJECT_SCHEMAS: Dict[str, BaseSchema] = {} -for _model in MODELS: - _meta = type( - "Meta", (), {"target": _model, "register_as_scheme": True, "strict": True} - ) - _schema_class = type( - f"{_model.__name__}Schema", - (BaseSchema,), - {"Meta": _meta, "object": fields.String(dump_only=True)}, - ) - globals()[_schema_class.__name__] = _schema_class - OBJECT_SCHEMAS[_model.object] = _schema_class() - - -class ScryfallUberSchema(OneOfSchema): - """Lookup master schema for ScryfallObject subclasses.""" - - class Meta: # TODO: do we need this? - """Marshmallow configuration options.""" - - strict = True - - type_field = "object" - type_schemas = OBJECT_SCHEMAS - - def get_obj_type(self, obj: models.ScryObject) -> str: - return getattr(obj, self.type_field) diff --git a/mtg_ssm/scryfall/third_party/marshmallow_fields.py b/mtg_ssm/scryfall/third_party/marshmallow_fields.py index be1d63f..d1d247a 100644 --- a/mtg_ssm/scryfall/third_party/marshmallow_fields.py +++ b/mtg_ssm/scryfall/third_party/marshmallow_fields.py @@ -31,13 +31,9 @@ import uuid import warnings -from marshmallow import class_registry -from marshmallow import utils -from marshmallow import validate -from marshmallow.base import FieldABC -from marshmallow.base import SchemaABC -from marshmallow.compat import basestring -from marshmallow.compat import text_type +from marshmallow import class_registry, utils, validate +from marshmallow.base import FieldABC, SchemaABC +from marshmallow.compat import basestring, text_type from marshmallow.exceptions import ValidationError from marshmallow.fields import Field from marshmallow.utils import missing as missing_ diff --git a/mtg_ssm/serialization/csv.py b/mtg_ssm/serialization/csv.py index 2f1bef1..6156e37 100644 --- a/mtg_ssm/serialization/csv.py +++ b/mtg_ssm/serialization/csv.py @@ -1,12 +1,9 @@ """CSV serializer.""" import csv +import datetime as dt from pathlib import Path -from typing import Any -from typing import ClassVar -from typing import Dict -from typing import Iterable -from typing import Mapping +from typing import Any, ClassVar, Dict, Iterable, Mapping from mtg_ssm.containers import counts from mtg_ssm.containers.collection import MagicCollection @@ -16,7 +13,7 @@ from mtg_ssm.serialization import interface CSV_HEADER = ["set", "name", "collector_number", "scryfall_id"] + [ - ct.name for ct in CountType + ct.value for ct in CountType ] @@ -27,7 +24,7 @@ def row_for_card(card: ScryCard, card_count: Mapping[CountType, int]) -> Dict[st "name": card.name, "collector_number": card.collector_number, "scryfall_id": card.id, - **{ct.name: cnt for ct, cnt in card_count.items() if cnt}, + **{ct.value: cnt for ct, cnt in card_count.items() if cnt}, } @@ -37,7 +34,7 @@ def rows_for_cards( """Generator that yields csv rows from a collection.""" for card_set in sorted( collection.oracle.index.setcode_to_set.values(), - key=lambda cset: cset.released_at, + key=lambda cset: (cset.released_at or dt.date.min, cset.code), ): for card in collection.oracle.index.setcode_to_cards[card_set.code]: card_count = collection.counts.get(card.id, {}) diff --git a/mtg_ssm/serialization/interface.py b/mtg_ssm/serialization/interface.py index 2193fa0..d446848 100644 --- a/mtg_ssm/serialization/interface.py +++ b/mtg_ssm/serialization/interface.py @@ -2,13 +2,7 @@ import abc from pathlib import Path -from typing import ClassVar -from typing import Dict -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple -from typing import Type +from typing import ClassVar, Dict, List, Optional, Set, Tuple, Type from mtg_ssm.containers.collection import MagicCollection from mtg_ssm.containers.indexes import Oracle diff --git a/mtg_ssm/serialization/xlsx.py b/mtg_ssm/serialization/xlsx.py index 71b23eb..1a36ebe 100644 --- a/mtg_ssm/serialization/xlsx.py +++ b/mtg_ssm/serialization/xlsx.py @@ -1,16 +1,10 @@ """XLSX serializer.""" import collections -from pathlib import Path +import datetime as dt import string -from typing import Any -from typing import ClassVar -from typing import Dict -from typing import Iterable -from typing import List -from typing import Optional -from typing import Sequence -from typing import Set +from pathlib import Path +from typing import Any, ClassVar, Dict, Iterable, List, Optional, Sequence, Set, Tuple import openpyxl from openpyxl.workbook.workbook import Workbook @@ -18,10 +12,9 @@ from mtg_ssm.containers import counts from mtg_ssm.containers.collection import MagicCollection -from mtg_ssm.containers.indexes import Oracle -from mtg_ssm.containers.indexes import ScryfallDataIndex +from mtg_ssm.containers.indexes import Oracle, ScryfallDataIndex from mtg_ssm.mtg import util -from mtg_ssm.scryfall.models import ScryCard +from mtg_ssm.scryfall.models import ScryCard, ScrySet from mtg_ssm.serialization import interface ALL_SETS_SHEET_HEADER: Sequence[str] = [ @@ -41,14 +34,17 @@ ] +def _card_set_sort_key(cset: ScrySet) -> Tuple[dt.date, str]: + released_at = cset.released_at or dt.date.min + return released_at, cset.code + + def create_all_sets(sheet: Worksheet, index: ScryfallDataIndex) -> None: """Create all sets sheet from card_db.""" sheet.title = "All Sets" sheet.append(ALL_SETS_SHEET_HEADER) sheet.append(ALL_SETS_SHEET_TOTALS) - for card_set in sorted( - index.setcode_to_set.values(), key=lambda cset: cset.released_at - ): + for card_set in sorted(index.setcode_to_set.values(), key=_card_set_sort_key): setcode = card_set.code.upper() row = [ setcode, @@ -116,7 +112,8 @@ def get_references( references = [] for card_set in sorted( - set_to_haveref, key=lambda setcode: index.setcode_to_set[setcode].released_at + set_to_haveref, + key=lambda setcode: _card_set_sort_key(index.setcode_to_set[setcode]), ): reference = 'IF({count}>0,"{setcode}: "&{count}&", ","")'.format( setcode=card_set.upper(), count=set_to_haveref[card_set] @@ -149,11 +146,11 @@ def style_all_cards(sheet: Worksheet) -> None: SET_SHEET_HEADER = ( ["have", "name", "scryfall_id", "collector_number", "artist"] - + [ct.name for ct in counts.CountType] + + [ct.value for ct in counts.CountType] + ["others"] ) COUNT_COLS = [ - string.ascii_uppercase[SET_SHEET_HEADER.index(ct.name)] for ct in counts.CountType + string.ascii_uppercase[SET_SHEET_HEADER.index(ct.value)] for ct in counts.CountType ] HAVE_TMPL = "=" + "+".join(c + "{rownum}" for c in COUNT_COLS) ROW_OFFSET = 2 @@ -209,7 +206,8 @@ def rows_from_sheet(sheet: Worksheet) -> Iterable[Dict[str, str]]: header = [cell.value for cell in header_row] for row in rows: values = [cell.value for cell in row] - yield dict(zip(header, values), set=sheet.title) + if any(v is not None for v in values): + yield dict(zip(header, values), set=sheet.title) def rows_for_workbook( @@ -246,7 +244,7 @@ def write(self, path: Path, collection: MagicCollection) -> None: s.code for s in sorted( collection.oracle.index.setcode_to_set.values(), - key=lambda cset: cset.released_at, + key=_card_set_sort_key, ) ] diff --git a/mtg_ssm/ssm.py b/mtg_ssm/ssm.py index b8fc3cd..09e1c00 100644 --- a/mtg_ssm/ssm.py +++ b/mtg_ssm/ssm.py @@ -3,19 +3,17 @@ import argparse import datetime as dt -from pathlib import Path import tempfile -from typing import Dict -from typing import List -from typing import Set +from pathlib import Path +from typing import Dict, List, Set import mtg_ssm +import mtg_ssm.serialization.interface as ser_interface from mtg_ssm.containers import bundles from mtg_ssm.containers.collection import MagicCollection from mtg_ssm.containers.indexes import Oracle from mtg_ssm.scryfall import fetcher from mtg_ssm.scryfall.models import ScrySetType -import mtg_ssm.serialization.interface as ser_interface def epilog() -> str: diff --git a/mypy.ini b/mypy.ini index ac259a7..2998bd5 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,6 +1,6 @@ [mypy] -python_version = 3.7 +python_version = 3.8 ignore_missing_imports = True follow_imports = normal diff --git a/pylintrc b/pylintrc index ff99d33..64979b9 100644 --- a/pylintrc +++ b/pylintrc @@ -1,14 +1,19 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-allow-list= + pydantic, + [MESSAGES CONTROL] # See: # http://docs.pylint.org/features.html # disable= - bad-continuation, duplicate-code, fixme, line-too-long, - locally-disabled, - locally-enabled, too-few-public-methods, too-many-instance-attributes, wrong-import-order, diff --git a/requirements.txt b/requirements.txt index 97d9951..160639c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,4 @@ -appdirs~=1.2 -marshmallow-annotations~=2.4 -marshmallow-enum~=1.4 -marshmallow-oneofschema~=1.0 -marshmallow~=2.18 -openpyxl~=2.6 -requests~=2.21 +appdirs~=1.4 +openpyxl~=3.0 +pydantic~=1.9 +requests~=2.27 diff --git a/setup.cfg b/setup.cfg index 34cc320..cbc4c6f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,14 +29,9 @@ exclude_lines = [isort] atomic = true -force_single_line = true -force_sort_within_sections = true -include_trailing_comma = true +profile = black line_length = 88 -multi_line_output = 3 not_skip = __init__.py -order_by_type = true -use_parentheses = true known_first_party = mtg_ssm, tests, diff --git a/setup.py b/setup.py index e05c18d..06e5264 100644 --- a/setup.py +++ b/setup.py @@ -4,24 +4,22 @@ import setuptools -if sys.version_info < (3, 6): - raise Exception("Python version < 3.6 are not supported.") +if sys.version_info < (3, 8): + raise Exception("Python version < 3.8 are not supported.") # Get version information without importing the package __version__ = None -exec( # pylint: disable=exec-used - open("mtg_ssm/version.py", "rt", encoding="utf-8").read() -) +with open("mtg_ssm/version.py", "rt", encoding="utf-8") as versionfile: + exec(versionfile.read()) # pylint: disable=exec-used SHORT_DESCRIPTION = "A tool to manage Magic: the Gathering collection spreadsheets." -LONG_DESCRIPTION = open("README.rst", "rt", encoding="utf-8").read() +with open("README.rst", "rt", encoding="utf-8") as readmefile: + LONG_DESCRIPTION = readmefile.read() -DEPENDENCIES = [l.strip() for l in open("requirements.txt", "rt", encoding="utf-8")] -TEST_DEPENDENCIES = [ - l.strip() for l in open("test_requirements.txt", "rt", encoding="utf-8") -] -if sys.version_info < (3, 7): - DEPENDENCIES.append("dataclasses") +with open("requirements.txt", "rt", encoding="utf-8") as requirementsfile: + DEPENDENCIES = [line.strip() for line in requirementsfile] +with open("test_requirements.txt", "rt", encoding="utf-8") as testrequirementsfile: + TEST_DEPENDENCIES = [line.strip() for line in testrequirementsfile] CLASSIFIERS = [ "Development Status :: 5 - Production/Stable", @@ -36,9 +34,9 @@ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Topic :: Games/Entertainment", ] diff --git a/test_requirements.txt b/test_requirements.txt index 8333ab5..03f9438 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -15,3 +15,4 @@ pytest-cov>=2.6.0 pytest>=3.0.2 python-coveralls>=2.9.0 responses>=0.10.5 +types-requests>=2.27 diff --git a/tests/conftest.py b/tests/conftest.py index c2a87be..ebc2961 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,19 +3,16 @@ import json import os -from typing import Dict -from typing import List +from typing import Dict, Generator, List, Sequence from uuid import UUID -from _pytest.monkeypatch import MonkeyPatch -from py._path.local import LocalPath import pytest import responses +from _pytest.monkeypatch import MonkeyPatch +from py._path.local import LocalPath from mtg_ssm.containers.bundles import ScryfallDataSet -from mtg_ssm.scryfall.models import ScryCard -from mtg_ssm.scryfall.models import ScrySet -from mtg_ssm.scryfall.schema import ScryfallUberSchema +from mtg_ssm.scryfall.models import ScryCard, ScryObjectList, ScryRootList, ScrySet TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data") SETS_DATA_FILE = os.path.join(TEST_DATA_DIR, "sets.json") @@ -31,26 +28,26 @@ def fetcher_cache_dir(tmpdir: LocalPath, monkeypatch: MonkeyPatch) -> LocalPath: @pytest.fixture(autouse=True) -def requests_mock() -> responses.RequestsMock: +def requests_mock() -> Generator[responses.RequestsMock, None, None]: """Auto replace all requests with a mock.""" with responses.RequestsMock() as rsps: yield rsps @pytest.fixture(scope="session") -def cards_data() -> List[ScryCard]: +def cards_data() -> Sequence[ScryCard]: """Fixture containing all test card data.""" - schema = ScryfallUberSchema() with open(CARDS_DATA_FILE, "rt", encoding="utf-8") as card_data_file: - return [schema.load(c).data for c in json.load(card_data_file)] + card_json = json.load(card_data_file) + return ScryRootList[ScryCard].parse_obj(card_json).__root__ @pytest.fixture(scope="session") -def sets_data() -> List[ScrySet]: +def sets_data() -> Sequence[ScrySet]: """Fixture containing all test set data.""" - schema = ScryfallUberSchema() with open(SETS_DATA_FILE, "rt", encoding="utf-8") as sets_data_file: - return schema.load(json.load(sets_data_file)).data.data + sets_json = json.load(sets_data_file) + return ScryObjectList[ScrySet].parse_obj(sets_json).data @pytest.fixture(scope="session") diff --git a/tests/containers/test_counts.py b/tests/containers/test_counts.py index 9ba486e..1a3f45a 100644 --- a/tests/containers/test_counts.py +++ b/tests/containers/test_counts.py @@ -1,17 +1,14 @@ """Tests for mtg_ssm.mtg.counts""" # pylint: disable=redefined-outer-name -from typing import Any -from typing import Dict -from typing import List +from typing import Any, Dict, List from uuid import UUID import pytest from mtg_ssm.containers import counts from mtg_ssm.containers.bundles import ScryfallDataSet -from mtg_ssm.containers.counts import CountType -from mtg_ssm.containers.counts import ScryfallCardCount +from mtg_ssm.containers.counts import CountType, ScryfallCardCount from mtg_ssm.containers.indexes import Oracle from mtg_ssm.containers.legacy import NoMatchError @@ -27,27 +24,27 @@ def oracle(scryfall_data: ScryfallDataSet) -> Oracle: [ pytest.param([], {}, id="no inputs"), pytest.param( - [{UUID(int=1): {CountType.nonfoil: 2}}], - {UUID(int=1): {CountType.nonfoil: 2}}, + [{UUID(int=1): {CountType.NONFOIL: 2}}], + {UUID(int=1): {CountType.NONFOIL: 2}}, id="single input", ), pytest.param( [ - {UUID(int=1): {CountType.nonfoil: 2}}, - {UUID(int=1): {CountType.nonfoil: 1, CountType.foil: 4}}, + {UUID(int=1): {CountType.NONFOIL: 2}}, + {UUID(int=1): {CountType.NONFOIL: 1, CountType.FOIL: 4}}, ], - {UUID(int=1): {CountType.nonfoil: 3, CountType.foil: 4}}, + {UUID(int=1): {CountType.NONFOIL: 3, CountType.FOIL: 4}}, id="mixed types", ), pytest.param( [ - {UUID(int=1): {CountType.nonfoil: 2}}, - {UUID(int=1): {CountType.foil: 1}, UUID(int=2): {CountType.nonfoil: 3}}, - {UUID(int=1): {CountType.foil: 5}}, + {UUID(int=1): {CountType.NONFOIL: 2}}, + {UUID(int=1): {CountType.FOIL: 1}, UUID(int=2): {CountType.NONFOIL: 3}}, + {UUID(int=1): {CountType.FOIL: 5}}, ], { - UUID(int=1): {CountType.nonfoil: 2, CountType.foil: 6}, - UUID(int=2): {CountType.nonfoil: 3}, + UUID(int=1): {CountType.NONFOIL: 2, CountType.FOIL: 6}, + UUID(int=2): {CountType.NONFOIL: 3}, }, id="multiple inputs", ), @@ -64,33 +61,33 @@ def test_merge_card_counts( [ pytest.param({}, {}, {}, id="no inputs"), pytest.param( - {UUID(int=1): {CountType.nonfoil: 2}}, - {UUID(int=1): {CountType.nonfoil: 1}}, - {UUID(int=1): {CountType.nonfoil: 1}}, + {UUID(int=1): {CountType.NONFOIL: 2}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, id="positive output", ), pytest.param( - {UUID(int=1): {CountType.nonfoil: 1}}, - {UUID(int=1): {CountType.nonfoil: 2}}, - {UUID(int=1): {CountType.nonfoil: -1}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, + {UUID(int=1): {CountType.NONFOIL: 2}}, + {UUID(int=1): {CountType.NONFOIL: -1}}, id="negative output", ), pytest.param( - {UUID(int=1): {CountType.nonfoil: 1}}, - {UUID(int=1): {CountType.nonfoil: 1}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, {}, id="negated", ), pytest.param( - {UUID(int=1): {CountType.nonfoil: 1}}, - {UUID(int=2): {CountType.nonfoil: 1}}, - {UUID(int=1): {CountType.nonfoil: 1}, UUID(int=2): {CountType.nonfoil: -1}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, + {UUID(int=2): {CountType.NONFOIL: 1}}, + {UUID(int=1): {CountType.NONFOIL: 1}, UUID(int=2): {CountType.NONFOIL: -1}}, id="mixed cards", ), pytest.param( - {UUID(int=1): {CountType.nonfoil: 1}}, - {UUID(int=1): {CountType.foil: 1}}, - {UUID(int=1): {CountType.nonfoil: 1, CountType.foil: -1}}, + {UUID(int=1): {CountType.NONFOIL: 1}}, + {UUID(int=1): {CountType.FOIL: 1}}, + {UUID(int=1): {CountType.NONFOIL: 1, CountType.FOIL: -1}}, id="mixed count types", ), ], @@ -115,12 +112,12 @@ def test_diff_card_counts( ), pytest.param( [{"scryfall_id": UUID("00000000-0000-0000-0000-000000000001"), "foil": 1}], - {UUID("00000000-0000-0000-0000-000000000001"): {counts.CountType.foil: 1}}, + {UUID("00000000-0000-0000-0000-000000000001"): {counts.CountType.FOIL: 1}}, id="id and int", ), pytest.param( [{"scryfall_id": "00000000-0000-0000-0000-000000000001", "foil": "1"}], - {UUID("00000000-0000-0000-0000-000000000001"): {counts.CountType.foil: 1}}, + {UUID("00000000-0000-0000-0000-000000000001"): {counts.CountType.FOIL: 1}}, id="text and text", ), pytest.param( @@ -131,7 +128,7 @@ def test_diff_card_counts( "nonfoil": "", } ], - {UUID("00000000-0000-0000-0000-000000000001"): {counts.CountType.foil: 1}}, + {UUID("00000000-0000-0000-0000-000000000001"): {counts.CountType.FOIL: 1}}, id="empty string", ), pytest.param( @@ -142,10 +139,10 @@ def test_diff_card_counts( ], { UUID("00000000-0000-0000-0000-000000000001"): { - counts.CountType.foil: 1 + counts.CountType.FOIL: 1 }, UUID("00000000-0000-0000-0000-000000000003"): { - counts.CountType.nonfoil: 1 + counts.CountType.NONFOIL: 1 }, }, id="multiple", @@ -167,8 +164,8 @@ def test_diff_card_counts( ], { UUID("00000000-0000-0000-0000-000000000001"): { - counts.CountType.foil: 2, - counts.CountType.nonfoil: 1, + counts.CountType.FOIL: 2, + counts.CountType.NONFOIL: 1, } }, id="duplicates", diff --git a/tests/containers/test_legacy.py b/tests/containers/test_legacy.py index 5a4fa70..6d62b32 100644 --- a/tests/containers/test_legacy.py +++ b/tests/containers/test_legacy.py @@ -1,8 +1,7 @@ """Tests for mtg_ssm.containers.legacy.""" # pylint: disable=redefined-outer-name -from typing import Any -from typing import Dict +from typing import Any, Dict from uuid import UUID import pytest diff --git a/tests/data/bulk_data.json b/tests/data/bulk_data.json index a79d6ef..db98c6e 100644 --- a/tests/data/bulk_data.json +++ b/tests/data/bulk_data.json @@ -1,16 +1,16 @@ { "data": [ { - "compressed_size": 25995288, + "compressed_size": 37294201, "content_encoding": "gzip", "content_type": "application/json", "description": "A JSON file containing every card object on Scryfall in English or the printed language if the card is only available in one language.", - "download_uri": "https://c2.scryfall.com/file/scryfall-bulk/default-cards/default-cards-20200908210348.json", + "download_uri": "https://c2.scryfall.com/file/scryfall-bulk/default-cards/default-cards-20220604210546.json", "id": "e2ef41e3-5778-4bc2-af3f-78eca4dd9c23", "name": "Default Cards", "object": "bulk_data", "type": "default_cards", - "updated_at": "2020-09-08T21:03:48.932000+00:00", + "updated_at": "2022-06-04T21:05:46.882000+00:00", "uri": "https://api.scryfall.com/bulk-data/e2ef41e3-5778-4bc2-af3f-78eca4dd9c23" } ], diff --git a/tests/data/cards.json b/tests/data/cards.json index 8b18902..eb0bf96 100644 --- a/tests/data/cards.json +++ b/tests/data/cards.json @@ -7,7 +7,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 240613, + "cmc": 4.0, "collector_number": "1", "color_identity": [ "W" @@ -16,7 +17,10 @@ "W" ], "digital": false, - "edhrec_rank": 3575, + "edhrec_rank": 3612, + "finishes": [ + "nonfoil" + ], "flavor_text": "Only leonin clerics who can survive the Razor Fields for one turning of the suns can stand in the Cave of Light.", "foil": false, "frame": "2003", @@ -27,6 +31,7 @@ "highres_image": true, "id": "9d26f171-5bb6-463c-8473-53b6cc27ed66", "illustration_id": "44748599-6238-4ace-bd20-ffe80f2a5c73", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/9/d/9d26f171-5bb6-463c-8473-53b6cc27ed66.jpg?1562928153", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/9/d/9d26f171-5bb6-463c-8473-53b6cc27ed66.jpg?1562928153", @@ -39,17 +44,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -63,11 +74,14 @@ "oracle_id": "10064324-34a0-47eb-a58e-01db10234ed9", "oracle_text": "Artifacts you control have hexproof. (They can't be the targets of spells or abilities your opponents control.)", "oversized": false, + "penny_rank": 8830, "power": "2", "prices": { - "eur": null, + "eur": 1.5, + "eur_foil": null, "tix": null, - "usd": "2.63", + "usd": 1.01, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A10064324-34a0-47eb-a58e-01db10234ed9&unique=prints", @@ -76,8 +90,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Leonin+Abunas", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=220527", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Leonin+Abunas", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Leonin+Abunas&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Leonin+Abunas&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Leonin+Abunas&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2010-06-18", "reprint": true, @@ -86,6 +100,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/arc?utm_source=api", "scryfall_uri": "https://scryfall.com/card/arc/1/leonin-abunas?utm_source=api", "set": "arc", + "set_id": "8bc5ec64-18d5-4c81-96a1-8f619d81a019", "set_name": "Archenemy", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aarc&unique=prints", "set_type": "archenemy", @@ -122,6 +137,7 @@ { "artist": "Mark Zug", "artist_id": "48e2b98c-5467-4671-bd42-4c3746115117", + "flavor_name": "", "mana_cost": "", "name": "Kaiso, Memory of Loyalty", "object": "card_face", @@ -131,7 +147,8 @@ "type_line": "Legendary Creature — Spirit" } ], - "cmc": "3.0", + "cardmarket_id": 12811, + "cmc": 3.0, "collector_number": "3", "color_identity": [ "W" @@ -140,7 +157,10 @@ "W" ], "digital": false, - "edhrec_rank": 16039, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -151,6 +171,7 @@ "highres_image": true, "id": "758abd53-6ad2-406e-8615-8e48678405b4", "illustration_id": "70eec478-45ae-4ce8-8199-720209599e2e", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/7/5/758abd53-6ad2-406e-8615-8e48678405b4.jpg?1562877848", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/7/5/758abd53-6ad2-406e-8615-8e48678405b4.jpg?1562877848", @@ -165,17 +186,23 @@ "lang": "en", "layout": "flip", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "restricted", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -192,10 +219,12 @@ "oversized": false, "power": "2", "prices": { - "eur": "0.16", - "tix": "0.03", - "usd": "0.17", - "usd_foil": "0.36" + "eur": 0.13, + "eur_foil": 0.59, + "tix": 0.03, + "usd": 0.11, + "usd_etched": null, + "usd_foil": 0.42 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A2358ffc2-6663-4ef3-b3a4-b036a4733ac6&unique=prints", "promo": false, @@ -203,8 +232,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Faithful+Squire", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=74093", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Faithful+Squire", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Faithful+Squire&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Faithful+Squire+%2F%2F+Kaiso%2C+Memory+of+Loyalty&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Faithful+Squire+%2F%2F+Kaiso%2C+Memory+of+Loyalty&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2005-02-04", "reprint": false, @@ -213,6 +242,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/bok?utm_source=api", "scryfall_uri": "https://scryfall.com/card/bok/3/faithful-squire-kaiso-memory-of-loyalty?utm_source=api", "set": "bok", + "set_id": "d4b88587-a1f5-4b47-9e24-78ec9e57bd0e", "set_name": "Betrayers of Kamigawa", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Abok&unique=prints", "set_type": "expansion", @@ -249,6 +279,7 @@ { "artist": "Mark Zug", "artist_id": "48e2b98c-5467-4671-bd42-4c3746115117", + "flavor_name": "", "mana_cost": "", "name": "Kenzo the Hardhearted", "object": "card_face", @@ -258,7 +289,8 @@ "type_line": "Legendary Creature — Human Samurai" } ], - "cmc": "1.0", + "cardmarket_id": 11977, + "cmc": 1.0, "collector_number": "2", "color_identity": [ "W" @@ -267,7 +299,10 @@ "W" ], "digital": false, - "edhrec_rank": 9845, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -278,6 +313,7 @@ "highres_image": true, "id": "864ad989-19a6-4930-8efc-bbc077a18c32", "illustration_id": "e8672d31-de00-4f84-b188-a89470816b6e", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/8/6/864ad989-19a6-4930-8efc-bbc077a18c32.jpg?1562762069", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/8/6/864ad989-19a6-4930-8efc-bbc077a18c32.jpg?1562762069", @@ -293,17 +329,23 @@ "lang": "en", "layout": "flip", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "restricted", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -318,12 +360,15 @@ "object": "card", "oracle_id": "82959ca2-cd96-4cca-9ce0-afb8db209860", "oversized": false, + "penny_rank": 8844, "power": "1", "prices": { - "eur": "0.09", - "tix": "0.03", - "usd": "0.36", - "usd_foil": "1.96" + "eur": 0.02, + "eur_foil": 1.5, + "tix": 0.02, + "usd": 0.32, + "usd_etched": null, + "usd_foil": 10.81 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A82959ca2-cd96-4cca-9ce0-afb8db209860&unique=prints", "promo": false, @@ -331,8 +376,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Bushi+Tenderfoot", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=78600", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Bushi+Tenderfoot", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Bushi+Tenderfoot&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Bushi+Tenderfoot+%2F%2F+Kenzo+the+Hardhearted&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Bushi+Tenderfoot+%2F%2F+Kenzo+the+Hardhearted&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2004-10-01", "reprint": false, @@ -341,6 +386,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/chk?utm_source=api", "scryfall_uri": "https://scryfall.com/card/chk/2/bushi-tenderfoot-kenzo-the-hardhearted?utm_source=api", "set": "chk", + "set_id": "6183d21f-a0af-4118-ba58-aca1d8719c01", "set_name": "Champions of Kamigawa", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Achk&unique=prints", "set_type": "expansion", @@ -361,7 +407,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "2.0", + "cardmarket_id": 13665, + "cmc": 2.0, "collector_number": "8", "color_identity": [ "W" @@ -370,7 +417,11 @@ "W" ], "digital": false, - "edhrec_rank": 12352, + "edhrec_rank": 14605, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -381,6 +432,7 @@ "highres_image": true, "id": "5526c510-bd33-4fac-8941-f19bd0997557", "illustration_id": "b60ade37-5f46-44b3-8114-d752084d9e5d", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/5/5526c510-bd33-4fac-8941-f19bd0997557.jpg?1593274750", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/5/5526c510-bd33-4fac-8941-f19bd0997557.jpg?1593274750", @@ -395,17 +447,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", - "penny": "not_legal", + "paupercommander": "restricted", + "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -421,12 +479,15 @@ "oracle_id": "43fbfeec-bcaf-48b8-befe-b7346fec5a3a", "oracle_text": "Cumulative upkeep—Put two cards from a single graveyard on the bottom of their owner's library. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)", "oversized": false, + "penny_rank": 10638, "power": "4", "prices": { - "eur": "0.24", - "tix": "0.02", - "usd": "0.23", - "usd_foil": "1.75" + "eur": 0.06, + "eur_foil": 1.0, + "tix": 0.02, + "usd": 0.19, + "usd_etched": null, + "usd_foil": 4.41 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A43fbfeec-bcaf-48b8-befe-b7346fec5a3a&unique=prints", "promo": false, @@ -434,8 +495,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=J%C3%B6tun+Grunt", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=122075", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=J%C3%B6tun+Grunt", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=J%C3%B6tun+Grunt&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=J%C3%B6tun+Grunt&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=J%C3%B6tun+Grunt&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2006-07-21", "reprint": false, @@ -444,6 +505,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/csp?utm_source=api", "scryfall_uri": "https://scryfall.com/card/csp/8/j%C3%B6tun-grunt?utm_source=api", "set": "csp", + "set_id": "1f4f105f-73e4-4f03-849e-82a204807847", "set_name": "Coldsnap", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Acsp&unique=prints", "set_type": "expansion", @@ -457,6 +519,24 @@ "variation": false }, { + "all_parts": [ + { + "component": "combo_piece", + "id": "4caaf31b-86a9-485b-8da7-d5b526ed1233", + "name": "Thallid", + "object": "related_card", + "type_line": "Creature — Fungus", + "uri": "https://api.scryfall.com/cards/4caaf31b-86a9-485b-8da7-d5b526ed1233" + }, + { + "component": "token", + "id": "006c118e-b5c7-4726-acee-59132f23e4fc", + "name": "Saproling", + "object": "related_card", + "type_line": "Token Creature — Saproling", + "uri": "https://api.scryfall.com/cards/006c118e-b5c7-4726-acee-59132f23e4fc" + } + ], "artist": "Edward P. Beard, Jr.", "artist_ids": [ "b845b8ee-aeea-4822-bcf9-7230625ac95c" @@ -464,7 +544,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 7487, + "cmc": 1.0, "collector_number": "74a", "color_identity": [ "G" @@ -473,7 +554,10 @@ "G" ], "digital": false, - "edhrec_rank": 4684, + "edhrec_rank": 6396, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -483,6 +567,7 @@ "highres_image": true, "id": "4caaf31b-86a9-485b-8da7-d5b526ed1233", "illustration_id": "4b06bf5b-59dc-4524-a023-33bad9e1eee4", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/c/4caaf31b-86a9-485b-8da7-d5b526ed1233.jpg?1562909047", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/c/4caaf31b-86a9-485b-8da7-d5b526ed1233.jpg?1562909047", @@ -495,17 +580,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -519,11 +610,14 @@ "oracle_id": "46abaabe-7015-4d82-a5aa-2706b1f51bed", "oracle_text": "At the beginning of your upkeep, put a spore counter on Thallid.\nRemove three spore counters from Thallid: Create a 1/1 green Saproling creature token.", "oversized": false, + "penny_rank": 8490, "power": "1", "prices": { - "eur": "0.08", + "eur": 0.1, + "eur_foil": null, "tix": null, - "usd": "0.13", + "usd": 0.19, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A46abaabe-7015-4d82-a5aa-2706b1f51bed&unique=prints", @@ -532,8 +626,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Thallid", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=1924", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Thallid", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Thallid&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1994-11-01", "reprint": false, @@ -542,6 +636,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/fem?utm_source=api", "scryfall_uri": "https://scryfall.com/card/fem/74a/thallid?utm_source=api", "set": "fem", + "set_id": "cf7390b1-341a-4ae8-a325-da0f5f322f13", "set_name": "Fallen Empires", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Afem&unique=prints", "set_type": "expansion", @@ -555,6 +650,24 @@ "variation": false }, { + "all_parts": [ + { + "component": "combo_piece", + "id": "4caaf31b-86a9-485b-8da7-d5b526ed1233", + "name": "Thallid", + "object": "related_card", + "type_line": "Creature — Fungus", + "uri": "https://api.scryfall.com/cards/4caaf31b-86a9-485b-8da7-d5b526ed1233" + }, + { + "component": "token", + "id": "006c118e-b5c7-4726-acee-59132f23e4fc", + "name": "Saproling", + "object": "related_card", + "type_line": "Token Creature — Saproling", + "uri": "https://api.scryfall.com/cards/006c118e-b5c7-4726-acee-59132f23e4fc" + } + ], "artist": "Jesper Myrfors", "artist_ids": [ "c011318e-8503-48c1-a990-46e50aff48a0" @@ -562,7 +675,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 7488, + "cmc": 1.0, "collector_number": "74b", "color_identity": [ "G" @@ -571,7 +685,10 @@ "G" ], "digital": false, - "edhrec_rank": 4684, + "edhrec_rank": 6396, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -581,6 +698,7 @@ "highres_image": true, "id": "80f8f778-ae31-45cd-b27f-f93a07853ede", "illustration_id": "f3935373-6fec-4f52-b6b3-672b01a004e2", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/8/0/80f8f778-ae31-45cd-b27f-f93a07853ede.jpg?1562918912", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/8/0/80f8f778-ae31-45cd-b27f-f93a07853ede.jpg?1562918912", @@ -593,17 +711,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -617,11 +741,14 @@ "oracle_id": "46abaabe-7015-4d82-a5aa-2706b1f51bed", "oracle_text": "At the beginning of your upkeep, put a spore counter on Thallid.\nRemove three spore counters from Thallid: Create a 1/1 green Saproling creature token.", "oversized": false, + "penny_rank": 8490, "power": "1", "prices": { - "eur": "0.08", + "eur": 0.15, + "eur_foil": null, "tix": null, - "usd": "0.13", + "usd": 0.17, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A46abaabe-7015-4d82-a5aa-2706b1f51bed&unique=prints", @@ -630,8 +757,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Thallid", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=1926", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Thallid", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Thallid&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1994-11-01", "reprint": false, @@ -640,6 +767,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/fem?utm_source=api", "scryfall_uri": "https://scryfall.com/card/fem/74b/thallid?utm_source=api", "set": "fem", + "set_id": "cf7390b1-341a-4ae8-a325-da0f5f322f13", "set_name": "Fallen Empires", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Afem&unique=prints", "set_type": "expansion", @@ -653,6 +781,24 @@ "variation": false }, { + "all_parts": [ + { + "component": "combo_piece", + "id": "4caaf31b-86a9-485b-8da7-d5b526ed1233", + "name": "Thallid", + "object": "related_card", + "type_line": "Creature — Fungus", + "uri": "https://api.scryfall.com/cards/4caaf31b-86a9-485b-8da7-d5b526ed1233" + }, + { + "component": "token", + "id": "006c118e-b5c7-4726-acee-59132f23e4fc", + "name": "Saproling", + "object": "related_card", + "type_line": "Token Creature — Saproling", + "uri": "https://api.scryfall.com/cards/006c118e-b5c7-4726-acee-59132f23e4fc" + } + ], "artist": "Ron Spencer", "artist_ids": [ "dab52c11-0564-4207-a4a1-c1735c946a65" @@ -660,7 +806,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 7489, + "cmc": 1.0, "collector_number": "74c", "color_identity": [ "G" @@ -669,7 +816,10 @@ "G" ], "digital": false, - "edhrec_rank": 4684, + "edhrec_rank": 6396, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -679,6 +829,7 @@ "highres_image": true, "id": "2cf2f3da-9101-439d-8caa-910ff40bfbb3", "illustration_id": "7f219b9f-5e6a-468b-86f8-5160dcdae849", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/2/c/2cf2f3da-9101-439d-8caa-910ff40bfbb3.jpg?1562903271", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/2/c/2cf2f3da-9101-439d-8caa-910ff40bfbb3.jpg?1562903271", @@ -691,17 +842,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -715,11 +872,14 @@ "oracle_id": "46abaabe-7015-4d82-a5aa-2706b1f51bed", "oracle_text": "At the beginning of your upkeep, put a spore counter on Thallid.\nRemove three spore counters from Thallid: Create a 1/1 green Saproling creature token.", "oversized": false, + "penny_rank": 8490, "power": "1", "prices": { - "eur": "0.08", + "eur": 0.07, + "eur_foil": null, "tix": null, - "usd": "0.13", + "usd": 0.22, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A46abaabe-7015-4d82-a5aa-2706b1f51bed&unique=prints", @@ -728,8 +888,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Thallid", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=1927", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Thallid", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Thallid&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1994-11-01", "reprint": false, @@ -738,6 +898,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/fem?utm_source=api", "scryfall_uri": "https://scryfall.com/card/fem/74c/thallid?utm_source=api", "set": "fem", + "set_id": "cf7390b1-341a-4ae8-a325-da0f5f322f13", "set_name": "Fallen Empires", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Afem&unique=prints", "set_type": "expansion", @@ -751,6 +912,24 @@ "variation": false }, { + "all_parts": [ + { + "component": "combo_piece", + "id": "4caaf31b-86a9-485b-8da7-d5b526ed1233", + "name": "Thallid", + "object": "related_card", + "type_line": "Creature — Fungus", + "uri": "https://api.scryfall.com/cards/4caaf31b-86a9-485b-8da7-d5b526ed1233" + }, + { + "component": "token", + "id": "006c118e-b5c7-4726-acee-59132f23e4fc", + "name": "Saproling", + "object": "related_card", + "type_line": "Token Creature — Saproling", + "uri": "https://api.scryfall.com/cards/006c118e-b5c7-4726-acee-59132f23e4fc" + } + ], "artist": "Daniel Gelon", "artist_ids": [ "63ac31a8-dd1a-4679-9f82-ece89429a084" @@ -758,7 +937,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 7490, + "cmc": 1.0, "collector_number": "74d", "color_identity": [ "G" @@ -767,7 +947,10 @@ "G" ], "digital": false, - "edhrec_rank": 4684, + "edhrec_rank": 6396, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -777,6 +960,7 @@ "highres_image": true, "id": "01827286-b104-41c5-bac9-7c38414bc40e", "illustration_id": "a4fa384d-5327-4022-b8e5-1b74cb84d7db", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/0/1/01827286-b104-41c5-bac9-7c38414bc40e.jpg?1562895253", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/0/1/01827286-b104-41c5-bac9-7c38414bc40e.jpg?1562895253", @@ -789,17 +973,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -813,11 +1003,14 @@ "oracle_id": "46abaabe-7015-4d82-a5aa-2706b1f51bed", "oracle_text": "At the beginning of your upkeep, put a spore counter on Thallid.\nRemove three spore counters from Thallid: Create a 1/1 green Saproling creature token.", "oversized": false, + "penny_rank": 8490, "power": "1", "prices": { - "eur": "0.08", + "eur": 0.27, + "eur_foil": null, "tix": null, - "usd": "0.16", + "usd": 0.16, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A46abaabe-7015-4d82-a5aa-2706b1f51bed&unique=prints", @@ -826,8 +1019,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Thallid", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=1925", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Thallid", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Thallid&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1994-11-01", "reprint": false, @@ -836,6 +1029,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/fem?utm_source=api", "scryfall_uri": "https://scryfall.com/card/fem/74d/thallid?utm_source=api", "set": "fem", + "set_id": "cf7390b1-341a-4ae8-a325-da0f5f322f13", "set_name": "Fallen Empires", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Afem&unique=prints", "set_type": "expansion", @@ -856,7 +1050,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "3.0", + "cardmarket_id": 7716, + "cmc": 3.0, "collector_number": "44a", "color_identity": [ "B" @@ -865,7 +1060,10 @@ "B" ], "digital": false, - "edhrec_rank": 13499, + "edhrec_rank": 17273, + "finishes": [ + "nonfoil" + ], "flavor_text": "\"It keeps some out, yes. It also keeps others in!\"\n—Grandmother Sengir", "foil": false, "frame": "1993", @@ -876,6 +1074,7 @@ "highres_image": true, "id": "0c6f0614-06dc-4bd2-b8b9-d951ae27db21", "illustration_id": "838191d3-7740-435f-9286-9c6fc9788704", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/0/c/0c6f0614-06dc-4bd2-b8b9-d951ae27db21.jpg?1575874678", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/0/c/0c6f0614-06dc-4bd2-b8b9-d951ae27db21.jpg?1575874678", @@ -891,17 +1090,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -917,9 +1122,11 @@ "oversized": false, "power": "0", "prices": { - "eur": "0.10", + "eur": 0.15, + "eur_foil": null, "tix": null, - "usd": "0.21", + "usd": 0.1, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A443f8dd1-333d-42c4-a286-302a9496209a&unique=prints", @@ -928,8 +1135,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Cemetery+Gate", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2913", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Cemetery+Gate", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Cemetery+Gate&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Cemetery+Gate&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Cemetery+Gate&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1995-10-01", "reprint": false, @@ -938,6 +1145,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/hml?utm_source=api", "scryfall_uri": "https://scryfall.com/card/hml/44a/cemetery-gate?utm_source=api", "set": "hml", + "set_id": "5ac1f606-e682-46e9-ad0f-122a3783581b", "set_name": "Homelands", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Ahml&unique=prints", "set_type": "expansion", @@ -958,7 +1166,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "3.0", + "cardmarket_id": 7717, + "cmc": 3.0, "collector_number": "44b", "color_identity": [ "B" @@ -967,7 +1176,10 @@ "B" ], "digital": false, - "edhrec_rank": 13499, + "edhrec_rank": 17273, + "finishes": [ + "nonfoil" + ], "flavor_text": "\"Just the place for a picnic.\"\n—Murat, Death Speaker", "foil": false, "frame": "1993", @@ -978,6 +1190,7 @@ "highres_image": true, "id": "4a7b2cc1-cb0b-4cb8-963f-453a1d5b0e3c", "illustration_id": "91b840e3-27dc-4782-bf35-eed48631a971", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/a/4a7b2cc1-cb0b-4cb8-963f-453a1d5b0e3c.jpg?1562587268", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/a/4a7b2cc1-cb0b-4cb8-963f-453a1d5b0e3c.jpg?1562587268", @@ -993,17 +1206,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -1019,9 +1238,11 @@ "oversized": false, "power": "0", "prices": { - "eur": "0.10", + "eur": 0.04, + "eur_foil": null, "tix": null, - "usd": "0.10", + "usd": 0.18, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A443f8dd1-333d-42c4-a286-302a9496209a&unique=prints", @@ -1030,8 +1251,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Cemetery+Gate", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2914", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Cemetery+Gate", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Cemetery+Gate&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Cemetery+Gate&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Cemetery+Gate&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1995-10-01", "reprint": false, @@ -1040,6 +1261,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/hml?utm_source=api", "scryfall_uri": "https://scryfall.com/card/hml/44b/cemetery-gate?utm_source=api", "set": "hml", + "set_id": "5ac1f606-e682-46e9-ad0f-122a3783581b", "set_name": "Homelands", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Ahml&unique=prints", "set_type": "expansion", @@ -1061,7 +1283,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "6.0", + "cardmarket_id": 21603, + "cmc": 6.0, "collector_number": "1", "color_identity": [ "W" @@ -1070,7 +1293,10 @@ "W" ], "digital": false, - "edhrec_rank": 1155, + "edhrec_rank": 1891, + "finishes": [ + "nonfoil" + ], "flavor_text": "Ixidor had only to imagine their ruin and Akroma made it so.", "foil": false, "frame": "2003", @@ -1082,6 +1308,7 @@ "highres_image": true, "id": "b8f5e276-d7c3-4b4b-ac5b-9bb1aeeca8d0", "illustration_id": "0cf7d49d-80e5-4da1-88c7-d34427fe0916", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/b/8/b8f5e276-d7c3-4b4b-ac5b-9bb1aeeca8d0.jpg?1562842869", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/b/8/b8f5e276-d7c3-4b4b-ac5b-9bb1aeeca8d0.jpg?1562842869", @@ -1096,17 +1323,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -1122,10 +1355,13 @@ "oracle_id": "ae19dce5-c9fc-4fbe-99b5-dc6a12124a68", "oracle_text": "Destroy all artifacts, creatures, and enchantments.\nCycling {3} ({3}, Discard this card: Draw a card.)", "oversized": false, + "penny_rank": 129, "prices": { - "eur": null, - "tix": "0.65", - "usd": "0.52", + "eur": 0.19, + "eur_foil": null, + "tix": 0.57, + "usd": 0.46, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Aae19dce5-c9fc-4fbe-99b5-dc6a12124a68&unique=prints", @@ -1134,8 +1370,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Akroma%27s+Vengeance", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=205366", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Akroma%27s+Vengeance", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Akroma%27s+Vengeance&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Akroma%27s+Vengeance&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Akroma%27s+Vengeance&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2009-09-04", "reprint": true, @@ -1144,6 +1380,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/hop?utm_source=api", "scryfall_uri": "https://scryfall.com/card/hop/1/akromas-vengeance?utm_source=api", "set": "hop", + "set_id": "7137ffeb-eb1d-466c-a0d3-3157f52b1b10", "set_name": "Planechase", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Ahop&unique=prints", "set_type": "planechase", @@ -1163,7 +1400,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 21641, + "cmc": 1.0, "collector_number": "24", "color_identity": [ "B" @@ -1172,7 +1410,10 @@ "B" ], "digital": false, - "edhrec_rank": 177, + "edhrec_rank": 90, + "finishes": [ + "nonfoil" + ], "flavor_text": "\"If there is such a thing as too much power, I have not discovered it.\"\n—Volrath", "foil": false, "frame": "2003", @@ -1184,6 +1425,7 @@ "highres_image": true, "id": "c8c774f2-110e-476c-a4ff-cc86d31c6ae7", "illustration_id": "d2b19b06-705f-40e4-aace-072885238f4c", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/c/8/c8c774f2-110e-476c-a4ff-cc86d31c6ae7.jpg?1562842886", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/c/8/c8c774f2-110e-476c-a4ff-cc86d31c6ae7.jpg?1562842886", @@ -1196,17 +1438,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", - "historic": "not_legal", + "gladiator": "legal", + "historic": "banned", + "historicbrawl": "legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -1222,10 +1470,13 @@ "oracle_id": "53f7c868-b03e-4fc2-8dcf-a75bbfa3272b", "oracle_text": "Add {B}{B}{B}.", "oversized": false, + "penny_rank": 31, "prices": { - "eur": null, - "tix": "0.40", - "usd": "0.63", + "eur": 0.99, + "eur_foil": null, + "tix": 0.75, + "usd": 0.86, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A53f7c868-b03e-4fc2-8dcf-a75bbfa3272b&unique=prints", @@ -1237,8 +1488,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Dark+Ritual", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=205422", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Dark+Ritual", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Dark+Ritual&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Dark+Ritual&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Dark+Ritual&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2009-09-04", "reprint": true, @@ -1247,6 +1498,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/hop?utm_source=api", "scryfall_uri": "https://scryfall.com/card/hop/24/dark-ritual?utm_source=api", "set": "hop", + "set_id": "7137ffeb-eb1d-466c-a0d3-3157f52b1b10", "set_name": "Planechase", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Ahop&unique=prints", "set_type": "planechase", @@ -1266,7 +1518,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 6220, + "cmc": 1.0, "collector_number": "120", "color_identity": [ "B" @@ -1275,7 +1528,10 @@ "B" ], "digital": false, - "edhrec_rank": 177, + "edhrec_rank": 90, + "finishes": [ + "nonfoil" + ], "flavor_text": "\"Leshrac, my liege, grant me the power I am due.\"\n—Lim-Dûl, the Necromancer", "foil": false, "frame": "1993", @@ -1287,6 +1543,7 @@ "highres_image": true, "id": "4ebcd681-1871-4914-bcd7-6bd95829f6e0", "illustration_id": "2836a448-e4b5-4274-921b-1c19747be426", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/e/4ebcd681-1871-4914-bcd7-6bd95829f6e0.jpg?1562909407", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/e/4ebcd681-1871-4914-bcd7-6bd95829f6e0.jpg?1562909407", @@ -1299,17 +1556,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", - "historic": "not_legal", + "gladiator": "legal", + "historic": "banned", + "historicbrawl": "legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -1324,10 +1587,13 @@ "oracle_id": "53f7c868-b03e-4fc2-8dcf-a75bbfa3272b", "oracle_text": "Add {B}{B}{B}.", "oversized": false, + "penny_rank": 31, "prices": { - "eur": "0.37", - "tix": "4.72", - "usd": "0.53", + "eur": 0.3, + "eur_foil": null, + "tix": 0.96, + "usd": 0.65, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A53f7c868-b03e-4fc2-8dcf-a75bbfa3272b&unique=prints", @@ -1339,16 +1605,17 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Dark+Ritual", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2444", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Dark+Ritual", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Dark+Ritual&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Dark+Ritual&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Dark+Ritual&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "1995-06-01", + "released_at": "1995-06-03", "reprint": true, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/4ebcd681-1871-4914-bcd7-6bd95829f6e0/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ice?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ice/120/dark-ritual?utm_source=api", "set": "ice", + "set_id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "set_name": "Ice Age", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -1368,13 +1635,17 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 6540, + "cmc": 0.0, "collector_number": "380", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -1385,6 +1656,7 @@ "highres_image": true, "id": "fbdcbd97-90a9-45ea-94f6-2a1c6faaf965", "illustration_id": "85f80888-e516-48a6-81c5-28631517c198", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/f/b/fbdcbd97-90a9-45ea-94f6-2a1c6faaf965.jpg?1562942481", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/f/b/fbdcbd97-90a9-45ea-94f6-2a1c6faaf965.jpg?1562942481", @@ -1397,17 +1669,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -1423,9 +1701,11 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.35", - "tix": "0.64", - "usd": "0.61", + "eur": 0.45, + "eur_foil": null, + "tix": 0.37, + "usd": 0.47, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", @@ -1437,16 +1717,17 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2748", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "1995-06-01", + "released_at": "1995-06-03", "reprint": true, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/fbdcbd97-90a9-45ea-94f6-2a1c6faaf965/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ice?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ice/380/forest?utm_source=api", "set": "ice", + "set_id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "set_name": "Ice Age", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -1466,13 +1747,17 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 6541, + "cmc": 0.0, "collector_number": "381", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -1483,6 +1768,7 @@ "highres_image": true, "id": "b346b784-7bde-49d0-bfa9-56236cbe19d9", "illustration_id": "3216ffd5-663a-4b43-9d76-e8bf423c104c", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/b/3/b346b784-7bde-49d0-bfa9-56236cbe19d9.jpg?1562928391", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/b/3/b346b784-7bde-49d0-bfa9-56236cbe19d9.jpg?1562928391", @@ -1495,17 +1781,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -1521,9 +1813,11 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.35", - "tix": "2.12", - "usd": "0.93", + "eur": 0.62, + "eur_foil": null, + "tix": 0.8, + "usd": 0.65, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", @@ -1535,16 +1829,17 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2747", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "1995-06-01", + "released_at": "1995-06-03", "reprint": true, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/b346b784-7bde-49d0-bfa9-56236cbe19d9/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ice?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ice/381/forest?utm_source=api", "set": "ice", + "set_id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "set_name": "Ice Age", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -1564,13 +1859,17 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 6542, + "cmc": 0.0, "collector_number": "382", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -1581,6 +1880,7 @@ "highres_image": true, "id": "768c4d8f-5700-4f0a-9ff2-58422aeb1dac", "illustration_id": "ffee21ee-58f9-4713-888c-a3dfdc96dda3", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/7/6/768c4d8f-5700-4f0a-9ff2-58422aeb1dac.jpg?1562916916", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/7/6/768c4d8f-5700-4f0a-9ff2-58422aeb1dac.jpg?1562916916", @@ -1593,17 +1893,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -1619,9 +1925,11 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.35", - "tix": "7.06", - "usd": "0.55", + "eur": 0.5, + "eur_foil": null, + "tix": 4.41, + "usd": 0.27, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", @@ -1633,16 +1941,17 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2746", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "1995-06-01", + "released_at": "1995-06-03", "reprint": true, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/768c4d8f-5700-4f0a-9ff2-58422aeb1dac/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ice?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ice/382/forest?utm_source=api", "set": "ice", + "set_id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "set_name": "Ice Age", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -1662,13 +1971,17 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 6559, + "cmc": 0.0, "collector_number": "383", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -1679,6 +1992,7 @@ "highres_image": true, "id": "4c0ad95c-d62c-4138-ada0-fa39a63a449e", "illustration_id": "c8eee05b-31a6-4bf8-b0b8-c8b4db5de96a", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/c/4c0ad95c-d62c-4138-ada0-fa39a63a449e.jpg?1562908930", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/c/4c0ad95c-d62c-4138-ada0-fa39a63a449e.jpg?1562908930", @@ -1691,18 +2005,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "not_legal", + "alchemy": "legal", + "brawl": "legal", "commander": "legal", "duel": "legal", - "future": "not_legal", - "historic": "not_legal", + "explorer": "legal", + "future": "legal", + "gladiator": "legal", + "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", - "penny": "not_legal", - "pioneer": "not_legal", - "standard": "not_legal", + "paupercommander": "legal", + "penny": "legal", + "pioneer": "legal", + "premodern": "legal", + "standard": "legal", "vintage": "legal" }, "mana_cost": "", @@ -1717,9 +2037,11 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.89", - "tix": "2.09", - "usd": "1.28", + "eur": 0.37, + "eur_foil": null, + "tix": 2.13, + "usd": 1.65, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A5f0d3be8-e63e-4ade-ae58-6b0c14f2ce6d&unique=prints", @@ -1731,16 +2053,17 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Snow-Covered+Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2749", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Snow-Covered+Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Snow-Covered+Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Snow-Covered+Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Snow-Covered+Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "1995-06-01", + "released_at": "1995-06-03", "reprint": false, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/4c0ad95c-d62c-4138-ada0-fa39a63a449e/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ice?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ice/383/snow-covered-forest?utm_source=api", "set": "ice", + "set_id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "set_name": "Ice Age", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -1760,7 +2083,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 250656, + "cmc": 4.0, "collector_number": "85", "color_identity": [ "B" @@ -1769,7 +2093,11 @@ "B" ], "digital": false, - "edhrec_rank": 11092, + "edhrec_rank": 14484, + "finishes": [ + "nonfoil", + "foil" + ], "flavor_text": "Death took his humanity but not his skill with the knife.", "foil": true, "frame": "2003", @@ -1781,6 +2109,7 @@ "highres_image": true, "id": "59cf0906-04fa-4b30-a7a6-3d117931154f", "illustration_id": "6eb1c27b-7376-4e2c-aad2-9d69f3fbcdc1", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/9/59cf0906-04fa-4b30-a7a6-3d117931154f.jpg?1562830661", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/9/59cf0906-04fa-4b30-a7a6-3d117931154f.jpg?1562830661", @@ -1795,17 +2124,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "restricted", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -1821,12 +2156,15 @@ "oracle_id": "2b211adb-de44-4468-b65d-907a09aa7e9d", "oracle_text": "First strike\nWhenever a creature dealt damage by Abattoir Ghoul this turn dies, you gain life equal to that creature's toughness.", "oversized": false, + "penny_rank": 4666, "power": "3", "prices": { - "eur": "0.08", - "tix": "0.03", - "usd": "0.11", - "usd_foil": "0.31" + "eur": 0.07, + "eur_foil": 0.2, + "tix": 0.04, + "usd": 0.06, + "usd_etched": null, + "usd_foil": 0.27 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A2b211adb-de44-4468-b65d-907a09aa7e9d&unique=prints", "promo": false, @@ -1834,8 +2172,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Abattoir+Ghoul", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=222911", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Abattoir+Ghoul", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Abattoir+Ghoul&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Abattoir+Ghoul&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Abattoir+Ghoul&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2011-09-30", "reprint": false, @@ -1844,6 +2182,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/isd?utm_source=api", "scryfall_uri": "https://scryfall.com/card/isd/85/abattoir-ghoul?utm_source=api", "set": "isd", + "set_id": "d1026945-2969-42b9-be53-f941405a58cb", "set_name": "Innistrad", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aisd&unique=prints", "set_type": "expansion", @@ -1863,7 +2202,6 @@ ], "booster": true, "border_color": "black", - "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", "card_faces": [ { "artist": "Nils Hamm", @@ -1897,6 +2235,7 @@ "colors": [ "U" ], + "flavor_name": "", "flavor_text": "\"Unfortunately, all my test animals have died or escaped, so I shall be the final subject. I feel no fear. This is a momentous night.\"\n—Laboratory notes, final entry", "illustration_id": "c2b5f731-771b-4949-90f3-0ad40d676100", "image_uris": { @@ -1916,13 +2255,18 @@ "type_line": "Creature — Human Insect" } ], - "cmc": "1.0", + "cardmarket_id": 250620, + "cmc": 1.0, "collector_number": "51", "color_identity": [ "U" ], "digital": false, - "edhrec_rank": 8070, + "edhrec_rank": 10674, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "frame_effects": [ @@ -1935,6 +2279,7 @@ ], "highres_image": true, "id": "11bf83bb-c95b-4b4f-9a56-ce7a1816307a", + "image_status": "highres_scan", "keywords": [ "Flying", "Transform" @@ -1942,18 +2287,24 @@ "lang": "en", "layout": "transform", "legalities": { - "brawl": "not_legal", + "alchemy": "legal", + "brawl": "legal", "commander": "legal", "duel": "legal", - "future": "not_legal", - "historic": "not_legal", + "explorer": "legal", + "future": "legal", + "gladiator": "legal", + "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", - "penny": "not_legal", - "pioneer": "not_legal", - "standard": "not_legal", + "paupercommander": "legal", + "penny": "legal", + "pioneer": "legal", + "premodern": "not_legal", + "standard": "legal", "vintage": "legal" }, "mtgo_foil_id": 42437, @@ -1967,11 +2318,14 @@ "object": "card", "oracle_id": "edd531b9-f615-4399-8c8c-1c5e18c4acbf", "oversized": false, + "penny_rank": 97, "prices": { - "eur": "0.99", - "tix": "0.03", - "usd": "1.02", - "usd_foil": "4.27" + "eur": 0.57, + "eur_foil": 5.75, + "tix": 0.02, + "usd": 0.32, + "usd_etched": null, + "usd_foil": 6.22 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Aedd531b9-f615-4399-8c8c-1c5e18c4acbf&unique=prints", "promo": false, @@ -1979,8 +2333,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Delver+of+Secrets", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=226749", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Delver+of+Secrets", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Delver+of+Secrets&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Delver+of+Secrets+%2F%2F+Insectile+Aberration&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Delver+of+Secrets+%2F%2F+Insectile+Aberration&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2011-09-30", "reprint": false, @@ -1989,6 +2343,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/isd?utm_source=api", "scryfall_uri": "https://scryfall.com/card/isd/51/delver-of-secrets-insectile-aberration?utm_source=api", "set": "isd", + "set_id": "d1026945-2969-42b9-be53-f941405a58cb", "set_name": "Innistrad", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aisd&unique=prints", "set_type": "expansion", @@ -2008,13 +2363,18 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 250377, + "cmc": 0.0, "collector_number": "262", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -2025,6 +2385,7 @@ "highres_image": true, "id": "b606f644-1728-4cb3-90ed-121838875de1", "illustration_id": "761757ff-d26d-4aee-910e-1bc597a82569", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/b/6/b606f644-1728-4cb3-90ed-121838875de1.jpg?1562835915", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/b/6/b606f644-1728-4cb3-90ed-121838875de1.jpg?1562835915", @@ -2037,17 +2398,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -2064,10 +2431,12 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.10", - "tix": "0.03", - "usd": "0.30", - "usd_foil": "3.66" + "eur": 0.1, + "eur_foil": 0.89, + "tix": 0.03, + "usd": 0.15, + "usd_etched": null, + "usd_foil": 3.55 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", "produced_mana": [ @@ -2078,8 +2447,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=245247", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2011-09-30", "reprint": true, @@ -2088,6 +2457,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/isd?utm_source=api", "scryfall_uri": "https://scryfall.com/card/isd/262/forest?utm_source=api", "set": "isd", + "set_id": "d1026945-2969-42b9-be53-f941405a58cb", "set_name": "Innistrad", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aisd&unique=prints", "set_type": "expansion", @@ -2107,13 +2477,18 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 250378, + "cmc": 0.0, "collector_number": "263", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -2124,6 +2499,7 @@ "highres_image": true, "id": "16f52885-1f01-4f06-90a8-1a0ecf291ab5", "illustration_id": "c070ced7-22af-4965-988a-b3cb9c0e5395", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/1/6/16f52885-1f01-4f06-90a8-1a0ecf291ab5.jpg?1562826752", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/1/6/16f52885-1f01-4f06-90a8-1a0ecf291ab5.jpg?1562826752", @@ -2136,17 +2512,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -2163,10 +2545,12 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.16", - "tix": "0.03", - "usd": "0.24", - "usd_foil": "1.32" + "eur": 0.1, + "eur_foil": 0.64, + "tix": 0.03, + "usd": 0.14, + "usd_etched": null, + "usd_foil": 1.51 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", "produced_mana": [ @@ -2177,8 +2561,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=245248", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2011-09-30", "reprint": true, @@ -2187,6 +2571,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/isd?utm_source=api", "scryfall_uri": "https://scryfall.com/card/isd/263/forest?utm_source=api", "set": "isd", + "set_id": "d1026945-2969-42b9-be53-f941405a58cb", "set_name": "Innistrad", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aisd&unique=prints", "set_type": "expansion", @@ -2206,13 +2591,18 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 250379, + "cmc": 0.0, "collector_number": "264", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -2223,6 +2613,7 @@ "highres_image": true, "id": "4dea3762-c6ae-4304-aee4-6c3f56685319", "illustration_id": "f989d490-7ebb-417d-bb24-ed455160414e", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/d/4dea3762-c6ae-4304-aee4-6c3f56685319.jpg?1562829937", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/d/4dea3762-c6ae-4304-aee4-6c3f56685319.jpg?1562829937", @@ -2235,17 +2626,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -2262,10 +2659,12 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "0.18", - "tix": "0.03", - "usd": "0.25", - "usd_foil": "0.82" + "eur": 0.17, + "eur_foil": 0.84, + "tix": 0.03, + "usd": 0.21, + "usd_etched": null, + "usd_foil": 1.0 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", "produced_mana": [ @@ -2276,8 +2675,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=245246", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2011-09-30", "reprint": true, @@ -2286,6 +2685,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/isd?utm_source=api", "scryfall_uri": "https://scryfall.com/card/isd/264/forest?utm_source=api", "set": "isd", + "set_id": "d1026945-2969-42b9-be53-f941405a58cb", "set_name": "Innistrad", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aisd&unique=prints", "set_type": "expansion", @@ -2305,7 +2705,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "5.0", + "cardmarket_id": 5280, + "cmc": 5.0, "collector_number": "46", "color_identity": [ "U" @@ -2314,7 +2715,10 @@ "U" ], "digital": false, - "edhrec_rank": 11253, + "edhrec_rank": 15369, + "finishes": [ + "nonfoil" + ], "flavor_text": "These spirits of the air are winsome and wild, and cannot be truly contained. Only marginally intelligent, they often substitute whimsy for strategy, delighting in mischief and mayhem.", "foil": false, "frame": "1993", @@ -2325,6 +2729,7 @@ "highres_image": true, "id": "69c3b2a3-0daa-4d42-832d-fcdfda6555ea", "illustration_id": "67f66b28-3ee8-4ce0-a184-cb3d7c8fdb4f", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/9/69c3b2a3-0daa-4d42-832d-fcdfda6555ea.jpg?1559591522", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/9/69c3b2a3-0daa-4d42-832d-fcdfda6555ea.jpg?1559591522", @@ -2339,18 +2744,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "not_legal", + "paupercommander": "restricted", "penny": "legal", "pioneer": "legal", - "standard": "legal", + "premodern": "legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{3}{U}{U}", @@ -2363,11 +2774,14 @@ "oracle_id": "7744bae4-a8b7-44a5-9b4c-0048ad4cc448", "oracle_text": "Flying", "oversized": false, + "penny_rank": 6501, "power": "4", "prices": { - "eur": "69.45", + "eur": 449.95, + "eur_foil": null, "tix": null, - "usd": "51.25", + "usd": null, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A7744bae4-a8b7-44a5-9b4c-0048ad4cc448&unique=prints", @@ -2376,8 +2790,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Air+Elemental", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=94", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Air+Elemental", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Air+Elemental&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Air+Elemental&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Air+Elemental&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1993-08-05", "reprint": false, @@ -2386,6 +2800,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/lea?utm_source=api", "scryfall_uri": "https://scryfall.com/card/lea/46/air-elemental?utm_source=api", "set": "lea", + "set_id": "288bd996-960e-448b-a187-9504c1930c2c", "set_name": "Limited Edition Alpha", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Alea&unique=prints", "set_type": "core", @@ -2406,7 +2821,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 5240, + "cmc": 1.0, "collector_number": "98", "color_identity": [ "B" @@ -2415,7 +2831,10 @@ "B" ], "digital": false, - "edhrec_rank": 177, + "edhrec_rank": 90, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -2425,6 +2844,7 @@ "highres_image": true, "id": "ebb6664d-23ca-456e-9916-afcd6f26aa7f", "illustration_id": "827c7f7b-1c5b-4bc0-91d7-b9894f7a2674", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/e/b/ebb6664d-23ca-456e-9916-afcd6f26aa7f.jpg?1559591495", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/e/b/ebb6664d-23ca-456e-9916-afcd6f26aa7f.jpg?1559591495", @@ -2437,17 +2857,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", - "historic": "not_legal", + "gladiator": "legal", + "historic": "banned", + "historicbrawl": "legal", "legacy": "legal", "modern": "not_legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -2461,10 +2887,13 @@ "oracle_id": "53f7c868-b03e-4fc2-8dcf-a75bbfa3272b", "oracle_text": "Add {B}{B}{B}.", "oversized": false, + "penny_rank": 31, "prices": { - "eur": "92.80", + "eur": 179.5, + "eur_foil": null, "tix": null, - "usd": "274.99", + "usd": 312.47, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A53f7c868-b03e-4fc2-8dcf-a75bbfa3272b&unique=prints", @@ -2476,8 +2905,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Dark+Ritual", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=54", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Dark+Ritual", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Dark+Ritual&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Dark+Ritual&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Dark+Ritual&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1993-08-05", "reprint": false, @@ -2486,6 +2915,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/lea?utm_source=api", "scryfall_uri": "https://scryfall.com/card/lea/98/dark-ritual?utm_source=api", "set": "lea", + "set_id": "288bd996-960e-448b-a187-9504c1930c2c", "set_name": "Limited Edition Alpha", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Alea&unique=prints", "set_type": "core", @@ -2505,13 +2935,17 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 5513, + "cmc": 0.0, "collector_number": "294", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -2521,6 +2955,7 @@ "highres_image": true, "id": "6f1c8cb0-38eb-408b-94e8-16db83999b3b", "illustration_id": "a65460f1-5185-4bae-94bd-ed49a330d505", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/f/6f1c8cb0-38eb-408b-94e8-16db83999b3b.jpg?1559591465", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/f/6f1c8cb0-38eb-408b-94e8-16db83999b3b.jpg?1559591465", @@ -2533,17 +2968,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -2558,9 +2999,11 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "16.18", + "eur": 55.0, + "eur_foil": null, "tix": null, - "usd": "38.94", + "usd": 85.85, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", @@ -2572,8 +3015,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=289", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1993-08-05", "reprint": false, @@ -2582,6 +3025,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/lea?utm_source=api", "scryfall_uri": "https://scryfall.com/card/lea/294/forest?utm_source=api", "set": "lea", + "set_id": "288bd996-960e-448b-a187-9504c1930c2c", "set_name": "Limited Edition Alpha", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Alea&unique=prints", "set_type": "core", @@ -2601,13 +3045,17 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 5512, + "cmc": 0.0, "collector_number": "295", "color_identity": [ "G" ], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -2617,6 +3065,7 @@ "highres_image": true, "id": "f20c89d9-71c9-45f5-a9cb-6e253b0a7cca", "illustration_id": "3b022529-b95d-4338-b4be-0d26fc37f2df", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/f/2/f20c89d9-71c9-45f5-a9cb-6e253b0a7cca.jpg?1559591510", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/f/2/f20c89d9-71c9-45f5-a9cb-6e253b0a7cca.jpg?1559591510", @@ -2629,17 +3078,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "legal", "vintage": "legal" }, @@ -2654,9 +3109,11 @@ "oracle_text": "({T}: Add {G}.)", "oversized": false, "prices": { - "eur": "16.18", + "eur": 89.5, + "eur_foil": null, "tix": null, - "usd": "47.91", + "usd": 93.24, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ab34bb2dc-c1af-4d77-b0b3-a0fb342a5fc6&unique=prints", @@ -2668,8 +3125,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Forest", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=288", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Forest", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Forest&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Forest&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1993-08-05", "reprint": false, @@ -2678,6 +3135,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/lea?utm_source=api", "scryfall_uri": "https://scryfall.com/card/lea/295/forest?utm_source=api", "set": "lea", + "set_id": "288bd996-960e-448b-a187-9504c1930c2c", "set_name": "Limited Edition Alpha", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Alea&unique=prints", "set_type": "core", @@ -2715,7 +3173,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "1.0", + "cardmarket_id": 261913, + "cmc": 1.0, "collector_number": "167", "color_identity": [ "G" @@ -2724,7 +3183,11 @@ "G" ], "digital": false, - "edhrec_rank": 4684, + "edhrec_rank": 6396, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -2735,6 +3198,7 @@ "highres_image": true, "id": "69d20d28-76e9-4e6e-95c3-f88c51dfabfd", "illustration_id": "c5e63c9c-3c6d-473a-8af9-ac3260ea6a24", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/9/69d20d28-76e9-4e6e-95c3-f88c51dfabfd.jpg?1561967373", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/9/69d20d28-76e9-4e6e-95c3-f88c51dfabfd.jpg?1561967373", @@ -2747,17 +3211,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -2773,12 +3243,15 @@ "oracle_id": "46abaabe-7015-4d82-a5aa-2706b1f51bed", "oracle_text": "At the beginning of your upkeep, put a spore counter on Thallid.\nRemove three spore counters from Thallid: Create a 1/1 green Saproling creature token.", "oversized": false, + "penny_rank": 8490, "power": "1", "prices": { - "eur": "0.17", - "tix": "0.03", - "usd": "0.30", - "usd_foil": "0.40" + "eur": 0.12, + "eur_foil": 0.49, + "tix": 0.03, + "usd": 0.27, + "usd_etched": null, + "usd_foil": 0.47 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A46abaabe-7015-4d82-a5aa-2706b1f51bed&unique=prints", "promo": false, @@ -2786,8 +3259,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Thallid", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=370352", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Thallid", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Thallid&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Thallid&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2013-06-07", "reprint": true, @@ -2796,6 +3269,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/mma?utm_source=api", "scryfall_uri": "https://scryfall.com/card/mma/167/thallid?utm_source=api", "set": "mma", + "set_id": "0b7020f2-336d-4706-9ce6-f6710b9ebd5c", "set_name": "Modern Masters", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Amma&unique=prints", "set_type": "masters", @@ -2816,11 +3290,15 @@ "booster": false, "border_color": "black", "card_back_id": "1b2396d4-9048-439d-96bd-354288518841", - "cmc": "0.0", + "cardmarket_id": 240531, + "cmc": 0.0, "collector_number": "1★", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "flavor_text": "\"Take a moment. Ponder the depths of your insignificance.\"", "foil": false, "frame": "2003", @@ -2831,6 +3309,7 @@ "highres_image": true, "id": "17b941e9-5dcc-473e-a461-709d74e32a3c", "illustration_id": "3ab0dfe8-ae12-4327-aae6-0d8708d4efd8", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/1/7/17b941e9-5dcc-473e-a461-709d74e32a3c.jpg?1562252328", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/1/7/17b941e9-5dcc-473e-a461-709d74e32a3c.jpg?1562252328", @@ -2843,17 +3322,23 @@ "lang": "en", "layout": "scheme", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -2868,9 +3353,11 @@ "oracle_text": "When you set this scheme in motion, take an extra turn after this one. Schemes can't be set in motion that turn.", "oversized": true, "prices": { - "eur": null, + "eur": 16.99, + "eur_foil": null, "tix": null, - "usd": "15.77", + "usd": 23.18, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A402ba90d-6c41-49ee-ab50-7f0a466f66fe&unique=prints", @@ -2879,8 +3366,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=All+in+Good+Time", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=212648", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=All+in+Good+Time", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=All+in+Good+Time&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=All+in+Good+Time&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=All+in+Good+Time&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2010-06-18", "reprint": false, @@ -2889,6 +3376,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/oarc?utm_source=api", "scryfall_uri": "https://scryfall.com/card/oarc/1%E2%98%85/all-in-good-time?utm_source=api", "set": "oarc", + "set_id": "238beedf-1d4d-475f-a980-527ba2f55dc6", "set_name": "Archenemy Schemes", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aoarc&unique=prints", "set_type": "archenemy", @@ -2908,11 +3396,16 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 287050, + "cmc": 0.0, "collector_number": "183", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": true, @@ -2923,6 +3416,7 @@ "highres_image": true, "id": "7019912c-bd9b-4b96-9388-400794909aa1", "illustration_id": "27777a6f-cf59-4515-bcc4-8a6020d0d865", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/7/0/7019912c-bd9b-4b96-9388-400794909aa1.jpg?1562917413", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/7/0/7019912c-bd9b-4b96-9388-400794909aa1.jpg?1562917413", @@ -2935,17 +3429,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", - "penny": "not_legal", + "paupercommander": "legal", + "penny": "legal", "pioneer": "legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -2962,10 +3462,12 @@ "oracle_text": "{T}: Add {C}.", "oversized": false, "prices": { - "eur": "0.19", - "tix": "0.02", - "usd": "0.68", - "usd_foil": "4.60" + "eur": 0.31, + "eur_foil": 3.85, + "tix": 0.02, + "usd": 0.71, + "usd_etched": null, + "usd_foil": 6.72 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A05d24b0c-904a-46b6-b42a-96a4d91a0dd4&unique=prints", "produced_mana": [ @@ -2976,8 +3478,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Wastes", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=407694", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Wastes", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Wastes&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2016-01-22", "reprint": false, @@ -2986,6 +3488,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/ogw?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ogw/183/wastes?utm_source=api", "set": "ogw", + "set_id": "cd51d245-8f95-45b0-ab5f-e2b3a3eb5dfe", "set_name": "Oath of the Gatewatch", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aogw&unique=prints", "set_type": "expansion", @@ -3005,11 +3508,15 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 287178, + "cmc": 0.0, "collector_number": "183a", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2015", "full_art": false, @@ -3020,6 +3527,7 @@ "highres_image": true, "id": "9cc070d3-4b83-4684-9caf-063e5c473a77", "illustration_id": "27777a6f-cf59-4515-bcc4-8a6020d0d865", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/9/c/9cc070d3-4b83-4684-9caf-063e5c473a77.jpg?1562926596", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/9/c/9cc070d3-4b83-4684-9caf-063e5c473a77.jpg?1562926596", @@ -3032,17 +3540,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", - "penny": "not_legal", + "paupercommander": "legal", + "penny": "legal", "pioneer": "legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -3057,9 +3571,11 @@ "oracle_text": "{T}: Add {C}.", "oversized": false, "prices": { - "eur": null, + "eur": 1.18, + "eur_foil": null, "tix": null, - "usd": "3.28", + "usd": 1.79, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A05d24b0c-904a-46b6-b42a-96a4d91a0dd4&unique=prints", @@ -3071,8 +3587,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Wastes", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=407693", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Wastes", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Wastes&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2016-01-22", "reprint": false, @@ -3081,6 +3597,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/ogw?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ogw/183a/wastes?utm_source=api", "set": "ogw", + "set_id": "cd51d245-8f95-45b0-ab5f-e2b3a3eb5dfe", "set_name": "Oath of the Gatewatch", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aogw&unique=prints", "set_type": "expansion", @@ -3100,11 +3617,16 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 287051, + "cmc": 0.0, "collector_number": "184", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": true, @@ -3115,6 +3637,7 @@ "highres_image": true, "id": "69b215fe-0d97-4ca1-9490-174220fd454b", "illustration_id": "8b1f166f-fbc9-42da-8dcd-5a5ea38652c3", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/9/69b215fe-0d97-4ca1-9490-174220fd454b.jpg?1562916234", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/9/69b215fe-0d97-4ca1-9490-174220fd454b.jpg?1562916234", @@ -3127,17 +3650,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", - "penny": "not_legal", + "paupercommander": "legal", + "penny": "legal", "pioneer": "legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -3154,10 +3683,12 @@ "oracle_text": "{T}: Add {C}.", "oversized": false, "prices": { - "eur": "0.22", - "tix": "0.02", - "usd": "0.80", - "usd_foil": "8.59" + "eur": 0.35, + "eur_foil": 5.75, + "tix": 0.02, + "usd": 0.7, + "usd_etched": null, + "usd_foil": 16.74 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A05d24b0c-904a-46b6-b42a-96a4d91a0dd4&unique=prints", "produced_mana": [ @@ -3168,8 +3699,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Wastes", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=407696", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Wastes", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Wastes&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2016-01-22", "reprint": false, @@ -3178,6 +3709,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/ogw?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ogw/184/wastes?utm_source=api", "set": "ogw", + "set_id": "cd51d245-8f95-45b0-ab5f-e2b3a3eb5dfe", "set_name": "Oath of the Gatewatch", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aogw&unique=prints", "set_type": "expansion", @@ -3197,11 +3729,15 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 287179, + "cmc": 0.0, "collector_number": "184a", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2015", "full_art": false, @@ -3212,6 +3748,7 @@ "highres_image": true, "id": "60682c00-c661-4a9d-8326-f3f014a04e3e", "illustration_id": "8b1f166f-fbc9-42da-8dcd-5a5ea38652c3", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/0/60682c00-c661-4a9d-8326-f3f014a04e3e.jpg?1562914528", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/0/60682c00-c661-4a9d-8326-f3f014a04e3e.jpg?1562914528", @@ -3224,17 +3761,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "legal", - "penny": "not_legal", + "paupercommander": "legal", + "penny": "legal", "pioneer": "legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -3249,9 +3792,11 @@ "oracle_text": "{T}: Add {C}.", "oversized": false, "prices": { - "eur": null, + "eur": 1.39, + "eur_foil": null, "tix": null, - "usd": "0.66", + "usd": 0.86, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A05d24b0c-904a-46b6-b42a-96a4d91a0dd4&unique=prints", @@ -3263,8 +3808,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Wastes", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=407695", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Wastes", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Wastes&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Wastes&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2016-01-22", "reprint": false, @@ -3273,6 +3818,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/ogw?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ogw/184a/wastes?utm_source=api", "set": "ogw", + "set_id": "cd51d245-8f95-45b0-ab5f-e2b3a3eb5dfe", "set_name": "Oath of the Gatewatch", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aogw&unique=prints", "set_type": "expansion", @@ -3292,11 +3838,15 @@ "booster": false, "border_color": "black", "card_back_id": "7840c131-f96b-4700-9347-2215c43156e6", - "cmc": "0.0", + "cardmarket_id": 21475, + "cmc": 0.0, "collector_number": "1", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2003", "full_art": false, @@ -3307,6 +3857,7 @@ "highres_image": true, "id": "3f770c56-58ea-4b70-b9b6-9b2cb13e2234", "illustration_id": "8d617a18-0f09-4471-8ac6-f0928f1f9912", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/3/f/3f770c56-58ea-4b70-b9b6-9b2cb13e2234.jpg?1547434215", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/3/f/3f770c56-58ea-4b70-b9b6-9b2cb13e2234.jpg?1547434215", @@ -3319,17 +3870,23 @@ "lang": "en", "layout": "planar", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -3344,9 +3901,11 @@ "oracle_text": "At the beginning of your end step, if you have no cards in hand, draw seven cards.\nWhenever you roll {CHAOS}, discard your hand.", "oversized": true, "prices": { - "eur": null, + "eur": 1.46, + "eur_foil": null, "tix": null, - "usd": "2.50", + "usd": 3.59, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A15b979de-c8ee-4664-9ca7-6c4eb3346967&unique=prints", @@ -3355,8 +3914,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Academy+at+Tolaria+West", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=198073", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Academy+at+Tolaria+West", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Academy+at+Tolaria+West&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Academy+at+Tolaria+West&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Academy+at+Tolaria+West&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2009-09-04", "reprint": false, @@ -3365,6 +3924,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/ohop?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ohop/1/academy-at-tolaria-west?utm_source=api", "set": "ohop", + "set_id": "7a8b75a9-7c92-4c3f-976a-322e1eb3b6b6", "set_name": "Planechase Planes", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aohop&unique=prints", "set_type": "planechase", @@ -3384,11 +3944,15 @@ "booster": false, "border_color": "black", "card_back_id": "7840c131-f96b-4700-9347-2215c43156e6", - "cmc": "0.0", + "cardmarket_id": 256187, + "cmc": 0.0, "collector_number": "9", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2003", "full_art": false, @@ -3399,6 +3963,7 @@ "highres_image": true, "id": "fabef637-fb4b-41b5-8d12-5568e84c6d11", "illustration_id": "0d0681f8-ecba-4289-ac18-2292b9dc9c0b", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/f/a/fabef637-fb4b-41b5-8d12-5568e84c6d11.jpg?1547434323", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/f/a/fabef637-fb4b-41b5-8d12-5568e84c6d11.jpg?1547434323", @@ -3411,17 +3976,23 @@ "lang": "en", "layout": "planar", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -3436,9 +4007,11 @@ "oracle_text": "Players may cast enchantment spells as though they had flash.\nWhenever you roll {CHAOS}, destroy target creature that isn't enchanted.", "oversized": true, "prices": { - "eur": null, + "eur": 0.55, + "eur_foil": null, "tix": null, - "usd": "0.73", + "usd": 1.31, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A25650a32-4014-4065-ad01-7357c3ad3995&unique=prints", @@ -3447,8 +4020,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Akoum", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=226512", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Akoum", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Akoum&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Akoum&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Akoum&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2012-06-01", "reprint": false, @@ -3457,6 +4030,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/opc2?utm_source=api", "scryfall_uri": "https://scryfall.com/card/opc2/9/akoum?utm_source=api", "set": "opc2", + "set_id": "7079031b-c5b0-4353-87af-a63a0f204f47", "set_name": "Planechase 2012 Planes", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aopc2&unique=prints", "set_type": "planechase", @@ -3476,11 +4050,15 @@ "booster": false, "border_color": "black", "card_back_id": "7840c131-f96b-4700-9347-2215c43156e6", - "cmc": "0.0", + "cardmarket_id": 256186, + "cmc": 0.0, "collector_number": "1", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2003", "full_art": false, @@ -3491,6 +4069,7 @@ "highres_image": true, "id": "36ab24d3-ca9d-4b9c-8c28-4dd1f05a2314", "illustration_id": "375c30bc-2186-433f-a201-759ac76388ba", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/3/6/36ab24d3-ca9d-4b9c-8c28-4dd1f05a2314.jpg?1547434158", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/3/6/36ab24d3-ca9d-4b9c-8c28-4dd1f05a2314.jpg?1547434158", @@ -3503,17 +4082,23 @@ "lang": "en", "layout": "planar", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -3525,12 +4110,14 @@ "nonfoil": true, "object": "card", "oracle_id": "6dc67a65-31bf-4535-9e02-8f6d6ecefde5", - "oracle_text": "When you encounter Chaotic Aether, each blank roll of the planar die is a CHAOS roll until a player planeswalks away from a plane. (Then planeswalk away from this phenomenon.)", + "oracle_text": "When you encounter Chaotic Aether, each blank roll of the planar die is a {CHAOS} roll until a player planeswalks away from a plane. (Then planeswalk away from this phenomenon.)", "oversized": true, "prices": { - "eur": null, + "eur": 0.51, + "eur_foil": null, "tix": null, - "usd": "1.13", + "usd": 1.62, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A6dc67a65-31bf-4535-9e02-8f6d6ecefde5&unique=prints", @@ -3539,8 +4126,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Chaotic+Aether", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=226509", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Chaotic+Aether", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Chaotic+Aether&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Chaotic+Aether&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Chaotic+Aether&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2012-06-01", "reprint": false, @@ -3549,6 +4136,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/opc2?utm_source=api", "scryfall_uri": "https://scryfall.com/card/opc2/1/chaotic-aether?utm_source=api", "set": "opc2", + "set_id": "7079031b-c5b0-4353-87af-a63a0f204f47", "set_name": "Planechase 2012 Planes", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aopc2&unique=prints", "set_type": "planechase", @@ -3568,7 +4156,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 256207, + "cmc": 4.0, "collector_number": "1", "color_identity": [ "W" @@ -3577,7 +4166,10 @@ "W" ], "digital": false, - "edhrec_rank": 14200, + "edhrec_rank": 18268, + "finishes": [ + "nonfoil" + ], "flavor_text": "When an order for griffin barding comes in, blacksmiths prepare their forges for months of exacting work. They know griffins always detect imperfections and never haggle.", "foil": false, "frame": "2003", @@ -3589,6 +4181,7 @@ "highres_image": true, "id": "0f638ffc-20b3-4e8c-8f0a-0d034902bddd", "illustration_id": "3b5d36c9-2fc0-43b1-8878-ec476a6feaf4", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/0/f/0f638ffc-20b3-4e8c-8f0a-0d034902bddd.jpg?1575571386", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/0/f/0f638ffc-20b3-4e8c-8f0a-0d034902bddd.jpg?1575571386", @@ -3604,17 +4197,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "legal", + "paupercommander": "legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -3632,9 +4231,11 @@ "oversized": false, "power": "2", "prices": { - "eur": "0.18", - "tix": "0.05", - "usd": "0.15", + "eur": 0.05, + "eur_foil": null, + "tix": 0.03, + "usd": 0.1, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Aad3d6003-66d3-486d-aa54-ddce1adb5ff1&unique=prints", @@ -3643,8 +4244,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Armored+Griffin", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=271234", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Armored+Griffin", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Armored+Griffin&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Armored+Griffin&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Armored+Griffin&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2012-06-01", "reprint": true, @@ -3653,6 +4254,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/pc2?utm_source=api", "scryfall_uri": "https://scryfall.com/card/pc2/1/armored-griffin?utm_source=api", "set": "pc2", + "set_id": "9fb2f83e-7015-4aa9-808f-310ccf0fdb9c", "set_name": "Planechase 2012", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apc2&unique=prints", "set_type": "planechase", @@ -3673,7 +4275,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 272058, + "cmc": 4.0, "collector_number": "11", "color_identity": [ "W" @@ -3682,7 +4285,10 @@ "W" ], "digital": false, - "edhrec_rank": 5738, + "edhrec_rank": 9226, + "finishes": [ + "foil" + ], "flavor_text": "\"Dragons seek war. I bring it to them.\"", "foil": true, "frame": "2015", @@ -3693,6 +4299,7 @@ "highres_image": true, "id": "6daabdc2-e8a8-41a6-a9f0-1973d9c31d39", "illustration_id": "df13e192-e174-4335-aa66-759bc84bef4e", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/d/6daabdc2-e8a8-41a6-a9f0-1973d9c31d39.jpg?1562920845", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/d/6daabdc2-e8a8-41a6-a9f0-1973d9c31d39.jpg?1562920845", @@ -3707,17 +4314,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -3729,32 +4342,37 @@ "oracle_id": "9fc6e1db-cf09-4b8c-be4f-bb02ffe7a188", "oracle_text": "At the beginning of your end step, bolster X, where X is the number of tapped creatures you control. (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.)", "oversized": false, + "penny_rank": 5103, "power": "2", "prices": { - "eur": "1.21", + "eur": null, + "eur_foil": 0.2, "tix": null, "usd": null, - "usd_foil": "0.74" + "usd_etched": null, + "usd_foil": 0.69 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A9fc6e1db-cf09-4b8c-be4f-bb02ffe7a188&unique=prints", "promo": true, "promo_types": [ - "intropack", - "setpromo" + "setpromo", + "intropack" ], "rarity": "rare", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Dragonscale+General", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Dragonscale+General", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Dragonscale+General&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Dragonscale+General&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Dragonscale+General&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "2015-01-24", + "released_at": "2015-01-23", "reprint": true, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/6daabdc2-e8a8-41a6-a9f0-1973d9c31d39/rulings", "scryfall_set_uri": "https://scryfall.com/sets/pfrf?utm_source=api", "scryfall_uri": "https://scryfall.com/card/pfrf/11/dragonscale-general?utm_source=api", + "security_stamp": "oval", "set": "pfrf", + "set_id": "aa9f80e3-8d60-46b7-b91e-eb1736fde866", "set_name": "Fate Reforged Promos", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apfrf&unique=prints", "set_type": "promo", @@ -3776,7 +4394,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 272208, + "cmc": 4.0, "collector_number": "11s", "color_identity": [ "W" @@ -3785,7 +4404,10 @@ "W" ], "digital": false, - "edhrec_rank": 5738, + "edhrec_rank": 9226, + "finishes": [ + "foil" + ], "flavor_text": "\"Dragons seek war. I bring it to them.\"", "foil": true, "frame": "2015", @@ -3796,6 +4418,7 @@ "highres_image": true, "id": "dc2d84b1-c6db-43af-ba8f-b9b90ceee1a3", "illustration_id": "b289082a-84c0-45f7-8131-68360d692d1c", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/d/c/dc2d84b1-c6db-43af-ba8f-b9b90ceee1a3.jpg?1562947407", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/d/c/dc2d84b1-c6db-43af-ba8f-b9b90ceee1a3.jpg?1562947407", @@ -3810,17 +4433,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -3832,33 +4461,38 @@ "oracle_id": "9fc6e1db-cf09-4b8c-be4f-bb02ffe7a188", "oracle_text": "At the beginning of your end step, bolster X, where X is the number of tapped creatures you control. (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.)", "oversized": false, + "penny_rank": 5103, "power": "2", "prices": { "eur": null, + "eur_foil": 1.8, "tix": null, "usd": null, - "usd_foil": "0.45" + "usd_etched": null, + "usd_foil": 0.38 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A9fc6e1db-cf09-4b8c-be4f-bb02ffe7a188&unique=prints", "promo": true, "promo_types": [ - "datestamped", + "setpromo", "prerelease", - "setpromo" + "datestamped" ], "rarity": "rare", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Dragonscale+General", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Dragonscale+General", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Dragonscale+General&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Dragonscale+General&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Dragonscale+General&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, - "released_at": "2015-01-24", + "released_at": "2015-01-23", "reprint": true, "reserved": false, "rulings_uri": "https://api.scryfall.com/cards/dc2d84b1-c6db-43af-ba8f-b9b90ceee1a3/rulings", "scryfall_set_uri": "https://scryfall.com/sets/pfrf?utm_source=api", "scryfall_uri": "https://scryfall.com/card/pfrf/11s/dragonscale-general?utm_source=api", + "security_stamp": "oval", "set": "pfrf", + "set_id": "aa9f80e3-8d60-46b7-b91e-eb1736fde866", "set_name": "Fate Reforged Promos", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apfrf&unique=prints", "set_type": "promo", @@ -3880,11 +4514,15 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 255442, + "cmc": 0.0, "collector_number": "P1", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2003", "full_art": false, @@ -3895,6 +4533,7 @@ "highres_image": true, "id": "57f25ead-b3ec-4c40-972d-d750ed2f5319", "illustration_id": "85527664-3aa4-4e96-9ba1-b8e233f7442a", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/7/57f25ead-b3ec-4c40-972d-d750ed2f5319.jpg?1549805757", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/7/57f25ead-b3ec-4c40-972d-d750ed2f5319.jpg?1549805757", @@ -3907,17 +4546,23 @@ "lang": "en", "layout": "planar", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -3932,9 +4577,11 @@ "oracle_text": "Players have no maximum hand size.\nWhenever you roll the planar die, draw a card.\nWhenever you roll {CHAOS}, reveal the top card of your planar deck. You may put it on the bottom of your planar deck.", "oversized": true, "prices": { - "eur": null, + "eur": 2.84, + "eur_foil": null, "tix": null, - "usd": "2.84", + "usd": 2.63, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A7a425df4-7010-462e-9cb5-20389bac721c&unique=prints", @@ -3946,8 +4593,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Stairs+to+Infinity", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=226521", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Stairs+to+Infinity", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Stairs+to+Infinity&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Stairs+to+Infinity&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Stairs+to+Infinity&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2012-06-01", "reprint": true, @@ -3956,6 +4603,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/phop?utm_source=api", "scryfall_uri": "https://scryfall.com/card/phop/P1/stairs-to-infinity?utm_source=api", "set": "phop", + "set_id": "ef3f6784-a6e8-41ff-8bed-72e0c7121298", "set_name": "Promotional Planes", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aphop&unique=prints", "set_type": "promo", @@ -3975,11 +4623,15 @@ "booster": false, "border_color": "black", "card_back_id": "7840c131-f96b-4700-9347-2215c43156e6", - "cmc": "0.0", + "cardmarket_id": 21474, + "cmc": 0.0, "collector_number": "41", "color_identity": [], "colors": [], "digital": false, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "2003", "full_art": false, @@ -3989,6 +4641,7 @@ "highres_image": true, "id": "76e5383d-ac12-4abc-aa30-15e99ded2d6f", "illustration_id": "b1188b1e-7a18-47b7-a9b3-1d91445369a9", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/7/6/76e5383d-ac12-4abc-aa30-15e99ded2d6f.jpg?1547432249", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/7/6/76e5383d-ac12-4abc-aa30-15e99ded2d6f.jpg?1547432249", @@ -4001,17 +4654,23 @@ "lang": "en", "layout": "planar", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -4026,9 +4685,11 @@ "oracle_text": "Creatures can't block.\nWhenever you roll {CHAOS}, draw a card for each land you control.", "oversized": true, "prices": { - "eur": null, + "eur": 9.99, + "eur_foil": null, "tix": null, - "usd": "9.55", + "usd": 11.47, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A97f708de-9271-4137-a9fe-dda25b922900&unique=prints", @@ -4040,8 +4701,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Tazeem", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=198069", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Tazeem", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Tazeem&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Tazeem&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Tazeem&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2009-09-04", "reprint": true, @@ -4050,6 +4711,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/phop?utm_source=api", "scryfall_uri": "https://scryfall.com/card/phop/41/tazeem?utm_source=api", "set": "phop", + "set_id": "ef3f6784-a6e8-41ff-8bed-72e0c7121298", "set_name": "Promotional Planes", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aphop&unique=prints", "set_type": "promo", @@ -4069,12 +4731,16 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 15173, + "cmc": 0.0, "collector_number": "1", "color_identity": [], "colors": [], "digital": false, - "edhrec_rank": 6602, + "edhrec_rank": 7364, + "finishes": [ + "nonfoil" + ], "foil": false, "frame": "1993", "full_art": false, @@ -4084,6 +4750,7 @@ "highres_image": true, "id": "2f989fda-2e54-427c-9154-4820c48abb02", "illustration_id": "5de809a1-34f1-44ef-856d-dc2fa1db6b98", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/2/f/2f989fda-2e54-427c-9154-4820c48abb02.jpg?1561756864", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/2/f/2f989fda-2e54-427c-9154-4820c48abb02.jpg?1561756864", @@ -4098,17 +4765,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "legal", "pauper": "not_legal", - "penny": "legal", + "paupercommander": "not_legal", + "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -4122,10 +4795,13 @@ "oracle_id": "12326d23-1fb5-4084-a23a-d6e2c90ea36c", "oracle_text": "{3}, {T}: Tap target creature you control and target creature of an opponent's choice they control. Those creatures fight each other. (Each deals damage equal to its power to the other.)", "oversized": false, + "penny_rank": 5131, "prices": { - "eur": null, + "eur": 0.8, + "eur_foil": null, "tix": null, - "usd": "4.17", + "usd": 9.99, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A12326d23-1fb5-4084-a23a-d6e2c90ea36c&unique=prints", @@ -4137,8 +4813,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Arena", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=97042", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Arena", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Arena&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Arena&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Arena&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "1994-09-01", "reprint": false, @@ -4147,6 +4823,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/phpr?utm_source=api", "scryfall_uri": "https://scryfall.com/card/phpr/1/arena?utm_source=api", "set": "phpr", + "set_id": "b32cc4a1-1e06-4bec-bab6-89b2691b57a4", "set_name": "HarperPrism Book Promos", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aphpr&unique=prints", "set_type": "promo", @@ -4180,6 +4857,7 @@ { "artist": "John Avon", "artist_id": "798f3932-30e0-4420-aa3f-db4d613f89ca", + "flavor_name": "", "mana_cost": "{5}{R}", "name": "Bust", "object": "card_face", @@ -4187,7 +4865,8 @@ "type_line": "Sorcery" } ], - "cmc": "8.0", + "cardmarket_id": 14291, + "cmc": 8.0, "collector_number": "112", "color_identity": [ "R" @@ -4196,7 +4875,11 @@ "R" ], "digital": false, - "edhrec_rank": 18329, + "edhrec_rank": 7949, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -4207,6 +4890,7 @@ "highres_image": true, "id": "7ce986a4-5f82-4e7e-bef5-b49f05bf96a6", "illustration_id": "0ec34103-b2f5-4dd0-9451-4a7585301da9", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/7/c/7ce986a4-5f82-4e7e-bef5-b49f05bf96a6.jpg?1562575287", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/7/c/7ce986a4-5f82-4e7e-bef5-b49f05bf96a6.jpg?1562575287", @@ -4219,17 +4903,23 @@ "lang": "en", "layout": "split", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -4243,11 +4933,14 @@ "object": "card", "oracle_id": "514fdac0-95f4-4034-b891-283fe0fb6da6", "oversized": false, + "penny_rank": 1335, "prices": { - "eur": "0.97", - "tix": "0.14", - "usd": "2.38", - "usd_foil": "8.00" + "eur": 1.06, + "eur_foil": 4.25, + "tix": 0.02, + "usd": 2.15, + "usd_etched": null, + "usd_foil": 11.49 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A514fdac0-95f4-4034-b891-283fe0fb6da6&unique=prints", "promo": false, @@ -4255,8 +4948,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Boom+%2F%2F+Bust", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=126218", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Boom+%2F%2F+Bust", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Boom+%2F%2F+Bust&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Boom+%2F%2F+Bust&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Boom+%2F%2F+Bust&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2007-02-02", "reprint": false, @@ -4265,6 +4958,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/plc?utm_source=api", "scryfall_uri": "https://scryfall.com/card/plc/112/boom-bust?utm_source=api", "set": "plc", + "set_id": "5a1b571c-73e9-4c14-b9d4-a62507d85789", "set_name": "Planar Chaos", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aplc&unique=prints", "set_type": "expansion", @@ -4284,7 +4978,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "5.0", + "cardmarket_id": 3362, + "cmc": 5.0, "collector_number": "107", "color_identity": [ "B", @@ -4297,7 +4992,11 @@ "W" ], "digital": false, - "edhrec_rank": 7037, + "edhrec_rank": 10149, + "finishes": [ + "nonfoil", + "foil" + ], "flavor_text": "Altered by Phyrexian science, corrupted by black mana, and twisted by rage, Ertai still looked in the mirror and saw only glory.", "foil": true, "frame": "1997", @@ -4309,6 +5008,7 @@ "highres_image": true, "id": "66b950d9-8fef-4deb-b51b-26edb90abc56", "illustration_id": "c09a61fc-11a2-4601-a7bc-79474b33819d", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/6/66b950d9-8fef-4deb-b51b-26edb90abc56.jpg?1586450720", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/6/66b950d9-8fef-4deb-b51b-26edb90abc56.jpg?1586450720", @@ -4321,17 +5021,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -4347,12 +5053,15 @@ "oracle_id": "36934bd0-b275-4222-926c-b5a74cf0967d", "oracle_text": "{U}, {T}, Sacrifice a creature or enchantment: Counter target spell.", "oversized": false, + "penny_rank": 10927, "power": "3", "prices": { - "eur": "0.69", - "tix": "0.03", - "usd": "3.24", - "usd_foil": "15.40" + "eur": 0.75, + "eur_foil": 130.0, + "tix": 0.08, + "usd": 4.33, + "usd_etched": null, + "usd_foil": 124.97 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A36934bd0-b275-4222-926c-b5a74cf0967d&unique=prints", "promo": false, @@ -4360,8 +5069,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Ertai%2C+the+Corrupted", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=25614", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Ertai%2C+the+Corrupted", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Ertai%2C+the+Corrupted&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Ertai%2C+the+Corrupted&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Ertai%2C+the+Corrupted&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2001-02-05", "reprint": false, @@ -4370,6 +5079,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/pls?utm_source=api", "scryfall_uri": "https://scryfall.com/card/pls/107/ertai-the-corrupted?utm_source=api", "set": "pls", + "set_id": "82dc193b-bd5f-4883-a93f-a4155b467ee0", "set_name": "Planeshift", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apls&unique=prints", "set_type": "expansion", @@ -4378,7 +5088,7 @@ "tcgplayer_id": 7793, "textless": false, "toughness": "4", - "type_line": "Legendary Creature — Human Wizard", + "type_line": "Legendary Creature — Phyrexian Human Wizard", "uri": "https://api.scryfall.com/cards/66b950d9-8fef-4deb-b51b-26edb90abc56", "variation": false }, @@ -4390,7 +5100,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "5.0", + "cardmarket_id": 3400, + "cmc": 5.0, "collector_number": "107★", "color_identity": [ "B", @@ -4403,7 +5114,10 @@ "W" ], "digital": false, - "edhrec_rank": 7037, + "edhrec_rank": 10149, + "finishes": [ + "foil" + ], "flavor_text": "Altered by Phyrexian science, corrupted by black mana, and twisted by rage, Ertai still looked in the mirror and saw only glory.", "foil": true, "frame": "1997", @@ -4415,6 +5129,7 @@ "highres_image": true, "id": "fbbfeb32-1654-4bf6-9a38-891f1a03e02b", "illustration_id": "6ebcb06f-33ee-45e8-ac59-3ac1d143dfe6", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/f/b/fbbfeb32-1654-4bf6-9a38-891f1a03e02b.jpg?1562948333", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/f/b/fbbfeb32-1654-4bf6-9a38-891f1a03e02b.jpg?1562948333", @@ -4427,17 +5142,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -4451,12 +5172,15 @@ "oracle_id": "36934bd0-b275-4222-926c-b5a74cf0967d", "oracle_text": "{U}, {T}, Sacrifice a creature or enchantment: Counter target spell.", "oversized": false, + "penny_rank": 10927, "power": "3", "prices": { - "eur": "50.00", + "eur": null, + "eur_foil": 340.0, "tix": null, "usd": null, - "usd_foil": "99.42" + "usd_etched": null, + "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A36934bd0-b275-4222-926c-b5a74cf0967d&unique=prints", "promo": false, @@ -4464,8 +5188,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Ertai%2C+the+Corrupted", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=29292", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Ertai%2C+the+Corrupted", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Ertai%2C+the+Corrupted&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Ertai%2C+the+Corrupted&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Ertai%2C+the+Corrupted&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2001-02-05", "reprint": false, @@ -4474,6 +5198,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/pls?utm_source=api", "scryfall_uri": "https://scryfall.com/card/pls/107%E2%98%85/ertai-the-corrupted?utm_source=api", "set": "pls", + "set_id": "82dc193b-bd5f-4883-a93f-a4155b467ee0", "set_name": "Planeshift", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apls&unique=prints", "set_type": "expansion", @@ -4482,7 +5207,7 @@ "tcgplayer_id": 77304, "textless": false, "toughness": "4", - "type_line": "Legendary Creature — Human Wizard", + "type_line": "Legendary Creature — Phyrexian Human Wizard", "uri": "https://api.scryfall.com/cards/fbbfeb32-1654-4bf6-9a38-891f1a03e02b", "variation": false }, @@ -4494,7 +5219,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "2.0", + "cardmarket_id": 245507, + "cmc": 2.0, "collector_number": "39", "color_identity": [ "B" @@ -4503,7 +5229,10 @@ "B" ], "digital": false, - "edhrec_rank": 613, + "edhrec_rank": 1299, + "finishes": [ + "foil" + ], "foil": true, "frame": "2003", "full_art": true, @@ -4513,6 +5242,7 @@ "highres_image": true, "id": "dd88131a-2811-4a1f-bb9a-c82e12c1493b", "illustration_id": "275a74e3-c403-4c45-a6af-58ed98627589", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/d/d/dd88131a-2811-4a1f-bb9a-c82e12c1493b.jpg?1561758222", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/d/d/dd88131a-2811-4a1f-bb9a-c82e12c1493b.jpg?1561758222", @@ -4525,17 +5255,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -4547,23 +5283,26 @@ "oracle_id": "038c0165-32b6-4e81-8180-604b49905207", "oracle_text": "Put X -1/-1 counters on each creature. Shuffle Black Sun's Zenith into its owner's library.", "oversized": false, + "penny_rank": 1943, "prices": { "eur": null, + "eur_foil": 11.99, "tix": null, "usd": null, - "usd_foil": "18.43" + "usd_etched": null, + "usd_foil": 26.3 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A038c0165-32b6-4e81-8180-604b49905207&unique=prints", "promo": true, "promo_types": [ - "gameday", - "setpromo" + "setpromo", + "gameday" ], "rarity": "rare", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Black+Sun%27s+Zenith", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Black+Sun%27s+Zenith", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Black+Sun%27s+Zenith&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Black+Sun%27s+Zenith&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Black+Sun%27s+Zenith&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2011-02-03", "reprint": true, @@ -4572,6 +5311,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/pmbs?utm_source=api", "scryfall_uri": "https://scryfall.com/card/pmbs/39/black-suns-zenith?utm_source=api", "set": "pmbs", + "set_id": "8a59d98a-4e13-4943-b06c-b35868e954ba", "set_name": "Mirrodin Besieged Promos", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apmbs&unique=prints", "set_type": "promo", @@ -4590,7 +5330,6 @@ ], "booster": false, "border_color": "silver", - "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", "card_faces": [ { "artist": "John Thacker", @@ -4601,12 +5340,12 @@ "flavor_text": "\"The night. . . will last. . .forever!\"", "illustration_id": "587b0f05-3512-4e2d-9569-2f5f70bc0c92", "image_uris": { - "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.png?1583354618", - "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618" + "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.png?1623834384", + "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384" }, "mana_cost": "{4}{B}{B}", "name": "Nightmare Moon", @@ -4626,14 +5365,15 @@ "colors": [ "B" ], + "flavor_name": "", "illustration_id": "a18eb5e3-0043-4d97-ba49-163db9e70df3", "image_uris": { - "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "large": "https://c1.scryfall.com/file/scryfall-cards/large/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618", - "png": "https://c1.scryfall.com/file/scryfall-cards/png/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.png?1583354618", - "small": "https://c1.scryfall.com/file/scryfall-cards/small/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1583354618" + "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "large": "https://c1.scryfall.com/file/scryfall-cards/large/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384", + "png": "https://c1.scryfall.com/file/scryfall-cards/png/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.png?1623834384", + "small": "https://c1.scryfall.com/file/scryfall-cards/small/back/5/6/5646ea19-0025-4f88-ad22-36968a1d3b89.jpg?1623834384" }, "mana_cost": "", "name": "Princess Luna", @@ -4645,12 +5385,16 @@ "watermark": "mlpwaxingmoon" } ], - "cmc": "6.0", + "cardmarket_id": 405599, + "cmc": 6.0, "collector_number": "1", "color_identity": [ "B" ], "digital": false, + "finishes": [ + "foil" + ], "foil": true, "frame": "2015", "frame_effects": [ @@ -4663,6 +5407,7 @@ ], "highres_image": true, "id": "5646ea19-0025-4f88-ad22-36968a1d3b89", + "image_status": "highres_scan", "keywords": [ "Flying", "Transform" @@ -4670,17 +5415,23 @@ "lang": "en", "layout": "transform", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -4691,18 +5442,20 @@ "oracle_id": "e724bddb-6195-4943-b9c6-decc96717998", "oversized": false, "prices": { - "eur": "35.80", + "eur": null, + "eur_foil": 69.89, "tix": null, "usd": null, - "usd_foil": "31.50" + "usd_etched": null, + "usd_foil": 67.63 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ae724bddb-6195-4943-b9c6-decc96717998&unique=prints", "promo": true, "rarity": "mythic", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Nightmare+Moon", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Nightmare+Moon", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Nightmare+Moon&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Nightmare+Moon+%2F%2F+Princess+Luna&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Nightmare+Moon+%2F%2F+Princess+Luna&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2019-10-22", "reprint": false, @@ -4710,7 +5463,9 @@ "rulings_uri": "https://api.scryfall.com/cards/5646ea19-0025-4f88-ad22-36968a1d3b89/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ptg?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ptg/1/nightmare-moon-princess-luna?utm_source=api", + "security_stamp": "oval", "set": "ptg", + "set_id": "d264b61b-bfb3-4388-be42-e34a1eaa00c2", "set_name": "Ponies: The Galloping", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aptg&unique=prints", "set_type": "funny", @@ -4730,7 +5485,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "6.0", + "cardmarket_id": 14756, + "cmc": 6.0, "collector_number": "43", "color_identity": [ "G" @@ -4739,7 +5495,10 @@ "G" ], "digital": false, - "edhrec_rank": 11187, + "edhrec_rank": 12997, + "finishes": [ + "foil" + ], "foil": true, "frame": "1997", "full_art": false, @@ -4749,6 +5508,7 @@ "highres_image": true, "id": "5d5f3f57-410f-4ee2-b93c-f5051a068828", "illustration_id": "88652d14-abd8-414e-bea8-9705e7cd85ab", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/d/5d5f3f57-410f-4ee2-b93c-f5051a068828.jpg?1562133671", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/d/5d5f3f57-410f-4ee2-b93c-f5051a068828.jpg?1562133671", @@ -4761,17 +5521,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -4783,20 +5549,23 @@ "oracle_id": "f6f4c684-2915-4a58-9c4b-487387f7cf73", "oracle_text": "You may have Rhox assign its combat damage as though it weren't blocked.\n{2}{G}: Regenerate Rhox. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.)", "oversized": false, + "penny_rank": 10276, "power": "5", "prices": { "eur": null, + "eur_foil": 0.8, "tix": null, "usd": null, - "usd_foil": "0.81" + "usd_etched": null, + "usd_foil": 0.63 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Af6f4c684-2915-4a58-9c4b-487387f7cf73&unique=prints", "promo": false, "rarity": "rare", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Rhox", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Rhox", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Rhox&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Rhox&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Rhox&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2000-04-01", "reprint": true, @@ -4805,6 +5574,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/s00?utm_source=api", "scryfall_uri": "https://scryfall.com/card/s00/43/rhox?utm_source=api", "set": "s00", + "set_id": "1c105623-2564-40d7-a3aa-4134787fb127", "set_name": "Starter 2000", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3As00&unique=prints", "set_type": "starter", @@ -4817,6 +5587,118 @@ "uri": "https://api.scryfall.com/cards/5d5f3f57-410f-4ee2-b93c-f5051a068828", "variation": false }, + { + "artist": "John Stanko", + "artist_ids": [ + "b0f038a0-73b5-4806-918e-9cd11b5f92e1" + ], + "booster": false, + "border_color": "black", + "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", + "cmc": 1.0, + "collector_number": "VS", + "color_identity": [ + "B" + ], + "colors": [ + "B" + ], + "digital": false, + "edhrec_rank": 138, + "finishes": [ + "foil" + ], + "flavor_text": "In matters of life and death, he trusts his gut.", + "foil": true, + "frame": "2003", + "full_art": false, + "games": [ + "paper" + ], + "highres_image": true, + "id": "dba1cf83-e13d-401e-b76f-b12a51b307f9", + "illustration_id": "67f7a210-ad99-4344-a806-5e4b11c88eb9", + "image_status": "highres_scan", + "image_uris": { + "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/d/b/dba1cf83-e13d-401e-b76f-b12a51b307f9.jpg?1640811544", + "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/d/b/dba1cf83-e13d-401e-b76f-b12a51b307f9.jpg?1640811544", + "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/d/b/dba1cf83-e13d-401e-b76f-b12a51b307f9.jpg?1640811544", + "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/d/b/dba1cf83-e13d-401e-b76f-b12a51b307f9.jpg?1640811544", + "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/d/b/dba1cf83-e13d-401e-b76f-b12a51b307f9.png?1640811544", + "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/d/b/dba1cf83-e13d-401e-b76f-b12a51b307f9.jpg?1640811544" + }, + "keywords": [ + "Scry" + ], + "lang": "en", + "layout": "normal", + "legalities": { + "alchemy": "not_legal", + "brawl": "not_legal", + "commander": "legal", + "duel": "legal", + "explorer": "not_legal", + "future": "not_legal", + "gladiator": "not_legal", + "historic": "not_legal", + "historicbrawl": "not_legal", + "legacy": "legal", + "modern": "legal", + "oldschool": "not_legal", + "pauper": "legal", + "paupercommander": "legal", + "penny": "legal", + "pioneer": "not_legal", + "premodern": "not_legal", + "standard": "not_legal", + "vintage": "legal" + }, + "mana_cost": "{B}", + "multiverse_ids": [], + "name": "Viscera Seer", + "nonfoil": false, + "object": "card", + "oracle_id": "f82a4e85-526d-4456-b700-7760043a31be", + "oracle_text": "Sacrifice a creature: Scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)", + "oversized": false, + "penny_rank": 734, + "power": "1", + "prices": { + "eur": null, + "eur_foil": null, + "tix": null, + "usd": null, + "usd_etched": null, + "usd_foil": null + }, + "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Af82a4e85-526d-4456-b700-7760043a31be&unique=prints", + "promo": false, + "rarity": "common", + "related_uris": { + "edhrec": "https://edhrec.com/route/?cc=Viscera+Seer", + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Viscera+Seer&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Viscera+Seer&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + }, + "released_at": "2021-11-08", + "reprint": true, + "reserved": false, + "rulings_uri": "https://api.scryfall.com/cards/dba1cf83-e13d-401e-b76f-b12a51b307f9/rulings", + "scryfall_set_uri": "https://scryfall.com/sets/sld?utm_source=api", + "scryfall_uri": "https://scryfall.com/card/sld/VS/viscera-seer?utm_source=api", + "set": "sld", + "set_id": "4d92a8a7-ccb0-437d-abdc-9d70fc5ed672", + "set_name": "Secret Lair Drop", + "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Asld&unique=prints", + "set_type": "box", + "set_uri": "https://api.scryfall.com/sets/4d92a8a7-ccb0-437d-abdc-9d70fc5ed672", + "story_spotlight": false, + "tcgplayer_id": 257331, + "textless": false, + "toughness": "1", + "type_line": "Creature — Vampire Wizard", + "uri": "https://api.scryfall.com/cards/dba1cf83-e13d-401e-b76f-b12a51b307f9", + "variation": false + }, { "artist": "Matt Cavotta", "artist_ids": [ @@ -4841,6 +5723,7 @@ { "artist": "Matt Cavotta", "artist_id": "2e6a0611-9411-4ba4-98e3-c0e18cbf9f83", + "flavor_name": "", "mana_cost": "", "name": "Erayo's Essence", "object": "card_face", @@ -4848,7 +5731,8 @@ "type_line": "Legendary Enchantment" } ], - "cmc": "2.0", + "cardmarket_id": 12658, + "cmc": 2.0, "collector_number": "35", "color_identity": [ "U" @@ -4857,7 +5741,10 @@ "U" ], "digital": false, - "edhrec_rank": 16462, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", "full_art": false, @@ -4868,13 +5755,14 @@ "highres_image": true, "id": "0b61d772-2d8b-4acf-9dd2-b2e8b03538c8", "illustration_id": "99cab97a-9861-4a5a-8578-6c742d192183", + "image_status": "highres_scan", "image_uris": { - "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1574767862", - "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1574767862", - "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1574767862", - "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1574767862", - "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.png?1574767862", - "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1574767862" + "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1610664131", + "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1610664131", + "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1610664131", + "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1610664131", + "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.png?1610664131", + "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/0/b/0b61d772-2d8b-4acf-9dd2-b2e8b03538c8.jpg?1610664131" }, "keywords": [ "Flying" @@ -4882,17 +5770,23 @@ "lang": "en", "layout": "flip", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "banned", - "duel": "restricted", + "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -4907,12 +5801,15 @@ "object": "card", "oracle_id": "d83bb32d-f409-421a-9d93-bd7ea3240b47", "oversized": false, + "penny_rank": 2452, "power": "1", "prices": { - "eur": "2.89", - "tix": "0.02", - "usd": "5.60", - "usd_foil": "18.95" + "eur": 6.95, + "eur_foil": 29.99, + "tix": 0.02, + "usd": 8.16, + "usd_etched": null, + "usd_foil": 45.68 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ad83bb32d-f409-421a-9d93-bd7ea3240b47&unique=prints", "promo": false, @@ -4920,8 +5817,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Erayo%2C+Soratami+Ascendant", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=87599", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Erayo%2C+Soratami+Ascendant", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Erayo%2C+Soratami+Ascendant&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Erayo%2C+Soratami+Ascendant+%2F%2F+Erayo%27s+Essence&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Erayo%2C+Soratami+Ascendant+%2F%2F+Erayo%27s+Essence&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2005-06-03", "reprint": false, @@ -4930,6 +5827,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/sok?utm_source=api", "scryfall_uri": "https://scryfall.com/card/sok/35/erayo-soratami-ascendant-erayos-essence?utm_source=api", "set": "sok", + "set_id": "4db16ad3-2b95-442f-bb6b-e9aa7fe7f769", "set_name": "Saviors of Kamigawa", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Asok&unique=prints", "set_type": "expansion", @@ -4951,7 +5849,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "3.0", + "cardmarket_id": 430059, + "cmc": 3.0, "collector_number": "220", "color_identity": [ "G", @@ -4962,7 +5861,11 @@ "R" ], "digital": false, - "edhrec_rank": 3051, + "edhrec_rank": 2371, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "frame_effects": [ @@ -4978,6 +5881,7 @@ "highres_image": true, "id": "5b3c393c-3596-4bd9-a553-e0b03c2eb950", "illustration_id": "1e321242-000b-442e-bc3e-a68750e03766", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/5/b/5b3c393c-3596-4bd9-a553-e0b03c2eb950.jpg?1581481087", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/5/b/5b3c393c-3596-4bd9-a553-e0b03c2eb950.jpg?1581481087", @@ -4992,18 +5896,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{1}{R}{G}", @@ -5024,10 +5934,12 @@ "source_uri": "https://twitter.com/MTG_Arena/status/1209549655878422529" }, "prices": { - "eur": "9.27", - "tix": "13.16", - "usd": "8.76", - "usd_foil": "11.12" + "eur": 9.94, + "eur_foil": 14.99, + "tix": 2.41, + "usd": 6.62, + "usd_etched": null, + "usd_foil": 7.57 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ae8473969-195f-41ee-a84d-463cc8c0ef02&unique=prints", "produced_mana": [ @@ -5039,8 +5951,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Klothys%2C+God+of+Destiny", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=476471", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Klothys%2C+God+of+Destiny", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Klothys%2C+God+of+Destiny&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Klothys%2C+God+of+Destiny&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Klothys%2C+God+of+Destiny&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": false, @@ -5048,7 +5960,9 @@ "rulings_uri": "https://api.scryfall.com/cards/5b3c393c-3596-4bd9-a553-e0b03c2eb950/rulings", "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/220/klothys-god-of-destiny?utm_source=api", + "security_stamp": "oval", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5070,7 +5984,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "3.0", + "cardmarket_id": 430394, + "cmc": 3.0, "collector_number": "268", "color_identity": [ "G", @@ -5081,15 +5996,20 @@ "R" ], "digital": false, - "edhrec_rank": 3051, + "edhrec_rank": 2371, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "frame_effects": [ "nyxtouched", "showcase", - "legendary" + "legendary", + "fullart" ], - "full_art": false, + "full_art": true, "games": [ "arena", "paper", @@ -5098,13 +6018,14 @@ "highres_image": true, "id": "4d747889-04db-4e7a-ad4c-7549514b5112", "illustration_id": "24343437-32f3-4f4f-be5d-5ad7a4314895", + "image_status": "highres_scan", "image_uris": { - "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1581481416", - "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1581481416", - "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1581481416", - "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1581481416", - "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.png?1581481416", - "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1581481416" + "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1654049968", + "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1654049968", + "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1654049968", + "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1654049968", + "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.png?1654049968", + "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/4/d/4d747889-04db-4e7a-ad4c-7549514b5112.jpg?1654049968" }, "keywords": [ "Indestructible" @@ -5112,18 +6033,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{1}{R}{G}", @@ -5141,10 +6068,12 @@ "source_uri": "https://magic.wizards.com/en/articles/archive/card-image-gallery/theros-beyond-death-variants" }, "prices": { - "eur": null, + "eur": 9.74, + "eur_foil": 12.98, "tix": null, - "usd": "6.95", - "usd_foil": "14.29" + "usd": 6.62, + "usd_etched": null, + "usd_foil": 10.9 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ae8473969-195f-41ee-a84d-463cc8c0ef02&unique=prints", "produced_mana": [ @@ -5158,8 +6087,8 @@ "rarity": "mythic", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Klothys%2C+God+of+Destiny", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Klothys%2C+God+of+Destiny", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Klothys%2C+God+of+Destiny&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Klothys%2C+God+of+Destiny&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Klothys%2C+God+of+Destiny&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": false, @@ -5167,7 +6096,9 @@ "rulings_uri": "https://api.scryfall.com/cards/4d747889-04db-4e7a-ad4c-7549514b5112/rulings", "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/268/klothys-god-of-destiny?utm_source=api", + "security_stamp": "oval", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5189,7 +6120,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "7.0", + "cardmarket_id": 431694, + "cmc": 7.0, "collector_number": "190", "color_identity": [ "G" @@ -5198,7 +6130,11 @@ "G" ], "digital": false, - "edhrec_rank": 1020, + "edhrec_rank": 557, + "finishes": [ + "nonfoil", + "foil" + ], "flavor_text": "Ancient yet ever-young, it is wise and subtle—and cruel and reckless as the spring itself.", "foil": true, "frame": "2015", @@ -5214,6 +6150,7 @@ "highres_image": true, "id": "a391da36-0b40-46ea-b771-50d2b920207e", "illustration_id": "295bfead-06c8-4d04-8bce-ffe80dfa02ce", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/a/3/a391da36-0b40-46ea-b771-50d2b920207e.jpg?1581480808", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/a/3/a391da36-0b40-46ea-b771-50d2b920207e.jpg?1581480808", @@ -5228,18 +6165,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{4}{G}{G}{G}", @@ -5260,10 +6203,12 @@ "source_uri": "https://www.youtube.com/watch?v=FrSbBMp45rg" }, "prices": { - "eur": "7.30", - "tix": "0.66", - "usd": "15.92", - "usd_foil": "18.12" + "eur": 6.4, + "eur_foil": 9.99, + "tix": 0.55, + "usd": 17.79, + "usd_etched": null, + "usd_foil": 21.16 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A8b610f8f-c8dd-4eeb-bc6e-3bc706d5f63e&unique=prints", "promo": false, @@ -5271,8 +6216,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Nyxbloom+Ancient", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=476441", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Nyxbloom+Ancient", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Nyxbloom+Ancient&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Nyxbloom+Ancient&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Nyxbloom+Ancient&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": false, @@ -5280,7 +6225,9 @@ "rulings_uri": "https://api.scryfall.com/cards/a391da36-0b40-46ea-b771-50d2b920207e/rulings", "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/190/nyxbloom-ancient?utm_source=api", + "security_stamp": "oval", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5301,7 +6248,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "7.0", + "cardmarket_id": 431974, + "cmc": 7.0, "collector_number": "330", "color_identity": [ "G" @@ -5310,11 +6258,14 @@ "G" ], "digital": false, - "edhrec_rank": 1020, + "edhrec_rank": 557, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "frame_effects": [ - "nyxborn", "extendedart", "nyxtouched" ], @@ -5327,13 +6278,14 @@ "highres_image": true, "id": "c8a8e37b-0b97-4355-8e00-169a82c38ea0", "illustration_id": "295bfead-06c8-4d04-8bce-ffe80dfa02ce", + "image_status": "highres_scan", "image_uris": { - "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1581507920", - "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1581507920", - "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1581507920", - "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1581507920", - "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.png?1581507920", - "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1581507920" + "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1634466744", + "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1634466744", + "large": "https://c1.scryfall.com/file/scryfall-cards/large/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1634466744", + "normal": "https://c1.scryfall.com/file/scryfall-cards/normal/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1634466744", + "png": "https://c1.scryfall.com/file/scryfall-cards/png/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.png?1634466744", + "small": "https://c1.scryfall.com/file/scryfall-cards/small/front/c/8/c8a8e37b-0b97-4355-8e00-169a82c38ea0.jpg?1634466744" }, "keywords": [ "Trample" @@ -5341,18 +6293,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{4}{G}{G}{G}", @@ -5365,10 +6323,12 @@ "oversized": false, "power": "5", "prices": { - "eur": null, + "eur": 17.25, + "eur_foil": 45.99, "tix": null, - "usd": "24.53", - "usd_foil": "73.59" + "usd": 28.49, + "usd_etched": null, + "usd_foil": 72.63 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A8b610f8f-c8dd-4eeb-bc6e-3bc706d5f63e&unique=prints", "promo": false, @@ -5378,8 +6338,8 @@ "rarity": "mythic", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Nyxbloom+Ancient", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Nyxbloom+Ancient", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Nyxbloom+Ancient&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Nyxbloom+Ancient&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Nyxbloom+Ancient&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": false, @@ -5387,7 +6347,9 @@ "rulings_uri": "https://api.scryfall.com/cards/c8a8e37b-0b97-4355-8e00-169a82c38ea0/rulings", "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/330/nyxbloom-ancient?utm_source=api", + "security_stamp": "oval", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5409,7 +6371,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 430119, + "cmc": 0.0, "collector_number": "248", "color_identity": [ "G", @@ -5417,7 +6380,11 @@ ], "colors": [], "digital": false, - "edhrec_rank": 365, + "edhrec_rank": 497, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -5429,6 +6396,7 @@ "highres_image": true, "id": "6e6256ea-ccb5-4595-8278-44266f922e31", "illustration_id": "846b14b7-34e8-4f0c-86bb-8bf5dc45bd00", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/e/6e6256ea-ccb5-4595-8278-44266f922e31.jpg?1581481279", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/e/6e6256ea-ccb5-4595-8278-44266f922e31.jpg?1581481279", @@ -5443,18 +6411,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "", @@ -5466,18 +6440,21 @@ "nonfoil": true, "object": "card", "oracle_id": "e521322b-0e83-458c-8936-7021a80ee279", - "oracle_text": "Temple of Plenty enters the battlefield tapped.\nWhen Temple of Plenty enters the battlefield, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)\n{T}: Add {G} or {W}.", + "oracle_text": "Temple of Plenty enters the battlefield tapped.\nWhen Temple of Plenty enters the battlefield, scry 1.\n{T}: Add {G} or {W}.", "oversized": false, + "penny_rank": 876, "preview": { "previewed_at": "2019-12-30", "source": "ChannelFireball", "source_uri": "https://www.channelfireball.com/all-strategy/articles/3-point/theros-beyond-death-exclusive-preview/" }, "prices": { - "eur": "0.82", - "tix": "0.18", - "usd": "0.97", - "usd_foil": "1.30" + "eur": 0.71, + "eur_foil": 1.0, + "tix": 0.02, + "usd": 0.68, + "usd_etched": null, + "usd_foil": 1.02 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ae521322b-0e83-458c-8936-7021a80ee279&unique=prints", "produced_mana": [ @@ -5489,8 +6466,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Temple+of+Plenty", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=476499", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Temple+of+Plenty", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Temple+of+Plenty&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Temple+of+Plenty&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Temple+of+Plenty&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": true, @@ -5498,7 +6475,9 @@ "rulings_uri": "https://api.scryfall.com/cards/6e6256ea-ccb5-4595-8278-44266f922e31/rulings", "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/248/temple-of-plenty?utm_source=api", + "security_stamp": "oval", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5518,7 +6497,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "0.0", + "cardmarket_id": 430134, + "cmc": 0.0, "collector_number": "351", "color_identity": [ "G", @@ -5526,7 +6506,11 @@ ], "colors": [], "digital": false, - "edhrec_rank": 365, + "edhrec_rank": 497, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "frame_effects": [ @@ -5541,6 +6525,7 @@ "highres_image": true, "id": "61dc9a80-850c-4945-b84a-85381cc3ee85", "illustration_id": "846b14b7-34e8-4f0c-86bb-8bf5dc45bd00", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/6/1/61dc9a80-850c-4945-b84a-85381cc3ee85.jpg?1580351273", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/6/1/61dc9a80-850c-4945-b84a-85381cc3ee85.jpg?1580351273", @@ -5555,18 +6540,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "", @@ -5575,18 +6566,21 @@ "nonfoil": true, "object": "card", "oracle_id": "e521322b-0e83-458c-8936-7021a80ee279", - "oracle_text": "Temple of Plenty enters the battlefield tapped.\nWhen Temple of Plenty enters the battlefield, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)\n{T}: Add {G} or {W}.", + "oracle_text": "Temple of Plenty enters the battlefield tapped.\nWhen Temple of Plenty enters the battlefield, scry 1.\n{T}: Add {G} or {W}.", "oversized": false, + "penny_rank": 876, "preview": { "previewed_at": "2019-12-30", "source": "ChannelFireball", "source_uri": "https://www.channelfireball.com/all-strategy/articles/3-point/theros-beyond-death-exclusive-preview/" }, "prices": { - "eur": null, + "eur": 1.75, + "eur_foil": 4.99, "tix": null, - "usd": "3.15", - "usd_foil": "9.29" + "usd": 2.7, + "usd_etched": null, + "usd_foil": 11.79 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Ae521322b-0e83-458c-8936-7021a80ee279&unique=prints", "produced_mana": [ @@ -5600,8 +6594,8 @@ "rarity": "rare", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Temple+of+Plenty", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Temple+of+Plenty", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Temple+of+Plenty&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Temple+of+Plenty&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Temple+of+Plenty&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": true, @@ -5609,7 +6603,9 @@ "rulings_uri": "https://api.scryfall.com/cards/61dc9a80-850c-4945-b84a-85381cc3ee85/rulings", "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/351/temple-of-plenty?utm_source=api", + "security_stamp": "oval", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5648,7 +6644,8 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "2.0", + "cardmarket_id": 431734, + "cmc": 2.0, "collector_number": "205", "color_identity": [ "G" @@ -5657,7 +6654,11 @@ "G" ], "digital": false, - "edhrec_rank": 4850, + "edhrec_rank": 2575, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -5669,6 +6670,7 @@ "highres_image": true, "id": "72b886c3-234c-49ce-9a11-456c1e8f092f", "illustration_id": "fe910acf-4de3-429b-b1be-9f5b4402facc", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/7/2/72b886c3-234c-49ce-9a11-456c1e8f092f.jpg?1581480945", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/7/2/72b886c3-234c-49ce-9a11-456c1e8f092f.jpg?1581480945", @@ -5683,18 +6685,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", - "penny": "legal", + "paupercommander": "not_legal", + "penny": "not_legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{1}{G}", @@ -5706,18 +6714,21 @@ "nonfoil": true, "object": "card", "oracle_id": "7579f57d-c76e-4703-a030-34fb7160cb23", - "oracle_text": "Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G}, Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate this ability only during your turn.", + "oracle_text": "Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G}, Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate only during your turn.", "oversized": false, + "penny_rank": 2285, "preview": { "previewed_at": "2020-01-09", "source": "Drawza", "source_uri": "https://www.twitch.tv/drawza" }, "prices": { - "eur": "0.10", - "tix": "0.01", - "usd": "0.12", - "usd_foil": "0.30" + "eur": 0.25, + "eur_foil": 0.09, + "tix": 0.03, + "usd": 0.41, + "usd_etched": null, + "usd_foil": 0.38 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A7579f57d-c76e-4703-a030-34fb7160cb23&unique=prints", "produced_mana": [ @@ -5728,8 +6739,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Wolfwillow+Haven", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=476456", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Wolfwillow+Haven", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Wolfwillow+Haven&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Wolfwillow+Haven&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Wolfwillow+Haven&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": false, @@ -5738,6 +6749,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/205/wolfwillow-haven?utm_source=api", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5750,6 +6762,24 @@ "variation": false }, { + "all_parts": [ + { + "component": "combo_piece", + "id": "72b886c3-234c-49ce-9a11-456c1e8f092f", + "name": "Wolfwillow Haven", + "object": "related_card", + "type_line": "Enchantment — Aura", + "uri": "https://api.scryfall.com/cards/72b886c3-234c-49ce-9a11-456c1e8f092f" + }, + { + "component": "token", + "id": "411f4bf6-7f09-4e24-b483-0068d2f974e5", + "name": "Wolf", + "object": "related_card", + "type_line": "Token Creature — Wolf", + "uri": "https://api.scryfall.com/cards/411f4bf6-7f09-4e24-b483-0068d2f974e5" + } + ], "artist": "Jakub Kasper", "artist_ids": [ "36901417-ce61-4636-8b77-6db14a9cb68a" @@ -5757,7 +6787,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "2.0", + "cardmarket_id": 431839, + "cmc": 2.0, "collector_number": "357", "color_identity": [ "G" @@ -5766,7 +6797,11 @@ "G" ], "digital": false, - "edhrec_rank": 4850, + "edhrec_rank": 2575, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "frame_effects": [ @@ -5781,6 +6816,7 @@ "highres_image": true, "id": "cfc4be7b-a948-464d-8327-575ccb7dccf3", "illustration_id": "fe910acf-4de3-429b-b1be-9f5b4402facc", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/c/f/cfc4be7b-a948-464d-8327-575ccb7dccf3.jpg?1586187338", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/c/f/cfc4be7b-a948-464d-8327-575ccb7dccf3.jpg?1586187338", @@ -5795,18 +6831,24 @@ "lang": "en", "layout": "normal", "legalities": { - "brawl": "legal", + "alchemy": "not_legal", + "brawl": "not_legal", "commander": "legal", "duel": "legal", - "future": "legal", + "explorer": "legal", + "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", - "penny": "legal", + "paupercommander": "not_legal", + "penny": "not_legal", "pioneer": "legal", - "standard": "legal", + "premodern": "not_legal", + "standard": "not_legal", "vintage": "legal" }, "mana_cost": "{1}{G}", @@ -5815,13 +6857,16 @@ "nonfoil": true, "object": "card", "oracle_id": "7579f57d-c76e-4703-a030-34fb7160cb23", - "oracle_text": "Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G}, Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate this ability only during your turn.", + "oracle_text": "Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G}, Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate only during your turn.", "oversized": false, + "penny_rank": 2285, "prices": { - "eur": null, + "eur": 0.02, + "eur_foil": 0.2, "tix": null, - "usd": "0.31", - "usd_foil": "0.57" + "usd": 0.63, + "usd_etched": null, + "usd_foil": 1.73 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A7579f57d-c76e-4703-a030-34fb7160cb23&unique=prints", "produced_mana": [ @@ -5834,8 +6879,8 @@ "rarity": "uncommon", "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Wolfwillow+Haven", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Wolfwillow+Haven", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Wolfwillow+Haven&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Wolfwillow+Haven&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Wolfwillow+Haven&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2020-01-24", "reprint": false, @@ -5844,6 +6889,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/thb?utm_source=api", "scryfall_uri": "https://scryfall.com/card/thb/357/wolfwillow-haven?utm_source=api", "set": "thb", + "set_id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "set_name": "Theros Beyond Death", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Athb&unique=prints", "set_type": "expansion", @@ -5901,7 +6947,8 @@ "type_line": "Instant" } ], - "cmc": "13.0", + "cardmarket_id": 14883, + "cmc": 13.0, "collector_number": "120", "color_identity": [ "B", @@ -5918,15 +6965,20 @@ "W" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2003", - "full_art": false, + "full_art": true, "games": [ "paper" ], "highres_image": true, "id": "8987644d-5a31-4a4e-9a8a-3d6260ed0fd6", "illustration_id": "4d1ca4ab-db58-4280-b854-e8bf22a964cb", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/8/9/8987644d-5a31-4a4e-9a8a-3d6260ed0fd6.jpg?1562488870", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/8/9/8987644d-5a31-4a4e-9a8a-3d6260ed0fd6.jpg?1562488870", @@ -5939,17 +6991,23 @@ "lang": "en", "layout": "split", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -5963,10 +7021,12 @@ "oracle_id": "adfe1b07-dd82-4c39-a7a6-ded0b1c39761", "oversized": false, "prices": { - "eur": "2.02", + "eur": 1.1, + "eur_foil": 49.99, "tix": null, - "usd": "3.05", - "usd_foil": "42.43" + "usd": 1.81, + "usd_etched": null, + "usd_foil": 60.95 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Aadfe1b07-dd82-4c39-a7a6-ded0b1c39761&unique=prints", "promo": false, @@ -5974,8 +7034,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Who+%2F%2F+What+%2F%2F+When+%2F%2F+Where+%2F%2F+Why", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=74358", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Who+%2F%2F+What+%2F%2F+When+%2F%2F+Where+%2F%2F+Why", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Who+%2F%2F+What+%2F%2F+When+%2F%2F+Where+%2F%2F+Why&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Who+%2F%2F+What+%2F%2F+When+%2F%2F+Where+%2F%2F+Why&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Who+%2F%2F+What+%2F%2F+When+%2F%2F+Where+%2F%2F+Why&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2004-11-19", "reprint": false, @@ -5984,6 +7044,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/unh?utm_source=api", "scryfall_uri": "https://scryfall.com/card/unh/120/who-what-when-where-why?utm_source=api", "set": "unh", + "set_id": "4c8bc76a-05a5-43db-aaf0-34deb347b871", "set_name": "Unhinged", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aunh&unique=prints", "set_type": "funny", @@ -5999,51 +7060,51 @@ "all_parts": [ { "component": "combo_piece", - "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", + "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" + "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" }, { "component": "combo_piece", - "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", + "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" + "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" }, { "component": "combo_piece", - "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", + "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" + "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" }, { "component": "combo_piece", - "id": "12272ce6-ab1f-4576-9e50-21d324263c44", + "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" + "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" }, { "component": "combo_piece", - "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", + "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" + "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" }, { "component": "combo_piece", - "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", + "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" + "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" } ], "artist": "Wayne England", @@ -6053,7 +7114,8 @@ "booster": true, "border_color": "silver", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 314426, + "cmc": 4.0, "collector_number": "49a", "color_identity": [ "U" @@ -6062,6 +7124,10 @@ "U" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6071,6 +7137,7 @@ "highres_image": true, "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "illustration_id": "f5f56b3d-a7ba-4c06-a2e9-b3bacbb4f952", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/9/a/9a650610-20e2-4f16-b59c-2ea7779f6e47.jpg?1562927634", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/9/a/9a650610-20e2-4f16-b59c-2ea7779f6e47.jpg?1562927634", @@ -6085,17 +7152,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -6110,10 +7183,12 @@ "oracle_text": "Choose two —\n• Switch target creature's power and toughness until end of turn.\n• Target creature can't be blocked this turn.\n• Draw a card. If that card's art is by Wayne England, you may reveal it and draw another card.\n• Assemble a Contraption.", "oversized": false, "prices": { - "eur": null, + "eur": 2.0, + "eur_foil": 27.99, "tix": null, - "usd": "2.24", - "usd_foil": "20.61" + "usd": 1.82, + "usd_etched": null, + "usd_foil": 22.35 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A5d0fd8ee-2cc1-4ed8-9395-1660d15cc9f3&unique=prints", "promo": false, @@ -6121,8 +7196,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Very+Cryptic+Command", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=439645", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Very+Cryptic+Command", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Very+Cryptic+Command&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2017-12-08", "reprint": false, @@ -6130,7 +7205,9 @@ "rulings_uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ust?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ust/49a/very-cryptic-command?utm_source=api", + "security_stamp": "oval", "set": "ust", + "set_id": "83491685-880d-41dd-a4af-47d2b3b17c10", "set_name": "Unstable", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aust&unique=prints", "set_type": "funny", @@ -6146,51 +7223,51 @@ "all_parts": [ { "component": "combo_piece", - "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", + "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" + "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" }, { "component": "combo_piece", - "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", + "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" + "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" }, { "component": "combo_piece", - "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", + "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" + "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" }, { "component": "combo_piece", - "id": "12272ce6-ab1f-4576-9e50-21d324263c44", + "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" + "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" }, { "component": "combo_piece", - "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", + "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" + "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" }, { "component": "combo_piece", - "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", + "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" + "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" } ], "artist": "Zoltan Boros", @@ -6200,7 +7277,8 @@ "booster": true, "border_color": "silver", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 313812, + "cmc": 4.0, "collector_number": "49b", "color_identity": [ "U" @@ -6209,6 +7287,10 @@ "U" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6218,6 +7300,7 @@ "highres_image": true, "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "illustration_id": "2345d8b0-e090-4b12-8a0a-40d98970f6ba", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/2/a/2a90b2b6-d96e-4c13-83be-849d2ec1d845.jpg?1562904026", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/2/a/2a90b2b6-d96e-4c13-83be-849d2ec1d845.jpg?1562904026", @@ -6230,17 +7313,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -6255,10 +7344,12 @@ "oracle_text": "Choose two —\n• Untap two target permanents.\n• Tap each permanent target player controls with exactly one word in its name.\n• Discard all the cards in your hand, then draw that many cards.\n• Return target instant or sorcery card from your graveyard to your hand.", "oversized": false, "prices": { - "eur": null, + "eur": 2.2, + "eur_foil": 10.99, "tix": null, - "usd": "1.76", - "usd_foil": "5.87" + "usd": 1.92, + "usd_etched": null, + "usd_foil": 7.08 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A48d94218-a460-4974-82b9-d3a9cba9998e&unique=prints", "promo": false, @@ -6266,8 +7357,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Very+Cryptic+Command", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=439438", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Very+Cryptic+Command", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Very+Cryptic+Command&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2017-12-08", "reprint": false, @@ -6275,7 +7366,9 @@ "rulings_uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ust?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ust/49b/very-cryptic-command?utm_source=api", + "security_stamp": "oval", "set": "ust", + "set_id": "83491685-880d-41dd-a4af-47d2b3b17c10", "set_name": "Unstable", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aust&unique=prints", "set_type": "funny", @@ -6291,51 +7384,51 @@ "all_parts": [ { "component": "combo_piece", - "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", + "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" + "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" }, { "component": "combo_piece", - "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", + "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" + "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" }, { "component": "combo_piece", - "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", + "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" + "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" }, { "component": "combo_piece", - "id": "12272ce6-ab1f-4576-9e50-21d324263c44", + "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" + "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" }, { "component": "combo_piece", - "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", + "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" + "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" }, { "component": "combo_piece", - "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", + "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" + "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" }, { "component": "token", @@ -6353,7 +7446,8 @@ "booster": true, "border_color": "silver", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 314423, + "cmc": 4.0, "collector_number": "49c", "color_identity": [ "U" @@ -6362,6 +7456,10 @@ "U" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6371,6 +7469,7 @@ "highres_image": true, "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "illustration_id": "2345d8b0-e090-4b12-8a0a-40d98970f6ba", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/2/d/2dfc9416-06d6-40af-8b3d-62371b3da7c5.jpg?1562904665", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/2/d/2dfc9416-06d6-40af-8b3d-62371b3da7c5.jpg?1562904665", @@ -6383,17 +7482,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -6408,10 +7513,12 @@ "oracle_text": "Choose two —\n• Draw a card from an opponent's library.\n• Copy target instant or sorcery spell. You may choose new targets for the copy.\n• Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1.\n• Create a 1/1 colorless Gnome artifact creature token.", "oversized": false, "prices": { - "eur": null, + "eur": 1.98, + "eur_foil": 14.99, "tix": null, - "usd": "3.10", - "usd_foil": "10.42" + "usd": 2.87, + "usd_etched": null, + "usd_foil": 7.73 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A5063f840-0aed-4e2d-98d8-65b39e95e3c9&unique=prints", "promo": false, @@ -6419,8 +7526,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Very+Cryptic+Command", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=439646", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Very+Cryptic+Command", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Very+Cryptic+Command&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2017-12-08", "reprint": false, @@ -6428,7 +7535,9 @@ "rulings_uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ust?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ust/49c/very-cryptic-command?utm_source=api", + "security_stamp": "oval", "set": "ust", + "set_id": "83491685-880d-41dd-a4af-47d2b3b17c10", "set_name": "Unstable", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aust&unique=prints", "set_type": "funny", @@ -6444,51 +7553,51 @@ "all_parts": [ { "component": "combo_piece", - "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", + "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" + "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" }, { "component": "combo_piece", - "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", + "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" + "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" }, { "component": "combo_piece", - "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", + "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" + "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" }, { "component": "combo_piece", - "id": "12272ce6-ab1f-4576-9e50-21d324263c44", + "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" + "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" }, { "component": "combo_piece", - "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", + "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" + "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" }, { "component": "combo_piece", - "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", + "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" + "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" } ], "artist": "Zoltan Boros", @@ -6498,7 +7607,8 @@ "booster": true, "border_color": "silver", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 314424, + "cmc": 4.0, "collector_number": "49d", "color_identity": [ "U" @@ -6507,6 +7617,10 @@ "U" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6516,6 +7630,7 @@ "highres_image": true, "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "illustration_id": "2345d8b0-e090-4b12-8a0a-40d98970f6ba", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/1/2/12272ce6-ab1f-4576-9e50-21d324263c44.jpg?1562898766", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/1/2/12272ce6-ab1f-4576-9e50-21d324263c44.jpg?1562898766", @@ -6528,17 +7643,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -6553,10 +7674,12 @@ "oracle_text": "Choose two —\n• Return target permanent to its controller's hand.\n• Draw two cards, then discard a card.\n• Change the target of target spell with a single target.\n• Turn over target nontoken creature.", "oversized": false, "prices": { - "eur": null, + "eur": 1.53, + "eur_foil": 12.93, "tix": null, - "usd": "2.13", - "usd_foil": "13.01" + "usd": 2.59, + "usd_etched": null, + "usd_foil": 10.25 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A9dc00e2b-73a3-42d5-95c9-d86094a6e455&unique=prints", "promo": false, @@ -6564,8 +7687,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Very+Cryptic+Command", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=439647", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Very+Cryptic+Command", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Very+Cryptic+Command&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2017-12-08", "reprint": false, @@ -6573,7 +7696,9 @@ "rulings_uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ust?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ust/49d/very-cryptic-command?utm_source=api", + "security_stamp": "oval", "set": "ust", + "set_id": "83491685-880d-41dd-a4af-47d2b3b17c10", "set_name": "Unstable", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aust&unique=prints", "set_type": "funny", @@ -6589,51 +7714,51 @@ "all_parts": [ { "component": "combo_piece", - "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", + "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" + "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" }, { "component": "combo_piece", - "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", + "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" + "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" }, { "component": "combo_piece", - "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", + "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" + "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" }, { "component": "combo_piece", - "id": "12272ce6-ab1f-4576-9e50-21d324263c44", + "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" + "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" }, { "component": "combo_piece", - "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", + "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" + "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" }, { "component": "combo_piece", - "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", + "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" + "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" } ], "artist": "Zoltan Boros", @@ -6643,7 +7768,8 @@ "booster": true, "border_color": "silver", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 314672, + "cmc": 4.0, "collector_number": "49e", "color_identity": [ "U" @@ -6652,6 +7778,10 @@ "U" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6661,6 +7791,7 @@ "highres_image": true, "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "illustration_id": "2345d8b0-e090-4b12-8a0a-40d98970f6ba", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/d/8/d8e84dd2-01f9-4fad-8a24-cc86424d09a2.jpg?1562940811", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/d/8/d8e84dd2-01f9-4fad-8a24-cc86424d09a2.jpg?1562940811", @@ -6675,17 +7806,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -6700,10 +7837,12 @@ "oracle_text": "Choose two —\n• Counter target black-bordered spell.\n• Return target creature to its owner's hand.\n• Untap each permanent you control with a watermark.\n• Roll two six-sided dice. Target player mills X cards, where X is the total of those results.", "oversized": false, "prices": { - "eur": null, + "eur": 2.2, + "eur_foil": 8.87, "tix": null, - "usd": "3.07", - "usd_foil": "5.99" + "usd": 3.44, + "usd_etched": null, + "usd_foil": 8.79 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Aa84f0b11-5c59-4bab-81ef-a84470fb2ade&unique=prints", "promo": false, @@ -6711,8 +7850,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Very+Cryptic+Command", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=439648", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Very+Cryptic+Command", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Very+Cryptic+Command&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2017-12-08", "reprint": false, @@ -6720,7 +7859,9 @@ "rulings_uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ust?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ust/49e/very-cryptic-command?utm_source=api", + "security_stamp": "oval", "set": "ust", + "set_id": "83491685-880d-41dd-a4af-47d2b3b17c10", "set_name": "Unstable", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aust&unique=prints", "set_type": "funny", @@ -6736,51 +7877,51 @@ "all_parts": [ { "component": "combo_piece", - "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", + "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" + "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" }, { "component": "combo_piece", - "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", + "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" + "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" }, { "component": "combo_piece", - "id": "2dfc9416-06d6-40af-8b3d-62371b3da7c5", + "id": "12272ce6-ab1f-4576-9e50-21d324263c44", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/2dfc9416-06d6-40af-8b3d-62371b3da7c5" + "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" }, { "component": "combo_piece", - "id": "12272ce6-ab1f-4576-9e50-21d324263c44", + "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/12272ce6-ab1f-4576-9e50-21d324263c44" + "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" }, { "component": "combo_piece", - "id": "d8e84dd2-01f9-4fad-8a24-cc86424d09a2", + "id": "9a650610-20e2-4f16-b59c-2ea7779f6e47", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d8e84dd2-01f9-4fad-8a24-cc86424d09a2" + "uri": "https://api.scryfall.com/cards/9a650610-20e2-4f16-b59c-2ea7779f6e47" }, { "component": "combo_piece", - "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", + "id": "2a90b2b6-d96e-4c13-83be-849d2ec1d845", "name": "Very Cryptic Command", "object": "related_card", "type_line": "Instant", - "uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5" + "uri": "https://api.scryfall.com/cards/2a90b2b6-d96e-4c13-83be-849d2ec1d845" }, { "component": "token", @@ -6798,7 +7939,8 @@ "booster": true, "border_color": "silver", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cardmarket_id": 314425, + "cmc": 4.0, "collector_number": "49f", "color_identity": [ "U" @@ -6807,6 +7949,10 @@ "U" ], "digital": false, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6816,6 +7962,7 @@ "highres_image": true, "id": "d41e6c51-d96a-436f-94c5-5d1e19c5e0d5", "illustration_id": "2345d8b0-e090-4b12-8a0a-40d98970f6ba", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/d/4/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5.jpg?1562939866", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/d/4/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5.jpg?1562939866", @@ -6830,17 +7977,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "not_legal", "duel": "not_legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "not_legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "not_legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "not_legal" }, @@ -6855,10 +8008,12 @@ "oracle_text": "Choose two —\n• Scry 3.\n• Create a 2/2 black Rogue creature token with menace.\n• Add or subtract 1 or one from a number or number word on target spell or permanent until end of turn.\n• Return all artifacts target player controls to their owner's hand.", "oversized": false, "prices": { - "eur": null, + "eur": 2.0, + "eur_foil": 11.99, "tix": null, - "usd": "1.82", - "usd_foil": "8.52" + "usd": 1.91, + "usd_etched": null, + "usd_foil": 6.4 }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A684dfe99-c957-4b91-bd14-867c20b4b3db&unique=prints", "promo": false, @@ -6866,8 +8021,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Very+Cryptic+Command", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=439649", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Very+Cryptic+Command", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Very+Cryptic+Command&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Very+Cryptic+Command&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2017-12-08", "reprint": false, @@ -6875,7 +8030,9 @@ "rulings_uri": "https://api.scryfall.com/cards/d41e6c51-d96a-436f-94c5-5d1e19c5e0d5/rulings", "scryfall_set_uri": "https://scryfall.com/sets/ust?utm_source=api", "scryfall_uri": "https://scryfall.com/card/ust/49f/very-cryptic-command?utm_source=api", + "security_stamp": "oval", "set": "ust", + "set_id": "83491685-880d-41dd-a4af-47d2b3b17c10", "set_name": "Unstable", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aust&unique=prints", "set_type": "funny", @@ -6895,7 +8052,7 @@ "booster": true, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "4.0", + "cmc": 4.0, "collector_number": "55", "color_identity": [ "U" @@ -6904,7 +8061,11 @@ "U" ], "digital": true, - "edhrec_rank": 8527, + "edhrec_rank": 12933, + "finishes": [ + "nonfoil", + "foil" + ], "foil": true, "frame": "2015", "full_art": false, @@ -6914,6 +8075,7 @@ "highres_image": true, "id": "116ec16c-3b4b-45be-83c8-333bccc29e35", "illustration_id": "d10469ab-1902-4505-8618-f576b18830a4", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/1/1/116ec16c-3b4b-45be-83c8-333bccc29e35.jpg?1562898511", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/1/1/116ec16c-3b4b-45be-83c8-333bccc29e35.jpg?1562898511", @@ -6926,17 +8088,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "not_legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "not_legal", "future": "not_legal", + "gladiator": "not_legal", "historic": "not_legal", + "historicbrawl": "not_legal", "legacy": "legal", "modern": "not_legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "not_legal", "penny": "legal", "pioneer": "not_legal", + "premodern": "not_legal", "standard": "not_legal", "vintage": "legal" }, @@ -6952,11 +8120,14 @@ "oracle_id": "ba6c3c72-c014-45c6-a0b4-59eb9a65303e", "oracle_text": "Academy Elite enters the battlefield with X +1/+1 counters on it, where X is the number of instant and sorcery cards in all graveyards.\n{2}{U}, Remove a +1/+1 counter from Academy Elite: Draw a card, then discard a card.", "oversized": false, + "penny_rank": 3396, "power": "0", "prices": { "eur": null, - "tix": "0.02", + "eur_foil": null, + "tix": 0.02, "usd": null, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3Aba6c3c72-c014-45c6-a0b4-59eb9a65303e&unique=prints", @@ -6965,8 +8136,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Academy+Elite", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=382835", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Academy+Elite", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Academy+Elite&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Academy+Elite&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Academy+Elite&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2014-06-16", "reprint": true, @@ -6974,7 +8145,9 @@ "rulings_uri": "https://api.scryfall.com/cards/116ec16c-3b4b-45be-83c8-333bccc29e35/rulings", "scryfall_set_uri": "https://scryfall.com/sets/vma?utm_source=api", "scryfall_uri": "https://scryfall.com/card/vma/55/academy-elite?utm_source=api", + "security_stamp": "oval", "set": "vma", + "set_id": "a944551a-73fa-41cd-9159-e8d0e4674403", "set_name": "Vintage Masters", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Avma&unique=prints", "set_type": "masters", @@ -6994,7 +8167,8 @@ "booster": false, "border_color": "black", "card_back_id": "0aeebaf5-8c7d-4636-9e82-8c27447861f7", - "cmc": "5.0", + "cardmarket_id": 289545, + "cmc": 5.0, "collector_number": "3", "color_identity": [ "W" @@ -7003,7 +8177,10 @@ "W" ], "digital": false, - "edhrec_rank": 5626, + "edhrec_rank": 7820, + "finishes": [ + "nonfoil" + ], "flavor_text": "Follow the light. In its absence, follow her.", "foil": false, "frame": "2015", @@ -7015,6 +8192,7 @@ "highres_image": true, "id": "8752c1db-b924-4dda-8b71-4c254d0ef2de", "illustration_id": "5f5651af-22fb-4fb8-a04c-1f34b5104bd9", + "image_status": "highres_scan", "image_uris": { "art_crop": "https://c1.scryfall.com/file/scryfall-cards/art_crop/front/8/7/8752c1db-b924-4dda-8b71-4c254d0ef2de.jpg?1562923563", "border_crop": "https://c1.scryfall.com/file/scryfall-cards/border_crop/front/8/7/8752c1db-b924-4dda-8b71-4c254d0ef2de.jpg?1562923563", @@ -7030,17 +8208,23 @@ "lang": "en", "layout": "normal", "legalities": { + "alchemy": "legal", "brawl": "not_legal", "commander": "legal", "duel": "legal", + "explorer": "legal", "future": "not_legal", + "gladiator": "legal", "historic": "legal", + "historicbrawl": "legal", "legacy": "legal", "modern": "legal", "oldschool": "not_legal", "pauper": "not_legal", + "paupercommander": "restricted", "penny": "legal", "pioneer": "legal", + "premodern": "legal", "standard": "not_legal", "vintage": "legal" }, @@ -7056,11 +8240,14 @@ "oracle_id": "4b7ac066-e5c7-43e6-9e7e-2739b24a905d", "oracle_text": "Flying, vigilance", "oversized": false, + "penny_rank": 8518, "power": "4", "prices": { - "eur": "0.14", - "tix": "0.04", - "usd": "0.15", + "eur": 0.1, + "eur_foil": null, + "tix": 0.05, + "usd": 0.11, + "usd_etched": null, "usd_foil": null }, "prints_search_uri": "https://api.scryfall.com/cards/search?order=released&q=oracleid%3A4b7ac066-e5c7-43e6-9e7e-2739b24a905d&unique=prints", @@ -7072,8 +8259,8 @@ "related_uris": { "edhrec": "https://edhrec.com/route/?cc=Serra+Angel", "gatherer": "https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=413369", - "mtgtop8": "https://mtgtop8.com/search?MD_check=1&SB_check=1&cards=Serra+Angel", - "tcgplayer_decks": "https://decks.tcgplayer.com/magic/deck/search?contains=Serra+Angel&page=1&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" + "tcgplayer_infinite_articles": "https://infinite.tcgplayer.com/search?contentMode=article&game=magic&partner=scryfall&q=Serra+Angel&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall", + "tcgplayer_infinite_decks": "https://infinite.tcgplayer.com/search?contentMode=deck&game=magic&partner=scryfall&q=Serra+Angel&utm_campaign=affiliate&utm_medium=api&utm_source=scryfall" }, "released_at": "2016-04-08", "reprint": true, @@ -7082,6 +8269,7 @@ "scryfall_set_uri": "https://scryfall.com/sets/w16?utm_source=api", "scryfall_uri": "https://scryfall.com/card/w16/3/serra-angel?utm_source=api", "set": "w16", + "set_id": "b3a0e4a1-5f2c-44e1-8558-61e6dcd88fda", "set_name": "Welcome Deck 2016", "set_search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aw16&unique=prints", "set_type": "starter", diff --git a/tests/data/sets.json b/tests/data/sets.json index 9c80746..97d5b3f 100644 --- a/tests/data/sets.json +++ b/tests/data/sets.json @@ -5,7 +5,7 @@ "code": "arc", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1653883200", "id": "8bc5ec64-18d5-4c81-96a1-8f619d81a019", "name": "Archenemy", "nonfoil_only": true, @@ -25,7 +25,7 @@ "code": "bok", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/bok.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/bok.svg?1653883200", "id": "d4b88587-a1f5-4b47-9e24-78ec9e57bd0e", "mtgo_code": "bok", "name": "Betrayers of Kamigawa", @@ -46,7 +46,7 @@ "code": "chk", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/chk.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/chk.svg?1653883200", "id": "6183d21f-a0af-4118-ba58-aca1d8719c01", "mtgo_code": "chk", "name": "Champions of Kamigawa", @@ -67,7 +67,7 @@ "code": "csp", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/csp.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/csp.svg?1653883200", "id": "1f4f105f-73e4-4f03-849e-82a204807847", "mtgo_code": "csp", "name": "Coldsnap", @@ -85,7 +85,7 @@ "code": "fem", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/fem.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/fem.svg?1653883200", "id": "cf7390b1-341a-4ae8-a325-da0f5f322f13", "name": "Fallen Empires", "nonfoil_only": true, @@ -102,7 +102,7 @@ "code": "hml", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hml.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hml.svg?1653883200", "id": "5ac1f606-e682-46e9-ad0f-122a3783581b", "name": "Homelands", "nonfoil_only": true, @@ -120,7 +120,7 @@ "code": "hop", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1653883200", "id": "7137ffeb-eb1d-466c-a0d3-3157f52b1b10", "mtgo_code": "pc1", "name": "Planechase", @@ -140,12 +140,12 @@ "code": "ice", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ice.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ice.svg?1653883200", "id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "name": "Ice Age", "nonfoil_only": true, "object": "set", - "released_at": "1995-06-01", + "released_at": "1995-06-03", "scryfall_uri": "https://scryfall.com/sets/ice", "search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -160,7 +160,7 @@ "code": "isd", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/isd.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/isd.svg?1653883200", "id": "d1026945-2969-42b9-be53-f941405a58cb", "mtgo_code": "isd", "name": "Innistrad", @@ -180,7 +180,7 @@ "code": "lea", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/lea.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/lea.svg?1653883200", "id": "288bd996-960e-448b-a187-9504c1930c2c", "name": "Limited Edition Alpha", "nonfoil_only": true, @@ -198,7 +198,7 @@ "code": "mma", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mma.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mma.svg?1653883200", "id": "0b7020f2-336d-4706-9ce6-f6710b9ebd5c", "mtgo_code": "mma", "name": "Modern Masters", @@ -216,7 +216,7 @@ "code": "oarc", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1653883200", "id": "238beedf-1d4d-475f-a980-527ba2f55dc6", "name": "Archenemy Schemes", "nonfoil_only": true, @@ -236,7 +236,7 @@ "code": "ogw", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ogw.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ogw.svg?1653883200", "id": "cd51d245-8f95-45b0-ab5f-e2b3a3eb5dfe", "mtgo_code": "ogw", "name": "Oath of the Gatewatch", @@ -255,7 +255,7 @@ "code": "ohop", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1653883200", "id": "7a8b75a9-7c92-4c3f-976a-322e1eb3b6b6", "mtgo_code": "ohop", "name": "Planechase Planes", @@ -274,7 +274,7 @@ "code": "opc2", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1653883200", "id": "7079031b-c5b0-4353-87af-a63a0f204f47", "mtgo_code": "opc2", "name": "Planechase 2012 Planes", @@ -293,7 +293,7 @@ "code": "pc2", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1653883200", "id": "9fb2f83e-7015-4aa9-808f-310ccf0fdb9c", "mtgo_code": "pc2", "name": "Planechase 2012", @@ -313,13 +313,13 @@ "code": "pfrf", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/frf.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/frf.svg?1653883200", "id": "aa9f80e3-8d60-46b7-b91e-eb1736fde866", "name": "Fate Reforged Promos", "nonfoil_only": false, "object": "set", "parent_set_code": "frf", - "released_at": "2015-01-24", + "released_at": "2015-01-23", "scryfall_uri": "https://scryfall.com/sets/pfrf", "search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apfrf&unique=prints", "set_type": "promo", @@ -330,7 +330,7 @@ "code": "phop", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/dci.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/dci.svg?1653883200", "id": "ef3f6784-a6e8-41ff-8bed-72e0c7121298", "name": "Promotional Planes", "nonfoil_only": true, @@ -346,7 +346,7 @@ "code": "phpr", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pbook.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pbook.svg?1653883200", "id": "b32cc4a1-1e06-4bec-bab6-89b2691b57a4", "name": "HarperPrism Book Promos", "nonfoil_only": true, @@ -365,7 +365,7 @@ "code": "plc", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/plc.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/plc.svg?1653883200", "id": "5a1b571c-73e9-4c14-b9d4-a62507d85789", "mtgo_code": "plc", "name": "Planar Chaos", @@ -386,7 +386,7 @@ "code": "pls", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pls.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pls.svg?1653883200", "id": "82dc193b-bd5f-4883-a93f-a4155b467ee0", "mtgo_code": "ps", "name": "Planeshift", @@ -406,7 +406,7 @@ "code": "pmbs", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mbs.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mbs.svg?1653883200", "id": "8a59d98a-4e13-4943-b06c-b35868e954ba", "name": "Mirrodin Besieged Promos", "nonfoil_only": false, @@ -423,7 +423,7 @@ "code": "ptg", "digital": false, "foil_only": true, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ptg.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ptg.svg?1653883200", "id": "d264b61b-bfb3-4388-be42-e34a1eaa00c2", "name": "Ponies: The Galloping", "nonfoil_only": false, @@ -440,7 +440,7 @@ "code": "s00", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/s00.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/s00.svg?1653883200", "id": "1c105623-2564-40d7-a3aa-4134787fb127", "name": "Starter 2000", "nonfoil_only": false, @@ -452,6 +452,23 @@ "tcgplayer_id": 106, "uri": "https://api.scryfall.com/sets/1c105623-2564-40d7-a3aa-4134787fb127" }, + { + "card_count": 1, + "code": "sld", + "digital": false, + "foil_only": false, + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/star.svg?1653883200", + "id": "4d92a8a7-ccb0-437d-abdc-9d70fc5ed672", + "name": "Secret Lair Drop", + "nonfoil_only": false, + "object": "set", + "released_at": "2019-12-02", + "scryfall_uri": "https://scryfall.com/sets/sld", + "search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Asld&unique=prints", + "set_type": "box", + "tcgplayer_id": 2576, + "uri": "https://api.scryfall.com/sets/4d92a8a7-ccb0-437d-abdc-9d70fc5ed672" + }, { "arena_code": "sok", "block": "Kamigawa", @@ -460,7 +477,7 @@ "code": "sok", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/sok.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/sok.svg?1653883200", "id": "4db16ad3-2b95-442f-bb6b-e9aa7fe7f769", "mtgo_code": "sok", "name": "Saviors of Kamigawa", @@ -479,7 +496,7 @@ "code": "thb", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/thb.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/thb.svg?1653883200", "id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "mtgo_code": "thb", "name": "Theros Beyond Death", @@ -497,7 +514,7 @@ "code": "unh", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/unh.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/unh.svg?1653883200", "id": "4c8bc76a-05a5-43db-aaf0-34deb347b871", "name": "Unhinged", "nonfoil_only": false, @@ -514,7 +531,7 @@ "code": "ust", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ust.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ust.svg?1653883200", "id": "83491685-880d-41dd-a4af-47d2b3b17c10", "name": "Unstable", "nonfoil_only": false, @@ -532,7 +549,7 @@ "code": "vma", "digital": true, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/vma.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/vma.svg?1653883200", "id": "a944551a-73fa-41cd-9159-e8d0e4674403", "mtgo_code": "vma", "name": "Vintage Masters", @@ -550,7 +567,7 @@ "code": "w16", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/w16.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/w16.svg?1653883200", "id": "b3a0e4a1-5f2c-44e1-8558-61e6dcd88fda", "mtgo_code": "w16", "name": "Welcome Deck 2016", diff --git a/tests/data/sets1.json b/tests/data/sets1.json index 80f6fba..711f8c9 100644 --- a/tests/data/sets1.json +++ b/tests/data/sets1.json @@ -5,7 +5,7 @@ "code": "arc", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1653883200", "id": "8bc5ec64-18d5-4c81-96a1-8f619d81a019", "name": "Archenemy", "nonfoil_only": true, @@ -25,7 +25,7 @@ "code": "bok", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/bok.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/bok.svg?1653883200", "id": "d4b88587-a1f5-4b47-9e24-78ec9e57bd0e", "mtgo_code": "bok", "name": "Betrayers of Kamigawa", @@ -46,7 +46,7 @@ "code": "chk", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/chk.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/chk.svg?1653883200", "id": "6183d21f-a0af-4118-ba58-aca1d8719c01", "mtgo_code": "chk", "name": "Champions of Kamigawa", @@ -67,7 +67,7 @@ "code": "csp", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/csp.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/csp.svg?1653883200", "id": "1f4f105f-73e4-4f03-849e-82a204807847", "mtgo_code": "csp", "name": "Coldsnap", @@ -85,7 +85,7 @@ "code": "fem", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/fem.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/fem.svg?1653883200", "id": "cf7390b1-341a-4ae8-a325-da0f5f322f13", "name": "Fallen Empires", "nonfoil_only": true, diff --git a/tests/data/sets2.json b/tests/data/sets2.json index 821931f..1c68728 100644 --- a/tests/data/sets2.json +++ b/tests/data/sets2.json @@ -5,7 +5,7 @@ "code": "hml", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hml.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hml.svg?1653883200", "id": "5ac1f606-e682-46e9-ad0f-122a3783581b", "name": "Homelands", "nonfoil_only": true, @@ -23,7 +23,7 @@ "code": "hop", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1653883200", "id": "7137ffeb-eb1d-466c-a0d3-3157f52b1b10", "mtgo_code": "pc1", "name": "Planechase", @@ -43,12 +43,12 @@ "code": "ice", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ice.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ice.svg?1653883200", "id": "b0e08eea-5c01-4406-a6e2-dcd09c5e5b67", "name": "Ice Age", "nonfoil_only": true, "object": "set", - "released_at": "1995-06-01", + "released_at": "1995-06-03", "scryfall_uri": "https://scryfall.com/sets/ice", "search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Aice&unique=prints", "set_type": "expansion", @@ -63,7 +63,7 @@ "code": "isd", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/isd.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/isd.svg?1653883200", "id": "d1026945-2969-42b9-be53-f941405a58cb", "mtgo_code": "isd", "name": "Innistrad", @@ -83,7 +83,7 @@ "code": "lea", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/lea.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/lea.svg?1653883200", "id": "288bd996-960e-448b-a187-9504c1930c2c", "name": "Limited Edition Alpha", "nonfoil_only": true, @@ -101,7 +101,7 @@ "code": "mma", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mma.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mma.svg?1653883200", "id": "0b7020f2-336d-4706-9ce6-f6710b9ebd5c", "mtgo_code": "mma", "name": "Modern Masters", @@ -119,7 +119,7 @@ "code": "oarc", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/arc.svg?1653883200", "id": "238beedf-1d4d-475f-a980-527ba2f55dc6", "name": "Archenemy Schemes", "nonfoil_only": true, @@ -139,7 +139,7 @@ "code": "ogw", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ogw.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ogw.svg?1653883200", "id": "cd51d245-8f95-45b0-ab5f-e2b3a3eb5dfe", "mtgo_code": "ogw", "name": "Oath of the Gatewatch", @@ -158,7 +158,7 @@ "code": "ohop", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/hop.svg?1653883200", "id": "7a8b75a9-7c92-4c3f-976a-322e1eb3b6b6", "mtgo_code": "ohop", "name": "Planechase Planes", @@ -177,7 +177,7 @@ "code": "opc2", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1653883200", "id": "7079031b-c5b0-4353-87af-a63a0f204f47", "mtgo_code": "opc2", "name": "Planechase 2012 Planes", @@ -196,7 +196,7 @@ "code": "pc2", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pc2.svg?1653883200", "id": "9fb2f83e-7015-4aa9-808f-310ccf0fdb9c", "mtgo_code": "pc2", "name": "Planechase 2012", @@ -216,13 +216,13 @@ "code": "pfrf", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/frf.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/frf.svg?1653883200", "id": "aa9f80e3-8d60-46b7-b91e-eb1736fde866", "name": "Fate Reforged Promos", "nonfoil_only": false, "object": "set", "parent_set_code": "frf", - "released_at": "2015-01-24", + "released_at": "2015-01-23", "scryfall_uri": "https://scryfall.com/sets/pfrf", "search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Apfrf&unique=prints", "set_type": "promo", @@ -233,7 +233,7 @@ "code": "phop", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/dci.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/dci.svg?1653883200", "id": "ef3f6784-a6e8-41ff-8bed-72e0c7121298", "name": "Promotional Planes", "nonfoil_only": true, @@ -249,7 +249,7 @@ "code": "phpr", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pbook.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pbook.svg?1653883200", "id": "b32cc4a1-1e06-4bec-bab6-89b2691b57a4", "name": "HarperPrism Book Promos", "nonfoil_only": true, @@ -268,7 +268,7 @@ "code": "plc", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/plc.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/plc.svg?1653883200", "id": "5a1b571c-73e9-4c14-b9d4-a62507d85789", "mtgo_code": "plc", "name": "Planar Chaos", @@ -289,7 +289,7 @@ "code": "pls", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pls.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/pls.svg?1653883200", "id": "82dc193b-bd5f-4883-a93f-a4155b467ee0", "mtgo_code": "ps", "name": "Planeshift", @@ -309,7 +309,7 @@ "code": "pmbs", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mbs.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/mbs.svg?1653883200", "id": "8a59d98a-4e13-4943-b06c-b35868e954ba", "name": "Mirrodin Besieged Promos", "nonfoil_only": false, @@ -326,7 +326,7 @@ "code": "ptg", "digital": false, "foil_only": true, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ptg.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ptg.svg?1653883200", "id": "d264b61b-bfb3-4388-be42-e34a1eaa00c2", "name": "Ponies: The Galloping", "nonfoil_only": false, @@ -343,7 +343,7 @@ "code": "s00", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/s00.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/s00.svg?1653883200", "id": "1c105623-2564-40d7-a3aa-4134787fb127", "name": "Starter 2000", "nonfoil_only": false, @@ -355,6 +355,23 @@ "tcgplayer_id": 106, "uri": "https://api.scryfall.com/sets/1c105623-2564-40d7-a3aa-4134787fb127" }, + { + "card_count": 1, + "code": "sld", + "digital": false, + "foil_only": false, + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/star.svg?1653883200", + "id": "4d92a8a7-ccb0-437d-abdc-9d70fc5ed672", + "name": "Secret Lair Drop", + "nonfoil_only": false, + "object": "set", + "released_at": "2019-12-02", + "scryfall_uri": "https://scryfall.com/sets/sld", + "search_uri": "https://api.scryfall.com/cards/search?order=set&q=e%3Asld&unique=prints", + "set_type": "box", + "tcgplayer_id": 2576, + "uri": "https://api.scryfall.com/sets/4d92a8a7-ccb0-437d-abdc-9d70fc5ed672" + }, { "arena_code": "sok", "block": "Kamigawa", @@ -363,7 +380,7 @@ "code": "sok", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/sok.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/sok.svg?1653883200", "id": "4db16ad3-2b95-442f-bb6b-e9aa7fe7f769", "mtgo_code": "sok", "name": "Saviors of Kamigawa", @@ -382,7 +399,7 @@ "code": "thb", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/thb.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/thb.svg?1653883200", "id": "5f23a78d-cda1-462a-8be3-a62b40c34913", "mtgo_code": "thb", "name": "Theros Beyond Death", @@ -400,7 +417,7 @@ "code": "unh", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/unh.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/unh.svg?1653883200", "id": "4c8bc76a-05a5-43db-aaf0-34deb347b871", "name": "Unhinged", "nonfoil_only": false, @@ -417,7 +434,7 @@ "code": "ust", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ust.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/ust.svg?1653883200", "id": "83491685-880d-41dd-a4af-47d2b3b17c10", "name": "Unstable", "nonfoil_only": false, @@ -435,7 +452,7 @@ "code": "vma", "digital": true, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/vma.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/vma.svg?1653883200", "id": "a944551a-73fa-41cd-9159-e8d0e4674403", "mtgo_code": "vma", "name": "Vintage Masters", @@ -453,7 +470,7 @@ "code": "w16", "digital": false, "foil_only": false, - "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/w16.svg?1599451200", + "icon_svg_uri": "https://c2.scryfall.com/file/scryfall-symbols/sets/w16.svg?1653883200", "id": "b3a0e4a1-5f2c-44e1-8558-61e6dcd88fda", "mtgo_code": "w16", "name": "Welcome Deck 2016", diff --git a/tests/gen_testdata.py b/tests/gen_testdata.py index 52eec54..3f505c6 100755 --- a/tests/gen_testdata.py +++ b/tests/gen_testdata.py @@ -3,15 +3,9 @@ # pylint: disable=protected-access import copy -import dataclasses -import json import os -from typing import List -from typing import cast -from mtg_ssm.scryfall import fetcher -from mtg_ssm.scryfall import models -from mtg_ssm.scryfall import schema +from mtg_ssm.scryfall import fetcher, models TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data") TARGET_SETS_FILE = os.path.join(TEST_DATA_DIR, "sets.json") @@ -58,10 +52,9 @@ "ust": {"Very Cryptic Command"}, "vma": {"Academy Elite"}, "w16": {"Serra Angel"}, + "sld": {"Viscera Seer"}, } -_OBJECT_SCHEMA = schema.ScryfallUberSchema() - def main() -> None: # pylint: disable=too-many-locals """Read scryfall data and write a subset for use as test data.""" @@ -70,10 +63,7 @@ def main() -> None: # pylint: disable=too-many-locals bulk_json = fetcher._fetch_endpoint( fetcher.BULK_DATA_ENDPOINT, dirty=False, write_cache=False ) - bulk_data = cast( - List[models.ScryBulkData], - cast(models.ScryObjectList, fetcher._deserialize_object(bulk_json)).data, - ) + bulk_data = models.ScryObjectList[models.ScryBulkData].parse_obj(bulk_json).data print("Selecting sets") accepted_sets = sorted( @@ -103,29 +93,25 @@ def main() -> None: # pylint: disable=too-many-locals ) print("Adjusting sets") - accepted_sets = [ - dataclasses.replace( - cset, card_count=len([c for c in accepted_cards if c.set == cset.code]) - ) - for cset in accepted_sets - ] + for cset in accepted_sets: + cset.card_count = len([c for c in accepted_cards if c.set == cset.code]) print("Writing sets") - sets_list = models.ScryObjectList( + sets_list = models.ScryObjectList[models.ScrySet]( data=accepted_sets, has_more=False, next_page=None, total_cards=None, warnings=None, ) - sets_list1 = models.ScryObjectList( + sets_list1 = models.ScryObjectList[models.ScrySet]( data=accepted_sets[:5], has_more=True, - next_page=models.URI(SETS_NEXTPAGE_URL), + next_page=SETS_NEXTPAGE_URL, total_cards=None, warnings=None, ) - sets_list2 = models.ScryObjectList( + sets_list2 = models.ScryObjectList[models.ScrySet]( data=accepted_sets[5:], has_more=False, next_page=None, @@ -134,46 +120,53 @@ def main() -> None: # pylint: disable=too-many-locals ) os.makedirs(TEST_DATA_DIR, exist_ok=True) with open(TARGET_SETS_FILE, "wt", encoding="utf-8") as sets_file: - json.dump( - _OBJECT_SCHEMA.dump(sets_list).data, - sets_file, - ensure_ascii=False, - indent=2, - sort_keys=True, + sets_file.write( + sets_list.json( + ensure_ascii=False, + indent=2, + sort_keys=True, + exclude_none=True, + ) ) sets_file.write("\n") with open(TARGET_SETS_FILE1, "wt", encoding="utf-8") as sets_file1: - json.dump( - _OBJECT_SCHEMA.dump(sets_list1).data, - sets_file1, - ensure_ascii=False, - indent=2, - sort_keys=True, + sets_file1.write( + sets_list1.json( + ensure_ascii=False, + indent=2, + sort_keys=True, + exclude_none=True, + ) ) sets_file1.write("\n") with open(TARGET_SETS_FILE2, "wt", encoding="utf-8") as sets_file2: - json.dump( - _OBJECT_SCHEMA.dump(sets_list2).data, - sets_file2, - ensure_ascii=False, - indent=2, - sort_keys=True, + sets_file2.write( + sets_list2.json( + ensure_ascii=False, + indent=2, + sort_keys=True, + exclude_none=True, + ) ) sets_file2.write("\n") print("Writing cards") with open(TARGET_CARDS_FILE, "wt", encoding="utf-8") as cards_file: - json.dump( - [_OBJECT_SCHEMA.dump(c).data for c in accepted_cards], - cards_file, - ensure_ascii=False, - indent=2, - sort_keys=True, + root_list: models.ScryRootList[models.ScryCard] = models.ScryRootList( + __root__=accepted_cards + ) + cards_file.write( + root_list.json( + ensure_ascii=False, + indent=2, + sort_keys=True, + exclude_none=True, + ) ) cards_file.write("\n") print("Writing bulk data") - bulk_list = models.ScryObjectList( + bulk_list = models.ScryObjectList[models.ScryBulkData]( data=accepted_bulk, has_more=False, next_page=None, @@ -181,12 +174,13 @@ def main() -> None: # pylint: disable=too-many-locals warnings=None, ) with open(TARGET_BULK_FILE, "wt", encoding="utf-8") as bulk_file: - json.dump( - _OBJECT_SCHEMA.dump(bulk_list).data, - bulk_file, - ensure_ascii=False, - indent=2, - sort_keys=True, + bulk_file.write( + bulk_list.json( + ensure_ascii=False, + indent=2, + sort_keys=True, + exclude_none=True, + ) ) bulk_file.write("\n") diff --git a/tests/mtg/test_util.py b/tests/mtg/test_util.py index 36f59c7..0efeb82 100644 --- a/tests/mtg/test_util.py +++ b/tests/mtg/test_util.py @@ -1,7 +1,6 @@ """Tests for mtg_ssm.mtg.util.""" -from typing import Dict -from typing import Optional +from typing import Dict, Optional from uuid import UUID import pytest @@ -46,10 +45,10 @@ def test_is_strict_basic(name: str, expected: bool) -> None: "★", ), pytest.param( - "Lathiel, the Bounteous Dawn", - UUID("913752eb-b446-41f8-9914-f78f981b042b"), - None, - "LTBP", + "Viscera Seer", + UUID("dba1cf83-e13d-401e-b76f-b12a51b307f9"), + 0, + "VS", ), ], ) diff --git a/tests/scryfall/test_fetcher.py b/tests/scryfall/test_fetcher.py index d9bca30..7ed8bec 100644 --- a/tests/scryfall/test_fetcher.py +++ b/tests/scryfall/test_fetcher.py @@ -4,20 +4,19 @@ import gzip import pickle import re -from typing import List +from typing import Dict, List, Pattern, Union import pytest from responses import RequestsMock from mtg_ssm.containers.bundles import ScryfallDataSet from mtg_ssm.scryfall import fetcher -from mtg_ssm.scryfall.models import ScryCard -from mtg_ssm.scryfall.models import ScrySet +from mtg_ssm.scryfall.models import ScryCard, ScrySet from tests import gen_testdata BULK_CARDS_REGEX = r"https://[a-z0-9]+\.scryfall.com/file/scryfall-bulk/default-cards/default-cards-\d{14}\.json" -ENDPOINT_TO_FILE = { +ENDPOINT_TO_FILE: Dict[Union[str, Pattern[str]], str] = { fetcher.BULK_DATA_ENDPOINT: gen_testdata.TARGET_BULK_FILE, fetcher.SETS_ENDPOINT: gen_testdata.TARGET_SETS_FILE1, gen_testdata.SETS_NEXTPAGE_URL: gen_testdata.TARGET_SETS_FILE2, @@ -64,7 +63,9 @@ def test_scryfetch() -> None: @pytest.mark.usefixtures("scryurls") def test_break_object_cache(baddata: bytes) -> None: scrydata1 = fetcher.scryfetch() - with open(fetcher._cache_path(fetcher.OBJECT_CACHE_URL), "wb") as cache_file: + with open( + fetcher._cache_path(fetcher.OBJECT_CACHE_URL, ".pickle.gz"), "wb" + ) as cache_file: cache_file.write(baddata) scrydata2 = fetcher.scryfetch() assert scrydata1 == scrydata2 diff --git a/tests/scryfall/test_schema.py b/tests/scryfall/test_schema.py deleted file mode 100644 index e4e1a1b..0000000 --- a/tests/scryfall/test_schema.py +++ /dev/null @@ -1,686 +0,0 @@ -"""Tests for scrypy.schema.""" - -import datetime as dt -import decimal -from typing import Any -from typing import Dict -import uuid - -import marshmallow.exceptions -import pytest - -from mtg_ssm.scryfall import models -from mtg_ssm.scryfall import schema - -SERDE_TESTS = [ - pytest.param( - { - "object": "list", - "has_more": False, - "data": ( - { - "object": "list", - "has_more": True, - "next_page": "https://example.com/page2", - "total_cards": 3, - "warnings": ("warn",), - "data": (), - }, - ), - }, - models.ScryObjectList( - has_more=False, - next_page=None, - total_cards=None, - warnings=None, - data=( - models.ScryObjectList( - has_more=True, - next_page=models.URI("https://example.com/page2"), - total_cards=3, - warnings=("warn",), - data=(), - ), - ), - ), - id="list", - ), - pytest.param( - { - "object": "set", - "id": "00000000-0000-0000-0000-000000000002", - "code": "cset", - "mtgo_code": "mtgocset", - "arena_code": "arenacset", - "tcgplayer_id": 2, - "name": "Test Set", - "set_type": "funny", - "released_at": "2018-04-03", - "block_code": "tst", - "block": "Test Block", - "parent_set_code": "cprnt", - "card_count": 5, - "digital": False, - "foil_only": True, - "nonfoil_only": False, - "icon_svg_uri": "https://example.com/cset_image.svg", - "search_uri": "https://example.com/search/set/cset", - "scryfall_uri": "https://example.com/set/cset", - "uri": "https://example.com/cset", - }, - models.ScrySet( - id=uuid.UUID(int=2), - code="cset", - mtgo_code="mtgocset", - arena_code="arenacset", - tcgplayer_id=2, - name="Test Set", - set_type=models.ScrySetType.FUNNY, - released_at=dt.date(2018, 4, 3), - block_code="tst", - block="Test Block", - parent_set_code="cprnt", - card_count=5, - printed_size=5, - digital=False, - foil_only=True, - nonfoil_only=False, - icon_svg_uri=models.URI("https://example.com/cset_image.svg"), - search_uri=models.URI("https://example.com/search/set/cset"), - scryfall_uri=models.URI("https://example.com/set/cset"), - uri=models.URI("https://example.com/cset"), - ), - id="set", - ), - pytest.param( - { - "object": "set", - "id": "00000000-0000-0000-0000-000000000002", - "code": "cset2", - "name": "Test Set 2", - "set_type": "promo", - "card_count": 6, - "digital": True, - "foil_only": False, - "icon_svg_uri": "https://example.com/cset2_image.svg", - "search_uri": "https://example.com/search/set/cset2", - "scryfall_uri": "https://example.com/set/cset2", - "uri": "https://example.com/cset2", - }, - models.ScrySet( - id=uuid.UUID(int=2), - code="cset2", - mtgo_code=None, - arena_code=None, - tcgplayer_id=None, - name="Test Set 2", - set_type=models.ScrySetType.PROMO, - released_at=None, - block_code=None, - block=None, - parent_set_code=None, - card_count=6, - digital=True, - foil_only=False, - nonfoil_only=None, - icon_svg_uri=models.URI("https://example.com/cset2_image.svg"), - search_uri=models.URI("https://example.com/search/set/cset2"), - scryfall_uri=models.URI("https://example.com/set/cset2"), - uri=models.URI("https://example.com/cset2"), - ), - id="set-nulls", - ), - pytest.param( - { - "object": "related_card", - "id": "00000000-0000-0000-0000-000000000003", - "component": "something", - "name": "some_related", - "type_line": "Thing — Such", - "uri": "https://example.com/related-card", - }, - models.ScryRelatedCard( - id=uuid.UUID(int=3), - component="something", - name="some_related", - type_line="Thing — Such", - uri=models.URI("https://example.com/related-card"), - ), - id="related_card", - ), - pytest.param( - { - "object": "card_face", - "artist": "Somebody", - "artist_id": "00000000-0000-0000-0000-000000000009", - "color_indicator": ("W", "B"), - "colors": ("G", "R"), - "flavor_text": "flavorful words", - "illustration_id": "00000000-0000-0000-0000-000000000004", - "image_uris": { - "imgone": "https://example.com/face1.jpg", - "imgtwo": "https://example.com/face2.jpg", - }, - "loyalty": "X", - "mana_cost": "{X}{W}{U}{U}", - "name": "A card", - "oracle_text": "Do some stuff", - "power": "1+*", - "printed_name": "Acard", - "printed_text": "Really do some stuff", - "printed_type_line": "Thing — really stuff", - "toughness": "2+*", - "type_line": "Thing — stuff", - "watermark": "Very", - }, - models.ScryCardFace( - artist="Somebody", - artist_id=uuid.UUID(int=9), - color_indicator=(models.ScryColor.WHITE, models.ScryColor.BLACK), - colors=(models.ScryColor.GREEN, models.ScryColor.RED), - flavor_text="flavorful words", - illustration_id=uuid.UUID(int=4), - image_uris={ - "imgone": models.URI("https://example.com/face1.jpg"), - "imgtwo": models.URI("https://example.com/face2.jpg"), - }, - loyalty="X", - mana_cost="{X}{W}{U}{U}", - name="A card", - oracle_text="Do some stuff", - power="1+*", - printed_name="Acard", - printed_text="Really do some stuff", - printed_type_line="Thing — really stuff", - toughness="2+*", - type_line="Thing — stuff", - watermark="Very", - ), - id="card_face", - ), - pytest.param( - { - "object": "card_face", - "mana_cost": "{X}{W}{U}{U}", - "name": "A card", - "type_line": "Thing — stuff", - }, - models.ScryCardFace( - artist=None, - artist_id=None, - color_indicator=None, - colors=None, - flavor_text=None, - illustration_id=None, - image_uris=None, - loyalty=None, - mana_cost="{X}{W}{U}{U}", - name="A card", - oracle_text=None, - power=None, - printed_name=None, - printed_text=None, - printed_type_line=None, - toughness=None, - type_line="Thing — stuff", - watermark=None, - ), - id="card_face-nulls", - ), - pytest.param( - { - "object": "card", - "arena_id": 1, - "id": "00000000-0000-0000-0000-000000000005", - "lang": "en", - "mtgo_id": 7, - "mtgo_foil_id": 8, - "multiverse_ids": (123, 456), - "tcgplayer_id": 9, - cardmarket_id=42, - "oracle_id": "00000000-0000-0000-0000-000000000006", - "prints_search_uri": "https://example.com/find/mycard", - "rulings_uri": "https://example.com/rulings/mycard", - "scryfall_uri": "https://example.com/scryfall/mycard", - "uri": "https://example.com/mycard", - "all_parts": ( - { - "object": "related_card", - "id": "00000000-0000-0000-0000-000000000007", - "component": "other", - "name": "othercard", - "type_line": "Some — Other", - "uri": "https://exmaple.com/othercard", - }, - ), - "card_faces": ( - { - "object": "card_face", - "mana_cost": "{X}", - "name": "A front", - "type_line": "Card — Front", - }, - ), - "cmc": "1.5", - "colors": ("U", "B"), - "color_identity": ("G", "W"), - "color_indicator": ("R",), - "edhrec_rank": 10, - "foil": True, - "hand_modifier": "-2", - "keywords": ("Flying", "First Strike"), - "layout": "saga", - "legalities": {"vintage": "restricted", "legacy": "legal"}, - "life_modifier": "+2", - "loyalty": "3", - "mana_cost": "{X}", - "name": "Some card", - "nonfoil": False, - "oracle_text": "Do a thing", - "oversized": True, - "power": "X", - "produced_mana": ("C", "R"), - "reserved": False, - "toughness": "Y", - "type_line": "Card — Stuff", - "artist": "Some person", - "artist_ids": ("00000000-0000-0000-0000-00000000000c",), - "booster": True, - "border_color": "gold", - "card_back_id": "00000000-0000-0000-0000-000000000012", - "collector_number": "107★", - "content_warning": False, - "digital": False, - "flavor_text": "I am a card", - "flavor_name": "The Bombast", - "frame_effect": "miracle", - "frame_effects": ("miracle",), - "frame": "1993", - "full_art": True, - "games": ("mtgo", "paper"), - "highres_image": True, - "illustration_id": "00000000-0000-0000-0000-000000000008", - "image_uris": {"animage": "https://example.com/somecard"}, - "prices": {"usd": "0.83", "usd_foil": None}, - "printed_name": "Some-card", - "printed_text": "Do da thing", - "printed_type_line": "Card — Stuffs", - "promo": True, - "promo_types": ("promo1",), - "purchase_uris": {"store": "https://example.com/buysomecard"}, - "rarity": "mythic", - "related_uris": {"other": "https://example.com/othersomecard"}, - "released_at": "2016-02-04", - "reprint": False, - "scryfall_set_uri": "https://example.com/scry/somecard", - "set_name": "A card set", - "set_search_uri": "https://example.com/acs/somecard", - "set_type": "someset", - "set_uri": "https://example.com/sets/acs", - "set": "acs", - "story_spotlight": True, - "textless": True, - "variation": True, - "variation_of": "00000000-0000-0000-0000-00000000001d", - "watermark": "Shiny", - "preview": { - "source": "me", - "source_uri": "not a good value", - "previewed_at": "2019-09-10", - }, - }, - models.ScryCard( - arena_id=1, - id=uuid.UUID(int=5), - lang="en", - mtgo_id=7, - mtgo_foil_id=8, - multiverse_ids=(123, 456), - tcgplayer_id=9, - oracle_id=uuid.UUID(int=6), - prints_search_uri=models.URI("https://example.com/find/mycard"), - rulings_uri=models.URI("https://example.com/rulings/mycard"), - scryfall_uri=models.URI("https://example.com/scryfall/mycard"), - uri=models.URI("https://example.com/mycard"), - all_parts=( - models.ScryRelatedCard( - id=uuid.UUID(int=7), - component="other", - name="othercard", - type_line="Some — Other", - uri=models.URI("https://exmaple.com/othercard"), - ), - ), - card_faces=( - models.ScryCardFace( - artist=None, - artist_id=None, - color_indicator=None, - colors=None, - flavor_text=None, - illustration_id=None, - image_uris=None, - loyalty=None, - mana_cost="{X}", - name="A front", - oracle_text=None, - power=None, - printed_name=None, - printed_text=None, - printed_type_line=None, - toughness=None, - type_line="Card — Front", - watermark=None, - ), - ), - cmc=decimal.Decimal("1.5"), - colors=(models.ScryColor.BLUE, models.ScryColor.BLACK), - color_identity=(models.ScryColor.GREEN, models.ScryColor.WHITE), - color_indicator=(models.ScryColor.RED,), - edhrec_rank=10, - foil=True, - hand_modifier="-2", - keywords=("Flying", "First Strike"), - layout=models.ScryCardLayout.SAGA, - legalities={ - models.ScryFormat.VINTAGE: models.ScryLegality.RESTRICTED, - models.ScryFormat.LEGACY: models.ScryLegality.LEGAL, - }, - life_modifier="+2", - loyalty="3", - mana_cost="{X}", - name="Some card", - nonfoil=False, - oracle_text="Do a thing", - oversized=True, - power="X", - produced_mana=(models.ScryColor.COLORLESS, models.ScryColor.RED), - reserved=False, - toughness="Y", - type_line="Card — Stuff", - artist="Some person", - artist_ids=(uuid.UUID(int=12),), - booster=True, - border_color=models.ScryBorderColor.GOLD, - card_back_id=uuid.UUID(int=18), - collector_number="107★", - content_warning=False, - digital=False, - flavor_text="I am a card", - flavor_name="The Bombast", - frame_effect=models.ScryFrameEffect.MIRACLE, - frame_effects=(models.ScryFrameEffect.MIRACLE,), - frame=models.ScryCardFrame.Y1993, - full_art=True, - games=(models.ScryGame.MTGO, models.ScryGame.PAPER), - highres_image=True, - illustration_id=uuid.UUID(int=8), - image_uris={"animage": models.URI("https://example.com/somecard")}, - prices={"usd": decimal.Decimal("0.83"), "usd_foil": None}, - printed_name="Some-card", - printed_text="Do da thing", - printed_type_line="Card — Stuffs", - promo=True, - promo_types=("promo1",), - purchase_uris={"store": models.URI("https://example.com/buysomecard")}, - rarity=models.ScryRarity.MYTHIC, - related_uris={"other": models.URI("https://example.com/othersomecard")}, - released_at=dt.date(2016, 2, 4), - reprint=False, - scryfall_set_uri=models.URI("https://example.com/scry/somecard"), - set_name="A card set", - set_search_uri=models.URI("https://example.com/acs/somecard"), - set_type="someset", - set_uri=models.URI("https://example.com/sets/acs"), - set="acs", - story_spotlight=True, - textless=True, - variation=True, - variation_of=uuid.UUID(int=29), - watermark="Shiny", - preview=models.CardPreviewBlock( - source="me", - source_uri="not a good value", - previewed_at=dt.date(2019, 9, 10), - ), - ), - id="card", - ), - pytest.param( - { - "object": "card", - "id": "00000000-0000-0000-0000-000000000009", - "lang": "en", - "oracle_id": "00000000-0000-0000-0000-00000000000a", - "prints_search_uri": "https://example.com/find/mycard", - "rulings_uri": "https://example.com/rulings/mycard", - "scryfall_uri": "https://example.com/scryfall/mycard", - "uri": "https://example.com/mycard", - "cmc": "1.5", - "color_identity": (), - "foil": True, - "keywords": (), - "layout": "saga", - "legalities": {}, - "name": "Some card", - "nonfoil": False, - "oversized": True, - "reserved": False, - "booster": False, - "border_color": "gold", - "card_back_id": "00000000-0000-0000-0000-000000000016", - "collector_number": "107★", - "digital": False, - "frame": "1993", - "full_art": True, - "games": (), - "highres_image": True, - "promo": True, - "rarity": "mythic", - "released_at": "2016-02-04", - "reprint": False, - "scryfall_set_uri": "https://example.com/scry/somecard", - "set_name": "A card set", - "set_search_uri": "https://example.com/acs/somecard", - "set_uri": "https://example.com/sets/acs", - "set_type": "settype", - "set": "acs", - "story_spotlight": True, - "textless": False, - "variation": False, - }, - models.ScryCard( - arena_id=None, - id=uuid.UUID(int=9), - lang="en", - mtgo_id=None, - mtgo_foil_id=None, - multiverse_ids=None, - tcgplayer_id=None, - oracle_id=uuid.UUID(int=10), - prints_search_uri=models.URI("https://example.com/find/mycard"), - rulings_uri=models.URI("https://example.com/rulings/mycard"), - scryfall_uri=models.URI("https://example.com/scryfall/mycard"), - uri=models.URI("https://example.com/mycard"), - all_parts=None, - card_faces=None, - cmc=decimal.Decimal("1.5"), - colors=None, - color_identity=(), - color_indicator=None, - edhrec_rank=None, - foil=True, - hand_modifier=None, - keywords=(), - layout=models.ScryCardLayout.SAGA, - legalities={}, - life_modifier=None, - loyalty=None, - mana_cost=None, - name="Some card", - nonfoil=False, - oracle_text=None, - oversized=True, - power=None, - produced_mana=None, - reserved=False, - toughness=None, - type_line=None, - artist=None, - artist_ids=None, - booster=False, - border_color=models.ScryBorderColor.GOLD, - card_back_id=uuid.UUID(int=22), - collector_number="107★", - content_warning=None, - digital=False, - flavor_text=None, - flavor_name=None, - frame_effect=None, - frame_effects=None, - frame=models.ScryCardFrame.Y1993, - full_art=True, - games=(), - highres_image=True, - illustration_id=None, - image_uris=None, - prices=None, - printed_name=None, - printed_text=None, - printed_type_line=None, - promo=True, - promo_types=None, - purchase_uris=None, - rarity=models.ScryRarity.MYTHIC, - related_uris=None, - released_at=dt.date(2016, 2, 4), - reprint=False, - scryfall_set_uri=models.URI("https://example.com/scry/somecard"), - set_name="A card set", - set_search_uri=models.URI("https://example.com/acs/somecard"), - set_uri=models.URI("https://example.com/sets/acs"), - set_type="settype", - set="acs", - story_spotlight=True, - textless=False, - variation=False, - variation_of=None, - watermark=None, - preview=None, - ), - id="card-nulls", - ), - pytest.param( - { - "object": "bulk_data", - "id": "00000000-0000-0000-0000-00000000000b", - "uri": "https://example.com/bulk/some_cards", - "type": "cards", - "name": "somecards", - "description": "some cards", - "download_uri": "https://example.com/bulk/some_cards/xyz", - "updated_at": "2019-02-10T10:09:04.174000+00:00", - "compressed_size": 300, - "content_type": "application/json", - "content_encoding": "gzip", - }, - models.ScryBulkData( - id=uuid.UUID(int=11), - uri=models.URI("https://example.com/bulk/some_cards"), - type="cards", - name="somecards", - description="some cards", - download_uri=models.URI("https://example.com/bulk/some_cards/xyz"), - updated_at=dt.datetime( - 2019, 2, 10, 10, 9, 4, 174000, tzinfo=dt.timezone.utc - ), - compressed_size=300, - content_type="application/json", - content_encoding="gzip", - ), - id="bulk_data", - ), -] - -DESERIALIZE_TESTS = SERDE_TESTS + [ - pytest.param( - {"object": "list", "has_more": False, "data": (), "extra": "invalid"}, - None, - marks=pytest.mark.xfail(raises=marshmallow.exceptions.ValidationError), - id="single unknown", - ), - pytest.param( - { - "object": "card", - "id": "00000000-0000-0000-0000-000000000009", - "lang": "en", - "oracle_id": "00000000-0000-0000-0000-00000000000a", - "prints_search_uri": "https://example.com/find/mycard", - "rulings_uri": "https://example.com/rulings/mycard", - "scryfall_uri": "https://example.com/scryfall/mycard", - "uri": "https://example.com/mycard", - "all_parts": ( - { - "object": "related_card", - "id": "00000000-0000-0000-0000-000000000007", - "component": "other", - "name": "othercard", - "type_line": "Some — Other", - "uri": "https://exmaple.com/othercard", - "extra": "invalid", - }, - { - "object": "related_card", - "id": "00000000-0000-0000-0000-000000000008", - "component": "other", - "name": "othercard", - "type_line": "Some — Other", - "uri": "https://exmaple.com/othercard", - "extra2": "invalid2", - }, - ), - "cmc": "1.5", - "color_identity": (), - "foil": True, - "layout": "saga", - "legalities": {}, - "name": "Some card", - "nonfoil": False, - "oversized": True, - "reserved": False, - "border_color": "gold", - "collector_number": "107★", - "digital": False, - "frame_effect": "miracle", - "frame": "1993", - "full_art": True, - "games": (), - "highres_image": True, - "promo": True, - "rarity": "mythic", - "released_at": "2016-02-04", - "reprint": False, - "scryfall_set_uri": "https://example.com/scry/somecard", - "set_name": "A card set", - "set_search_uri": "https://example.com/acs/somecard", - "set_uri": "https://example.com/sets/acs", - "set": "acs", - "story_spotlight": True, - }, - None, - marks=pytest.mark.xfail(raises=marshmallow.exceptions.ValidationError), - id="multiple unknown", - ), -] - -SERIALIZE_TESTS = SERDE_TESTS - - -@pytest.mark.parametrize("payload, obj", DESERIALIZE_TESTS) -def test_load(payload: Dict[str, Any], obj: models.ScryObject) -> None: - assert schema.ScryfallUberSchema().load(payload).data == obj - - -@pytest.mark.parametrize("payload, obj", SERIALIZE_TESTS) -def test_dump(payload: Dict[str, Any], obj: models.ScryObject) -> None: - assert schema.ScryfallUberSchema().dump(obj).data == payload diff --git a/tests/serialization/test_csv.py b/tests/serialization/test_csv.py index 1f06452..11ddf7a 100644 --- a/tests/serialization/test_csv.py +++ b/tests/serialization/test_csv.py @@ -1,8 +1,8 @@ """Tests for mtg_ssm.serialization.csv.""" # pylint: disable=redefined-outer-name -from pathlib import Path import textwrap +from pathlib import Path from typing import Dict from uuid import UUID @@ -43,7 +43,7 @@ def test_header() -> None: def test_row_for_card(id_to_card: Dict[UUID, ScryCard]) -> None: card = id_to_card[TEST_CARD_ID] - card_counts = {counts.CountType.nonfoil: 3, counts.CountType.foil: 5} + card_counts = {counts.CountType.NONFOIL: 3, counts.CountType.FOIL: 5} csv_row = csv.row_for_card(card, card_counts) assert csv_row == { "set": "PHOP", @@ -56,7 +56,7 @@ def test_row_for_card(id_to_card: Dict[UUID, ScryCard]) -> None: def test_rows_for_cards_verbose(oracle: Oracle) -> None: - card_counts: ScryfallCardCount = {TEST_CARD_ID: {counts.CountType.nonfoil: 3}} + card_counts: ScryfallCardCount = {TEST_CARD_ID: {counts.CountType.NONFOIL: 3}} collection = MagicCollection(oracle=oracle, counts=card_counts) rows = csv.rows_for_cards(collection, True) assert list(rows) == [ @@ -84,7 +84,7 @@ def test_rows_for_cards_verbose(oracle: Oracle) -> None: def test_rows_for_cards_terse(oracle: Oracle) -> None: card_counts: counts.ScryfallCardCount = { - TEST_CARD_ID: {counts.CountType.nonfoil: 3} + TEST_CARD_ID: {counts.CountType.NONFOIL: 3} } collection = MagicCollection(oracle=oracle, counts=card_counts) rows = csv.rows_for_cards(collection, False) @@ -102,7 +102,7 @@ def test_rows_for_cards_terse(oracle: Oracle) -> None: def test_write_verbose(oracle: Oracle, tmp_path: Path) -> None: csv_path = tmp_path / "outfile.csv" card_counts: ScryfallCardCount = { - TEST_CARD_ID: {counts.CountType.nonfoil: 3, counts.CountType.foil: 7} + TEST_CARD_ID: {counts.CountType.NONFOIL: 3, counts.CountType.FOIL: 7} } collection = MagicCollection(oracle=oracle, counts=card_counts) serializer = csv.CsvFullDialect() @@ -121,7 +121,7 @@ def test_write_verbose(oracle: Oracle, tmp_path: Path) -> None: def test_write_terse(oracle: Oracle, tmp_path: Path) -> None: csv_path = tmp_path / "outfile.csv" card_counts: counts.ScryfallCardCount = { - TEST_CARD_ID: {counts.CountType.nonfoil: 3} + TEST_CARD_ID: {counts.CountType.NONFOIL: 3} } collection = MagicCollection(oracle=oracle, counts=card_counts) @@ -150,5 +150,5 @@ def test_read(oracle: Oracle, tmp_path: Path) -> None: serializer = csv.CsvFullDialect() collection = serializer.read(csv_path, oracle) assert collection.counts == { - TEST_CARD_ID: {counts.CountType.nonfoil: 3, counts.CountType.foil: 7} + TEST_CARD_ID: {counts.CountType.NONFOIL: 3, counts.CountType.FOIL: 7} } diff --git a/tests/serialization/test_xlsx.py b/tests/serialization/test_xlsx.py index 1555889..5f55404 100644 --- a/tests/serialization/test_xlsx.py +++ b/tests/serialization/test_xlsx.py @@ -3,11 +3,7 @@ import datetime as dt from pathlib import Path -from typing import Dict -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import Dict, List, Optional, Set, Tuple from unittest import mock from uuid import UUID @@ -16,8 +12,7 @@ from mtg_ssm.containers.bundles import ScryfallDataSet from mtg_ssm.containers.collection import MagicCollection -from mtg_ssm.containers.counts import CountType -from mtg_ssm.containers.counts import ScryfallCardCount +from mtg_ssm.containers.counts import CountType, ScryfallCardCount from mtg_ssm.containers.indexes import Oracle from mtg_ssm.serialization import xlsx @@ -87,7 +82,7 @@ def test_create_all_sets(oracle: Oracle) -> None: [ "ICE", "Ice Age", - dt.date(1995, 6, 1), + dt.date(1995, 6, 3), "Ice Age", "expansion", 5, @@ -181,11 +176,11 @@ def test_create_all_cards_sheet(oracle: Oracle) -> None: def test_create_set_sheet(oracle: Oracle) -> None: card_counts: ScryfallCardCount = { - UUID("fbdcbd97-90a9-45ea-94f6-2a1c6faaf965"): {CountType.nonfoil: 1}, - UUID("b346b784-7bde-49d0-bfa9-56236cbe19d9"): {CountType.foil: 2}, + UUID("fbdcbd97-90a9-45ea-94f6-2a1c6faaf965"): {CountType.NONFOIL: 1}, + UUID("b346b784-7bde-49d0-bfa9-56236cbe19d9"): {CountType.FOIL: 2}, UUID("768c4d8f-5700-4f0a-9ff2-58422aeb1dac"): { - CountType.nonfoil: 3, - CountType.foil: 4, + CountType.NONFOIL: 3, + CountType.FOIL: 4, }, } collection = MagicCollection(oracle=oracle, counts=card_counts) @@ -262,8 +257,8 @@ def test_write(oracle: Oracle, tmp_path: Path) -> None: xlsx_path = tmp_path / "outfile.xlsx" card_counts: ScryfallCardCount = { UUID("5d5f3f57-410f-4ee2-b93c-f5051a068828"): { - CountType.nonfoil: 7, - CountType.foil: 12, + CountType.NONFOIL: 7, + CountType.FOIL: 12, } } collection = MagicCollection(oracle=oracle, counts=card_counts) @@ -369,7 +364,7 @@ def test_read_from_file(oracle: Oracle, tmp_path: Path) -> None: collection = serializer.read(xlsx_path, oracle) assert collection.counts == { UUID("5d5f3f57-410f-4ee2-b93c-f5051a068828"): { - CountType.nonfoil: 3, - CountType.foil: 7, + CountType.NONFOIL: 3, + CountType.FOIL: 7, } } diff --git a/tests/test_ssm.py b/tests/test_ssm.py index 860abab..de23cbd 100644 --- a/tests/test_ssm.py +++ b/tests/test_ssm.py @@ -2,17 +2,17 @@ # pylint: disable=redefined-outer-name import argparse as ap -from pathlib import Path import textwrap +from pathlib import Path -from _pytest.monkeypatch import MonkeyPatch import freezegun import pytest +from _pytest.monkeypatch import MonkeyPatch +import mtg_ssm.scryfall.fetcher from mtg_ssm import ssm from mtg_ssm.containers.bundles import ScryfallDataSet from mtg_ssm.containers.indexes import Oracle -import mtg_ssm.scryfall.fetcher from mtg_ssm.scryfall.models import ScrySetType