eBay Sold Items & Auction Scraper — Prices, Bids, Sellers
Under maintenancePricing
from $1.50 / 1,000 results
eBay Sold Items & Auction Scraper — Prices, Bids, Sellers
Under maintenanceExtract eBay SOLD/completed listings the official Browse API does not expose: real sold price, sold date, bid count, listing format and seller reputation. Built for resellers and arbitrage. Multi-marketplace (.com/.fr/.de/.co.uk/.it/.es).
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Adrien
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
eBay Sold Items & Auction Scraper — Real Sold Prices, Bids, Sold Date, Seller Rep
Get the data eBay's official API won't give you: real sold/completed prices, sold dates, bid counts, listing format, and seller reputation — the exact signals resellers and arbitrage sellers need. Multi-marketplace (US, UK, FR, DE, IT, ES), fast, and resilient to eBay's anti-bot throttling.
The official eBay Browse API only returns active listings. It does not expose what an item actually sold for. This scraper does — that is the whole point.
Why this actor
- 💰 Real sold prices — what items actually sold for, not asking prices.
- 📅 Sold date — when each sale closed (eBay shows ~last 90 days of sold history).
- 🔨 Bid counts — auction demand signal, unavailable from the official API.
- ⭐ Seller reputation — username, positive-feedback %, and rating count, so you can weight a sale by who made it.
- 🏷️ Listing format — auction / Buy It Now / Best Offer / auction+BIN.
- 🌍 Multi-marketplace —
.com,.co.uk,.fr,.de,.it,.eswith correct currency and date parsing per site (price arbitrage across regions). - 🧱 Built for the current eBay markup — many older eBay sold scrapers broke when eBay migrated from
li.s-itemto.su-card-container. This one targets the new markup and warns loudly if eBay changes it again. - 🤖 Agent-friendly — flat, structured JSON output with a clean schema, callable by AI agents.
Use cases
- Resale & arbitrage — find the true market clearing price before you buy to resell.
- Sourcing decisions — combine sold price × bids × sell-through to spot demand.
- Repricing — keep your Buy It Now prices aligned with what's actually selling.
- Market research — track price trends for a product or category over the sold window.
- Cross-border arbitrage — compare the same item's sold price on
.comvs.fr/.de.
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries (required) | string[] | — | Keywords to search, one scrape per query. |
marketplace | enum | www.ebay.com | eBay site: .com / .co.uk / .fr / .de / .it / .es. |
proxyCountryCode | string | derived | Residential proxy country (e.g. US, FR). Defaults from the marketplace. |
maxItemsPerQuery | int | 500 | Hard cap on unique items per query (cost guardrail). |
maxPagesPerQuery | int | 10 | Max result pages to paginate per query. |
itemsPerPage | enum | 240 | Results per page (60/120/240). |
format | enum | all | all / auction / buy_it_now. |
priceMin / priceMax | number | — | Price range filter. |
categoryId | string | — | Restrict to an eBay category id. |
sortOrder | string | — | eBay sort code (_sop), e.g. 12 = newly listed. |
fetchItemDetails | bool | false | Also open each item page for specifics/location/qty (slower, costs more). |
maxConcurrency | int | 5 | Simultaneous fetches (each on a fresh residential IP). |
maxRetriesPerPage | int | 8 | Fresh IPs to try before giving up on a page. eBay throttles per IP, so a blocked page usually succeeds on a later IP. Higher = fewer lost pages, more IPs used. |
proxyConfiguration | object | RESIDENTIAL | Residential proxy is required (see below). |
Example input
{"searchQueries": ["nintendo switch oled", "pokemon booster box"],"marketplace": "www.ebay.com","maxItemsPerQuery": 500,"maxPagesPerQuery": 10,"itemsPerPage": 240,"format": "all","proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output
One record per sold listing. Example:
{"item_id": "327182193885","title": "Nintendo Switch OLED","sold_price": 149.27,"currency": "USD","price_is_masked": false,"sold_date": "2026-06-03","condition": "Pre-Owned","listing_format": "auction","bids": 19,"shipping": "+$82.00 delivery Jun 17 - Jun 22","seller_name": "salesmanmike11","seller_feedback_pct": 100.0,"seller_feedback_count": 334,"item_url": "https://www.ebay.com/itm/327182193885","image_url": "https://i.ebayimg.com/images/g/51oAAeSw7IlqF7u5/s-l500.webp","marketplace": "www.ebay.com","query": "nintendo switch oled","scraped_at": "2026-06-04T12:00:00+00:00"}
Field reference
| Field | Type | Notes |
|---|---|---|
item_id | string | eBay item id (used for deduplication). |
title | string | Listing title. |
sold_price | number | null | Final sale price. null when masked (see below). |
currency | string | USD / GBP / EUR … |
price_is_masked | bool | true when eBay hid the real price (accepted Best Offer); sold_price is then null — we never fabricate a price. |
sold_date | string (ISO) | YYYY-MM-DD. |
condition | string | null | Brand New / Pre-Owned / Open Box / Parts Only … |
listing_format | string | auction / buy_it_now / best_offer / auction_bin / unknown. |
bids | int | null | Auction bid count; null on pure Buy It Now. |
shipping | string | null | Shipping/delivery text. |
seller_name | string | null | Seller username. |
seller_feedback_pct | number | null | e.g. 99.7. |
seller_feedback_count | int | null | Rating count (K/M expanded, e.g. 12.1K → 12100). |
item_url | string | Canonical item URL, tracking params stripped. |
image_url | string | null | Thumbnail. |
marketplace, query, scraped_at | — | Provenance. |
When fetchItemDetails is enabled, items also include item_specifics (brand/model/…), seller_location, quantity_sold, and returns.
Proxy & reliability (please read)
eBay throttles aggressively by IP: a single IP typically serves only ~1 useful sold-search request before eBay returns blocks that don't clear with waiting. This actor requires Apify Residential proxy with per-request rotation — it uses a fresh IP for every request and retries blocked pages on new IPs. Datacenter or single-IP proxies will fail.
The actor prints cost telemetry at the end of every run (IPs consumed, IP/page ratio, MB transferred, items, estimated $/1000) so you can see exactly what a run costs.
Pricing model
This actor is intended to run pay-per-result: you pay per sold item returned. Residential proxy is the main underlying cost; the per-run telemetry makes that cost transparent.
Running locally (for developers)
# from the actor rootpip install -r requirements.txtpip install apify-cli # or: npm i -g apify-cliapify run # uses .actor/input_schema.json prefill as input
Local runs that hit Apify Proxy need an APIFY_TOKEN in your environment (run apify login once). Without residential proxy, expect eBay to block after the first request — that is eBay's throttle, not a bug.
The repo also ships offline tests that validate parsing/orchestration against a captured eBay sample without any network or proxy:
python -m tests_local.test_units # locale, URL building, block classificationpython -m tests_local.validate_parser # parser vs. real captured HTML (field coverage)python -m tests_local.test_main_integration # full pagination/dedup/telemetry flow (mocked Actor)
Notes on data & compliance
This actor collects publicly visible eBay search-results data. It is not affiliated with, endorsed by, or operated by eBay Inc. "eBay" is a trademark of its respective owner. You are responsible for using the output in accordance with eBay's terms and applicable law in your jurisdiction. Use it for legitimate market research, pricing, and resale-sourcing purposes.
Keywords
eBay sold items scraper, eBay sold prices API, eBay completed listings, eBay sold listings data, eBay auction bids scraper, eBay seller feedback scraper, eBay price history, eBay reseller tool, eBay arbitrage, eBay market research, sold comps, eBay product research.