compsapi.com / sports card price api

Sports card comps, by grader and grade

Completed sales for graded and raw sports cards as JSON, with the grading service and grade read off each title, up to 1,095 days of history, and the settled price on accepted offers.

What a real query returns

Verified 13 October 2026. michael jordan 1986 fleer psa with graded=true over a three year window returned 161 completed sales in 1.8 seconds. The grader parsed as PSA on 159 rows, with one AGS and one BGS. Grades spread across 9, 8, 6, 7, 10 and 5, and the median across all grades was $2,099.99.

That grade spread is the thing to notice. A single median across grades 5 to 10 is close to meaningless for a card where each grade is a different market, which is why grade and grader are filters rather than just output fields.

curl -G https://api.compsapi.com/v1/sold \
  -H "Authorization: Bearer YOUR_KEY" \
  --data-urlencode "q=charizard psa 10" \
  --data-urlencode "days=1095" \
  --data-urlencode "best_offer=1"

Grade is the price, so filter on it

Add cards=1 and each row gains a card object with the service and the numeric grade pulled from the title. Then narrow with grader=PSA and grade=9 to get one real market rather than a blend of six. graded=true on its own drops raw copies, which is usually the first thing you want in this category.

For raw cards, leave grading off and use condition. Raw and graded copies of the same card are not substitutes and should not share a median.

Offers move the numbers here more than most categories

Mid and high value cards frequently sell through an accepted Best Offer, and on those eBay's public sold page reports what the seller was asking, not what the buyer paid. Across 5,859 matched sales the public figure was higher 99.0% of the time by a median of 14.9%. On a card trading around two thousand dollars that is a material error in a predictable direction, and it is invisible in the data itself. We return the settled amount, flagged per row. See Best Offer prices and the study.

Why a quarter of data is not enough

Sports card prices move with the season, with a player's form, and with set anniversaries and reprints. Ninety days, which is all eBay's public sold page exposes and therefore the ceiling for most sold data APIs, cannot separate a genuine trend from a hot month. We page up to 1,095 days, with up to 240 sales per request and paging to page 50, so a single card can be pulled across three full seasons. See the price history API.

A note on titles

Titles are written by sellers, so even after filtering to one grader and one grade a spread remains, and some of it is titles describing something other than what sold. Use the median and the spread rather than any single row, and treat a wide spread as a signal to narrow the query rather than a price.

Price from what things
actually sold for

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

Get a free key