compsapi.com / blog

Why your card comps are wrong

The same query returned a $14.73 median and a $545.00 median on the same day. Both numbers are real. Only one is a comp.

Published 17 October 2026 by CompsAPI

Here is a measurement we ran on 17 October 2026, against our own API, which does not flatter us.

Search three years of completed eBay sales for charizard base set psa 10. Take the raw feed of sold listings, keep only the ones that sold a single unit, and take the median. You get $14.73, over 239 listings, with individual sales running from $1.30 to $30,000.

Run the same words through the comps endpoint, which drops lots, mystery packs, accessories, replicas and keyword stuffed titles before it calculates anything. You get a median of $545.00 over 60 matching sales, with the middle half between $236.77 and $2,861.08.

Same words. Same window. Same marketplace. A 37x difference in the answer.

Why the first number happens

eBay matches on words in the title, and it matches generously. A search for charizard base set psa 10 returns every listing whose title holds those words in any arrangement, which includes a card sleeve with "fits PSA 10 Charizard Base Set" in the title, a bulk lot of commons advertised as "Charizard Base Set PSA 10 chase", a raw card described as a "PSA 10 contender", and a custom fan art proxy.

None of those is the card. All of them are cheap, so they drag the middle of the distribution to the floor.

This is not an eBay bug and it is not specific to our data. Any tool reading the same search sees the same listings. The difference between tools is entirely in what they throw away afterwards, and most throw away nothing.

The trap that looks like the fix

The obvious response is to put more words in the query. Add the card number and search charizard base set psa 10 4/102. The median moves to $555.50, which looks like it worked.

It did not work, it moved. The range is still $4.00 to $35,000, which tells you the set is still full of things that are not the card. More words in the query asks eBay to match a longer string, and eBay responds by widening rather than narrowing, so you get a different population of wrong listings instead of a clean population of right ones.

Card numbers make it worse in a specific way: they are reused across sets. 4/102 is Base Set Charizard and it is also a reprint in a later anniversary set. Pinning the number without pinning the set pins nothing.

What actually fixes it

Filter on structure rather than on words. Four parameters do almost all of the work.

ParameterWhat it does
graded=trueSlabs only. A raw card titled "PSA 10 contender" is read as raw, which is the point
grader=PSAThe grading company, read from the title. BGS, CGC, SGC and others are recognised
grade=10The grade itself, kept as text so 9.5 stays 9.5
exclude=junkDrops lots, mystery listings, accessories, replicas, sealed product and keyword stuffed titles

On the comps endpoint exclude=junk is already on, which is why the second number above is the one to use. On the raw sold endpoint you opt in.

curl -G https://api.compsapi.com/v1/comps \
  -H "Authorization: Bearer YOUR_KEY" \
  --data-urlencode "q=charizard base set" \
  --data-urlencode "graded=true" \
  --data-urlencode "grader=PSA" \
  --data-urlencode "grade=10" \
  --data-urlencode "days=1095"

To pin a specific card inside a set, use require rather than adding words to q. require runs on our side after the search, so it only ever removes rows, and the response echoes how many it removed. Putting the same text in q hands it to eBay's matcher and changes which listings come back at all.

Read the spread, not just the median

Even after filtering properly, nominally identical graded cards do not sell for one price. In the cleaned set above the middle half ran $236.77 to $2,861.08. That is not noise to be averaged away, it is the market: a slab with a popular population number, good photos and a seller with feedback does not fetch what an identical slab fetches in a quiet week.

So quote the median and the band. Our stats return p25 and p75 alongside median, plus count and outliers_removed, because a number without its spread and its sample size is a guess wearing a suit.

The short version

Keyword search is a retrieval step, not a comp. If a card pricing tool shows you one number and no sample size, it is showing you the median of a population it never inspected. Ask it how many sales, over what window, and what it threw away.

Ours will tell you. The parameters are documented, the free key is 100 searches a month with no card, and the numbers above reproduce.

Price from what things
actually sold for

100 free requests a month · every filter on · no card

Get a free key