MTGStocks API & Scraper: parameters and responses
This is the reference for the 25 MTGStocks endpoints under /mtgstocks/v1 (search, suggest, print, price_history, sellers, interests, sets, set, set_market, set_market_history and 15 more) and their 40 parameters. Each endpoint lists its parameters, required or optional, with allowed values and defaults, and comes with a cURL, Python and JavaScript call; every response uses the same { ok, data, meta, error } envelope.
The MTGStocks API returns Magic: The Gathering market data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
print returns one printing of a card with the latest low, average, high, market and foil prices at TCGplayer, Card Kingdom, Star City Games and ManaPool in USD and at Cardmarket and CardTrader in EUR, previous-day, week-ago and month-ago prices, the all-time high and low, format legality, every other printing and the sealed products that contain it. price_history returns the daily series behind the chart for one store: TCGplayer back to 2012 and Cardmarket back to 2017. interests is the daily table of biggest price moves (about 7,000 rows) with current and past price and percent change, in USD or EUR, regular or foil, filterable by direction, price, set, format legality and Reserved List. sellers lists current offers and buy prices at the stores MTGStocks tracks (Card Kingdom, Star City Games, ABU Games, ManaPool, Hareruya and others) with each row's own currency. sets, set and set_market cover all 454 sets, per-card prices and total set value with 7-day and 30-day change. sealed, sealed_history and expected_value cover booster boxes, their price history and what the contents are worth. indices tracks MTGStocks' market indices, including the Reserved List, in USD and EUR. No account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
One print, six stores, 14 years of history: Black Lotus (Unlimited)
Black Lotus from Unlimited Edition on 2026-11-08: one print call returned its price at six stores in their own currencies, and price_history returned 5,234 daily TCGplayer average points from 2012-06-22 to today.
| Store | Currency | Average price |
|---|---|---|
| TCGplayer | USD | 20,000.00 |
| ManaPool | USD | 21,518.34 |
| Star City Games | USD | 25,999.99 |
| Card Kingdom | USD | 35,099.99 |
| Cardmarket | EUR | 13,281.67 |
TCGplayer all-time high on this print: 105,123.29 USD (2026-08-12), all-time low 1,303.24 USD (2012-07-04). Stores are compared in their own currency; the engine does not convert or blend them, and fields a store does not publish come back null.
Real request and response JSON
Captured from the indexed primary action, print, on .
{
"method": "POST",
"url": "https://api.reefapi.com/mtgstocks/v1/print",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"print_id": "15770"
}
}{
"ok": true,
"meta": {
"api": "mtgstocks",
"endpoint": "print",
"mode": "live",
"latency_ms": 323,
"record_count": 1,
"bytes": 9163,
"cache_hit": false,
"charged_credits": 1,
"version": "0.1.0",
"request_id": "665055c71f7c4cf7",
"queue_ms": 1.3,
"fetched_at": "2026-11-08T13:04:29.364Z"
},
"data": {
"print": {
"print_id": 15770,
"name": "Black Lotus",
"slug": "15770-black-lotus",
"url": "https://www.mtgstocks.com/prints/15770-black-lotus",
"rarity": "R",
"collector_number": "233",
"foil": false,
"reserved_list": true,
"image_url": "https://cards.scryfall.io/normal/front/4/a/4a2e428c-dd25-484c-bbc8-2d6ce10ef42c.jpg",
"set": {
"set_id": 73,
"name": "Unlimited Edition",
"code": "2ED",
"slug": "73-unlimited-edition",
"set_type": "core"
},
"extended_rarity": "R1",
"has_foil": false,
"has_nonfoil": true,
"flip_card": false,
"tournament_legal": true,
"multiverse_id": 600,
"scryfall_id": "4a2e428c-dd25-484c-bbc8-2d6ce10ef42c",
"scryfall_url": "https://www.scryfall.com/card/4a2e428c-dd25-484c-bbc8-2d6ce10ef42c",
"edhrec_url": "https://www.edhrec.com/cards/black-lotus",
"set_mkm_id": 3,
"card": {
"card_id": 12208,
"name": "Black Lotus",
"mana_cost": "{0}",
"mana_value": 0,
"supertype": "Artifact",
"subtype": null,
"oracle_text": "{T}, Sacrifice this artifact: Add three mana of any one color.",
"power": null,
"toughness": null,
"loyalty": null,
"reserved_list": true,
"lowest_print_id": 15770,
"legality": {
"tlr": "banned",
"duel": "banned",
"brawl": "not_legal",
"penny": "not_legal",
"predh": "banned",
"future": "not_legal",
"legacy": "banned",
"modern": "not_legal",
"pauper": "not_legal",
"alchemy": "not_legal",
"pioneer": "not_legal",
"vintage": "restricted",
"explorer": "not_legal",
"historic": "not_legal",
"standard": "not_legal",
"timeless": "not_legal",
"commander": "banned",
"gladiator": "not_legal",
"oldschool": "restricted",
"premodern": "not_legal",
"oathbreaker": "banned",
"historicbrawl": "not_legal",
"standardbrawl": "not_legal",
"paupercommander": "not_legal",
"competitivebrawl": "not_legal"
}
},
"all_time_high_tcgplayer": {
"average": 105123.29,
"date": "2026-08-12",
"currency": "USD"
},
"all_time_low_tcgplayer": {
"average": 1303.24,
"date": "2012-07-04",
"currency": "USD"
},
"buylist": {
"nm": 1,
"lp": 1,
"nm_foil": null,
"lp_foil": null,
"currency": null
},
"stores": {
"tcgplayer": {
"store": "tcgplayer",
"currency": "USD",
"url": "https://www.tcgplayer.com/product/8989/magic-unlimited-edition-black-lotus",
"low": 19249.99,
"average": 20000,
"high": 22549.99,
"market": null,
"foil": null,
"foil_low": null,
"market_foil": null,
"url_foil": null,
"product_id": 8989,
"price_date": "2026-11-08",
"average_previous_day": 20000,
"average_week_ago": 21275,
"average_month_ago": 20000,
"foil_previous_day": null,
"foil_week_ago": null,
"foil_month_ago": null,
"average_change_day_percent": 0,
"average_change_week_percent": -5.99,
"average_change_month_percent": 0,
"foil_change_day_percent": null,
"foil_change_week_percent": null,
"foil_change_month_percent": null
},
"cardkingdom": {
"store": "cardkingdom",
"currency": "USD",
"url": "https://www.cardkingdom.com/mtg/unlimited/black-lotus",
"low": null,
"average": 35099.99,
"high": null,
"market": null,
"foil": null,
"foil_low": null,
"market_foil": null,
"url_foil": null,
"product_id": null,
"price_date": null,
"average_previous_day": 35099.99,
"average_week_ago": 35099.99,
"average_month_ago": 34999.99,
"foil_previous_day": null,
"foil_week_ago": null,
"foil_month_ago": null,
"average_change_day_percent": 0,
"average_change_week_percent": 0,
"average_change_month_percent": 0.29,
"foil_change_day_percent": null,
"foil_change_week_percent": null,
"foil_change_month_percent": null
},
"starcitygames": {
"store": "starcitygames",
"currency": "USD",
"url": "https://starcitygames.com/black-lotus-sgl-mtg-2ed-233-enn/",
"low": null,
"average": 25999.99,
"high": null,
"market": null,
"foil": 25999.99,
"foil_low": null,
"market_foil": null,
"url_foil": null,
"product_id": null,
"price_date": null,
"average_previous_day": 25999.99,
"average_week_ago": 25999.99,
"average_month_ago": 23999.99,
"foil_previous_day": 25999.99,
"foil_week_ago": 25999.99,
"foil_month_ago": 23999.99,
"average_change_day_percent": 0,
"average_change_week_percent": 0,
"average_change_month_percent": 8.33,
"foil_change_day_percent": 0,
"foil_change_week_percent": 0,
"foil_change_month_percent": 8.33
},
"manapool": {
"store": "manapool",
"currency": "USD",
"url": "https://manapool.com/card/2ed/233/black-lotus",
"low": null,
"average": 21518.34,
"high": null,
"market": null,
"foil": null,
"foil_low": null,
"market_foil": null,
"url_foil": null,
"product_id": null,
"price_date": null,
"average_previous_day": null,
"average_week_ago": null,
"average_month_ago": null,
"foil_previous_day": null,
"foil_week_ago": null,
"foil_month_ago": null,
"average_change_day_percent": null,
"average_change_week_percent": null,
"average_change_month_percent": null,
"foil_change_day_percent": null,
"foil_change_week_percent": null,
"foil_change_month_percent": null
},
"cardmarket": {
"store": "cardmarket",
"currency": "EUR",
"url": "https://www.cardmarket.com/en/Magic/Products/Singles/Unlimited/Black-Lotus?referrer=mtg-stocks",
"low": 10999.99,
"average": 13281.67,
"high": null,
"market": null,
"foil": null,
"foil_low": null,
"market_foil": null,
"url_foil": null,
"product_id": null,
"price_date": null,
"average_previous_day": 13281.67,
"average_week_ago": 13733.33,
"average_month_ago": 18250,
"foil_previous_day": null,
"foil_week_ago": null,
"foil_month_ago": null,
"average_change_day_percent": 0,
"average_change_week_percent": -3.29,
"average_change_month_percent": -27.22,
"foil_change_day_percent": null,
"foil_change_week_percent": null,
"foil_change_month_percent": null
},
"cardtrader": {
"store": "cardtrader",
"currency": "EUR",
"url": "https://www.cardtrader.com/cards/38394",
"low": 12500.64,
"average": 16500.44,
"high": null,
"market": null,
"foil": null,
"foil_low": null,
"market_foil": null,
"url_foil": null,
"product_id": 38394,
"price_date": null,
"average_previous_day": 16500.44,
"average_week_ago": 16500.44,
"average_month_ago": 30417.14,
"foil_previous_day": null,
"foil_week_ago": null,
"foil_month_ago": null,
"average_change_day_percent": 0,
"average_change_week_percent": 0,
"average_change_month_percent": -45.75,
"foil_change_day_percent": null,
"foil_change_week_percent": null,
"foil_change_month_percent": null
}
},
"found_in_sealed": [],
"other_printings": [
{
"print_id": 83036,
"name": "Black Lotus",
"slug": "83036-black-lotus-retro-frame",
"url": "https://www.mtgstocks.com/prints/83036-black-lotus-retro-frame",
"foil": false,
"collector_number": "525",
"rarity": "R",
"image_url": "https://static.mtgstocks.com/cardimages/t449429.png",
"set": {
"set_id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"code": "[trimmed-depth]"
},
"tcgplayer_average_usd": 7750,
"cardmarket_average_eur": 7500,
"tcgplayer_url": "https://www.tcgplayer.com/product/449429/magic-30th-anniversary-edition-black-lotus-retro-frame",
"cardmarket_url": "https://www.cardmarket.com/en/Magic/Products/Singles/30th-Anniversary-Edition/Black-Lotus-V2?referrer=mtg-stocks"
},
{
"print_id": 82732,
"name": "Black Lotus",
"slug": "82732-black-lotus",
"url": "https://www.mtgstocks.com/prints/82732-black-lotus",
"foil": false,
"collector_number": "228",
"rarity": "R",
"image_url": "https://static.mtgstocks.com/cardimages/t449115.png",
"set": {
"set_id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"code": "[trimmed-depth]"
},
"tcgplayer_average_usd": 5999.99,
"cardmarket_average_eur": 2799.98,
"tcgplayer_url": "https://www.tcgplayer.com/product/449115/magic-30th-anniversary-edition-black-lotus",
"cardmarket_url": "https://www.cardmarket.com/en/Magic/Products/Singles/30th-Anniversary-Edition/Black-Lotus-V1?referrer=mtg-stocks"
},
{
"print_id": 16374,
"name": "Black Lotus",
"slug": "16374-black-lotus",
"url": "https://www.mtgstocks.com/prints/16374-black-lotus",
"foil": false,
"collector_number": "232",
"rarity": "R",
"image_url": "https://cards.scryfall.io/normal/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.jpg",
"set": {
"set_id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"code": "[trimmed-depth]"
},
"tcgplayer_average_usd": 74981,
"cardmarket_average_eur": 98500,
"tcgplayer_url": "https://www.tcgplayer.com/product/1042/magic-alpha-edition-black-lotus",
"cardmarket_url": "https://www.cardmarket.com/en/Magic/Products/Singles/Alpha/Black-Lotus?referrer=mtg-stocks"
}
]
}
}
}What the MTGStocks API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Find Magic: The Gathering prints by card name: every printing across all sets with the print id, set, rarity and image. 25 rows a page, with the total number of matches. | Pricing teams call search to find Magic. | query, page, limit, max_rotations |
| suggest | Search-as-you-type: the closest prints for a partial card name, with set, foil availability and similarity score, plus plain matching card names. The quickest way to turn a name into a print_id. | Marketplace operators call suggest to get search-as-you-type. | query, max_rotations |
| One print in full: the latest low / average / high / market / foil prices at every store MTGStocks tracks (TCGplayer, Card Kingdom, Star City Games, ManaPool in USD; Cardmarket, CardTrader in EUR) with previous-day, week-ago and month-ago prices and percent changes, the all-time high and low, buylist prices, oracle text and format legality, ids for Scryfall and Gatherer, every other printing of the card with its price, and the sealed products that contain it. | Catalog enrichment teams call print to get one print in full. | print_id, also_viewed, max_rotations | |
| price_history | A print's daily price history for one store: TCGplayer back to 2012 (USD: low, average, market, foil, market foil), Cardmarket back to 2017 (EUR), Card Kingdom and Star City Games (USD retail: average and foil). One series per price type with min, max and change over the window; cut it by days or dates. | Retail analysts call price_history to get a print's daily price history for one store. | print_id, store, series, days, date_from, ... |
| sellers | Current offers for a print across the stores MTGStocks tracks (Card Kingdom, Star City Games, ABU Games, ManaPool, CardTrader, Hareruya and more): condition, foil, sell price, buy price, buying quantity, stock and the store's own link. Each row states its own currency (USD, EUR, GBP, CAD, JPY). | Pricing teams call sellers to get current offers for a print across the stores MTGStocks tracks (Card Kingdom, Star City Games,…. | print_id, store, condition, foil, currency, ... |
| interests | The price-movers table MTGStocks publishes each day: every print whose price moved today or this week (about 7,000 rows), with the current and past price and the percent change. Choose average or market price, regular or foil, USD (TCGplayer) or EUR (Cardmarket, average only); filter by direction, percent and amount, price, set, set type, format legality, Reserved List and release state. | Marketplace operators call interests to get the price-movers table MTGStocks publishes each day. | price_type, card_type, currency, period, direction, ... |
| sets | Every Magic set MTGStocks tracks (about 450): id, code, type, release date, and whether it has sealed product and expected value. Newest first; filter by name or type. | Catalog enrichment teams call sets to get every Magic set MTGStocks tracks (about 450). | query, set_type, has_sealed, has_expected_value, max_rotations |
| set | One set's card list with each print's latest prices at TCGplayer (USD), Cardmarket (EUR) and Card Kingdom (USD), plus the set's biggest 7-day gainers and losers. Filter by rarity, name, foil or Reserved List; sort by price. | Retail analysts call set to get one set's card list with each print's latest prices at TCGplayer (USD), Cardmarket (EUR) and…. | set_id, query, rarity, reserved, sort, ... |
| set_market | The total market value of every set today, with its 7-day and 30-day change: what the whole set is worth at TCGplayer prices (USD), on the site's own daily snapshot. Regular or foil. | Pricing teams call set_market to get the total market value of every set today, with its 7-day and 30-day change. | foil, set_type, sort, limit, max_rotations |
| set_market_history | The last 30 days of the whole-market value of Magic singles at TCGplayer prices (USD), and optionally one set's value on each of those days. | Marketplace operators call set_market_history to get the last 30 days of the whole-market value of Magic singles at TCGplayer prices (USD), and op…. | set_id, max_rotations |
| sealed | Sealed product (booster boxes, packs, bundles, Commander decks) with its latest TCGplayer price. Search the whole catalogue by name or list one set. | Catalog enrichment teams call sealed to get sealed product (booster boxes, packs, bundles, Commander decks) with its latest TCGplayer price. | query, set_id, page, limit, max_rotations |
| sealed_product | One sealed product: latest prices at TCGplayer (USD), Cardmarket (EUR), Card Kingdom, Star City Games, ManaPool and CardTrader where published, all-time high and low, and the percent change over a day, week and month. | Retail analysts call sealed_product to get one sealed product. | sealed_id, max_rotations |
| sealed_history | A sealed product's daily price history at TCGplayer (USD) or Cardmarket (EUR), or the daily history of its expected value: what the contents were worth at singles prices (USD), with averages by rarity. | Pricing teams call sealed_history to get a sealed product's daily price history at TCGplayer (USD) or Cardmarket (EUR), or the daily h…. | sealed_id, store, kind, series, days, ... |
| expected_value | Expected value of sealed product against its market price: how much the cards inside are worth versus what the box sells for. One row per set, or a set's full product tree (case, box, pack). USD. | Marketplace operators call expected_value to get expected value of sealed product against its market price. | set_id, query, max_rotations |
| all_time | Prints that have just hit an all-time high or all-time low at TCGplayer average price (USD), with the price and the date. | Catalog enrichment teams call all_time to get prints that have just hit an all-time high or all-time low at TCGplayer average price (USD),…. | kind, foil, page, limit, max_rotations |
| indices | MTGStocks market indices (Reserved List, Power Nine, formats, sets, Commander and more) with value, 1-day, 7-day, 30-day and 1-year change, equal-weight and price-weight, separately in USD and EUR. | Retail analysts call indices to get mTGStocks market indices (Reserved List, Power Nine, formats, sets, Commander and more) with…. | max_rotations |
| index | One index with its full daily history since 2021 (USD and EUR separately), its children, and the cards in it with price, 30-day change and weight in each currency. | Pricing teams call index to get one index with its full daily history since 2021 (USD and EUR separately), its children, and…. | slug, include_constituents, days, max_rotations |
| lists | MTGStocks' curated card lists: Reserved List, Commander Game Changers, cycling lands and others. | Marketplace operators call lists to get mTGStocks' curated card lists. | max_rotations |
| list | One curated list with every print's latest TCGplayer (USD), Cardmarket (EUR) and Card Kingdom (USD) price. | Catalog enrichment teams call list to get one curated list with every print's latest TCGplayer (USD), Cardmarket (EUR) and Card Kingdom…. | list_id, query, sort, page, limit, ... |
| popular | The five prints most viewed or most bought on MTGStocks right now, with each store's price. | Retail analysts call popular to get the five prints most viewed or most bought on MTGStocks right now, with each store's price.. | kind, max_rotations |
| premium_preview | The free teaser rows MTGStocks shows for its Premium screens (trends, penny stocks, underpriced cards, price compare, Secret Lair value and others). About five rows each: the complete screens need a paid MTGStocks account and are not available here. | Pricing teams call premium_preview to get the free teaser rows MTGStocks shows for its Premium screens (trends, penny stocks, underpric…. | name, max_rotations |
| formats | The tournament formats MTGStocks tracks, with the id that metagame, most_played and archetypes accept. | Marketplace operators call formats to get the tournament formats MTGStocks tracks, with the id that metagame, most_played and archetype…. | max_rotations |
| metagame | The current metagame of a tournament format: each archetype's share of top placings. | Catalog enrichment teams call metagame to get the current metagame of a tournament format. | format, max_rotations |
| most_played | The most played cards of a tournament format, with share of decks and the current price of their cheapest print. | Retail analysts call most_played to get the most played cards of a tournament format, with share of decks and the current price of th…. | format, max_rotations |
| archetypes | The named deck archetypes of a tournament format. | Pricing teams call archetypes to get the named deck archetypes of a tournament format.. | format, max_rotations |
Call print from your stack
curl -X POST https://api.reefapi.com/mtgstocks/v1/print \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"print_id":"15770"}'import os
import requests
REEF_KEY = os.environ["REEF_KEY"]
r = requests.post(
"https://api.reefapi.com/mtgstocks/v1/print",
headers={"x-api-key": REEF_KEY},
json={
"print_id": "15770"
},
timeout=90,
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/mtgstocks/v1/print", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"print_id": "15770"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.mtgstocks.print with {"print_id":"15770"}.Who uses this API and why
- Price alerts: today's biggest moves in USD or EUR, filtered to cards worth more than a set amount
- Investment research: 14 years of daily prices per print, Reserved List and index movement
- Arbitrage: TCGplayer against Card Kingdom, Star City Games and Cardmarket for one print, or store buy prices against sell prices
- Collection value: price by printing and finish, with set-level value and 30-day change
- Sealed product: booster box price history against the expected value of its contents
Questions developers ask before integrating
How far back does the price history go?
Per print and per store: TCGplayer daily data goes back to 2012 for older cards (Black Lotus Unlimited has 5,234 daily points from June 2012), Cardmarket to 2017, Card Kingdom to 2022 and Star City Games to 2025. Series are low, average, market, foil and market foil, as far as the store publishes them. Use days or a date range to cut the window.
Which currency are the prices in?
Each store block and each history response names its currency. TCGplayer, Card Kingdom, Star City Games and ManaPool are USD; Cardmarket and CardTrader are EUR. Store offers from sellers carry the currency of that row (USD, EUR, GBP, CAD, JPY). Nothing is converted, and USD and EUR are never mixed in one field.
What are interests?
MTGStocks' daily table of biggest price moves: each print whose price moved today or this week with its current price, its past price and the percent change. Choose average or market price, regular or foil, and USD or EUR (EUR has the average table only). A move from a near-zero price can show a huge percentage, so use price_min if you want cards with real value.
Does it include foils?
Yes. Prints with both finishes return foil prices alongside regular ones and separate foil history series; foil-only prints return null for the regular fields rather than a zero.
Can I get what stores are buying cards for?
Yes, from sellers. Each store's offers show sell price, buy price, buying quantity and stock by condition and finish, with the store's own link.
Are the Premium screens included?
Only the five-row free teaser MTGStocks shows for each, through premium_preview (trends, penny stocks, underpriced cards, price compare, Secret Lair value and others). The full Premium screens need a paid MTGStocks account.
How do I find a print id?
suggest takes part of a card name and returns the closest prints; search returns every printing of a name, 25 per page, with the total. A print id also works as the number at the start of a mtgstocks.com print URL.
What is the MTGStocks API?
MTGStocks API is a ReefAPI endpoint group for magic: the gathering daily price history per print since 2012, price movers, store offers, sets and sealed value. It returns live JSON through POST requests under /mtgstocks/v1.
Is the MTGStocks API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. MTGStocks calls use the same shared credit balance as every other ReefAPI engine.
Do I need a MTGStocks login or account?
No login to MTGStocks is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the MTGStocks data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the MTGStocks API use?
MTGStocks actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call MTGStocks from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call mtgstocks actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the MTGStocks API a MTGStocks scraper?
It is the managed alternative to a DIY MTGStocks scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same magic: the gathering daily price history per print since 2012, price movers, store offers, sets and sealed value back as clean JSON.