spyderproxy
BackBack to Blog

How to Scrape eBay Without Getting Blocked (2026 Guide)

DateApr 17, 2026
By Daniel K.11 min read

Scraping eBay means programmatically extracting data from eBay's public listings — product titles, prices, shipping costs, seller ratings, sold-item history, item specifics, and images — by sending HTTP requests to eBay's web pages and parsing the returned HTML. In 2026, eBay hosts over 2 billion listings across 190 markets, making it one of the richest public-pricing datasets on the internet for resellers, brand protection teams, market researchers, and arbitrage operators.

eBay is also actively defended. The site uses device fingerprinting, behavioral analysis, and aggressive IP reputation scoring to block scrapers. Hit eBay too hard from a single IP and you'll see captchas within minutes, then hard IP bans. This guide walks through the practical pipeline that actually works in 2026: choosing the right proxy type, respecting realistic rate limits, parsing the modern eBay DOM, and handling the specific failure modes that trip up most scrapers.

Scraping publicly visible data on eBay is generally legal in most jurisdictions, based on the same case law that protects web scraping of public pages (hiQ Labs v. LinkedIn in the US being the most-cited precedent). You are accessing pages that any browser can load without authentication. What you do with the data afterward — republication, creating derivative datasets, using it in a commercial product — may carry additional legal considerations, particularly around copyright and database rights in the EU.

eBay's Terms of Service prohibit automated access to the site without permission. Violating ToS is a civil matter — the worst-case outcome is typically an account suspension or an IP-block, not a criminal penalty — but if you have an eBay seller or buyer account, scraping from that account's browser profile puts it at risk. A safer practice is to scrape unauthenticated, from IPs unrelated to your eBay accounts.

eBay also offers an official Browse API and Finding API which let you access a significant subset of listing data through authorized channels. For production workflows at scale, the API is worth evaluating — though it has its own rate limits, application-level keys, and data-shape constraints that don't match every use case.

eBay API vs Web Scraping: Which Should You Use?

Before you write a single line of scraping code, check whether eBay's official APIs solve your problem.

ApproachUse WhenLimitations
eBay Browse API You need real-time listing data for active items, search, item lookup by ID Daily call limits, OAuth required, misses some UI-exclusive fields
eBay Finding API Keyword search, category browsing, basic item details Legacy API, limited response fields, rate-limited
Web Scraping You need sold-item history at scale, full item specifics, images, parsed seller data, or any workflow where API rate limits block you Requires proxies, breaks on DOM changes, risks IP blocks

In practice, most serious operators use both — API for structured real-time data where it exists, scraping for everything else (especially sold-item history, which is where the real pricing signal lives).

What Data Can You Actually Scrape from eBay?

The most valuable public data points on eBay pages:

  • Active listing data: title, current price, bid count, time remaining, shipping cost, item condition, location, seller username, seller feedback score.
  • Sold item history: the most commercially valuable data on eBay. Use the URL parameter LH_Sold=1&LH_Complete=1 on any search to return completed sales with final prices and sale dates.
  • Item specifics: structured attribute/value pairs under the "Item specifics" section (brand, model, size, color, MPN, etc.). These populate eBay's category filters and are critical for building comparable-products datasets.
  • Product images: all gallery image URLs from each listing.
  • Seller data: feedback score, percentage positive, member since, store name, number of items for sale.
  • Category data: eBay's category tree, which changes over time and is useful for mapping your own product data to eBay categories.

For pricing intelligence specifically, sold items are the gold standard — they tell you what items actually sell for, not just what sellers are asking.

Why eBay Blocks Scrapers

eBay's anti-bot stack in 2026 combines several layers. Understanding the signals that flag you makes it obvious why naive scrapers fail immediately.

IP Reputation

eBay maintains its own IP reputation database plus feeds from third-party services like Akamai, Cloudflare, and MaxMind. Datacenter IPs from AWS, GCP, DigitalOcean, Hetzner, and other common cloud providers are flagged instantly. Even one request from a low-reputation IP is enough to trigger challenges.

