compsapi.com / best offer gap study

eBay hides what a Best Offer actually sold for

Across 5,859 matched sales, the public sold page showed a higher price than the buyer paid 99.0% of the time, by a median of 14.9%. Here is the gap, by category, and what it does to anything priced off those comps.

What we measured

When a listing sells through an accepted Best Offer, eBay's public sold page shows the asking price, not the amount the buyer paid. The accepted figure is not on that page at all. So every tool, spreadsheet and scraper that reads the public sold page reports a number that is too high, and nothing in the data tells you by how much.

We hold both figures, so we measured the gap. Over the 90 days to 10 October 2026 we matched 5,859 completed Best Offer sales across 5,840 distinct listings, from 93 searches in 12 categories. Each sale is matched on listing id, so the asking price and the accepted price belong to the same item on the same sale. No row was thrown away.

The headline

99.0% of accepted Best Offer sales read high on the public sold page. 0.7% match within half a percent and 0.4% read low.

  • Median overstatement 14.9%. A typical Best Offer sale shows up about a seventh above what it closed at.
  • p90 40.8%. One sale in ten is overstated by more than two fifths.
  • Money weighted 14.2%, measured across every dollar that changed hands, so the median is not an artifact of cheap items.
  • Median accepted price $240, against a median asking price of $284.
Overstated by more thanShare of accepted Best Offer sales
5%89.2%
10%68.9%
25%23.4%
50%5.9%
100%0.8%

By category

Every one of the 12 categories sits above 11% on a money weighted basis. Offer heavy categories are worse, and the ones where sellers list high and expect to negotiate are worst of all.

CategorySales matchedRead highMedian gapp90Money weighted
Auto parts22896.9%12.2%51.3%23.9%
Sneakers85799.9%20.0%50.0%22.0%
Graded trading cards39099.7%15.7%40.0%17.3%
Jewellery65299.1%17.6%55.6%16.8%
Designer handbags72398.9%17.5%46.7%15.8%
Video games and consoles44699.8%14.7%36.4%15.7%
Phones and tablets30099.7%10.0%35.9%15.3%
Golf clubs59999.3%13.7%33.3%14.5%
Musical instruments36598.4%13.2%33.3%14.4%
Coins and bullion36298.1%11.1%30.0%13.2%
Luxury watches65598.0%11.2%31.2%12.1%
Cameras and lenses28297.9%11.1%25.0%11.5%

Why the public page cannot tell you

A Best Offer is a private negotiation between a buyer and a seller. eBay publishes that the item sold and what it was listed at, and keeps the accepted amount off the public record. There is no field to parse and no query that reveals it, so this is not something a better scraper fixes. The number simply is not on the page.

That is why two tools reading the same sold page produce the same wrong answer, and why the error is invisible: nothing in the response looks off. A $15,500 watch that was listed at $24,995 reads as a $24,995 sale, forever, to everyone reading the public page.

What it does to your numbers

The error is one sided. It never cancels out, because a Best Offer is almost never accepted above the asking price, so every affected comp pushes your estimate the same way.

  • Repricing. You list against comps that are a median 14.9% high, so you sit above the market and wonder why the item is not moving.
  • Buying. You pay up to a ceiling that was never real, and the margin you modelled was never there.
  • Valuation and insurance. Collection values come out high in exactly the categories people insure, with graded cards at 17.3% and jewellery at 16.8% money weighted.
  • Anything trained on the data. A model fed asking prices learns a price level that nobody ever paid.

Method, and what this does not say

Both sides of every pair come from the same sale on the same listing id. The asking side is what eBay's public sold page displayed, which is exactly what competing tools read. The accepted side is the amount the sale closed at, from our own data.

The honest limits:

  • It is 93 searches in 12 categories over 90 days, not a census of eBay. Other categories will differ.
  • It measures accepted Best Offer sales only. It says nothing about what share of all eBay sales go through an offer, which varies enormously by category.
  • Three rows out of 5,859 have an accepted price under $5 and are almost certainly an opening bid or a bad parse. Dropping every row under $10 moves the median from 14.9% to 14.8% and the money weighted gap from 14.2% to 14.0%, so nothing here rests on them. For the same reason we quote the median and the p90 rather than the worst listings.
  • 0.4% of pairs read low on the public page. We report that rather than filtering it out.
  • Where a single listing sold several units in the window, the accepted figure is the average of that listing's accepted offers. In these categories almost every listing is a single item.

Getting the accepted price

CompsAPI returns what the sale closed at, on every plan including the free one, with best_offer on each row so you can see which sales were negotiated. Pass best_offer=only to look at nothing else.

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"

Free key, no card, 100 requests a month. If you want to reproduce this study on your own category, that is enough to do it.

Price from what things
actually sold for

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

Get a free key