Skip to content

price

Browse the prices of every deck, collection, and wanted list in one place.

Run in a terminal with no flags, price opens an interactive browser. The same information prints non-interactively when you pass scripting flags, when stdin or stdout is piped, or under the global --no-input flag.

The same pricing engine backs the MCP get_price_report tool. For what a store would pay you for these cards, see sell.

Terminal window
ritual price [listName] [options]
Argument Description Required
[listName] Open (or print) a single list instead of all lists No

The name is matched across all three list types; see List Names. An ambiguous name is rejected. Disambiguate with --deck, --collection, or --wanted.

Option Description
--deck Only decks (also disambiguates list names)
--collection Only collections (also disambiguates list names)
--wanted Only wanted lists (also disambiguates list names)
--source <store> Price store, which sets the currency: tcgplayer, cardmarket, cardhoarder, or cardkingdom (default: the configured defaultPriceSource); see Price stores
--name <terms> Print cards whose name contains every space-separated term
--set <code> Print cards from this set code
--collector <number> Print cards with this collector number
--sort <field> Sort cards by name, price, lowest, set, cmc, edhrec, or quantity
--descending Reverse the sort direction
--summary Print the price summary instead of opening the browser
--refresh <mode> Card cache refresh policy: ask (default), auto, no-bulk, or never; see Price Freshness
--output <format> Output format (text, json, or ndjson)
--quiet Suppress progress lines and the price disclaimer; never the payload or the parser warnings

The main screen shows:

  • When prices were last updated, and the store (with its currency) prices come from
  • Every list with its total price, its lowest-price total (when it differs), its unpriced count, and its card count
  • Totals per list type (decks / collections / wanted lists) and across all lists

Selecting a list opens a card browser over it. 🔎 Search all cards opens the same browser over every list, with each card labelled by its source list. In a card browser:

  • Typing filters rows live by name, set code, or collector number.
  • Menu items change the sort field and direction, and set persistent set-code, collector-number, and (in the global search) list-type filters.
  • Selecting a card shows its printing, unit and line price, cheapest printing, mana value, and EDHREC rank. It can also list every printing with per-finish prices.

🔄 Refresh prices redownloads the card database (which carries the prices) and rebuilds the report. 🏪 Change store re-prices everything at another store, in that store’s currency (the header reads, for example, Store: Card Kingdom (USD)). Switching to Card Kingdom loads its feed under the run’s --refresh policy; if none can be had, the browser says so and keeps the current store.

A store names where prices come from, and so also their currency. There is no currency flag; each store has exactly one:

Store Currency Prices
tcgplayer USD Scryfall USD market price. The default when defaultPriceSource is unset.
cardmarket EUR Scryfall EUR price.
cardhoarder TIX Scryfall MTGO tix price.
cardkingdom USD Card Kingdom Near Mint retail, from the cached buylist feed

Without --source, price reads the configured defaultPriceSource. To see EUR prices, pick --source cardmarket; for MTGO tix, --source cardhoarder.

When the store is Card Kingdom (--source cardkingdom, or a cardkingdom default):

  • Entries match Card Kingdom products by Scryfall ID, with the same SKU fallback the sell report uses.
  • The feed follows this run’s --refresh policy, like the card cache. With no feed cached and bulk downloads disallowed, the command errors instead of falling back to Scryfall.
  • No substitute price is ever shown. A printing Card Kingdom does not sell, and any non-English entry (their feed is English-only), is reported unpriced. The “lowest” figure becomes the cheapest printing+finish CK sells.
  • An entry that names no printing is priced at a printing chosen from CK’s own catalog (see How Cards Are Priced). It goes unpriced only when CK carries no printing of the card at all.

Prices come from the local Scryfall card cache. The shared --refresh <mode> option decides how its freshness is handled (see CLI conventions). On launch, price reports when the cache was last refreshed.

Situation ask (default) auto no-bulk / never
Prices more than a day old Prompt to update (default no) Update without prompting Leave as is
Cache empty Offer to download (default yes) Download Error

Declining a download when the cache is empty also exits with an error, since nothing can be priced.

