Why Scrape eBay?
eBay is a goldmine of e-commerce data. With over 1.9 billion live listings across 190 markets, it's one of the largest product databases on the internet. Here's why developers and sellers are scraping it:
- Price tracking — Monitor competitor pricing and get alerts when items drop below your threshold
- Arbitrage — Find products selling cheaper on one eBay domain than another (eBay.de vs eBay.com price gaps are real)
- Competitor analysis — Track what your competitors sell, at what price, and how fast
- Market research — Understand demand, pricing trends, and seasonal patterns before launching a product
The problem? Building a reliable scraper from scratch takes time. Maintaining it takes even more. Let me show you a faster way.
The Good News: eBay Doesn't Fight Back (Much)
Unlike Amazon, which aggressively blocks datacenter IPs and serves CAPTCHAs, eBay's search pages serve clean, full HTML even from datacenter proxies. No JavaScript rendering needed. No fingerprinting. No CAPTCHA walls on search results.
This means:
- Simple HTTP requests work fine for search pages
- You don't need expensive residential proxies
- Response times are fast
- Data extraction is reliable
That said, product detail pages and high-volume requests still need some care — which is where a managed solution helps.
International Multi-Domain Scraping
eBay operates localized marketplaces with different inventories, prices, and currencies:
| Domain | Market | Currency |
|---|---|---|
| ebay.com | United States | USD |
| ebay.co.uk | United Kingdom | GBP |
| ebay.de | Germany | EUR |
| ebay.com.au | Australia | AUD |
| ebay.ca | Canada | CAD |
| ebay.fr | France | EUR |
| ebay.it | Italy | EUR |
| ebay.es | Spain | EUR |
Cross-domain scraping unlocks arbitrage opportunities. The same product can have a 20-40% price difference between markets. A Bosch drill that's €89 on eBay.de might be $129 on eBay.com — that's margin waiting to be captured.
A Ready-Made eBay Scraper on Apify
I built an eBay Scraper actor on Apify that handles all of this out of the box. Here's what it does:
Keyword search with filters:
- Search any term across any of the 8 domains
- Filter by condition (new, used, refurbished)
- Set price range limits
- Sort by price, relevance, or ending soonest
Product detail mode:
- Full item descriptions
- Seller information and feedback scores
- Shipping options and costs
- Item specifics and specifications
- Item condition details
Data fields returned:
{
"title": "Apple MacBook Pro 14" M3 Pro 2023 512GB",
"price": "$1,599.00",
"condition": "Brand New",
"shipping": "Free shipping",
"seller": "tech_deals_outlet",
"sellerFeedback": "99.2% positive",
"itemNumber": "395012345678",
"url": "https://www.ebay.com/itm/395012345678",
"imageUrl": "https://i.ebayimg.com/images/g/.../s-l1600.jpg",
"domain": "ebay.com"
}
Python Code Example
Here's how to use it with the apify-client Python package:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run_input = {
"search": "mechanical keyboard",
"domain": "ebay.com",
"condition": "new",
"maxPrice": "150",
"sortBy": "price_asc",
"maxItems": 50,
}
run = client.actor("cryptosignals/ebay-scraper").call(run_input=run_input)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for item in items:
print(f"{item['title']} — {item['price']}")
Install the client:
pip install apify-client
Multi-Domain Price Comparison
Want to compare prices across countries? Run the scraper against multiple domains:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
domains = ["ebay.com", "ebay.co.uk", "ebay.de", "ebay.com.au"]
search_term = "Sony WH-1000XM5"
all_results = {}
for domain in domains:
run = client.actor("cryptosignals/ebay-scraper").call(
run_input={
"search": search_term,
"domain": domain,
"condition": "new",
"maxItems": 10,
}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
all_results[domain] = items
if items:
prices = [item["price"] for item in items]
print(f"{domain}: {len(items)} results, lowest: {prices[0]}")
Use Case: Price Tracking Dashboard for Sellers
Here's a practical example — a scheduled price tracker that runs daily and alerts you to price changes:
import json
from datetime import datetime
from apify_client import ApifyClient
PRODUCTS_TO_TRACK = [
{"search": "iPhone 15 Pro Max 256GB", "domain": "ebay.com"},
{"search": "Samsung Galaxy S24 Ultra", "domain": "ebay.com"},
{"search": "MacBook Air M3", "domain": "ebay.co.uk"},
]
client = ApifyClient("YOUR_APIFY_TOKEN")
price_log = []
for product in PRODUCTS_TO_TRACK:
run = client.actor("cryptosignals/ebay-scraper").call(
run_input={
**product,
"condition": "new",
"sortBy": "price_asc",
"maxItems": 5,
}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
if items:
price_log.append({
"date": datetime.now().isoformat(),
"query": product["search"],
"domain": product["domain"],
"lowest_price": items[0]["price"],
"avg_top5": sum(
float(i["price"].replace("$","").replace("£","").replace("€","").replace(",",""))
for i in items
) / len(items),
})
# Save to JSON for your dashboard
with open("price_history.json", "a") as f:
for entry in price_log:
f.write(json.dumps(entry) + "
")
print(f"[{entry['domain']}] {entry['query']}: {entry['lowest_price']}")
Schedule this on Apify's built-in scheduler or with a simple cron job, and you've got a price tracking system running hands-free.
Getting Started
The eBay Scraper is available on Apify Store at $4.99/month with a 7-day free trial starting April 3, 2026.
That means you can:
- Sign up for a free Apify account
- Start the 7-day trial — no credit card needed for the trial period
- Run the scraper against all 8 eBay domains
- Export data as JSON, CSV, or push to your own API
- Decide if it's worth keeping
For $4.99/month, you skip the maintenance headache of keeping a custom scraper alive. eBay changes its HTML regularly — the actor handles that so you don't have to.
Try it out: apify.com/cryptosignals/ebay-scraper
Questions? Drop a comment below or open an issue on the actor page.
Top comments (0)