Request Rate Per IP

A single IP making 10+ requests per second to eBay looks nothing like a human. eBay's gateway tracks per-IP rates over short (1-second) and longer (1-hour, 24-hour) windows. Cross either threshold and you're rate-limited for hours.

TLS and HTTP Fingerprints

eBay reads your TLS handshake (JA3, JA4 fingerprints) and HTTP/2 frame order. Python's requests library has a recognizable fingerprint that differs from every real browser. Tools like curl_cffi and tls-client spoof browser fingerprints and are part of any serious eBay scraper stack today.

Missing Browser Headers

A real browser sends 20+ headers in a specific order: User-Agent, Accept, Accept-Language, Accept-Encoding, Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site, Sec-Fetch-User, Upgrade-Insecure-Requests, Referer, and cookies. Scrapers that send three headers get flagged.

Behavioral Signals

If you load a category page and jump straight to page 50 at superhuman speed, eBay notices. Real users navigate sequentially, pause on items, scroll, and click. Behavioral scoring catches bots that don't simulate these patterns.

Best Proxies for Scraping eBay

Getting the proxy layer right is the single biggest determinant of scraping success on eBay. Here's what works.

Rotating Residential Proxies (Recommended)

Residential proxies route your traffic through real home internet connections. eBay's IP reputation systems treat them as ordinary users because they are — the IPs belong to real households on Comcast, Spectrum, BT, Deutsche Telekom, and similar ISPs. Pair rotation with per-request IP changes and eBay sees no discernible request-rate concentration.

SpyderProxy's Budget Residential plan at $1.75/GB is the lowest-cost residential option that still delivers working eBay access at scale. For higher-volume workloads or if you hit detection on Budget Residential, Premium Residential at $2.75/GB gives you a 130M+ IP pool with freshness optimized for high-detection sites.

ISP (Static Residential) Proxies for Account-Linked Work

If you are doing anything that needs to look like the same user returning over multiple days — say, monitoring a specific seller's changes over time from a consistent IP — ISP proxies ($3.90/day) give you a static residential IP that stays yours. Not strictly necessary for scraping, but useful for stateful workflows.

