eBay Sold Listings Scraper — Completed Sales & Sold Prices avatar

eBay Sold Listings Scraper — Completed Sales & Sold Prices

Pricing

from $3.20 / 1,000 sold listings

Go to Apify Store
eBay Sold Listings Scraper — Completed Sales & Sold Prices

eBay Sold Listings Scraper — Completed Sales & Sold Prices

Scrape eBay sold listings and completed sale prices by keyword. Export sold date, condition, shipping, seller feedback across 20+ regional sites. Fast curl_cffi scraper — no browser, residential proxy ready.

Pricing

from $3.20 / 1,000 sold listings

Rating

0.0

(0)

Developer

Andrej Kiva

Andrej Kiva

Maintained by Community

Actor stats

0

Bookmarked

42

Total users

15

Monthly active users

6 days ago

Last modified

Share

Disclaimer: Unofficial integration for publicly accessible eBay completed (sold) listings. eBay and related names are trademarks of eBay Inc. Not affiliated with, sponsored by, or endorsed by eBay Inc. Provided for informational and research purposes only.

Scrape eBay sold listings and completed sale prices by keyword across 20+ regional marketplaces. Export sold price, sold date, shipping, condition, listing type, and seller feedback as clean JSON — ideal for resale arbitrage, sold comps, market pricing, and inventory valuation.

For detailed inputs, output fields, API examples, MCP prompts, pricing notes, and limitations, see the eBay Sold Listings Scraper API documentation by Crawloop.

Best for: developers and data teams who want raw sold listing rows for Google Sheets, Airtable, databases, webhooks, and custom analytics pipelines.

Crawloop eBay suite — livestream shows, live BIN/auction listings, sold comps, and pricing intelligence.

Live showsActive listingsSold listingsPricing intelligence
eBay Live Shows ScrapereBay Active Listings ScrapereBay Sold Listings Scraper ◄── you are hereeBay Sold Price Intelligence
Livestream hosts, tags, viewers, in-show lotsLive BIN/auction asking pricesCompleted sales, sold datesRecommended price, demand, CSV/report

When to use this Actor

  • eBay sold price lookup — real completed sales from the last 1–90 days
  • Scheduled new-sales watchmonitorMode on an Apify Schedule for only the sales since the last run
  • Resale & arbitrage research — sneakers, GPUs, collectibles, vintage, electronics comps
  • Competitive pricing datasets — sold prices per keyword, category, and marketplace
  • Seller intelligence — filter sellers, track feedback, focus on organic sales
  • Multi-market analysis — same keyword on ebay.com, ebay.de, or ebay.co.uk in parallel

When not to use this Actor

  • Pricing reports & recommended list price — use eBay Sold Price Intelligence
  • Sell-through / Terapeak-style analytics — public sold search does not expose unsold ended listings
  • Telegram / Slack bots — use an Apify run webhook on SUCCEEDED; this Actor does not send chat messages
  • Active / live listings — use eBay Active Listings Scraper
  • eBay Live livestream shows — use eBay Live Shows Scraper for hosts, viewers, and in-show lots
  • Official eBay API replacement — we parse public search pages

Key Features

  • Completed sales only — every row includes a sold/end date; sponsored active cards filtered out
  • Optional scheduled monitormonitorMode emits only new sales after the first seed run, plus one monitor_report row per keyword (rolling medians, sold/day, cheap-sale hint)
  • 20+ eBay sites — US, UK, DE, FR, IT, ES, CA, AU, PL, NL, SG, MY, PH, HK with correct currency parsing
  • Triple layout fallback.s-item, .s-item-card, and .s-card search layouts
  • Lightweight & fastcurl_cffi Chrome TLS impersonation, no browser automation
  • Rich sold data — price (string + numeric), shipping, total, bids count, condition ID, auction/BIN/best offer, seller type
  • Paste sold search URLsstartUrls reads keyword and filters from a browser Sold+Completed link
  • Advanced filters — date window, price range, condition, listing type, free shipping, seller blocklist
  • Deduped batch runs — optional itemId dedupe across keywords/URLs to avoid double PPE charges
  • Proxy-ready — Apify Residential Proxies recommended for US/UK; sticky session per search job
  • Sold-search fallback — when eBay gates Sold/Completed SRP behind sign-in, the Actor discovers candidate item IDs via public search engines and scrapes sold item pages (source: "pdp_fallback"). Per-keyword volume is then limited by SERP coverage (not by count alone); split into several related keywords for larger pulls.

