Skip to content
Prepaid, no subscription trap. Top up a balance and we draw the monthly fee from it.
tcggraph

Both sides of the market

What a card sells for. And what it buys for.

Every card has two prices. Almost every card API publishes one of them. TCGGraph carries the dealer's bid next to their asking price on the same object, in the same shape, with the same daily history — so you can answer what a collection is worth to sell, not just what it would cost to rebuild.

61,671
Cards with a dealer bid
80,758
Buylist quotes held
3.8×
Swing in bid across price bands
Daily
Bid refresh, with history

The problem

Retail tells you what a card costs. It does not tell you what it is worth.

If you are valuing a collection, quoting a trade-in, pricing a bulk lot or marking a portfolio, the retail price is the wrong number. It is what someone would pay to acquire the card, and nobody in your flow is doing that. Your user wants to know what they can get for it.

The usual workaround is to take retail and apply a percentage. It feels reasonable and it is wrong nearly everywhere, because the discount is not a constant — it is a function of what the card is worth.

So the two-price problem is not solved by arithmetic. It is solved by carrying the second price.

Ask for the bid instead of the ask
curl -G "https://api.tcggraph.com/v1/cards/mtg_f6555d1f-d4c/prices" \
  -d listType=buylist \
  -H "Authorization: Bearer $TCGGRAPH_KEY"
Both sides, same object
{
  "prices": [
    {
      "source": "cardkingdom",
      "listType": "retail",
      "finish": "normal",
      "currency": "USD",
      "market": 24.99
    },
    {
      "source": "cardkingdom",
      "listType": "buylist",
      "finish": "normal",
      "currency": "USD",
      "market": 13.50
    }
  ]
}

Measured, not assumed

Why a flat percentage is always wrong somewhere

Across 74,736 cards where we hold a dealer's bid and their own asking price, the bid runs at 14.5% of retail on the cheapest cards and 54.9% on the most expensive. Pick any single percentage and it is badly wrong at one end of your inventory.

Retail price of the cardCards measuredAverage bid, as a share of retail
Under $129,811
14.5%
$1 – $522,551
33.6%
$5 – $2014,504
48.9%
$20 – $1006,488
53.1%
$100 – $5001,046
54.1%
$500 and up336
54.9%

A bulk common is worth a fraction of its sticker price to a dealer who has to sort, store and eventually shift it. A card someone is actively looking for is worth most of it. That is the whole shape of the trade, and it is invisible if you only hold one number.

Who this is for

Anyone whose user is selling rather than buying

Trade-in and buy counters

Game shops, conventions, pop-up buy desks

Quote a customer a number in seconds instead of thumbing through a binder and guessing. Offer a percentage of the real dealer bid rather than a percentage of retail, and your margin stops depending on which staff member happens to be on the counter.

Collection valuation

Collection trackers, insurance tools, estate valuation

A collection valued at retail is a number the owner can never actually realise. Showing both sides — what it would cost to buy and what it would fetch to sell — is the difference between a fantasy figure and a defensible one.

Bulk and lot pricing

Bulk buyers, liquidators, deck-out services

Sub-dollar cards clear at a seventh of retail while premium singles clear at over half. Pricing a mixed lot off a single blended percentage overpays on the bulk and underpays on the hits; per-card bids get the whole box right.

Sell-side portfolio tracking

Investment and portfolio apps

Track what a position is worth on exit, not on entry. A portfolio marked at retail overstates itself by roughly half at the top of the market and far more at the bottom, and users notice the moment they try to sell.

One parameter

Nothing to migrate, nothing to reconcile

Retail and buylist are separate rows with separate history, never blended into a single figure. Omitting the parameter returns retail, so nothing you have already built changes behaviour.

Because both sides sit on the same card object, the spread is a subtraction rather than a reconciliation job across two providers with two identifier schemes.

Buylist covers Magic: The Gathering today — 61,671 printings. Dealer bids are far scarcer than retail prices across the hobby, and we would rather name the game than inflate a coverage number.

Or ask for both at once
{
  card(id: "mtg_f6555d1f-d4c") {
    name
    prices {
      source
      listType
      finish
      currency
      market
    }
  }
}

Questions

Buylist, answered

Ship your card app this weekend

$19 a month for 25,000 credits, no sales call and no contract. Pick a plan and your first query runs in under a minute.