Datacenter Proxies (Don't)

Cheap, fast, and instantly detected by eBay. Datacenter proxies at $1.50/proxy/month are great for scraping sites that don't have aggressive defenses — eBay isn't one of them. You'll burn IPs faster than they produce useful data.

Mobile (LTE) Proxies for Hardest Targets

If you're hitting detection on residential and need the highest possible trust score, LTE proxies at $2/IP route through real 4G/5G carrier IPs. Overkill for general eBay scraping, but effective when you need to access specific country-locked sub-sites or hit anti-bot-reinforced parts of the eBay experience.

Realistic Rate Limits for eBay (2026)

There is no published eBay rate limit for scraping — the limit is enforced by detection. Based on what actually works without triggering blocks:

  • Per proxy IP: 1 request every 2-4 seconds. Faster than that and IP-level rate limiters kick in.
  • Per residential session: 20-50 sequential requests before rotating to a new IP. Long uninterrupted sessions from one IP become identifiable.
  • Concurrency: aim for 10-50 concurrent workers each using a different proxy IP, rather than 500 concurrent workers hitting the same IP.
  • Daily volume: with a properly configured rotating residential pool, 50,000-200,000 eBay pages per day is achievable from a single machine without sustained blocks.

Build in jitter: random delays of 0.5-3 seconds between requests within a session. Deterministic timing is a bot fingerprint on its own.

Minimal Python Scraper (2026-Safe Stack)

A working eBay search-page scraper using curl_cffi for TLS fingerprint spoofing, rotating residential proxies, and BeautifulSoup for parsing:

import time, random
from curl_cffi import requests
from bs4 import BeautifulSoup

PROXY = "http://username-session-{sid}:[email protected]:7777"

def fetch_search(keyword, page=1, session_id=None):
    url = f"https://www.ebay.com/sch/i.html?_nkw={keyword}&_pgn={page}&LH_Sold=1&LH_Complete=1"
    sid = session_id or random.randint(10000, 99999)
    proxy = PROXY.format(sid=sid)
    r = requests.get(
        url,
        impersonate="chrome124",
        proxies={"http": proxy, "https": proxy},
        timeout=30,
    )
    r.raise_for_status()
    return r.text

def parse_sold_items(html):
    soup = BeautifulSoup(html, "html.parser")
    items = []
    for card in soup.select("li.s-item"):
        title_el = card.select_one(".s-item__title")
        price_el = card.select_one(".s-item__price")
        sold_el  = card.select_one(".s-item__caption--signal")
        if not title_el or not price_el:
            continue
        items.append({
            "title": title_el.get_text(strip=True),
            "price": price_el.get_text(strip=True),
            "sold_date": sold_el.get_text(strip=True) if sold_el else None,
        })
    return items

if __name__ == "__main__":
    for page in range(1, 6):
        html = fetch_search("vintage polaroid camera", page=page)
        for row in parse_sold_items(html):
            print(row)
        time.sleep(random.uniform(1.5, 3.5))

Key points in the snippet above: impersonate="chrome124" sets the full TLS + HTTP/2 fingerprint of Chrome 124 so eBay doesn't flag the client at the transport layer; the proxy URL uses a session ID so each run gets a different residential IP; request spacing uses random.uniform() to avoid deterministic timing; LH_Sold=1&LH_Complete=1 pulls sold-item history which is the actionable pricing data. See our guide on rotating proxies with Python requests for deeper patterns on session management and retry logic.

Handling Blocks, Captchas, and Failures

Even with a good stack you will occasionally hit one of eBay's challenges. Handle each deterministically.

Soft Rate-Limit (HTTP 200 with a different page)

eBay sometimes returns a 200 OK but with a stripped-down "access" interstitial instead of the expected search page. Detect this by checking for a known selector in the parsed HTML and treating its absence as a failure. Retry with a new IP and a longer delay.

Captcha Page

If the response HTML contains captcha keywords or specific element IDs, your IP is burned. Mark that proxy session as bad, rotate to a new session ID, and continue. Don't try to solve the captcha — captcha-solving services cost more than rotating to a fresh IP and add latency.

HTTP 429 or 503

Hard rate limits. Sleep for 60-120 seconds with exponential backoff and rotate IP. If you hit this consistently from many IPs, you're probably exceeding per-subnet limits — reduce concurrency and spread requests across more distinct IP ranges.

Empty Result Pages

eBay occasionally A/B-tests DOM changes that break selectors. Always validate your parser against a known-good keyword (one with guaranteed sold results) on startup. When zero items come back for a query that should have hundreds, it's a DOM change, not an IP issue.

Scaling to Production Volume

Once you're reliably getting data from a single-threaded scraper, scaling to millions of pages per day comes down to five concerns.

1. Proxy Pool Sizing

At production scale you want an IP pool large enough that each IP sees few enough requests per hour to stay invisible to reputation systems. Budget Residential's 10M+ pool handles most workloads; if you saturate it, Premium Residential's 130M+ pool gives more runway.

2. Queue-Based Architecture

Decouple URL generation, fetching, and parsing via a queue (Redis streams, SQS, RabbitMQ). Workers pull from the queue, scrape through their assigned proxy session, push parsed results to storage. Failed URLs go to a retry queue with incrementing backoff.

3. Deduplication

eBay listings change often but many pages return identical content between runs. Hash each parsed response body and skip storage writes for unchanged pages to keep your dataset clean and your storage bill sane.

4. Monitoring

Track block rate (failed requests / total requests), parse rate (successfully parsed / total successes), and cost per 1,000 pages. If block rate rises above 5% something is off — either your fingerprint is stale, your proxies are burned, or eBay changed something.

5. Validation

Before storing, validate that the scraped price is numeric, the title is non-empty, and dates parse correctly. Bad rows from subtle DOM changes or challenge pages will otherwise corrupt your dataset silently.

Ethical and Technical Etiquette

Good scraping practice benefits everyone who scrapes. Keep your impact minimal.

Identify yourself in the User-Agent with a contact email if your use case allows. Legitimate operators often include Contact: [email protected] in a custom header — ethical and sometimes gets you whitelisted.

Respect the robots.txt for paths it disallows, even where you have a legal right to ignore it. eBay's robots.txt explicitly disallows paths like /itm/ and /sch/. Many scrapers proceed anyway given the public nature of the data, but understand that you're operating in a grey zone.

Don't hammer a single seller. If you're scraping seller pages, spread the load across time and IPs; don't send 1,000 requests in a minute to one small seller's listings.

Scrape once, serve many. Cache aggressively. If your downstream analytics only need hourly data, don't scrape the same listing 50 times per hour.

Frequently Asked Questions

Is it legal to scrape eBay?

Scraping publicly visible data from eBay is generally legal in most jurisdictions based on precedents like hiQ Labs v. LinkedIn in the US, which protected access to public web pages. However, eBay's Terms of Service prohibit automated access without permission, so while there's limited criminal risk, scraping can violate ToS and lead to account suspensions or IP blocks. Check your local laws and the specific terms you're operating under.

What's the best proxy for scraping eBay?

Rotating residential proxies are the best choice for scraping eBay. SpyderProxy Budget Residential at $1.75/GB provides 10M+ residential IPs and handles most eBay workloads. For higher-volume scraping or when Budget Residential shows detection, upgrade to Premium Residential at $2.75/GB with 130M+ IPs. Avoid datacenter proxies — eBay detects them almost instantly.

How fast can I scrape eBay without getting blocked?

Realistic safe limits are 1 request every 2-4 seconds per IP, with IP rotation every 20-50 requests. Daily volumes of 50,000-200,000 pages from a single machine are achievable with a properly configured rotating residential pool. Going faster triggers rate limits, captchas, and eventual IP bans.

Should I use the eBay API or scrape?

Use both. eBay's Browse API and Finding API are good for structured real-time data on active listings. Scrape when you need sold-item history (the most valuable pricing data), full item specifics, or volumes that exceed API quotas. Most serious operators combine API calls for structured data with scraping for everything else.

How do I scrape eBay sold items?

Add the URL parameters LH_Sold=1&LH_Complete=1 to any eBay search URL to return completed sales with final prices and dates. Sold items are the most valuable pricing signal on eBay because they show actual sale prices, not just asking prices. Parse the same search-results selectors as active listings with an additional check for the sold-date caption.

What tools should I use to scrape eBay?

For HTTP requests, use curl_cffi or tls-client in Python — they spoof real browser TLS fingerprints which eBay checks. For parsing, BeautifulSoup or lxml. For proxies, rotating residential from SpyderProxy. For scaling, a queue system (Redis, SQS) with distributed workers. Plain requests or urllib will be detected and blocked.

Can I scrape eBay with Puppeteer or Playwright?

Yes, but browser automation is 10-20x slower per request than HTTP scraping and uses more proxy bandwidth. Use Puppeteer or Playwright only when you need to execute JavaScript to render content that isn't in the initial HTML — which for eBay is rare. For most eBay data, HTTP scraping with TLS fingerprint spoofing is faster and cheaper. See our comparison of Puppeteer vs Playwright vs Selenium for deeper tradeoffs.

Scrape eBay at Scale — Without the Blocks

SpyderProxy rotating residential proxies start at $1.75/GB with 10M+ clean IPs, automatic rotation, and SOCKS5 support. Bypass eBay's anti-bot defenses and collect pricing data reliably.