Input Parameters

ParameterTypeDefaultDescription
keywordsArraySearch queries (required if no startUrls); up to 3 jobs run at a time
startUrlsArrayPasted eBay Sold/Completed search URLs (filters + site parsed from each URL)
daysToScrapeInteger30Completed sales lookback (1–90 days)
countInteger100Max sold listings per keyword/URL. Monitor: seed window size, then max new sales per run
dedupeItemIdsBooleantrueSkip duplicate itemId across jobs in the same run (ignored in monitorMode)
ebaySiteString"ebay.com"Regional eBay domain (for keyword jobs)
itemConditionString"any"any, new, used, refurbished
listingTypeString"any"any, auction, buy_it_now
freeShippingOnlyBooleanfalseFree shipping filter (LH_FS on eBay)
excludeSellersArray[]Seller usernames to skip
monitorModeBooleanfalseSeed on first run; later scheduled runs emit only new sales + monitor_report
monitorStoreNameString"ebay-sold-monitor-state"Named KV store for seen IDs and the rolling 90-day window
resetMonitorStateBooleanfalseClear the named store and seed again
alertBelowMedianPercentInteger15Cheap-sale hint vs rolling median; 0 disables. Not a buy signal.
categoryIdString"0"eBay category (0 = all)
minPrice / maxPriceNumberSold price range
sortOrderString"endedRecently"Sort sold results
proxyConfigurationObjectResidentialApify Proxy settings

Input Example

{
"keywords": ["nike air max", "rtx 4080"],
"daysToScrape": 14,
"count": 100,
"ebaySite": "ebay.de",
"itemCondition": "used",
"listingType": "auction",
"dedupeItemIds": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "DE"
}
}

Input from a sold search URL

{
"startUrls": [
"https://www.ebay.com/sch/i.html?_nkw=rtx+4080&LH_Sold=1&LH_Complete=1&_udlo=500"
],
"daysToScrape": 30,
"count": 50
}

Scheduled monitor (new sales only)

Save as an Actor Task, set an Apify Schedule (every 6–12 hours), and attach a run webhook on SUCCEEDED if you want Slack/email/Sheets. The first run seeds the named store and writes a monitor_report only. Later runs push new sold rows plus an updated report.

On seed, only count comps are stored. For a busy keyword, raise count so the window covers the lookback — otherwise the next run will treat leftover first-page sales as new.

{
"keywords": ["Pokemon Charizard PSA 10"],
"ebaySite": "ebay.com",
"daysToScrape": 30,
"count": 100,
"monitorMode": true,
"monitorStoreName": "ebay-sold-charizard-psa10",
"alertBelowMedianPercent": 15
}

Output Format

Each dataset row = one completed eBay sale. With monitorMode, later runs add only new sales, plus one type: "monitor_report" row per keyword.

FieldDescription
itemIdeBay listing ID
titleListing title
soldPrice / soldPriceValueFinal sold price (string + numeric)
soldCurrencyCurrency code
totalPrice / totalPriceValueSold price + shipping
endedAtSale end time (UTC ISO 8601)
condition / conditionIdLocalized label + normalized code
listingTypebuy_it_now, auction, best_offer_accepted
bidsCountAuction bid count when available
shippingPrice / shippingPriceValue / shippingTypeShipping cost and type
sellerUsername / sellerFeedbackScoreSeller profile
keywordSearch query that found this sale
sourcePresent as pdp_fallback when the row came from the sold-search fallback
urlClean item URL

