eBay Sold Comps API

Updated . Plan numbers are the ones on the developers page that day; the live plans table wins if they ever disagree.

Quick answer

The HobbyCardIndex sold comps API returns a card's real sold sales, matched to the exact card and grade, each with the price, date, grade, listing title, how it sold (auction, Buy It Now or Best Offer), bids and the listing link. eBay is by far the biggest share, with Fanatics Collect, Goldin, Heritage and TCGplayer alongside, and every commercial plan includes it from $99 a month.

How the sales endpoint works

Everything lives under https://hobbycardindex.com/api/v1/ and takes your key in an X-API-Key header (an Authorization: Bearer header works too). Every successful response is wrapped as {"success": true, "data": {...}}; the examples on this page show what sits inside data. Prices are US dollars with two decimals.

Find the card first with GET /prices/search or POST /scan, then call GET /prices/{cardId}/sales with an optional days window from 1 to 365 (90 by default). Each call returns the newest 100 sales in each grade for that card within the window, plus a summary of count, average, low and high across them, and counts as one sold-sale lookup and one request. Sales are per card and per call, never a bulk pull; more sales per call is available on a written agreement.

Try it: a card's recent sales

curl 'https://hobbycardindex.com/api/v1/prices/12345/sales?days=30' \
  -H 'X-API-Key: hci_live_...'
{
  "card": {
    "id": 12345,
    "name": "Mike Trout #US175",
    "playerName": "Mike Trout"
  },
  "periodDays": 30,
  "summary": {
    "count": 14,
    "average": 2350.75,
    "low": 1900,
    "high": 2800
  },
  "sales": [
    {
      "soldAt": "2026-10-28T17:04:00Z",
      "price": 2500,
      "grade": "PSA 10",
      "gradingCompany": "PSA",
      "title": "2011 Topps Update Mike Trout RC #US175 PSA 10",
      "auction": true,
      "saleType": "auction",
      "askingPrice": null,
      "bids": 23,
      "source": "ebay",
      "url": "https://www.ebay.com/itm/...",
      "imageUrl": "https://..."
    },
    {
      "soldAt": "2026-10-21T02:41:00Z",
      "price": 2150,
      "grade": "PSA 10",
      "gradingCompany": "PSA",
      "title": "2011 Topps Update Mike Trout RC #US175 PSA 10 Gem Mint",
      "auction": false,
      "saleType": "best_offer",
      "askingPrice": 2399.99,
      "bids": null,
      "source": "ebay",
      "url": "https://www.ebay.com/itm/...",
      "imageUrl": "https://..."
    },
    {
      "soldAt": "2026-10-19T20:15:00Z",
      "price": 2325,
      "grade": "PSA 10",
      "gradingCompany": "PSA",
      "title": "2011 Topps Update Mike Trout #US175 PSA 10",
      "auction": true,
      "saleType": "auction",
      "askingPrice": null,
      "bids": 31,
      "source": "goldin",
      "url": "https://goldin.co/item/...",
      "imageUrl": null
    }
  ]
}

Example values, not live sales. eBay links carry our affiliate tag; the imageUrl is a link to the listing's own photo, not a copy of it.

What each sale carries

FieldWhat it is
soldAt, priceWhen it sold (UTC) and what was paid, in US dollars.
grade, gradingCompany"PSA 10", "BGS 9.5", "Raw" and so on, and the grader. Sales are matched to the exact card and grade, so a raw sale never lands in a PSA 10 average.
saleTypeauction, buy_it_now or best_offer; null when the marketplace didn't report how it sold.
askingPriceOn Best Offer sales, the listing's asking price; price is the accepted offer. Null otherwise.
bidsThe bid count on an auction, when reported.
sourceWhere it sold: ebay, fanatics-collect, goldin, heritage or tcgplayer.
title, url, imageUrlThe listing title, the listing's own page and its photo, both as links. Seller names aren't included, by design.

Sale lookups by plan

Lite includes 5,000 sold-sale lookups a month, Growth Lite 25,000, Growth 100,000 and Platform 500,000; the free setup month has 500 to test with. Sale lookups are a hard stop: when the month's number is used up they end until the 1st, with no overage, and each one ticks the plan's request count as well. For a card page, one lookup per card view with a cache is the usual pattern; if you're pricing an inventory, one lookup per card per refresh.