Under never the report is built from the cache only. A card the cache does not hold is reported as unpriced, not fetched one card at a time. (ask, auto, and no-bulk still fill such gaps with a per-card lookup.) This makes --refresh never usable offline; otherwise every uncached name waits out the full Scryfall request timeout.

Prompts never fire when they cannot be answered. Under --no-input / RITUAL_NO_INPUT or a non-TTY stdin, the ask prompts are declined. With --output json/ndjson, ask downgrades to never so the output stays parseable.

  • An entry pinned to a specific printing (set + collector number) is priced at that exact printing, at its own finish when recorded, otherwise the printing’s default finish. Collection entries are always pinned.
  • An unpinned entry is priced at a representative recent printing, the same pick the public site uses. Such printings are marked * in card listings. The pick uses the active store’s prices: under Card Kingdom it is the newest printing Card Kingdom sells. A card CK carries no printing of keeps the Scryfall pick and reports unpriced.
  • Every deck and wanted-list entry also carries a lowest price, the cheapest acceptable copy:
    • Deck entries and name-only wanted entries: the cheapest printing+finish overall.
    • A wanted entry pinned to a printing without a finish: that printing’s cheapest finish.
    • A fully specified entry: its own price.
  • Deck totals cover every section except extras (maybeboard/token sections), matching the public site.
  • A card with no price in the active currency counts as unpriced. Unpriced counts are quantity-weighted.
  • A deck or wanted-list total is an estimate when it includes any entry with no pinned printing (priced at the representative) or any entry with no price. Such a total reads Total ~$12.34, and the JSON totals report those copies as a quantity-weighted estimatedCount. Collection entries always pin their printing, so collections never estimate. Proxy and custom-art cards are an exact zero, not an estimate.
  • A proxy or custom-art card is priced at zero, by rule. A card is a proxy when its effective labels include proxy (its own [proxy] token, or a proxy list default its line does not negate with [no-proxy]). A card has custom art when the list’s .art.json file gives it some. Either skips the price lookup entirely. Its price and lowest price are 0, its unpriced reason is proxy or custom-art, and it counts toward the card count but not the unpriced count. A fully proxied deck therefore totals nothing and reports zero missing prices. In the browser and text views the price cell reads PROXY or CUSTOM instead of N/A, and the card detail explains it (this copy is a proxy, so it carries no price / this copy has custom art, so it carries no price). A card that is both reads CUSTOM.
  • Only nonfoil, foil, and etched participate in pricing. These are the finishes Ritual records and the only ones Scryfall publishes prices for. A printing offered in some other finish is never quoted under that finish’s name, in either the cheapest-printing pick or the all-printings listing. A printing offered in no recorded finish is still priced at its base price and reported as nonfoil.
  • Etched euro prices are sparse. Scryfall publishes eur_etched for only a few etched printings, so an etched entry priced at cardmarket often reports as unpriced. It is not quoted at the nonfoil euro price, which would understate it. Price those lists at a USD store (--source tcgplayer or --source cardkingdom) for a complete total.

Three views, chosen by the flags:

Terminal window
# Summary of every list (the main screen as text)
ritual price --summary
# One list's cards and totals
ritual price "Red Binder" --no-input
# Search cards across all lists
ritual price --set neo --sort price --descending
ritual price --name "sol ring"

Each view supports --output json (one structured document) and --output ndjson (one JSON line per list or card). Every structured payload names its source (the store) and currency (that store’s). The summary JSON includes lastRefreshedAt, per-list summaries, per-type totals, grand totals, and a warnings array. The single-list and card-search payloads carry the same warnings field. Card listings include per-entry prices, lowest prices, and unpriced reasons.

warnings holds lines the list parsers could not read (prose, comments, malformed card lines). Such lines are not priced, so the totals exclude them. The warnings also print to stderr in every output mode, including under --quiet.

Terminal window
ritual price --summary --output json
ritual price --wanted --set otc --output ndjson

Prices reflect NM (Near Mint) values: Scryfall market prices, or Card Kingdom’s NM retail when that is the store.