Output Example

{
"itemId": "377309614758",
"title": "ASUS TUF Gaming GeForce RTX 3080 OC 10GB GDDR6 - FAULTY",
"soldPrice": "163.34",
"soldPriceValue": 163.34,
"soldCurrency": "EUR",
"endedAt": "2026-07-02T12:00:00.000Z",
"listingType": "auction",
"bidsCount": 15,
"totalPrice": "179.33",
"totalPriceValue": 179.33,
"keyword": "rtx 3080"
}

Monitor report example

Written once per keyword when monitorMode is on. windowComplete tells you whether 7/30/90-day medians cover a full period yet. Incomplete windows still show a median from the comps stored so far. alert is a hint vs that rolling median — lots, grade mismatches, and shipping can false-trigger it.

{
"type": "monitor_report",
"monitorKey": "ebay.com:pokemon-charizard-psa-10:any:any:a1b2c3d4e5",
"query": "Pokemon Charizard PSA 10",
"marketplace": "ebay.com",
"isSeedRun": false,
"newSales": 7,
"medianPrice7d": 419.0,
"medianPrice30d": 428.5,
"medianPrice90d": null,
"windowComplete": { "7d": true, "30d": true, "90d": false },
"previousMedianPrice30d": 401.2,
"medianChangePercent": 6.8,
"soldPerDay": 1.7,
"lowestNewSale": 365,
"alert": "price_below_market",
"storedSales": 86
}

Supported eBay marketplaces

ebay.com · ebay.co.uk · ebay.de · ebay.fr · ebay.it · ebay.es · ebay.ca · ebay.com.au · ebay.at · ebay.ch · ebay.ie · ebay.pl · ebay.nl · ebay.be · ebay.com.sg · ebay.com.my · ebay.ph · ebay.com.hk

Use Cases

Use CaseWhat you get
Scheduled new-sales watchOnly sales since the last run + rolling 7/30/90-day snapshot
Sold comps for resaleHistorical sold prices for flips and liquidation buys
Market pricing data30/60/90-day sold price bands per keyword
Category researchSold data by categoryId and condition
Cross-border pricingSame keyword on .com vs .de with local currency
Custom analyticsFeed raw JSON into your own pricing models
AI / MCP workflowsRun via Apify API, clients, or MCP and summarize sold comps

Ready-made task examples

Pre-configured sold-comps inputs for common niches. Open an example, review the input, and run it:

NicheExample
Resellers / general comps APIGet eBay sold comps via API
Sports cards / PSAPull sports card sold comps
Pokémon TCGExport Pokémon card sold prices
Retro games / CIBCheck video game sold listings
LEGO sets & minifiguresGet raw LEGO sold prices
Auto / OEM / MPN partsCheck OEM auto parts sold prices

Integration examples

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/ebay-sold-listings-scraper').call({
keywords: ['rtx 4080'],
daysToScrape: 30,
count: 100,
ebaySite: 'ebay.com',
proxyConfiguration: {
useApifyProxy: true,
apifyProxyGroups: ['RESIDENTIAL'],
apifyProxyCountry: 'US',
},
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));

Python

from apify_client import ApifyClient
client = ApifyClient(token)
run = client.actor("crawloop/ebay-sold-listings-scraper").call(
run_input={
"keywords": ["nike air max", "rtx 4080"],
"daysToScrape": 14,
"count": 100,
"ebaySite": "ebay.de",
"itemCondition": "used",
"dedupeItemIds": True,
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "DE",
},
}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items), items[:3])

cURL

curl "https://api.apify.com/v2/acts/crawloop~ebay-sold-listings-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keywords": ["rtx 4080"],
"daysToScrape": 30,
"count": 50,
"ebaySite": "ebay.com",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}'

MCP and AI assistants

Use this Actor from AI tools via Apify MCP. Connect your Apify account, then call crawloop/ebay-sold-listings-scraper.

