Why scrape eBay?
eBay hosts over 1.7 billion live listings across every product category imaginable. Here is why teams scrape it:
Price monitoring
Track real-time and historical prices across thousands of listings. Adjust your own pricing strategy based on market data.
Seller research
Analyze top seller profiles, feedback scores, and inventory to identify competitors and sourcing opportunities.
Product sourcing
Find underpriced items for resale by monitoring newly listed products and completed/sold auctions.
Market analysis
Track demand trends by monitoring search volume, average sold prices, and listing velocity in specific niches.
The challenge
eBay serves different HTML depending on whether it detects a bot or a real browser. Search result pages are JavaScript-rendered, making simple HTTP requests useless. Add aggressive rate limiting, CAPTCHA challenges, and dynamic class names that change between deployments, and you have a moving target.
Method 1: DIY with Puppeteer
Launch a headless browser, navigate to eBay search results, and scrape listing data from the DOM:
#E8A0BF">const puppeteer = #E8A0BF">require(#A8D4A0">'puppeteer');
(#E8A0BF">async () => {
#E8A0BF">const browser = #E8A0BF">await puppeteer.#87CEEB">launch({ headless: #A8D4A0">'new' });
#E8A0BF">const page = #E8A0BF">await browser.#87CEEB">newPage();
#E8A0BF">await page.setUserAgent(
#A8D4A0">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' +
#A8D4A0">'AppleWebKit/537.36 (KHTML, like Gecko) ' +
#A8D4A0">'Chrome/124.0.0.0 Safari/537.36'
);
#E8A0BF">await page.#87CEEB">goto(
#A8D4A0">'https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard',
{ waitUntil: #A8D4A0">'networkidle2', timeout: 30000 }
);
#E8A0BF">const items = #E8A0BF">await page.#87CEEB">$$eval(#A8D4A0">'.s-item', nodes =>
nodes.slice(0, 10).map(n => ({
title: n.#87CEEB">querySelector(#A8D4A0">'.s-item__title')?.innerText,
price: n.#87CEEB">querySelector(#A8D4A0">'.s-item__price')?.innerText,
shipping: n.#87CEEB">querySelector(#A8D4A0">'.s-item__shipping')?.innerText,
link: n.#87CEEB">querySelector(#A8D4A0">'.s-item__link')?.href,
}))
);
console.#87CEEB">log(items);
#E8A0BF">await browser.#87CEEB">close();
})();Pain points
- !eBay detects headless Chromium and returns bot-detection pages
- !Search result selectors use dynamic class names that change on redeployments
- !Pagination requires handling infinite scroll or URL-based page parameters
- !Rate limiting kicks in fast — your IP gets temporarily blocked after a few hundred requests
- !Sold/completed listing pages require authentication for full data access
- !Running Puppeteer at scale means managing a fleet of browser instances (200-400 MB RAM each)
Method 2: SnapRender API
Same data, no browser fleet. SnapRender's /render endpoint returns clean markdown, and /extract pulls structured listing data with CSS selectors.
Render as markdown
Get full search results as LLM-ready markdown — great for AI-powered market analysis pipelines.
#E8A0BF">import requests
# Render eBay search results #E8A0BF">as markdown
render = requests.#87CEEB">post(
#A8D4A0">"https://api.snaprender.dev/v1/render",
headers={#A8D4A0">"x-api-key": #A8D4A0">"sr_live_YOUR_KEY"},
json={
#A8D4A0">"url": #A8D4A0">"https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
#A8D4A0">"format": #A8D4A0">"markdown",
#A8D4A0">"use_flaresolverr": #E8A0BF">True
}
)
#E8A0BF">print(render.#87CEEB">json()[#A8D4A0">"data"][#A8D4A0">"markdown"])Extract structured data
Pull titles, prices, shipping costs, and links as clean JSON. No HTML parsing required.
#E8A0BF">import requests
# Extract structured listing data #E8A0BF">with CSS selectors
extract = requests.#87CEEB">post(
#A8D4A0">"https://api.snaprender.dev/v1/extract",
headers={#A8D4A0">"x-api-key": #A8D4A0">"sr_live_YOUR_KEY"},
json={
#A8D4A0">"url": #A8D4A0">"https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
#A8D4A0">"use_flaresolverr": #E8A0BF">True,
#A8D4A0">"selectors": {
#A8D4A0">"titles": #A8D4A0">".s-item__title",
#A8D4A0">"prices": #A8D4A0">".s-item__price",
#A8D4A0">"shipping": #A8D4A0">".s-item__shipping",
#A8D4A0">"links": #A8D4A0">".s-item__link @href"
}
}
)
#E8A0BF">print(extract.#87CEEB">json())Example response
{
#A8D4A0">"status": #A8D4A0">"success",
#A8D4A0">"data": {
#A8D4A0">"titles": [#A8D4A0">"Razer BlackWidow V4 Pro", #A8D4A0">"Keychron Q1 Max", ...],
#A8D4A0">"prices": [#A8D4A0">"$149.99", #A8D4A0">"$199.00", ...],
#A8D4A0">"shipping": [#A8D4A0">"Free shipping", #A8D4A0">"+$8.99 shipping", ...],
#A8D4A0">"links": [#A8D4A0">"https://www.ebay.com/itm/...", ...]
},
#A8D4A0">"url": #A8D4A0">"https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
#A8D4A0">"elapsed_ms": 2830
}Legal considerations
Web scraping law varies by jurisdiction. Key points for eBay:
- 1.eBay's Terms of Service prohibit automated data collection without written consent. The legal landscape is evolving — the hiQ v. LinkedIn ruling supports scraping public data, but always check current case law.
- 2.Respect robots.txt directives. eBay blocks many paths for automated crawlers.
- 3.Rate-limit your requests aggressively. Excessive traffic can constitute a denial-of-service attack.
- 4.Never collect personal seller information (email addresses, phone numbers). Stick to public listing data.
Start free — 100 requests/month
Get your API key in 30 seconds. Scrape eBay listings with five lines of code. No credit card, no browser fleet, no proxy bills.
Get Your API KeyFrequently asked questions
Scraping publicly available eBay listings is generally permissible under the hiQ v. LinkedIn precedent, but eBay's Terms of Service restrict automated access. Never scrape personal seller data, respect robots.txt, and rate-limit your requests. Consult a lawyer for your specific use case.
eBay uses a combination of rate limiting, CAPTCHA challenges, browser fingerprinting, and behavioral analysis. Requests from data-center IPs or headless browsers with default configurations are blocked quickly. SnapRender's FlareSolverr integration handles these checks automatically.
Yes. Completed listings are publicly visible on eBay. You can scrape sold prices, sale dates, and item conditions to build pricing models. Use SnapRender's /extract endpoint with selectors targeting the sold-items results page.
SnapRender starts free with 100 requests/month. Paid plans begin at $9/month for 1,500 requests. Each eBay listing page is one request — no credit multipliers or hidden fees.