If you built anything on eBay sold prices before 2025, you probably had a findCompletedItems call somewhere. It stopped working, and the obvious replacements do not return sold data. This post covers what still works in 2026, how to call it from Python, and how much the results differ in quality between providers, measured on the same searches.
Short version: eBay has no open sold listings API anymore. findCompletedItems was retired on February 5, 2025, the Browse API only returns active listings, and Marketplace Insights is limited to approved partners. Third-party eBay sold listings APIs fill the gap, and they are not equally accurate: in a blind 40-search test, wrong-item rates ranged from 5.4% to 31.6%.
What happened to eBay's sold data APIs
| eBay API | Sold listings? | Status in 2026 |
|---|---|---|
Finding API findCompletedItems
|
Yes, before 2025 | Decommissioned February 5, 2025 |
Browse API item_summary/search
|
No, active listings only | Available |
| Marketplace Insights API | Yes, about 90 days | Limited release, approved partners only |
| Terapeak / Product Research | Yes, up to 3 years | Seller Hub tool, no public API |
So if you searched for an "eBay completed items API" or a "findCompletedItems replacement" and ended up on the Browse API docs: it will not give you sold prices. There is no sold filter.
Your options for eBay sold listings data
- Marketplace Insights. The official route, if eBay approves you. Most new developers are not approved, and it covers about 90 days.
- Scrape eBay's sold search yourself. Possible, but you own the parsing, the breakage when eBay changes its markup, and the cleanup of wrong items. Scrapers that read the sold page also show the asking price on Best Offer sales, not what the buyer paid.
- A third-party eBay sold listings API. One HTTP call, JSON back. This is what most people use now. The rest of this post is about picking one and calling it.
Get eBay sold listings in Python
Here is a working example with CompSniper. The free plan gives you 100 requests a month. Create a key and set it as COMPSNIPER_API_KEY.
import os
import requests
API = "https://api.compsniper.com/v1/scrape"
headers = {"Authorization": f"Bearer {os.environ['COMPSNIPER_API_KEY']}"}
response = requests.get(
API,
headers=headers,
params={"keyword": "nintendo switch oled", "count": 240, "ebaySite": "ebay.com"},
timeout=75,
)
response.raise_for_status()
data = response.json()
summary = data["summary"]
print(f"{summary['count']} sales, median ${summary['median']}, middle range ${summary['p25']} to ${summary['p75']}")
for item in data["items"][:5]:
print(item["endedAt"], item["soldPrice"], item["soldCurrency"], item["title"])
Each sold item comes back with the sold price and currency, the date it ended, condition, shipping, seller, the listing URL and image. The summary block gives you the median, the 25th and 75th percentile, min, max and average shipping, computed after wrong items are removed, so you do not need to write the statistics yourself.
The same call works in Node.js:
const res = await fetch(
"https://api.compsniper.com/v1/scrape?keyword=nintendo+switch+oled&count=240",
{ headers: { Authorization: `Bearer ${process.env.COMPSNIPER_API_KEY}` } },
);
if (!res.ok) throw new Error(await res.text());
const data = await res.json();
console.log(data.summary.median, data.items.length);
Other eBay sites work the same way: pass ebaySite as ebay.co.uk, ebay.de, ebay.fr, ebay.it, ebay.es, ebay.ca or ebay.com.au, and prices come back in that site's currency.
Going past 90 days: eBay sold price history
eBay's sold search only reaches back about 90 days. For slow-moving items, seasonal trends or "what did this sell for last year", use the history endpoint, which goes back up to 3 years:
response = requests.get(
"https://api.compsniper.com/v1/research/sold",
headers=headers,
params={
"keyword": "nintendo switch oled",
"startDate": "2023-10-21",
"endDate": "2026-10-21",
"sort": "lastSoldDescending",
"limit": 50,
},
timeout=60,
)
response.raise_for_status()
for row in response.json()["results"]:
print(row["lastSoldDate"], row["soldUnits"], row["averageSoldPrice"]["amount"], row["title"])
It is included on every plan, free too. Docs: 3-year eBay sold history API.
The part most comparisons skip: accuracy
Every sold listings API returns rows. The question is how many of those rows are the item you searched for. eBay's keyword search drags in other models, other grades and sets, cases, chargers, parts-only units and look-alikes, and each one pulls your median away from the real price.
We ran the same 40 searches (trading cards, electronics, fashion and collectibles), each with a written definition of the correct item, through five sold listings APIs, then labeled all 7,285 unique rows right or wrong without knowing which API returned them:
| API | Wrong items returned |
|---|---|
| CompSniper | 5.4% |
| Trawl | 25.7% |
| SoldComps | 26.0% |
| Soldgraph | 27.6% |
| CompsAPI | 31.6% |
Full method and data: Sold listings API accuracy benchmark 2026.
Whatever you pick, test it yourself the same way. Take 20 searches from your real use case, write down what a correct match is before you look, and count wrong rows per API. A cheap API that returns one wrong item in four costs you more in bad prices than it saves.
Best Offer: the price eBay does not show
When a listing sells through an accepted offer, eBay's sold page shows the original asking price crossed out, not what the buyer paid. If you price from those rows you overstate the market, most of all on items where many sales close on offers.
CompSniper returns the accepted Best Offer price where it is available, at no extra cost. Docs: accepted Best Offer prices API.
Quick checklist for choosing an eBay sold data API
- Accuracy: what share of returned rows are the wrong item? Ask for numbers or measure it.
- Best Offer: does it return the accepted price or the crossed-out asking price?
- History: do you need more than eBay's 90 days?
- Coverage: which eBay sites, and do you need Poshmark, Mercari, Grailed, Depop or TCGplayer too?
- Price summary: do you get a median and range back, or do you compute them?
- Failures: are failed requests charged?
FAQ
Does eBay still have a sold listings API?
Not one you can sign up for. Marketplace Insights is a limited release for approved partners. findCompletedItems was decommissioned on February 5, 2025.
What replaced findCompletedItems?
For most developers, a third-party eBay sold listings API that returns sold prices, dates and listing details as JSON.
Can the eBay Browse API return sold items?
No. It searches active listings only.
How far back does eBay sold data go?
eBay's sold search shows about 90 days. History endpoints such as CompSniper's /v1/research/sold reach back up to 3 years.
Is there a free eBay sold listings API?
Yes. CompSniper's free plan includes 100 requests a month, and 3-year history is included on it.
If you are migrating off findCompletedItems, the CompSniper quickstart has cURL, Python and Node examples, and the free key takes about a minute. Questions about a specific use case? Drop them in the comments.
Top comments (0)