Example prompts:

  • "Run eBay Sold Listings Scraper for rtx 4080 on ebay.com, last 30 days, max 100 rows, and return soldPrice, endedAt, and condition as JSON"
  • "Enable monitorMode for Pokemon Charizard PSA 10, seed the named store, then summarize the monitor_report"
  • "Scrape eBay sold listings for nike air max on ebay.de and summarize the median sold price"
  • "Chain eBay Sold Listings Scraper then eBay Sold Price Intelligence for iPhone 13 Pro and return the recommended listing price"
  • "Compare eBay Live Shows Scraper lineup lots with eBay Sold Listings Scraper comps for the same card-break keyword"

Suite next step

For recommended list price, demand level, and CSV/Markdown reports, run eBay Sold Price Intelligence on the same keyword. For live competition, use eBay Active Listings Scraper. For livestream rooms, run eBay Live Shows Scraper.

FAQ

How is this different from Sold Price Intelligence?

This Actor returns raw sold listing rows. eBay Sold Price Intelligence adds recommended price, demand scoring, confidence, and ready-made CSV/Markdown reports. monitorMode on this Actor is incremental new sales + a compact rolling snapshot — not a pricing-intelligence report.

How does monitor mode work?

The first run with monitorMode: true stores matching comps in a named Key-Value store and writes a monitor_report only (no billed sold rows). Later scheduled runs emit only new itemIds, merge them into a rolling 90-day window, and write an updated report. Keep monitorStoreName stable. A run with zero new sales still succeeds and still writes the report.

Seed stores at most count comps. If the sold search has more matching sales than count, the following run can emit those leftovers as new. Use a higher count on high-volume queries (for example rtx 4080) so the seed window is actually the lookback you want.

Will 90-day median be filled on day one?

Only if the stored window actually spans 90 days (daysToScrape: 90 on seed and enough comps). Otherwise windowComplete.90d stays false. eBay public sold search itself does not go beyond about 90 days.

Do I get Telegram or Slack alerts?

No. Attach an Apify webhook to the schedule (run SUCCEEDED) and read the dataset, including type=monitor_report. alert=price_below_market is a threshold vs the rolling median, not a guaranteed deal. Broad keywords (mixed SKUs, grades, or lots) swing the median and can false-trigger — tighten the query if the alert is noisy.

How is this different from the Active Listings Scraper?

eBay Active Listings Scraper returns live listings with current ask prices. This Actor uses eBay's Sold + Completed filter — every row is a finished transaction.

How is this different from eBay Live Shows Scraper?

eBay Live Shows Scraper scrapes livestream rooms and in-show lots. This Actor scrapes completed search sales.

Do I need proxies?

Residential proxies are recommended for US and UK. European domains often work with datacenter proxies. Defaults to geo-targeted Apify Residential Proxy per marketplace.

Can I scrape multiple keywords at once?

Yes — pass an array in keywords. Jobs share the same filters and run up to 3 at a time (further keywords queue). Duplicate itemIds across keywords are skipped by default (dedupeItemIds).

Why did I get fewer rows than count?

If Sold/Completed search is sign-in gated, the Actor switches to item-page fallback. That path cannot always fill a high count from one query — add related keywords (for example iphone 15 and iphone 15 pro) instead of raising count alone.

Can I paste an eBay search URL?

Yes — use startUrls with a Sold/Completed search link. The Actor reads the keyword, site, and filters from the URL.

How far back can I scrape?

daysToScrape from 1 to 90. Pagination stops after consecutive out-of-range items when sorted by ended recently.

Best Offer accepted prices

For Best Offer Accepted rows, eBay often shows the asking price on the search card — not the private accepted offer amount. listingType / isBestOfferAccepted still mark those sales.

ActorUse for
eBay Live Shows ScraperLivestream shows, hosts, in-show lots
eBay Active Listings ScraperLive ask prices, watchers, competition
eBay Sold Listings Scraper ◄── you are hereRaw completed sales / sold comps
eBay Sold Price IntelligenceRecommended price, demand, CSV/report