What this is and isn't

It's a card sales history API: the sales behind one catalog card, by grade, licensed for you to show your users. It isn't a keyword search over every eBay listing, and it isn't an official eBay API; we get the sales through a data partner, not direct agreements with the marketplaces, and that agreement is what lets us license the records to you. If you came here from a 130point search, that page spells out the difference. To see the same sales in the app, open any card on the sports card database hub, and when reading comps is unfamiliar, how to value a card is the short version.

What you get

Plans and prices

Commercial plans in US dollars, as listed on the developers page on November 1, 2026
PlanPriceRequests a monthPhoto scansSold-sale lookupsCert lookupsLookups a secondPast the requests and scans (up to 3x)
Lite$99 a month25,00025,0005,00015010$1 per 250 more
Growth Lite$249 a month125,000125,00025,00075015$1 per 500 more
Growth$499 a month500,000500,000100,0003,00020$1 per 1,000 more
Platformfrom $1,500 a month2,000,0001,500,000500,00050,000, plus 50,000 pop reports50Set up with Sean, invoiced; bulk price files included

Price history comes with every size. Sold-sale, cert and pop lookups stop at the plan's number and never run over. Two add-ons: pop reports plus cert lookups for $100 a month, which brings 32,000 of each to Lite, Growth Lite or Growth, and the daily price files for $450 a month on Growth Lite or Growth (included in Platform, not offered on Lite). Lite, Growth Lite and Growth are month to month by card, cancelled any time in Settings, API Access, and run to the end of the paid month.

The free setup month is 30 days on real data with no card: 1,000 requests and 1,000 photo scans a day, 500 sold-sale lookups and 100 cert lookups for the month. You apply in Settings, API Access once you're signed in, and Sean reviews each one. When the 30 days end, the first month of the plan you applied with is invoiced, and paying it keeps the key going. Full plan details are on the developers page.

Apply for a free setup month

Credit and data use

A commercial plan licenses the data for a product your users see. You can store the prices and price history you pull while the plan is active and use them on card pages, in charts, collection values and your own estimates. Sold-sale records can be shown to your users and kept in your product, but not turned into a standalone sales database, copied by the category or offered as a download. Card recognition stays with the scan endpoint: show our identifications, don't use them to build a recognizer of your own.

The terms ask for one link back to us somewhere on your site, such as "Prices and API supplied by Hobby Card Index". It does not need to be beside the prices or on your main page. When a plan ends, stored copies go within 30 days. The full wording is in the Terms of Service, section 8, and the shorter version is under Data use on the developers page.

Common questions

Is there an API for eBay sold card prices?

Yes. GET /api/v1/prices/{cardId}/sales on the HobbyCardIndex API returns a card's real sold sales, each with the price, date, grade, grading company, listing title, sale type, bids, where it sold and a link to the listing. eBay is by far the biggest share, alongside Fanatics Collect, Goldin, Heritage and TCGplayer.

Does it include Best Offer accepted prices?

Yes. A sale with saleType best_offer carries askingPrice, the listing's asking price, and price, the accepted offer, so you can show both. Auctions carry the bid count in bids, and Buy It Now sales come through as buy_it_now. saleType is null when the marketplace didn't report how the item sold.

How many sales do I get per call?

Each call returns the newest 100 sales in each grade for the card within your window, which is days from 1 to 365 and 90 by default, with a summary of count, average, low and high. One call is one sold-sale lookup and one request. More sales per call is available on a written agreement.

How many sold-sale lookups does each plan include?

Lite includes 5,000 sold-sale lookups a month, Growth Lite 25,000, Growth 100,000 and Platform 500,000; the free setup month has 500 to test with. Sale lookups are a hard stop at the plan's number, they never run over, and each call also counts as one request against the plan's monthly requests.

Can I store the sold sales in my own database?

You can show them to your users and keep them in your product while your plan is active. What the terms rule out is building a standalone sales database, copying all our sales or a whole category, offering them as a download or passing them to anyone else. When the plan ends, stored copies go within 30 days.

Where do the sold sales come from?

Through a data partner, not direct agreements with the marketplaces, and that agreement is what lets us license the records to you to display in your app. Each record names the marketplace it sold on: ebay, fanatics-collect, goldin, heritage or tcgplayer. Seller names aren't included, by design; the listing link and a link to its photo are.