# eBay Sold Items Scraper: Sold Prices, Comps & Sell-Through (`yumitori/ebay-sold-scraper`) Actor

⚡🔥 BLAZING-FAST eBay sold-price scraper — every real sold price for any keyword in seconds. See what items really sell for, not asking prices, and price every flip right. Median & avg · sneakers, cards, electronics, any category · 8 marketplaces · newest-first.

- **URL**: https://apify.com/yumitori/ebay-sold-scraper.md
- **Developed by:** [Yakugusa Yumitori](https://apify.com/yumitori) (community)
- **Categories:** E-commerce, AI, Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 1,000 sold listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**The fastest eBay sold-price scraper on the market.** Pull the **entire sold history** — eBay **sold & completed listings**, the real prices items *actually closed at*, not asking prices — for any keyword, with built-in **median / average / percentile** stats, across **8 eBay marketplaces**. No API key, no browser, no captcha. Paste keywords, get the whole market back in seconds.

![Proof: eBay Sold Items Scraper pulled 247,798 sold listings in 1 minute 3 seconds — the Apify run detail showing "Succeeded, 247,798 results" and a 1m3s runtime, with the clean sold-listings table below (photo, title, sold price, shipping, sold date, keyword, item ID, eBay link)](https://api.apify.com/v2/key-value-stores/0E5QViFPvkhwmLd5X/records/hero-v2)

> ⚡ **247,798 sold listings in 1 minute 3 seconds.** A real run — that's the whole market for one term, pulled faster and deeper than any other eBay scraper. Most stop at 12,000; this didn't slow down.

**A full-market example** (copy-paste to try it):

```json
{
  "queries": ["playstation 5"],
  "categories": ["139973", "139971", "54968"],
  "maxComps": 250000,
  "marketplace": "US",
  "days": 90
}
```

> 🚨 **🆓 Free plan: runs are capped at 500 sold listings per keyword and 3 keywords per run — plenty to try it out. Any paid Apify plan unlocks the full market (up to 250,000 per keyword) and lower per-result pricing.** 🚨

***

### Why it's the fastest — and why that matters

- 🏆 **Real SOLD prices, not asking prices.** eBay **completed listings** — what buyers *actually paid* — the only number that matters for pricing, flipping, or valuation.
- 🌊 **The whole market, not a 12k sample.** Other scrapers hit eBay's ~12,000 web cap and stop. This pulls the **entire sold history** for a term — tens of thousands of comps, up to **250,000+** across categories.
- ⚡ **Seconds, not minutes.** ~4,000 sold listings per second. A full-market pull that takes competitors ages finishes here in about a minute.
- 📊 **Stats done for you.** Every run saves a **price summary** (median, average, min/max and p25/p75 per keyword) to the run's storage — best-offer-accepted sales excluded so your comps aren't skewed. No spreadsheet math.
- 🎯 **On-topic by default.** Each keyword auto-scopes to its real eBay category, so "playstation 5" returns actual PS5 consoles — not $5 games that skew the median.
- 🕒 **Newest-sold first, any window.** Filter to the last 7 days, 30 days, 90 days… results always come freshest-first.
- 🌍 **8 marketplaces** — US · UK · DE · FR · IT · ES · CA · AU.
- 🔓 **Zero friction** — no eBay API key, no login, no browser, no captcha. Just structured data.

### Just ask — no fields to fill

Not sure which keyword, marketplace, or date range to set? **Don't.** Type your question the way you'd say it in the **"Ask in plain English"** box and the actor works out the rest — the item, the eBay site, the time window and the condition — then pulls the sold prices.

| You ask… | It runs… |
|---|---|
| *"how much do used AirPods Pro 2 sell for in the UK last 30 days"* | `airpods pro 2` · used · UK · 30 days |
| *"sealed pokemon booster box prices this year"* | `pokemon booster box` · new · 90-day+ window |
| *"compare iphone 15 pro on US vs UK"* | `iphone 15 pro` on **both** US and UK — side-by-side, each row tagged by marketplace |
| *"iphone 15 vs samsung s24 sold prices"* | both items in one run |
| *"charizard ex 201/165 psa 10"* | the card **plus** its per-grade Price Guide (see below) |

It handles **comparisons across sites**, **multiple items at once**, and **condition/timeframe** — all from one sentence. Prefer the classic way? Leave the box empty and use the keyword fields as normal.

### 🃏 Graded cards — per-grade Price Guide, automatically

Search a **graded trading card** and you get more than raw comps: the run also returns eBay's **per-grade Price Guide** — the value at each grade (PSA 10 / 9 / 8, BGS, CGC) with how many have sold — so a PSA 10 isn't blended into the same median as a raw copy. It's **auto-detected**: search a normal product (a phone, a pair of sneakers) and none of this appears — it only shows up for cards that actually have a grade guide. Examples that trigger it: `charizard ex 201/165`, `2020 pokemon pikachu vmax psa 10`, `michael jordan psa 9`.

### What you get

Every **sold listing** comes back as a clean row:

| Field | Description |
|---|---|
| `title` | Listing title |
| `price` | **Final sold price** (what it actually closed at) |
| `shipping` | Shipping shown (`Free` / `$14.95`) |
| `sold_date` | Date sold (newest first) |
| `image_url` | Item photo |
| `item_id` | eBay item / listing ID |
| `item_url` | Direct eBay link |
| `query` | The keyword that returned it |

**Want richer per-listing detail?** Turn on **Enrich with item details** (`"enrichDetails": true`) to attach **condition, item specifics (size · storage · brand · model) and seller + feedback score** to the newest listings. It runs on the same fast endpoint (no browser, no proxy) and lands in a separate **"🔎 With details"** output tab, so your main results stay clean.

![The "With details" output tab — each sold iPhone 15 Pro row now shows condition (Very Good – Refurbished, Excellent – Refurbished…), the seller and their feedback score (evalueexpo · 99.6), and a full item-specifics list per listing: Storage, Battery Capacity 3274 mAh, Display Technology OLED, Pixel Density 461 ppi, Release Date, Camera Resolution and more](https://i.imgur.com/qHBV7oO.png)

> ⏱️ **Heads-up on speed:** enrichment makes a few extra lookups per listing, so a run with this toggle **on won't be as fast** as the core sold-only pull (which stays blazing). Leave it **off** for maximum speed; turn it **on** only when you need condition, specifics and seller detail.

**Sample row:**

```json
{
  "query": "jordan 1 chicago",
  "title": "Nike Air Jordan 1 Retro High OG Chicago Lost & Found Size 10",
  "price": 194.99,
  "shipping": "$14.95",
  "sold_date": "2026-08-27",
  "item_id": "206518842971",
  "item_url": "https://www.ebay.com/itm/206518842971"
}
```

With **Enrich** on, each row also carries `condition`, `seller` + feedback score, and an `item_specifics` list (brand, model, storage, size…). Output lands in a native **sortable table** with one-click **CSV / JSON export**.

### Use cases

#### 🔔 Power a real-time deal-alert bot (Discord / Slack / Telegram)

Feed sold-comp data into a bot that doesn't just alert — it **tells members if it's a deal.** Pair every new listing with what the item *actually sells for*: the sold **median**, how many **comps** back it, and the **profit / ROI** after shipping. That's the difference between spam and a bot people pay for.

![eBay deal-alert Discord bot powered by this actor — MarketBot posts a listing at $18.18 + $3.50 shipping with a verdict line "Usually sells $214 median (30 comps) · 58% sell-through · seller 99.7% (530)" and a green "~$96 profit / 88% ROI" bar, plus a View on eBay button, in a #listing-alerts channel for a reseller community](https://i.imgur.com/1HAf78D.png)

> A "new listing" ping is noise. **"$18.18 — usually sells $214 median (30 comps) · ~$96 profit / 88% ROI"** is a reason to buy. Only real sold-price data produces that verdict — and you get all of it here: the full sold history per keyword, with the built-in **median** and the individual **comps** behind it, so your bot can compute the profit/ROI on any incoming listing.

#### 💰 Price a listing before you post it

Pull the full sold history for your exact item, read the built-in **median / p25 / p75**, and list at a price that actually moves.

#### 📈 eBay market research before you buy inventory

See how many really sold, the price trend, and how fast it's turning over — so you buy what sells, not what sits.

#### 🃏 Trading-card & collectible valuation

Sold comps for any card by set, grade or player — turn raw prices into a real, defensible valuation.

#### 🗄️ Feed repricers, dashboards & pricing models

Export clean JSON/CSV (with `item_id`, links, dates) into your own repricer, inventory system, or BI dashboard via the Apify API.

### Input

| Field | What it does |
|---|---|
| **Ask in plain English** (`ask`) | *Optional.* Type a question — *"how much do used AirPods Pro 2 sell for in the UK"* — and it fills in the keyword, marketplace, recency and condition for you. Leave empty to use the fields below. |
| **Keywords** (`queries`) | 1–50 search terms, one per line. You get every sold listing for each. |
| **Marketplace** (`marketplace`) | `US` · `GB` · `DE` · `FR` · `IT` · `ES` · `CA` · `AU`. |
| **Categories** (`categories`) | *Optional.* Leave empty to auto-scope per keyword. Pick one or more to control or broaden the scope. |
| **Custom category IDs** (`categoryIdsCustom`) | Paste any eBay category IDs from the lookup tool (below). |
| **Max sold listings** (`maxComps`) | Per keyword — up to **250,000** for the full history. |
| **Recency** (`days`) | Only items sold in the last 7 / 30 / 90 days … (default 90). Newest-first. |

```json
{
  "queries": ["jordan 1 chicago", "pokemon booster box"],
  "marketplace": "US",
  "maxComps": 5000,
  "days": 30
}
```

> 🕒 **Filter to recent sales.** The **"Only items sold in the last…"** dropdown pulls just the last **7 / 14 / 30 / 60 / 90 days** (up to 12 months) — perfect for *"what's it selling for right now?"* vs. a longer trend. Every run comes back **newest-sold first**, so the freshest comps are always on top.

### Category scoping — and a free lookup tool

By default the actor **auto-scopes each keyword to its most-relevant eBay category**, so your comps stay on-topic and your median stays accurate. To take control — or to *broaden* a search across related categories for maximum volume — add category IDs.

🔎 **Find any eBay category ID here: [ebay-categories.pages.dev](https://ebay-categories.pages.dev)** — search all **20,000+** eBay categories by product or brand (`lego`, `pokemon`, `iphone`…), **select multiple**, copy, and paste straight into **Custom category IDs**.

> *Example:* leave categories empty → "playstation 5" returns real PS5 consoles (~$145 median). Add Consoles + Video Games + Accessories → the entire 250k-listing PS5 market (median blends in cheaper games — your call).

### Integrations & automation

- **Apify API** — trigger runs and pull the dataset as JSON/CSV from anywhere.
- **Schedule** it hourly/daily to keep a rolling price history or feed alert bots.
- **Webhooks** — fire your own pipeline the moment a run finishes.

### Pricing

Pay-per-result — you only pay for the sold listings you actually get, and full-market pulls finish in about a minute. No monthly eBay-research subscription, no per-seat fees.

### FAQ

**Does this return sold prices or asking prices?**
Real **sold** prices — completed transactions with sold dates.

**Is this the same as eBay's completed / sold listings filter?**
It's the full version of it. eBay's own **completed listings** view is capped and login-gated; this pulls the *entire* sold history for a keyword — tens of thousands of completed listings with prices and dates — no account needed.

**How do I see what something sold for on eBay?**
Enter the item as a keyword and run it — you get every recent **sold listing** with the exact price it closed at, plus the median across all comps. That's the answer to *"how much did it actually sell for?"* in seconds.

**Can I get eBay price history for an item?**
Yes — set the recency window (7 / 30 / 90 days, up to 12 months) and you get a full **price history** of closing prices over that period, newest-sold first, with the median and range.

**How many sold listings can I get per keyword?**
Up to **250,000** — far past eBay's own ~12,000 web cap. For most keywords that's the *entire* sold history.

**How fast is a run?**
Very. A typical keyword returns in **2–8 seconds**; a full-market pull of **~250,000 listings finishes in about a minute** (247,798 in 1m3s in the screenshot above — roughly **4,000 sold listings per second**).

**Which eBay sites are supported?**
US, UK, Germany, France, Italy, Spain, Canada and Australia.

**Do I need an eBay API key or account?**
No. No API key, no login, no browser, no captcha — just enter keywords and run.

**Is this a cheaper alternative to eBay's paid research tools?**
Yes — you get the same sold-market research (volume, average price, trend) plus the individual sold listings behind it, pay-as-you-go, with no eBay account.

**How do I stop a broad keyword returning junk?**
It auto-scopes to the right category by default. To force a specific one, look up the category ID at [ebay-categories.pages.dev](https://ebay-categories.pages.dev) and add it.

**Does it work for trading cards, sneakers, electronics…?**
Any category. Search by product or brand; the actor scopes to the correct eBay category automatically.

**Can I get richer detail per listing?**
Yes — turn on **Enrich with item details** (`"enrichDetails": true`) to add condition, item specifics (size/storage/brand) and seller + feedback to the newest listings, shown in a separate **"🔎 With details"** tab. Same fast endpoint, no browser or proxy.

### Legal & fair use

This actor collects **publicly available** eBay listing data for price research and market analysis. Use it responsibly and in line with eBay's terms and applicable law. Not affiliated with or endorsed by eBay Inc.

# Actor input Schema

## `queries` (type: `array`):

What to look up — one search term per line. You get every sold listing for each.

## `ask` (type: `string`):

Another way in — instead of the keyword field above, just ask a question: “how much do used AirPods Pro 2 sell for in the UK last 30 days”, “sealed pokemon booster box prices this year”, “compare iphone 15 pro on US vs UK”, “charizard ex 201/165 psa 10”. It fills in the keyword, marketplace, recency and condition for you, and can compare across sites or multiple items. Leave empty to use the keyword field above.

## `marketplace` (type: `string`):

Which eBay site to pull sold listings from.

## `categories` (type: `array`):

Leave EMPTY (default) and each keyword is auto-scoped to its single most-relevant eBay category — this keeps comps accurate (a "nintendo switch" search returns real Switch consoles, not $5 games). Pick one or more categories to control the scope yourself: add several to broaden a search and pull far more volume across related categories (e.g. Video Games & Consoles + Video Games + Accessories for a Switch search). Heads-up: adding categories widens the price mix, so the median blends whatever categories you include. Don't see your category in the list? Look up ANY eBay category ID at https://ebay-categories.pages.dev and paste it into "Custom category IDs" below.

## `categoryIdsCustom` (type: `array`):

🔎 Find & copy any eBay category IDs at https://ebay-categories.pages.dev (search by product or brand, select multiple, copy), then paste them here — one per line.

## `maxComps` (type: `integer`):

How many sold listings to pull per keyword — enough to cover the entire sold history for a term. Results come newest-sold first.

## `days` (type: `string`):

Filter to items sold within this window. Results always come newest-sold first.

## `enrichDetails` (type: `boolean`):

OFF (default) = fastest, core sold fields only. ON = adds condition, item specifics (size · storage · color) and seller + feedback score to the newest listings, shown in a separate “🔎 With details” output tab. This makes a few extra lookups per run (no browser/proxy) so runs take a little longer — turn it on only when you need the detail.

## `cardPriceGuide` (type: `boolean`):

ON (default) = when a keyword is a graded trading card, the run ALSO returns eBay’s per-grade Price Guide — PSA/BGS/CGC values with sold counts — plus a Card Price Guide report in Storage. Auto-detected and self-gating: it only appears when eBay actually has a grade guide for the item, so normal runs (e.g. “jordan 4”, “dyson v11”) are never touched. Examples that trigger it: “charizard ex 201/165”, “2020 pokemon pikachu vmax psa 10”, “michael jordan psa 9”, “black lotus bgs”. Turn OFF to skip card lookups entirely.

## Actor input object example

```json
{
  "queries": [
    "jordan 1",
    "pokemon booster box"
  ],
  "marketplace": "US",
  "categories": [],
  "categoryIdsCustom": [],
  "maxComps": 1000,
  "days": "90",
  "enrichDetails": false,
  "cardPriceGuide": true
}
```

# Actor output Schema

## `data` (type: `string`):

Every sold listing — price, shipping, sold date, image, link. Turn on 'Enrich with item details' to add condition, item specifics and seller.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "jordan 1",
        "pokemon booster box"
    ],
    "categoryIdsCustom": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("yumitori/ebay-sold-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": [
        "jordan 1",
        "pokemon booster box",
    ],
    "categoryIdsCustom": [],
}

# Run the Actor and wait for it to finish
run = client.actor("yumitori/ebay-sold-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "jordan 1",
    "pokemon booster box"
  ],
  "categoryIdsCustom": []
}' |
apify call yumitori/ebay-sold-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yumitori/ebay-sold-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fmzbU3J0pSn1ejdsv/builds/rkeNgiDSr79ZjsGxX/openapi.json
