In late August 2026, eBay put sold and completed listings behind a login. A logged-out browser opening any search with the Sold Items filter is now redirected to signin.ebay.com before a single result renders. That one change broke every "eBay sold listings API" that worked by reading the public sold page, all at once, and most of their sales pages have not caught up. What still works, entirely logged out, is the live side: for one console we pulled 243 asking prices with watcher counts, bid counts and per-listing sold totals in a single one-credit call to Scavio's /api/v1/ebay/search, and those four signals bracket a market price the way sold comps used to.
Here is the exact behavior, reproduced in a clean Chrome profile with no cookies on August 30, 2026:
GET https://www.ebay.com/sch/i.html?_nkw=nintendo+switch+oled+console&LH_Sold=1&LH_Complete=1
-> 307 https://www.ebay.com/splashui/challenge?...
-> https://signin.ebay.com/ws/eBayISAPI.dll?SignIn&ru=...%2Fsch%2Fi.html%3F...LH_Sold%3D1...&sgfl=srch

The same query without LH_Sold=1 renders 86 result tiles in the same browser session. This is not bot detection catching a scraper: it is a real browser on a residential connection, and the redirect carries sgfl=srch, a flag eBay attaches when a search feature itself requires an account. We verified from a second network through proxy infrastructure and hit the identical wall. Live search: fine. Sold search: sign in first.
Why "just use the official API" does not work either
eBay does have a real sold-data product, the Marketplace Insights API. Its own developer documentation describes it as "Retrieve the sales history of items sold on eBay" and adds, in the same sentence, "This is a Limited Release." The Buy API support matrix is blunter: "The Marketplace Insights API is restricted and not open to new users at this time." Access has been application-gated since around 2020, and developer forum threads asking how to get in are mostly answered with variations of "contact support and wait."
So the situation for anyone pricing inventory programmatically is: the public sold page now requires a login, the official API does not accept new users, and Terapeak, eBay's own research tool, lives inside Seller Hub behind a seller login with no API. Vendors claiming otherwise are serving one of three things: a login wall dressed as an empty result, cached data that ages by the day, or requests made through logged-in accounts, which is squarely against eBay's terms and gets the accounts cycled. If you are evaluating a vendor this week, ask them to run a sold query for an obscure item listed yesterday and explain where the response came from.
What live data still tells you
Losing sold comps hurts, but the live side of eBay leaks more pricing signal than most people use. One search call returns four of them.
1. The asking-price distribution, by condition. Asks are not sales, but 243 of them for the same product are not noise either. The spread below is one /api/v1/ebay/search call with per_page: 240:
The condition ladder is intact and quantified: Pre-Owned centers at $180, Open Box at $220, refurbished grades step from $183 to $239. If you price a pre-owned unit at $240 because one outlier asks $395, the distribution says nobody is with you.
2. Watchers. 23 of the 243 listings carry ten or more watchers, and their median ask is $179.55, sitting almost exactly on the Pre-Owned median rather than on the cheap tail. Demand concentrates where pricing is fair, and a listing with 30 watchers at $189.99 is telling you what the market will tolerate this week.
3. Live bids. Auctions are public price discovery that never got walled. In the same response, a Zelda-edition bundle shows "bids": 54 at a current price of $222.50. Fifty-four people bidding is harder evidence than any ask.
4. Per-listing sold totals. eBay still prints lifetime sold counts on multi-quantity fixed-price listings, and the search response carries them. The strongest row in our capture:
{
"item_id": "194991515485",
"title": "Nintendo Switch OLED 64GB WHITE Joy Cons Newest Game Console + 2 Day SHIP!",
"price": 269.99,
"condition": "Excellent - Refurbished",
"sold_count": 1233,
"seller_name": "re_tech_deals",
"seller_feedback_percent": 99.7
}That is 1,233 confirmed sales at a visible ask, from a listing that is still live. It is not a 90-day comp table, but it is transaction evidence, and it is public.
Wiring it to the buying list you already keep
Most sourcing operations we see run on a spreadsheet: product names or MPNs, target quantity, a max price, a condition floor. The manual half is re-running eBay searches every time the sheet changes. That part automates in an afternoon, because the search endpoint takes the same filters your sheet already encodes:
import requests
API = "https://api.scavio.dev/api/v1/ebay/search"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
def check_row(row):
body = {
"query": row["mpn"],
"max_price": row["max_price"],
"condition": row["condition"],
"per_page": 60,
}
r = requests.post(API, headers=HEADERS, json=body).json()
hits = [
p for p in r["data"]["products"]
if p["price"] and p["price"] <= row["max_price"]
]
return sorted(hits, key=lambda p: p["price"])Each row costs 1 credit per check. A 100-product list checked daily is about 3,000 calls a month, which is $30, and the response fields above (watchers, bids, sold_count, seller_feedback_percent) let the same pass flag which hits are real sellers rather than junk listings.
Where our own API stands, honestly
Scavio's eBay search shipped with a sold parameter, and until late August it returned real completed-sale rows. Today that view is inside eBay's login wall like everyone else's, so the parameter returns this instead:
{
"error": "eBay redirects sold/completed listing searches (LH_Sold / LH_Complete) to a login page; this data now requires authentication and cannot be scraped. Remove these filters to query active listings."
}You are not billed for it, and we would rather hand you that sentence than a silent empty array that looks like "no results." If eBay reopens the view, the parameter starts working again with no change on your side. Everything else in this post, the live search, the condition and price filters, watchers, bids, sold counts and seller data, is working today and is what every number and screenshot above was captured with.
Frequently asked questions
Is there still a way to see sold eBay listings?
Only while signed in. As of late August 2026, opening a search with the Sold Items filter (LH_Sold=1) in a logged-out browser redirects to signin.ebay.com instead of showing results. Signed-in users still get the usual 90-day sold history in the UI.
Does eBay have an official API for sold listings?
Yes, the Marketplace Insights API, and you almost certainly cannot use it. eBay classifies it as a Limited Release, its own support matrix says it is "restricted and not open to new users at this time," and access has been application-only since around 2020.
Can any third-party API still return eBay sold data?
Any vendor still advertising logged-out sold-listings scraping is now returning a login wall, cached history, or data pulled through logged-in accounts against eBay's terms. Ask which one before you pay. Scavio's eBay endpoint returns an explicit error on the sold view rather than pretending, and keeps the live-listing view fully working.
What replaces sold comps for pricing an item?
Four live signals that are still public: the asking-price distribution by condition, watcher counts, active auction bids, and the per-listing sold totals eBay still prints on multi-quantity listings. One Scavio /api/v1/ebay/search call returns all four as structured JSON for 1 credit, and the combination brackets a realistic price the way sold comps used to.
Is there a free way to check what an item sold for on eBay?
Sign in to a regular eBay account and use the Sold Items filter manually; the 90-day window is still there for humans. Sellers also get Terapeak product research inside Seller Hub at no charge, but it is a dashboard, not an API, and it requires a seller login.
Where did the eBay sold listings page go?
The URL still exists: any search with LH_Sold=1 and LH_Complete=1 appended. Nothing about the page moved. What changed is who may load it: logged out, it now bounces to sign-in with a return URL pointing back at the search you asked for.
What this leaves you owning
If you keep pricing inventory against eBay yourself, you now own a browser session pool that stays logged in against eBay's terms and gets cycled when eBay notices, or an application to a Limited Release API that is not accepting applications, plus the parser that breaks whenever the results page shifts a class name. The wall went up in days and without an announcement; whatever you build against today's markup inherits that volatility.
Scavio absorbs the part that moves. Request plumbing, the interstitial handling that decides whether you got listings or a challenge page, and normalizing eBay's markup into the stable JSON shown above run on our side, and when eBay changes something it is our on-call, not your weekend. When a view becomes impossible, as sold search just did, you get an explicit error the same day instead of quietly rotting data.
Pricing is 1 credit per search, $0.01 per credit, no monthly commitment. The 243-listing capture behind every chart and number in this post cost 3 credits. A 100-item buying list checked daily runs about $30 a month.
Start with 50 free credits, no card required — enough to pull the full ask distribution for a dozen products on your own list and check the condition ladder against what you paid last month.
Endpoint reference: eBay Search, eBay Product and eBay Seller. For the wider landscape, see our ecommerce data API comparison.