[{"data":1,"prerenderedAt":2725},["ShallowReactive",2],{"blog-mtg-price-api-tcgplayer-cardmarket":3,"blog-related-mtg-price-api-tcgplayer-cardmarket":2724},{"id":4,"title":5,"author":6,"body":7,"category":2703,"date":2704,"description":2705,"extension":2706,"image":2707,"imageAlt":2708,"imageCredit":6,"meta":2709,"navigation":1462,"path":2710,"readTime":2711,"seo":2712,"stem":2713,"tags":2714,"updatedAt":2722,"__hash__":2723},"content\u002Fblog\u002Fmagic\u002F2026\u002F11\u002Fmtg-price-api-tcgplayer-cardmarket.md","MTG Price API: TCGplayer & CardMarket in One Call","PokéWallet Team",{"type":8,"value":9,"toc":2674},"minimark",[10,14,29,71,74,90,102,107,194,197,202,212,352,366,386,414,421,452,456,467,510,517,593,601,669,674,690,694,698,722,745,748,782,785,789,798,858,865,924,935,948,955,959,980,983,1002,1110,1113,1117,1123,1185,1219,1223,1229,1273,1284,1288,1294,1339,1361,1397,1401,1407,1411,1925,1932,1936,2308,2321,2327,2410,2414,2420,2423,2463,2466,2469,2478,2480,2484,2488,2491,2495,2521,2525,2531,2535,2542,2546,2549,2553,2560,2562,2575,2577,2581,2592,2633,2638,2663,2665,2670],[11,12,5],"h1",{"id":13},"mtg-price-api-tcgplayer-cardmarket-in-one-call",[15,16,18,19],"div",{"style":17},"background: rgba(14, 165, 233, 0.15); border-left: 4px solid #0ea5e9; padding: 1rem 1.5rem; margin: 1.5rem 0; border-radius: 4px;","\n  ",[20,21,23,24,28],"p",{"style":22},"margin: 0; font-size: 0.9rem; color: #e0e0e0;","\n    ",[25,26,27],"strong",{},"🔵 IN THIS GUIDE:"," How to pull Magic: The Gathering card data and both marketplace prices (TCGplayer in USD, CardMarket in EUR) from one REST API. The catalog is free, and whole-set prices and analytics start at Ultra. Every example below comes from a real API response.\n  ",[30,31,32],"blockquote",{},[20,33,34,37,38,41,42,45,46,50,51,54,55,58,59,62,63,66,67,70],{},[25,35,36],{},"Quick Answer:"," The PokéWallet API returns ",[25,39,40],{},"TCGplayer (USD)"," and ",[25,43,44],{},"CardMarket (EUR)"," prices for a Magic card in a single response, under ",[47,48,49],"code",{},"\u002Fmtg\u002F",", with the same key you use for the other 11 games. The catalog (",[25,52,53],{},"514 sets",", cards, search, images) is free at ",[25,56,57],{},"100 requests\u002Fhour",". Prices for whole sets and the analytics endpoints need ",[25,60,61],{},"Ultra (€29\u002Fmonth)"," or the ",[25,64,65],{},"7-day trial","; Pro is not enough. Prices refresh ",[25,68,69],{},"once a day",".",[20,72,73],{},"Magic has the biggest card catalog of any game this API covers, and its prices live on two marketplaces. US sellers watch TCGplayer. European buyers watch CardMarket. If you build a price tracker, a collection app or a Discord bot, you need both, and you don't want to maintain two integrations to get them.",[20,75,76,77,80,81,41,86,70],{},"This guide covers what the ",[47,78,79],{},"mtg"," endpoints return, how to make a first request, what stays free, what needs Ultra, and how to call it from JavaScript and Python. It also covers where Scryfall is the simpler choice. It is the third game guide in the series, after ",[82,83,85],"a",{"href":84},"\u002Fblog\u002Friftbound-api-card-prices-tcgplayer-cardmarket","Riftbound",[82,87,89],{"href":88},"\u002Fblog\u002Florcana-api-card-prices-tcgplayer-cardmarket","Disney Lorcana",[20,91,92,93,97,98,70],{},"The angle isn't \"better than the alternatives\". It's one key and one response shape across twelve games, with two marketplaces side by side. The ",[82,94,96],{"href":95},"\u002Fblog\u002Ftcg-price-api-12-card-games-one-key","multi-game overview"," covers that bigger picture. The full reference is in the ",[82,99,101],{"href":100},"\u002Fapi-docs\u002Fmagic-the-gathering","Magic: The Gathering API documentation",[103,104,106],"h3",{"id":105},"key-takeaways","Key Takeaways",[108,109,110,135,145,155,162,180],"ul",{},[111,112,113,114,117,118,121,122,121,125,121,128,41,131,134],"li",{},"🆓 ",[25,115,116],{},"The catalog is free on every plan."," ",[47,119,120],{},"\u002Fmtg\u002Fsets",", ",[47,123,124],{},"\u002Fmtg\u002Fsets\u002F:set",[47,126,127],{},"\u002Fmtg\u002Fcards\u002F:id",[47,129,130],{},"\u002Fmtg\u002Fsearch",[47,132,133],{},"\u002Fmtg\u002Fimages\u002F:id"," cost nothing beyond the free tier's 100 requests\u002Fhour and 1,000\u002Fday.",[111,136,137,138,141,142,144],{},"💰 ",[25,139,140],{},"A single card or search call already includes prices."," Both return TCGplayer and CardMarket prices on every plan. The set card list (",[47,143,124],{},") does not.",[111,146,147,148,117,151,154],{},"🔐 ",[25,149,150],{},"Whole-set prices and analytics need Ultra.",[47,152,153],{},"\u002Fmtg\u002Fprices\u002F:set",", statistics, completion value, trending sets and top cards require Ultra (€29\u002Fmonth) or the 7-day trial. Pro does not unlock them for Magic.",[111,156,157,158,161],{},"🌍 ",[25,159,160],{},"Two currencies, never converted."," TCGplayer is USD, CardMarket is EUR, and the completion-value response says cross-currency comparison isn't available.",[111,163,164,165,168,169,41,172,175,176,179],{},"🎴 ",[25,166,167],{},"CardMarket prices come per finish."," Each card carries separate ",[47,170,171],{},"normal",[47,173,174],{},"foil"," entries, and ",[47,177,178],{},"updated_at"," marks the last price change.",[111,181,182,183,117,186,189,190,193],{},"🧹 ",[25,184,185],{},"Clean the card text.",[47,187,188],{},"card_text"," contains HTML ",[47,191,192],{},"\u003Cbr>"," tags and Windows line endings, so strip them before rendering.",[195,196],"hr",{},[198,199,201],"h2",{"id":200},"what-the-api-covers","What the API Covers",[20,203,204,205,207,208,211],{},"Magic sits under the game code ",[47,206,79],{},". The public ",[47,209,210],{},"GET \u002Fgames"," endpoint lists it with its routes:",[213,214,215,231],"table",{},[216,217,218],"thead",{},[219,220,221,225,228],"tr",{},[222,223,224],"th",{},"Route",[222,226,227],{},"What it does",[222,229,230],{},"Plan",[232,233,234,247,258,269,281,292,304,316,328,340],"tbody",{},[219,235,236,241,244],{},[237,238,239],"td",{},[47,240,120],{},[237,242,243],{},"List every set",[237,245,246],{},"Free",[219,248,249,253,256],{},[237,250,251],{},[47,252,124],{},[237,254,255],{},"One set and its cards",[237,257,246],{},[219,259,260,264,267],{},[237,261,262],{},[47,263,127],{},[237,265,266],{},"One card with TCGplayer and CardMarket prices",[237,268,246],{},[219,270,271,276,279],{},[237,272,273],{},[47,274,275],{},"\u002Fmtg\u002Fsearch?q=",[237,277,278],{},"Search cards, prices included",[237,280,246],{},[219,282,283,287,290],{},[237,284,285],{},[47,286,133],{},[237,288,289],{},"Card image",[237,291,246],{},[219,293,294,298,301],{},[237,295,296],{},[47,297,153],{},[237,299,300],{},"Prices for a whole set",[237,302,303],{},"Ultra",[219,305,306,311,314],{},[237,307,308],{},[47,309,310],{},"\u002Fmtg\u002Fsets\u002F:set\u002Fstatistics",[237,312,313],{},"Price statistics and rarity breakdown",[237,315,303],{},[219,317,318,323,326],{},[237,319,320],{},[47,321,322],{},"\u002Fmtg\u002Fsets\u002F:set\u002Fcompletion-value",[237,324,325],{},"Cost to complete a set",[237,327,303],{},[219,329,330,335,338],{},[237,331,332],{},[47,333,334],{},"\u002Fmtg\u002Fsets\u002Ftrending",[237,336,337],{},"Sets moving over 7 days",[237,339,303],{},[219,341,342,347,350],{},[237,343,344],{},[47,345,346],{},"\u002Fmtg\u002Fanalytics\u002Ftop-cards",[237,348,349],{},"Top cards by price or growth",[237,351,303],{},[20,353,354,355,358,359,362,363,365],{},"The ",[47,356,357],{},"\u002Fgames"," response files the last five under ",[47,360,361],{},"pro_endpoints",". For the ten games beyond Pokémon and One Piece, those need ",[25,364,303],{}," or the 7-day trial, and Pro does not cover them.",[20,367,368,369,371,372,375,376,375,379,375,382,385],{},"The set list reports ",[25,370,53],{},". Each entry has a ",[47,373,374],{},"set_code",", a ",[47,377,378],{},"set_id",[47,380,381],{},"card_count",[47,383,384],{},"sealed_count",", a language and a release date. Two real entries show the range:",[108,387,388,400],{},[111,389,390,393,394,121,397,399],{},[25,391,392],{},"10th Edition"," (",[47,395,396],{},"10E",[47,398,378],{}," 1): 389 cards, 9 sealed products, released 13 July 2007.",[111,401,402,393,405,121,408,410,411,70],{},[25,403,404],{},"2021 Lunar New Year",[47,406,407],{},"pl21",[47,409,378],{}," -42): 1 card, no sealed products, release date ",[47,412,413],{},"null",[20,415,416,417,420],{},"So promo and oddball sets are in the list, and a release date can be missing. Don't treat ",[47,418,419],{},"release_date"," as always present.",[20,422,423,424,427,428,431,432,434,435,438,439,442,443,446,447,449,450,70],{},"Cards carry Magic-specific fields on top of the common ones: ",[47,425,426],{},"sub_type"," (for example \"Legendary Creature — Eldrazi\"), ",[47,429,430],{},"flavor_text",", power (",[47,433,20],{},"), toughness (",[47,436,437],{},"t",") and ",[47,440,441],{},"upc",". In the samples ",[47,444,445],{},"card_type"," came back ",[47,448,413],{},", so read the type line from ",[47,451,426],{},[198,453,455],{"id":454},"your-first-request","Your First Request",[20,457,458,459,462,463,466],{},"Every request goes to ",[47,460,461],{},"https:\u002F\u002Fapi.pokewallet.io"," with your key in the ",[47,464,465],{},"X-API-Key"," header. Start with a search:",[468,469,474],"pre",{"className":470,"code":471,"language":472,"meta":473,"style":473},"language-bash shiki shiki-themes github-dark-default","curl -H \"X-API-Key: $POKEWALLET_API_KEY\" \\\n  \"https:\u002F\u002Fapi.pokewallet.io\u002Fmtg\u002Fsearch?q=Emrakul\"\n","bash","",[47,475,476,504],{"__ignoreMap":473},[477,478,481,485,489,493,497,500],"span",{"class":479,"line":480},"line",1,[477,482,484],{"class":483},"sQhOw","curl",[477,486,488],{"class":487},"sFSAA"," -H",[477,490,492],{"class":491},"s9uIt"," \"X-API-Key: ",[477,494,496],{"class":495},"sZEs4","$POKEWALLET_API_KEY",[477,498,499],{"class":491},"\"",[477,501,503],{"class":502},"suJrU"," \\\n",[477,505,507],{"class":479,"line":506},2,[477,508,509],{"class":491},"  \"https:\u002F\u002Fapi.pokewallet.io\u002Fmtg\u002Fsearch?q=Emrakul\"\n",[20,511,512,513,516],{},"The query returned 53 matches in total. The ",[47,514,515],{},"metadata"," block tells you where the prices came from:",[213,518,519,529],{},[216,520,521],{},[219,522,523,526],{},[222,524,525],{},"Metadata field",[222,527,528],{},"Value",[232,530,531,541,552,563,573,583],{},[219,532,533,538],{},[237,534,535],{},[47,536,537],{},"total_count",[237,539,540],{},"53",[219,542,543,549],{},[237,544,545,548],{},[47,546,547],{},"tcg"," (cards with TCGplayer data)",[237,550,551],{},"51",[219,553,554,560],{},[237,555,556,559],{},[47,557,558],{},"cardmarket"," (cards with CardMarket data)",[237,561,562],{},"47",[219,564,565,570],{},[237,566,567],{},[47,568,569],{},"both_sources",[237,571,572],{},"45",[219,574,575,580],{},[237,576,577],{},[47,578,579],{},"tcg_only",[237,581,582],{},"6",[219,584,585,590],{},[237,586,587],{},[47,588,589],{},"cardmarket_only",[237,591,592],{},"2",[20,594,595,596,600],{},"Not every card exists on both marketplaces, so handle a missing side. In the first search result, ",[597,598,599],"em",{},"Emrakul, the Aeons Torn"," (Pro Tour Promos, foil only), both sources were present:",[213,602,603,618],{},[216,604,605],{},[219,606,607,610,613,616],{},[222,608,609],{},"Source",[222,611,612],{},"Finish",[222,614,615],{},"Figure",[222,617,528],{},[232,619,620,633,645,657],{},[219,621,622,624,627,630],{},[237,623,40],{},[237,625,626],{},"Foil",[237,628,629],{},"market price",[237,631,632],{},"$123.86",[219,634,635,637,639,642],{},[237,636,40],{},[237,638,626],{},[237,640,641],{},"low \u002F high",[237,643,644],{},"$104.13 \u002F $231.50",[219,646,647,649,651,654],{},[237,648,44],{},[237,650,626],{},[237,652,653],{},"trend",[237,655,656],{},"€47.18",[219,658,659,661,663,666],{},[237,660,44],{},[237,662,626],{},[237,664,665],{},"avg",[237,667,668],{},"€48.99",[20,670,671],{},[597,672,673],{},"Prices as returned by the API for the Pro Tour Promos foil, stamped 30 September 2026.",[20,675,676,677,679,680,683,684,686,687,689],{},"CardMarket also returned a ",[47,678,171],{}," entry for that card, with only a ",[47,681,682],{},"low"," of €36.05 and every other field ",[47,685,413],{},". A ",[47,688,413],{}," means no data, not zero. Check for it before you do arithmetic.",[198,691,693],{"id":692},"free-endpoints","Free Endpoints",[103,695,697],{"id":696},"sets-and-cards","Sets and cards",[20,699,700,703,704,393,707,710,711,62,713,715,716,718,719,721],{},[47,701,702],{},"GET \u002Fmtg\u002Fsets\u002F24684"," returned ",[597,705,706],{},"Reality Fracture",[47,708,709],{},"FRA","), released 2 October 2026. It accepts either the ",[47,712,378],{},[47,714,374],{},". If a ",[47,717,374],{}," is ambiguous, the API answers with candidates, so prefer the numeric ",[47,720,378],{}," in code you ship.",[20,723,724,725,728,729,41,732,735,736,739,740,41,743,70],{},"The card list is paginated, and the ",[47,726,727],{},"pagination"," object reports ",[47,730,731],{},"total",[47,733,734],{},"total_pages",". The sample was fetched with a page size of one, which is why it shows 782 pages. The first card is ",[597,737,738],{},"Emrakul, the Exigent Doom",", mythic, in ",[47,741,742],{},"Normal",[47,744,626],{},[20,746,747],{},"In that card list the price arrays were empty:",[468,749,753],{"className":750,"code":751,"language":752,"meta":473,"style":473},"language-json shiki shiki-themes github-dark-default","\"tcgplayer\": { \"prices\": [], \"url\": \"https:\u002F\u002Fwww.tcgplayer.com\u002Fproduct\u002F716715\u002F...\" }\n","json",[47,754,755],{"__ignoreMap":473},[477,756,757,760,763,767,770,773,776,779],{"class":479,"line":480},[477,758,759],{"class":491},"\"tcgplayer\"",[477,761,762],{"class":495},": { ",[477,764,766],{"class":765},"sPWt5","\"prices\"",[477,768,769],{"class":495},": [], ",[477,771,772],{"class":765},"\"url\"",[477,774,775],{"class":495},": ",[477,777,778],{"class":491},"\"https:\u002F\u002Fwww.tcgplayer.com\u002Fproduct\u002F716715\u002F...\"",[477,780,781],{"class":495}," }\n",[20,783,784],{},"That is by design: the set card list gives you the card and the marketplace link, not the prices. To get prices, call the single-card endpoint or search, or use the Ultra set-price endpoint below.",[103,786,788],{"id":787},"one-card-both-marketplaces","One card, both marketplaces",[20,790,791,794,795,797],{},[47,792,793],{},"GET \u002Fmtg\u002Fcards\u002F:id"," takes the long ID from the set or search results. For ",[597,796,738],{}," it returned:",[213,799,800,820],{},[216,801,802],{},[219,803,804,806,808,811,814,817],{},[222,805,609],{},[222,807,612],{},[222,809,810],{},"Low",[222,812,813],{},"Mid",[222,815,816],{},"High",[222,818,819],{},"Market",[232,821,822,840],{},[219,823,824,826,828,831,834,837],{},[237,825,40],{},[237,827,742],{},[237,829,830],{},"$28.08",[237,832,833],{},"$32.62",[237,835,836],{},"$58.92",[237,838,839],{},"$29.08",[219,841,842,844,846,849,852,855],{},[237,843,40],{},[237,845,626],{},[237,847,848],{},"$33.01",[237,850,851],{},"$42.30",[237,853,854],{},"$94.97",[237,856,857],{},"$39.85",[20,859,860],{},[597,861,862,863,70],{},"TCGplayer, updated 30 September 2026. Normal also had a direct low of $29.48; Foil's was ",[47,864,413],{},[213,866,867,886],{},[216,868,869],{},[219,870,871,873,875,877,880,883],{},[222,872,609],{},[222,874,612],{},[222,876,810],{},[222,878,879],{},"Trend",[222,881,882],{},"Avg",[222,884,885],{},"Avg 7d",[232,887,888,906],{},[219,889,890,892,894,897,900,903],{},[237,891,44],{},[237,893,742],{},[237,895,896],{},"€14.30",[237,898,899],{},"€16.27",[237,901,902],{},"€34.79",[237,904,905],{},"€31.97",[219,907,908,910,912,915,918,921],{},[237,909,44],{},[237,911,626],{},[237,913,914],{},"€19.50",[237,916,917],{},"€18.78",[237,919,920],{},"€59.99",[237,922,923],{},"€58.32",[20,925,926],{},[597,927,928,929,41,932,70],{},"CardMarket, updated 30 September 2026. The response also carries ",[47,930,931],{},"avg1",[47,933,934],{},"avg30",[20,936,937,938,41,940,942,943,947],{},"Those figures were stamped two days before the set's listed release date, so they are pre-release prices. The CardMarket ",[47,939,665],{},[47,941,653],{}," fields sit far apart for this card. They measure different things, so pick one and stick with it rather than mixing them. Our ",[82,944,946],{"href":945},"\u002Fblog\u002Fbuild-pokemon-card-price-tracker-pokewallet-api-tutorial","Pokémon price tracker tutorial"," uses the same approach for deciding which field to display.",[20,949,950,951,954],{},"Plan your request budget before you loop. The free tier is ",[25,952,953],{},"100 requests\u002Fhour and 1,000\u002Fday",", and every call counts, including the card lookups you make after a search.",[198,956,958],{"id":957},"ultra-endpoints-prices-analytics","Ultra Endpoints: Prices & Analytics",[20,960,961,962,965,966,969,970,974,975,979],{},"Ultra costs ",[25,963,964],{},"€29\u002Fmonth",", with ",[25,967,968],{},"7,000 requests\u002Fhour and 70,000\u002Fday",". The trial lasts 7 days and you start it from the dashboard after you ",[82,971,973],{"href":972},"\u002Fauth\u002Flogin","log in",". The whole Magic analytics layer sits behind it. See ",[82,976,978],{"href":977},"\u002Fblog\u002Fpokewallet-pro-vs-ultra-which-plan","Pro vs Ultra"," for the plan breakdown.",[103,981,300],{"id":982},"prices-for-a-whole-set",[20,984,985,988,989,965,992,995,996,998,999,1001],{},[47,986,987],{},"GET \u002Fmtg\u002Fprices\u002F24684"," returns one row per card ",[25,990,991],{},"and finish",[47,993,994],{},"source: \"both\""," and a ",[47,997,731],{}," of 1,226 rows for ",[597,1000,706],{},". Each row has the TCGplayer and CardMarket figures side by side:",[468,1003,1005],{"className":750,"code":1004,"language":752,"meta":473,"style":473},"{\n  \"name\": \"Emrakul, the Exigent Doom\",\n  \"variant\": \"Foil\",\n  \"tcgplayer\": { \"market_price\": 39.85, \"updated_at\": \"2026-09-30T20:37:36.812579+00:00\" },\n  \"cardmarket\": { \"trend\": 18.78, \"avg\": 59.99, \"updated_at\": \"2026-09-30T14:49:39.980453+00:00\" }\n}\n",[47,1006,1007,1012,1025,1038,1067,1104],{"__ignoreMap":473},[477,1008,1009],{"class":479,"line":480},[477,1010,1011],{"class":495},"{\n",[477,1013,1014,1017,1019,1022],{"class":479,"line":506},[477,1015,1016],{"class":765},"  \"name\"",[477,1018,775],{"class":495},[477,1020,1021],{"class":491},"\"Emrakul, the Exigent Doom\"",[477,1023,1024],{"class":495},",\n",[477,1026,1028,1031,1033,1036],{"class":479,"line":1027},3,[477,1029,1030],{"class":765},"  \"variant\"",[477,1032,775],{"class":495},[477,1034,1035],{"class":491},"\"Foil\"",[477,1037,1024],{"class":495},[477,1039,1041,1044,1046,1049,1051,1054,1056,1059,1061,1064],{"class":479,"line":1040},4,[477,1042,1043],{"class":765},"  \"tcgplayer\"",[477,1045,762],{"class":495},[477,1047,1048],{"class":765},"\"market_price\"",[477,1050,775],{"class":495},[477,1052,1053],{"class":487},"39.85",[477,1055,121],{"class":495},[477,1057,1058],{"class":765},"\"updated_at\"",[477,1060,775],{"class":495},[477,1062,1063],{"class":491},"\"2026-09-30T20:37:36.812579+00:00\"",[477,1065,1066],{"class":495}," },\n",[477,1068,1070,1073,1075,1078,1080,1083,1085,1088,1090,1093,1095,1097,1099,1102],{"class":479,"line":1069},5,[477,1071,1072],{"class":765},"  \"cardmarket\"",[477,1074,762],{"class":495},[477,1076,1077],{"class":765},"\"trend\"",[477,1079,775],{"class":495},[477,1081,1082],{"class":487},"18.78",[477,1084,121],{"class":495},[477,1086,1087],{"class":765},"\"avg\"",[477,1089,775],{"class":495},[477,1091,1092],{"class":487},"59.99",[477,1094,121],{"class":495},[477,1096,1058],{"class":765},[477,1098,775],{"class":495},[477,1100,1101],{"class":491},"\"2026-09-30T14:49:39.980453+00:00\"",[477,1103,781],{"class":495},[477,1105,1107],{"class":479,"line":1106},6,[477,1108,1109],{"class":495},"}\n",[20,1111,1112],{},"The row count (1,226) is higher than the card count because foils and other finishes get their own rows.",[103,1114,1116],{"id":1115},"statistics","Statistics",[20,1118,1119,1122],{},[47,1120,1121],{},"GET \u002Fmtg\u002Fsets\u002F24684\u002Fstatistics"," summarises the set on each marketplace:",[213,1124,1125,1135],{},[216,1126,1127],{},[219,1128,1129,1131,1133],{},[222,1130],{},[222,1132,40],{},[222,1134,44],{},[232,1136,1137,1152,1163,1174],{},[219,1138,1139,1142,1149],{},[237,1140,1141],{},"Average price",[237,1143,1144,1145,1148],{},"17.01 (",[47,1146,1147],{},"avg_market_price",")",[237,1150,1151],{},"12.32",[219,1153,1154,1157,1160],{},[237,1155,1156],{},"Minimum",[237,1158,1159],{},"0.12",[237,1161,1162],{},"0.03",[219,1164,1165,1168,1171],{},[237,1166,1167],{},"Maximum",[237,1169,1170],{},"880",[237,1172,1173],{},"452.25",[219,1175,1176,1179,1182],{},[237,1177,1178],{},"Most expensive",[237,1180,1181],{},"Omnipresence (Borderless) (Facet Foil)",[237,1183,1184],{},"Hexhaven Invigorator (Borderless) (Facet Foil)",[20,1186,1187,1188,1191,1192,1195,1196,121,1199,121,1202,121,1205,121,1208,121,1211,1214,1215,1218],{},"CardMarket also reports a ",[47,1189,1190],{},"trend_direction",", which was ",[47,1193,1194],{},"stable",". The response includes a rarity breakdown (",[47,1197,1198],{},"M",[47,1200,1201],{},"T",[47,1203,1204],{},"C",[47,1206,1207],{},"R",[47,1209,1210],{},"U",[47,1212,1213],{},"L","). It also shows a ",[47,1216,1217],{},"total_cards"," of 767, where the set endpoint reported 782. The two endpoints count differently, so don't reconcile them and don't assume one is a bug in your code.",[103,1220,1222],{"id":1221},"completion-value","Completion value",[20,1224,1225,1228],{},[47,1226,1227],{},"GET \u002Fmtg\u002Fsets\u002F24684\u002Fcompletion-value"," estimates what one copy of every card costs:",[213,1230,1231,1245],{},[216,1232,1233],{},[219,1234,1235,1237,1239,1242],{},[222,1236],{},[222,1238,810],{},[222,1240,1241],{},"Market \u002F avg",[222,1243,1244],{},"High \u002F trend",[232,1246,1247,1260],{},[219,1248,1249,1251,1254,1257],{},[237,1250,40],{},[237,1252,1253],{},"18,286.81",[237,1255,1256],{},"14,069.58 (market)",[237,1258,1259],{},"31,790.08 (high)",[219,1261,1262,1264,1267,1270],{},[237,1263,44],{},[237,1265,1266],{},"11,034.06",[237,1268,1269],{},"12,255.16 (avg)",[237,1271,1272],{},"652.20 (trend)",[20,1274,1275,1276,1279,1280,1283],{},"The CardMarket ",[47,1277,1278],{},"trend_estimate"," of 652.20 is nowhere near its ",[47,1281,1282],{},"avg_estimate",", and the response doesn't say why. Use one field consistently. The note in the response is explicit that this is one copy per card in the base finish, and that USD and EUR can't be compared directly.",[103,1285,1287],{"id":1286},"top-cards-and-trending-sets","Top cards and trending sets",[20,1289,1290,1293],{},[47,1291,1292],{},"GET \u002Fmtg\u002Fanalytics\u002Ftop-cards"," defaults to the highest prices from TCGplayer:",[213,1295,1296,1309],{},[216,1297,1298],{},[219,1299,1300,1303,1306],{},[222,1301,1302],{},"Card",[222,1304,1305],{},"Set",[222,1307,1308],{},"Price",[232,1310,1311,1325],{},[219,1312,1313,1316,1322],{},[237,1314,1315],{},"Smaug the Magnificent (Borderless)",[237,1317,1318,1319,1148],{},"The Hobbit (",[47,1320,1321],{},"HOB",[237,1323,1324],{},"24,500",[219,1326,1327,1330,1336],{},[237,1328,1329],{},"Time Walk",[237,1331,1332,1333,1148],{},"Unlimited Edition (",[47,1334,1335],{},"2ED",[237,1337,1338],{},"5,719.99",[20,1340,1341,1342,1345,1346,1349,1350,1353,1354,393,1357,1360],{},"Add ",[47,1343,1344],{},"?metric=growth&source=cm"," to rank by CardMarket growth instead. The sample returned ",[597,1347,1348],{},"Sandstorm Eidolon"," (Dissension, €14.43, ",[25,1351,1352],{},"+753.8%"," over 7 days) and ",[597,1355,1356],{},"Aurora Eidolon",[25,1358,1359],{},"+479.2%",", €15.87). Growth lists like this surface cheap commons with small supply, so check the sale volume behind a spike before acting on it.",[20,1362,1363,1366,1367,1370,1371,1374,1375,1370,1378,1381,1382,1385,1386,1389,1390,1393,1394,1396],{},[47,1364,1365],{},"GET \u002Fmtg\u002Fsets\u002Ftrending"," covers a 7-day window. ",[597,1368,1369],{},"WCD 2002: Brian Kibler"," showed ",[25,1372,1373],{},"+112.1%"," on CardMarket (average €3.79 to €8.04), and ",[597,1376,1377],{},"Alpha Edition",[25,1379,1380],{},"+78.9%"," (€519.91 to €930.31), with ",[597,1383,1384],{},"Timetwister"," up 191.4%. TCGplayer data was missing for both. The Alpha Edition entry returns ",[47,1387,1388],{},"work_in_progress"," with the message \"TCGPlayer price history not yet available\". Code defensively: the ",[47,1391,1392],{},"tcgplayer"," key can be ",[47,1395,413],{}," or a status object.",[198,1398,1400],{"id":1399},"code-examples-javascript-python","Code Examples: JavaScript & Python",[20,1402,1403,1404,70],{},"Both examples use only the routes, parameters and fields shown above. Set your key as ",[47,1405,1406],{},"POKEWALLET_API_KEY",[103,1408,1410],{"id":1409},"javascript-node-18-search-then-compare-marketplaces","JavaScript (Node 18+): search, then compare marketplaces",[468,1412,1416],{"className":1413,"code":1414,"language":1415,"meta":473,"style":473},"language-javascript shiki shiki-themes github-dark-default","const BASE = \"https:\u002F\u002Fapi.pokewallet.io\";\nconst headers = { \"X-API-Key\": process.env.POKEWALLET_API_KEY };\n\nasync function get(path) {\n  const res = await fetch(`${BASE}${path}`, { headers });\n  if (!res.ok) {\n    throw new Error(`${path} failed: HTTP ${res.status}`);\n  }\n  return res.json();\n}\n\nconst { results } = await get(\"\u002Fmtg\u002Fsearch?q=Emrakul\");\n\nfor (const card of results) {\n  const { name, set_name } = card.card_info;\n\n  const tcg = (card.tcgplayer?.prices ?? []).map(\n    (p) => `${p.sub_type_name} $${p.market_price}`\n  );\n  const cm = (card.cardmarket?.prices ?? [])\n    .filter((p) => p.trend !== null)\n    .map((p) => `${p.variant_type} €${p.trend}`);\n\n  console.log(`${name} (${set_name})`);\n  console.log(\"  TCGplayer market:\", tcg.join(\", \") || \"no data\");\n  console.log(\"  CardMarket trend:\", cm.join(\", \") || \"no data\");\n}\n","javascript",[47,1417,1418,1435,1458,1464,1485,1520,1533,1567,1573,1587,1592,1597,1624,1629,1648,1670,1675,1700,1737,1743,1761,1791,1828,1833,1858,1891,1920],{"__ignoreMap":473},[477,1419,1420,1423,1426,1429,1432],{"class":479,"line":480},[477,1421,1422],{"class":502},"const",[477,1424,1425],{"class":487}," BASE",[477,1427,1428],{"class":502}," =",[477,1430,1431],{"class":491}," \"https:\u002F\u002Fapi.pokewallet.io\"",[477,1433,1434],{"class":495},";\n",[477,1436,1437,1439,1442,1444,1447,1450,1453,1455],{"class":479,"line":506},[477,1438,1422],{"class":502},[477,1440,1441],{"class":487}," headers",[477,1443,1428],{"class":502},[477,1445,1446],{"class":495}," { ",[477,1448,1449],{"class":491},"\"X-API-Key\"",[477,1451,1452],{"class":495},": process.env.",[477,1454,1406],{"class":487},[477,1456,1457],{"class":495}," };\n",[477,1459,1460],{"class":479,"line":1027},[477,1461,1463],{"emptyLinePlaceholder":1462},true,"\n",[477,1465,1466,1469,1472,1476,1479,1482],{"class":479,"line":1040},[477,1467,1468],{"class":502},"async",[477,1470,1471],{"class":502}," function",[477,1473,1475],{"class":1474},"sc3cj"," get",[477,1477,1478],{"class":495},"(",[477,1480,1481],{"class":483},"path",[477,1483,1484],{"class":495},") {\n",[477,1486,1487,1490,1493,1495,1498,1501,1503,1506,1509,1512,1514,1517],{"class":479,"line":1069},[477,1488,1489],{"class":502},"  const",[477,1491,1492],{"class":487}," res",[477,1494,1428],{"class":502},[477,1496,1497],{"class":502}," await",[477,1499,1500],{"class":1474}," fetch",[477,1502,1478],{"class":495},[477,1504,1505],{"class":491},"`${",[477,1507,1508],{"class":487},"BASE",[477,1510,1511],{"class":491},"}${",[477,1513,1481],{"class":495},[477,1515,1516],{"class":491},"}`",[477,1518,1519],{"class":495},", { headers });\n",[477,1521,1522,1525,1527,1530],{"class":479,"line":1106},[477,1523,1524],{"class":502},"  if",[477,1526,393],{"class":495},[477,1528,1529],{"class":502},"!",[477,1531,1532],{"class":495},"res.ok) {\n",[477,1534,1536,1539,1542,1545,1547,1549,1551,1554,1557,1559,1562,1564],{"class":479,"line":1535},7,[477,1537,1538],{"class":502},"    throw",[477,1540,1541],{"class":502}," new",[477,1543,1544],{"class":1474}," Error",[477,1546,1478],{"class":495},[477,1548,1505],{"class":491},[477,1550,1481],{"class":495},[477,1552,1553],{"class":491},"} failed: HTTP ${",[477,1555,1556],{"class":495},"res",[477,1558,70],{"class":491},[477,1560,1561],{"class":495},"status",[477,1563,1516],{"class":491},[477,1565,1566],{"class":495},");\n",[477,1568,1570],{"class":479,"line":1569},8,[477,1571,1572],{"class":495},"  }\n",[477,1574,1576,1579,1582,1584],{"class":479,"line":1575},9,[477,1577,1578],{"class":502},"  return",[477,1580,1581],{"class":495}," res.",[477,1583,752],{"class":1474},[477,1585,1586],{"class":495},"();\n",[477,1588,1590],{"class":479,"line":1589},10,[477,1591,1109],{"class":495},[477,1593,1595],{"class":479,"line":1594},11,[477,1596,1463],{"emptyLinePlaceholder":1462},[477,1598,1600,1602,1604,1607,1610,1613,1615,1617,1619,1622],{"class":479,"line":1599},12,[477,1601,1422],{"class":502},[477,1603,1446],{"class":495},[477,1605,1606],{"class":487},"results",[477,1608,1609],{"class":495}," } ",[477,1611,1612],{"class":502},"=",[477,1614,1497],{"class":502},[477,1616,1475],{"class":1474},[477,1618,1478],{"class":495},[477,1620,1621],{"class":491},"\"\u002Fmtg\u002Fsearch?q=Emrakul\"",[477,1623,1566],{"class":495},[477,1625,1627],{"class":479,"line":1626},13,[477,1628,1463],{"emptyLinePlaceholder":1462},[477,1630,1632,1635,1637,1639,1642,1645],{"class":479,"line":1631},14,[477,1633,1634],{"class":502},"for",[477,1636,393],{"class":495},[477,1638,1422],{"class":502},[477,1640,1641],{"class":487}," card",[477,1643,1644],{"class":502}," of",[477,1646,1647],{"class":495}," results) {\n",[477,1649,1651,1653,1655,1658,1660,1663,1665,1667],{"class":479,"line":1650},15,[477,1652,1489],{"class":502},[477,1654,1446],{"class":495},[477,1656,1657],{"class":487},"name",[477,1659,121],{"class":495},[477,1661,1662],{"class":487},"set_name",[477,1664,1609],{"class":495},[477,1666,1612],{"class":502},[477,1668,1669],{"class":495}," card.card_info;\n",[477,1671,1673],{"class":479,"line":1672},16,[477,1674,1463],{"emptyLinePlaceholder":1462},[477,1676,1678,1680,1683,1685,1688,1691,1694,1697],{"class":479,"line":1677},17,[477,1679,1489],{"class":502},[477,1681,1682],{"class":487}," tcg",[477,1684,1428],{"class":502},[477,1686,1687],{"class":495}," (card.tcgplayer?.prices ",[477,1689,1690],{"class":502},"??",[477,1692,1693],{"class":495}," []).",[477,1695,1696],{"class":1474},"map",[477,1698,1699],{"class":495},"(\n",[477,1701,1703,1706,1708,1711,1714,1717,1719,1721,1724,1727,1729,1731,1734],{"class":479,"line":1702},18,[477,1704,1705],{"class":495},"    (",[477,1707,20],{"class":483},[477,1709,1710],{"class":495},") ",[477,1712,1713],{"class":502},"=>",[477,1715,1716],{"class":491}," `${",[477,1718,20],{"class":495},[477,1720,70],{"class":491},[477,1722,1723],{"class":495},"sub_type_name",[477,1725,1726],{"class":491},"} $${",[477,1728,20],{"class":495},[477,1730,70],{"class":491},[477,1732,1733],{"class":495},"market_price",[477,1735,1736],{"class":491},"}`\n",[477,1738,1740],{"class":479,"line":1739},19,[477,1741,1742],{"class":495},"  );\n",[477,1744,1746,1748,1751,1753,1756,1758],{"class":479,"line":1745},20,[477,1747,1489],{"class":502},[477,1749,1750],{"class":487}," cm",[477,1752,1428],{"class":502},[477,1754,1755],{"class":495}," (card.cardmarket?.prices ",[477,1757,1690],{"class":502},[477,1759,1760],{"class":495}," [])\n",[477,1762,1764,1767,1770,1773,1775,1777,1779,1782,1785,1788],{"class":479,"line":1763},21,[477,1765,1766],{"class":495},"    .",[477,1768,1769],{"class":1474},"filter",[477,1771,1772],{"class":495},"((",[477,1774,20],{"class":483},[477,1776,1710],{"class":495},[477,1778,1713],{"class":502},[477,1780,1781],{"class":495}," p.trend ",[477,1783,1784],{"class":502},"!==",[477,1786,1787],{"class":487}," null",[477,1789,1790],{"class":495},")\n",[477,1792,1794,1796,1798,1800,1802,1804,1806,1808,1810,1812,1815,1818,1820,1822,1824,1826],{"class":479,"line":1793},22,[477,1795,1766],{"class":495},[477,1797,1696],{"class":1474},[477,1799,1772],{"class":495},[477,1801,20],{"class":483},[477,1803,1710],{"class":495},[477,1805,1713],{"class":502},[477,1807,1716],{"class":491},[477,1809,20],{"class":495},[477,1811,70],{"class":491},[477,1813,1814],{"class":495},"variant_type",[477,1816,1817],{"class":491},"} €${",[477,1819,20],{"class":495},[477,1821,70],{"class":491},[477,1823,653],{"class":495},[477,1825,1516],{"class":491},[477,1827,1566],{"class":495},[477,1829,1831],{"class":479,"line":1830},23,[477,1832,1463],{"emptyLinePlaceholder":1462},[477,1834,1836,1839,1842,1844,1846,1848,1851,1853,1856],{"class":479,"line":1835},24,[477,1837,1838],{"class":495},"  console.",[477,1840,1841],{"class":1474},"log",[477,1843,1478],{"class":495},[477,1845,1505],{"class":491},[477,1847,1657],{"class":495},[477,1849,1850],{"class":491},"} (${",[477,1852,1662],{"class":495},[477,1854,1855],{"class":491},"})`",[477,1857,1566],{"class":495},[477,1859,1861,1863,1865,1867,1870,1873,1876,1878,1881,1883,1886,1889],{"class":479,"line":1860},25,[477,1862,1838],{"class":495},[477,1864,1841],{"class":1474},[477,1866,1478],{"class":495},[477,1868,1869],{"class":491},"\"  TCGplayer market:\"",[477,1871,1872],{"class":495},", tcg.",[477,1874,1875],{"class":1474},"join",[477,1877,1478],{"class":495},[477,1879,1880],{"class":491},"\", \"",[477,1882,1710],{"class":495},[477,1884,1885],{"class":502},"||",[477,1887,1888],{"class":491}," \"no data\"",[477,1890,1566],{"class":495},[477,1892,1894,1896,1898,1900,1903,1906,1908,1910,1912,1914,1916,1918],{"class":479,"line":1893},26,[477,1895,1838],{"class":495},[477,1897,1841],{"class":1474},[477,1899,1478],{"class":495},[477,1901,1902],{"class":491},"\"  CardMarket trend:\"",[477,1904,1905],{"class":495},", cm.",[477,1907,1875],{"class":1474},[477,1909,1478],{"class":495},[477,1911,1880],{"class":491},[477,1913,1710],{"class":495},[477,1915,1885],{"class":502},[477,1917,1888],{"class":491},[477,1919,1566],{"class":495},[477,1921,1923],{"class":479,"line":1922},27,[477,1924,1109],{"class":495},[20,1926,1927,1928,1931],{},"The optional chaining covers the cards that exist on only one marketplace. The ",[47,1929,1930],{},"trend !== null"," filter drops finishes with no trend value.",[103,1933,1935],{"id":1934},"python-ultra-set-prices","Python: Ultra set prices",[468,1937,1941],{"className":1938,"code":1939,"language":1940,"meta":473,"style":473},"language-python shiki shiki-themes github-dark-default","import os\nimport requests\n\nBASE = \"https:\u002F\u002Fapi.pokewallet.io\"\nHEADERS = {\"X-API-Key\": os.environ[\"POKEWALLET_API_KEY\"]}\n\n\ndef get(path: str) -> dict:\n    res = requests.get(f\"{BASE}{path}\", headers=HEADERS, timeout=30)\n    res.raise_for_status()\n    return res.json()\n\n\npayload = get(\"\u002Fmtg\u002Fprices\u002F24684\")  # Ultra or trial required\n\nrows = [\n    {\n        \"name\": row[\"name\"],\n        \"variant\": row[\"variant\"],\n        \"usd\": row[\"tcgplayer\"][\"market_price\"],\n        \"eur_trend\": row[\"cardmarket\"][\"trend\"],\n    }\n    for row in payload[\"data\"]\n    if row.get(\"tcgplayer\") and row.get(\"cardmarket\")\n]\n\nfor row in sorted(rows, key=lambda r: r[\"usd\"] or 0, reverse=True)[:5]:\n    print(row)\n","python",[47,1942,1943,1951,1958,1962,1971,1992,1996,2000,2022,2073,2078,2086,2090,2094,2114,2118,2128,2133,2147,2159,2175,2191,2196,2216,2237,2241,2245,2299],{"__ignoreMap":473},[477,1944,1945,1948],{"class":479,"line":480},[477,1946,1947],{"class":502},"import",[477,1949,1950],{"class":495}," os\n",[477,1952,1953,1955],{"class":479,"line":506},[477,1954,1947],{"class":502},[477,1956,1957],{"class":495}," requests\n",[477,1959,1960],{"class":479,"line":1027},[477,1961,1463],{"emptyLinePlaceholder":1462},[477,1963,1964,1966,1968],{"class":479,"line":1040},[477,1965,1508],{"class":487},[477,1967,1428],{"class":502},[477,1969,1970],{"class":491}," \"https:\u002F\u002Fapi.pokewallet.io\"\n",[477,1972,1973,1976,1978,1981,1983,1986,1989],{"class":479,"line":1069},[477,1974,1975],{"class":487},"HEADERS",[477,1977,1428],{"class":502},[477,1979,1980],{"class":495}," {",[477,1982,1449],{"class":491},[477,1984,1985],{"class":495},": os.environ[",[477,1987,1988],{"class":491},"\"POKEWALLET_API_KEY\"",[477,1990,1991],{"class":495},"]}\n",[477,1993,1994],{"class":479,"line":1106},[477,1995,1463],{"emptyLinePlaceholder":1462},[477,1997,1998],{"class":479,"line":1535},[477,1999,1463],{"emptyLinePlaceholder":1462},[477,2001,2002,2005,2007,2010,2013,2016,2019],{"class":479,"line":1569},[477,2003,2004],{"class":502},"def",[477,2006,1475],{"class":1474},[477,2008,2009],{"class":495},"(path: ",[477,2011,2012],{"class":487},"str",[477,2014,2015],{"class":495},") -> ",[477,2017,2018],{"class":487},"dict",[477,2020,2021],{"class":495},":\n",[477,2023,2024,2027,2029,2032,2035,2037,2040,2042,2045,2047,2050,2052,2054,2057,2059,2061,2063,2066,2068,2071],{"class":479,"line":1575},[477,2025,2026],{"class":495},"    res ",[477,2028,1612],{"class":502},[477,2030,2031],{"class":495}," requests.get(",[477,2033,2034],{"class":502},"f",[477,2036,499],{"class":491},[477,2038,2039],{"class":502},"{",[477,2041,1508],{"class":487},[477,2043,2044],{"class":502},"}{",[477,2046,1481],{"class":495},[477,2048,2049],{"class":502},"}",[477,2051,499],{"class":491},[477,2053,121],{"class":495},[477,2055,2056],{"class":483},"headers",[477,2058,1612],{"class":502},[477,2060,1975],{"class":487},[477,2062,121],{"class":495},[477,2064,2065],{"class":483},"timeout",[477,2067,1612],{"class":502},[477,2069,2070],{"class":487},"30",[477,2072,1790],{"class":495},[477,2074,2075],{"class":479,"line":1589},[477,2076,2077],{"class":495},"    res.raise_for_status()\n",[477,2079,2080,2083],{"class":479,"line":1594},[477,2081,2082],{"class":502},"    return",[477,2084,2085],{"class":495}," res.json()\n",[477,2087,2088],{"class":479,"line":1599},[477,2089,1463],{"emptyLinePlaceholder":1462},[477,2091,2092],{"class":479,"line":1626},[477,2093,1463],{"emptyLinePlaceholder":1462},[477,2095,2096,2099,2101,2104,2107,2110],{"class":479,"line":1631},[477,2097,2098],{"class":495},"payload ",[477,2100,1612],{"class":502},[477,2102,2103],{"class":495}," get(",[477,2105,2106],{"class":491},"\"\u002Fmtg\u002Fprices\u002F24684\"",[477,2108,2109],{"class":495},")  ",[477,2111,2113],{"class":2112},"sH3jZ","# Ultra or trial required\n",[477,2115,2116],{"class":479,"line":1650},[477,2117,1463],{"emptyLinePlaceholder":1462},[477,2119,2120,2123,2125],{"class":479,"line":1672},[477,2121,2122],{"class":495},"rows ",[477,2124,1612],{"class":502},[477,2126,2127],{"class":495}," [\n",[477,2129,2130],{"class":479,"line":1677},[477,2131,2132],{"class":495},"    {\n",[477,2134,2135,2138,2141,2144],{"class":479,"line":1702},[477,2136,2137],{"class":491},"        \"name\"",[477,2139,2140],{"class":495},": row[",[477,2142,2143],{"class":491},"\"name\"",[477,2145,2146],{"class":495},"],\n",[477,2148,2149,2152,2154,2157],{"class":479,"line":1739},[477,2150,2151],{"class":491},"        \"variant\"",[477,2153,2140],{"class":495},[477,2155,2156],{"class":491},"\"variant\"",[477,2158,2146],{"class":495},[477,2160,2161,2164,2166,2168,2171,2173],{"class":479,"line":1745},[477,2162,2163],{"class":491},"        \"usd\"",[477,2165,2140],{"class":495},[477,2167,759],{"class":491},[477,2169,2170],{"class":495},"][",[477,2172,1048],{"class":491},[477,2174,2146],{"class":495},[477,2176,2177,2180,2182,2185,2187,2189],{"class":479,"line":1763},[477,2178,2179],{"class":491},"        \"eur_trend\"",[477,2181,2140],{"class":495},[477,2183,2184],{"class":491},"\"cardmarket\"",[477,2186,2170],{"class":495},[477,2188,1077],{"class":491},[477,2190,2146],{"class":495},[477,2192,2193],{"class":479,"line":1793},[477,2194,2195],{"class":495},"    }\n",[477,2197,2198,2201,2204,2207,2210,2213],{"class":479,"line":1830},[477,2199,2200],{"class":502},"    for",[477,2202,2203],{"class":495}," row ",[477,2205,2206],{"class":502},"in",[477,2208,2209],{"class":495}," payload[",[477,2211,2212],{"class":491},"\"data\"",[477,2214,2215],{"class":495},"]\n",[477,2217,2218,2221,2224,2226,2228,2231,2233,2235],{"class":479,"line":1835},[477,2219,2220],{"class":502},"    if",[477,2222,2223],{"class":495}," row.get(",[477,2225,759],{"class":491},[477,2227,1710],{"class":495},[477,2229,2230],{"class":502},"and",[477,2232,2223],{"class":495},[477,2234,2184],{"class":491},[477,2236,1790],{"class":495},[477,2238,2239],{"class":479,"line":1860},[477,2240,2215],{"class":495},[477,2242,2243],{"class":479,"line":1893},[477,2244,1463],{"emptyLinePlaceholder":1462},[477,2246,2247,2249,2251,2253,2256,2259,2262,2265,2268,2271,2274,2277,2280,2282,2285,2287,2290,2293,2296],{"class":479,"line":1922},[477,2248,1634],{"class":502},[477,2250,2203],{"class":495},[477,2252,2206],{"class":502},[477,2254,2255],{"class":487}," sorted",[477,2257,2258],{"class":495},"(rows, ",[477,2260,2261],{"class":483},"key",[477,2263,2264],{"class":502},"=lambda",[477,2266,2267],{"class":495}," r: r[",[477,2269,2270],{"class":491},"\"usd\"",[477,2272,2273],{"class":495},"] ",[477,2275,2276],{"class":502},"or",[477,2278,2279],{"class":487}," 0",[477,2281,121],{"class":495},[477,2283,2284],{"class":483},"reverse",[477,2286,1612],{"class":502},[477,2288,2289],{"class":487},"True",[477,2291,2292],{"class":495},")[:",[477,2294,2295],{"class":487},"5",[477,2297,2298],{"class":495},"]:\n",[477,2300,2302,2305],{"class":479,"line":2301},28,[477,2303,2304],{"class":487},"    print",[477,2306,2307],{"class":495},"(row)\n",[20,2309,2310,2311,2315,2316,2320],{},"Without Ultra, this call fails, so catch the error and fall back to the single-card endpoint. There are also an ",[82,2312,2314],{"href":2313},"\u002Fdevelopers\u002Fsdk","official TypeScript and Python SDK",", with typed results and automatic pagination, and a ",[82,2317,2319],{"href":2318},"\u002Fdevelopers\u002Fmcp","hosted MCP server"," if you'd rather query prices from an AI client.",[20,2322,2323,2324,2326],{},"Strip the markup before you display ",[47,2325,188],{},":",[468,2328,2330],{"className":1413,"code":2329,"language":1415,"meta":473,"style":473},"const clean = (text) => text?.replace(\u002F\u003Cbr>\\s*\u002Fg, \"\\n\").replace(\u002F\\r\u002Fg, \"\").trim();\n",[47,2331,2332],{"__ignoreMap":473},[477,2333,2334,2336,2339,2341,2343,2346,2348,2350,2353,2356,2358,2361,2364,2367,2370,2373,2375,2377,2380,2382,2385,2387,2389,2391,2394,2396,2398,2400,2403,2405,2408],{"class":479,"line":480},[477,2335,1422],{"class":502},[477,2337,2338],{"class":1474}," clean",[477,2340,1428],{"class":502},[477,2342,393],{"class":495},[477,2344,2345],{"class":483},"text",[477,2347,1710],{"class":495},[477,2349,1713],{"class":502},[477,2351,2352],{"class":495}," text?.",[477,2354,2355],{"class":1474},"replace",[477,2357,1478],{"class":495},[477,2359,2360],{"class":491},"\u002F\u003Cbr>",[477,2362,2363],{"class":487},"\\s",[477,2365,2366],{"class":502},"*",[477,2368,2369],{"class":491},"\u002F",[477,2371,2372],{"class":502},"g",[477,2374,121],{"class":495},[477,2376,499],{"class":491},[477,2378,2379],{"class":502},"\\n",[477,2381,499],{"class":491},[477,2383,2384],{"class":495},").",[477,2386,2355],{"class":1474},[477,2388,1478],{"class":495},[477,2390,2369],{"class":491},[477,2392,2393],{"class":487},"\\r",[477,2395,2369],{"class":491},[477,2397,2372],{"class":502},[477,2399,121],{"class":495},[477,2401,2402],{"class":491},"\"\"",[477,2404,2384],{"class":495},[477,2406,2407],{"class":1474},"trim",[477,2409,1586],{"class":495},[198,2411,2413],{"id":2412},"how-it-compares-to-the-alternatives","How It Compares to the Alternatives",[20,2415,2416,2419],{},[25,2417,2418],{},"Scryfall"," is the obvious comparison, and it is a good one. It is free and it already returns USD and EUR prices for Magic cards. If you only build for Magic and one price per card is enough, it may be all you need. ",[20,2421,2422],{},"The case for this API is narrower and more practical:",[108,2424,2425,2434,2440],{},[111,2426,2427,2430,2431,2433],{},[25,2428,2429],{},"One key, twelve games."," The same ",[47,2432,465],{}," and the same response shape cover Pokémon, One Piece, Yu-Gi-Oh!, Lorcana, Riftbound and the rest. If your product spans several games, you write one client.",[111,2435,2436,2439],{},[25,2437,2438],{},"Both marketplaces in one response."," TCGplayer and CardMarket arrive together, with CardMarket split by finish, so you don't reconcile two sources yourself.",[111,2441,2442,2445,2446,2448,2449,2452,2453,2456,2457,41,2460,2462],{},[25,2443,2444],{},"The ID model stays the same."," Switching ",[47,2447,49],{}," for ",[47,2450,2451],{},"\u002Flor\u002F"," or ",[47,2454,2455],{},"\u002Frft\u002F"," is the whole migration. See the ",[82,2458,2459],{"href":88},"Lorcana",[82,2461,85],{"href":84}," guides for the same walkthrough.",[20,2464,2465],{},"What it does not do: no eBay data, no grading data, and no price history for Magic. History exists only for Pokémon. Prices are daily snapshots, not live feeds, so don't use it for second-by-second arbitrage.",[20,2467,2468],{},"My recommendation: if you only need Magic cards, start with whichever free source fits. If you plan to add a second game, or need CardMarket and TCGplayer side by side, use one multi-game key from day one and skip the rewrite later.",[20,2470,2471,2472,2474,2475,2477],{},"New sets show up in ",[47,2473,120],{}," as the catalog adds them. Mystery Booster: Commander Edition, due 9 November, is the sort of release you would look up by ",[47,2476,374],{}," once it appears. Check the live list instead of hard-coding a set ID.",[195,2479],{},[198,2481,2483],{"id":2482},"frequently-asked-questions","Frequently Asked Questions",[103,2485,2487],{"id":2486},"is-there-a-free-magic-the-gathering-price-api","Is there a free Magic: The Gathering price API?",[20,2489,2490],{},"Yes. The PokéWallet free tier gives you 100 requests\u002Fhour and 1,000\u002Fday with no credit card. Single-card and search responses include TCGplayer and CardMarket prices. Prices for whole sets and analytics require Ultra or the 7-day trial.",[103,2492,2494],{"id":2493},"does-the-api-have-cardmarket-prices-for-magic","Does the API have CardMarket prices for Magic?",[20,2496,2497,2498,41,2500,965,2502,121,2504,121,2506,121,2508,121,2510,41,2513,2515,2516,41,2518,2520],{},"Yes. Each card carries CardMarket prices in EUR, split into ",[47,2499,171],{},[47,2501,174],{},[47,2503,682],{},[47,2505,653],{},[47,2507,665],{},[47,2509,931],{},[47,2511,2512],{},"avg7",[47,2514,934],{},". Some cards have only a ",[47,2517,682],{},[47,2519,413],{}," for the rest.",[103,2522,2524],{"id":2523},"how-often-are-mtg-prices-updated","How often are MTG prices updated?",[20,2526,2527,2528,2530],{},"TCGplayer and CardMarket prices refresh once a day. The ",[47,2529,178],{}," field on each price shows the last time that price changed, not the time you made the request.",[103,2532,2534],{"id":2533},"how-many-magic-sets-does-the-api-cover","How many Magic sets does the API cover?",[20,2536,2537,2538,2541],{},"The set list currently reports 514 sets, including promo and special sets. ",[47,2539,2540],{},"GET \u002Fmtg\u002Fsets"," returns them all with card counts, sealed counts, language and release date.",[103,2543,2545],{"id":2544},"do-i-need-ultra-to-get-magic-prices","Do I need Ultra to get Magic prices?",[20,2547,2548],{},"Not for individual cards. Card lookups and search include prices on every plan. You need Ultra (€29\u002Fmonth) or the 7-day trial for prices of whole sets, statistics, completion value, trending sets and top cards. Pro is not enough for Magic.",[103,2550,2552],{"id":2551},"can-i-use-one-api-key-for-magic-and-other-card-games","Can I use one API key for Magic and other card games?",[20,2554,2555,2556,2452,2558,70],{},"Yes. One key covers twelve games, from Pokémon and One Piece to Magic, Yu-Gi-Oh!, Lorcana and Riftbound, each under its own path such as ",[47,2557,49],{},[47,2559,2451],{},[195,2561],{},[15,2563,18,2565],{"style":2564},"background: rgba(107, 76, 154, 0.12); border-left: 4px solid #6B4C9A; padding: 1rem 1.5rem; margin: 1.5rem 0; border-radius: 4px;",[20,2566,23,2568,2571,2572,2574],{"style":2567},"margin: 0; font-size: 0.85rem; color: #e0e0e0;",[25,2569,2570],{},"💬 Price disclaimer:"," All figures come from PokéWallet API responses captured on 2 November 2026. TCGplayer prices are in USD and CardMarket prices are in EUR, and the ",[47,2573,178],{}," stamps inside them are from 30 September 2026. They are daily snapshots, not live quotes, and not financial advice.\n  ",[195,2576],{},[198,2578,2580],{"id":2579},"start-building-with-the-pokéwallet-api","Start Building with the PokéWallet API",[20,2582,2583,2584,2587,2588,2591],{},"Everything in this guide runs on the free tier up to the Ultra sections, and the same key works across the other eleven games. Get a key, search a card, and see both marketplaces in one response. Our ",[82,2585,2586],{"href":95},"multi-game API overview"," shows the rest of the catalog, and the ",[82,2589,2590],{"href":100},"Magic: The Gathering docs"," cover every parameter.",[108,2593,2594,2601,2607,2613,2620],{},[111,2595,2596,2597,2600],{},"🔑 ",[25,2598,2599],{},"One API key for 12 trading card games"," — Pokémon, One Piece, Magic, Yu-Gi-Oh!, Lorcana, Riftbound and more",[111,2602,137,2603,2606],{},[25,2604,2605],{},"TCGplayer (USD) and CardMarket (EUR) prices",", refreshed daily",[111,2608,113,2609,2612],{},[25,2610,2611],{},"Catalog endpoints free on every plan"," — sets, cards, search and images",[111,2614,2615,2616,2619],{},"⚡ ",[25,2617,2618],{},"Ultra unlocks prices and analytics for every game"," — try it free for 7 days from your dashboard",[111,2621,2622,2623,2626,2627],{},"💬 ",[25,2624,2625],{},"Developer support"," in our ",[82,2628,2632],{"href":2629,"rel":2630},"https:\u002F\u002Fdiscord.gg\u002FznDxEjmDVP",[2631],"nofollow","Discord",[20,2634,2635],{},[25,2636,2637],{},"Get Started:",[108,2639,2640,2649,2656],{},[111,2641,2642,2643,2648],{},"🚀 ",[25,2644,2645],{},[82,2646,2647],{"href":972},"Get Your Free API Key"," — no credit card required",[111,2650,2651,2652],{},"📖 Read the ",[82,2653,2655],{"href":2654},"\u002Fapi-docs","API documentation",[111,2657,2658,2659],{},"💳 Compare plans on the ",[82,2660,2662],{"href":2661},"\u002Fpricing","pricing page",[195,2664],{},[20,2666,2667],{},[597,2668,2669],{},"This article is for informational purposes only and is not financial advice. Details reflect information available at the time of writing; release dates, pricing and set contents are subject to change. Card prices are volatile — always verify current market pricing before buying or selling.",[2671,2672,2673],"style",{},"html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sPWt5, html code.shiki .sPWt5{--shiki-default:#7EE787}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}",{"title":473,"searchDepth":506,"depth":506,"links":2675},[2676,2677,2678,2679,2683,2689,2693,2694,2702],{"id":105,"depth":1027,"text":106},{"id":200,"depth":506,"text":201},{"id":454,"depth":506,"text":455},{"id":692,"depth":506,"text":693,"children":2680},[2681,2682],{"id":696,"depth":1027,"text":697},{"id":787,"depth":1027,"text":788},{"id":957,"depth":506,"text":958,"children":2684},[2685,2686,2687,2688],{"id":982,"depth":1027,"text":300},{"id":1115,"depth":1027,"text":1116},{"id":1221,"depth":1027,"text":1222},{"id":1286,"depth":1027,"text":1287},{"id":1399,"depth":506,"text":1400,"children":2690},[2691,2692],{"id":1409,"depth":1027,"text":1410},{"id":1934,"depth":1027,"text":1935},{"id":2412,"depth":506,"text":2413},{"id":2482,"depth":506,"text":2483,"children":2695},[2696,2697,2698,2699,2700,2701],{"id":2486,"depth":1027,"text":2487},{"id":2493,"depth":1027,"text":2494},{"id":2523,"depth":1027,"text":2524},{"id":2533,"depth":1027,"text":2534},{"id":2544,"depth":1027,"text":2545},{"id":2551,"depth":1027,"text":2552},{"id":2579,"depth":506,"text":2580},"Developers","2026-11-03","MTG price API with TCGplayer USD and CardMarket EUR prices in one call. 514 sets, free catalog, set prices and analytics on Ultra. One key, 12 games.","md","\u002Fblog\u002Fmagic\u002F2026\u002F11\u002Fmtg-price-api-tcgplayer-cardmarket.webp","A towering Emrakul, the Exigent Doom looming over a dark, warped horizon, beside Smaug the Magnificent coiled on a golden hoard, with Time Walk and other Magic cards fanned across a developer desk under a laptop full of rising price charts, cool teal and violet light.",{},"\u002Fblog\u002Fmagic\u002F2026\u002F11\u002Fmtg-price-api-tcgplayer-cardmarket","11 min read",{"title":5,"description":2705},"blog\u002Fmagic\u002F2026\u002F11\u002Fmtg-price-api-tcgplayer-cardmarket",[2715,2716,2717,2718,2719,2720,2721],"mtg price api","magic the gathering card price api","cardmarket api mtg","mtg card database api","magic the gathering api multi game","mtg card prices api","tcgplayer api",null,"d9scwGXuRisjwCMgyoaVvQPcRzMwI67VMxHff0ofGF0",[],1793690225146]