ScavioScavio
Pricing
Tools
Sign InsGet Startedg
Blog
eBay12 min readAug 30, 2026

eBay Sold Listings Now Require a Login. What Can Price Research Use Instead?

eBay now redirects logged-out sold-listing searches to sign-in. Price research still works on live data: ask spread by condition, watchers, bids, sold counts.

Scavio Team

Aug 30, 2026

Try Scavio Free
scavio
Price research / Resale
eBay

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 eBay sign-in page that a logged-out browser now lands on when requesting sold listings

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 session, and the redirect carries sgfl=srch, a flag eBay attaches when a search feature itself requires an account. We verified from a second network 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:

Range plot of 243 live asking prices for a Nintendo Switch OLED console grouped by condition, with the most-watched listings clustering at the Pre-Owned median of about 180 dollars

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:

JSON
{
  "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.

The comps you do get are grouped by a title, not a field

Even once you have sales data, the grouping is wrong, because the attribute that sets a graded card's price is not a field. We pulled 913 unique live listings through /api/v1/ebay/search across eight graded-card searches. 861 of them announce a numeric grade in the title. None of them carry that grade anywhere in structured data, and item_aspects came back empty on all 913.

Horizontal bar chart showing grade, year and card number appear only in seller-written eBay titles while price, watchers and sold counts are the only structured fields

What eBay does hand you is condition, and on graded cards it is nearly a constant: 97.8% of the graded listings come back "New (Other)", the rest splitting across "Pre-Owned", "Brand New" and null. A PSA 10 in a sealed slab and a raw card in a top-loader return the same value. A tool that groups by structured fields cannot tell them apart, and a tool that groups by title text inherits whatever the seller typed.

That shows up as spread. Same claimed grade, same search, one call each:

SearchListingsLowMedianHighSpread
psa 10 charizard119$23.00$200.00$2,403.30104x
psa 10 michael jordan116$51.00$315.00$6,300.00124x
psa 10 pikachu117$12.50$122.65$3,950.00316x
psa 10 lebron james114$4.25$176.78$1,250.00294x
bgs 9.5 pokemon card107$1.00$174.99$3,000.003,000x
cgc 10 pokemon card89$19.99$35.95$325.0016x
psa 9 rookie card110$3.25$29.72$299.9992x
sgc 10 baseball card89$0.99$34.99$1,575.001,591x

The tempting read is that the cheap tail is fraud. Mostly it is not. Here are the six cheapest listings a naive average over psa 10 charizard would swallow, against a median of $200.00 for that same set:

$23.00 New (Other) 2025 Pokemon M2 Japanese #13 Mega Charizard X Ex PSA 10 $27.74 New (Other) Mystery Pokemon Graded Card Slab - Random - PSA 10 Charizard + Booster Pack! $35.00 New (Other) PSA 10 Charizard x ex READ DISCRIPTION [arrow emoji removed] $44.00 New (Other) 2022 Pokemon GO Japanese #011 Radiant Charizard PSA 10 GEM MINT $50.00 New (Other) Mega Charizard X ex #013 M2 Inferno X 2025 JP Pokemon PSA 10 (522) $53.00 New (Other) 2021 POKEMON JAPANESE SWORD & SHIELD VMAX CLIMAX #187 FULL ART/CHARIZARD PSA 10

One is a mystery box, not a card. One tells you to read the description, and spells it "DISCRIPTION". The other four are real PSA 10 Charizards that are cheap because they are different cards, from different years and different sets. "PSA 10 Charizard" is not a card. It is 121 listings spanning nine distinct print years.

You cannot filter your way out either. Running a blocklist over all 861 graded titles for the obvious tells, read description, custom, proxy, reprint, repack, lot, mystery, digital, art card, slab only, matches 6 of them. 0.7%. Five of the six listings above survive it, including the one that is explicitly warning you, because the seller misspelled the warning. The rows that poison an average mostly are not labelled, and the one that tried could not be matched on.

The identity problem is the bigger half. Across all 913 titles, 74.0% name a year and 68.3% carry a card number or parallel, which means 26% of listings give you no year at all and roughly a third give you nothing to pin the print run on. Those rows cannot be assigned to a comp set by any parser, only guessed at.

One correction to the section above, from this capture. The four live signals hold on consumer electronics, where we measured them, but they are much thinner on collectibles: across these 913 card listings watchers was null on 82.6% and sold_count on 98.4%, because single-quantity auction and fixed-price card listings rarely carry either. Seller identity was missing on 50.9%. On cards, the ask distribution is doing nearly all the work and the other three signals are a bonus, not a floor. Check which of them your category actually populates before you design around them.

What this changes in practice is the unit you group on. Do not treat a search as a comp set. Parse year, set, card number and claimed grade out of the title, require all four to match before two listings go in the same bucket, and route the rows that fail to parse to a review queue rather than into the mean. On the eight searches above, requiring a parseable grade, year and card number keeps 458 of 913 listings. That discipline throws away 49.8% of what you paid to fetch, which is the honest yield: a comp set of 40 listings you can defend beats 119 you cannot.

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:

Python
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:

JSON
{
  "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 handling 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.

Search, social and ecommerce data as JSON

  • One API key for every platform
  • Pay per request with credits
  • Works with MCP, LangChain and n8n
Try Scavio Free

50 free credits, no credit card

On this page

  1. Why "just use the official API" does not work either
  2. What live data still tells you
  3. The comps you do get are grouped by a title, not a field
  4. Wiring it to the buying list you already keep

Related articles

View all
  • scavio
    Comparison / Ecommerce
    Costco
    6 Best Costco Scraper APIs in 2026, Compared
  • scavio
    Ecommerce / API
    Walmart
    Walmart Seller Product Research via API
ScavioScavio

One scraper API for every social, search, e-commerce and real estate platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy