# eBay Sold Listings Scraper — Real Sold Prices & Comps (`apimy/ebay-sold-listings-scraper`) Actor

Real eBay sold prices by keyword: sold price, shipping, total, sold date, condition, auction or Buy It Now, best offer and seller rating. Up to 200 recent sales per keyword on 8 eBay sites, plus median price per keyword. No login.

- **URL**: https://apify.com/apimy/ebay-sold-listings-scraper.md
- **Developed by:** [Nikita Iakovlev](https://apify.com/apimy) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## eBay Sold Listings Scraper — Real Sold Prices & Comps

Find out what an item **really sold for on eBay**, not what sellers are asking. Type a keyword, get the most
recent completed sales with sold price, shipping, total, sold date, condition, auction or Buy It Now, best offer
and seller rating — plus the median, average, min and max sold price for every keyword. No login, no cookies,
no eBay account.

Built for resellers, flippers, pawn shops, price-guide sites, e-commerce analysts and AI agents that need
**sold comps** to price an item.

### Tested head-to-head — 8 November 2026

Same search (`iphone 13`, 20 sold listings) run through this Actor and the five most used eBay sold-listings
Actors in Apify Store:

| | This Actor | The other five |
|---|---|---|
| Rows returned out of 20 | 20 | 20–21 |
| Price per 1,000 sold listings (Free plan) | **$3.20** | $2.00–$4.76 |
| Filled fields | 97% | 56–100% |
| Median, average, min and max price per keyword | **yes, free** | in 2 of 5 |

What the others have and this Actor does not: a product photo (4 of 5) and the eBay category (2 of 5). Our data
source does not return them; if you need photos, tell us in Issues.

### What you get

One row per sold listing:

| Field | Example |
|---|---|
| `title` | Apple iPhone 13 Mini 128GB Pink Unlocked |
| `soldPrice` | 160 |
| `shippingPrice` | 10.99 |
| `totalPrice` | 170.99 |
| `currency` | USD |
| `soldDate` | 2026-11-07 |
| `condition` | Pre-Owned |
| `listingType` | `buy_it_now`, `auction` or `best_offer` |
| `bestOfferAccepted` | false |
| `sellerUsername`, `sellerFeedbackScore`, `sellerPositivePercent` | craftelite1994, 645, 99.1 |
| `url` | https://www.ebay.com/itm/147671171668 |
| `keyword`, `site` | iphone 13 128gb, ebay.com |

The **SUMMARY** record of the run (Storage → Key-value store) holds a price summary per keyword:
number of sales, median, average, minimum and maximum sold price, and how many sales your filters removed.
It is free and does not count as rows.

### How to use it

1. Put one keyword per line in **Keywords**. Be specific: `iphone 13 128gb unlocked` gives cleaner comps
   than `iphone`.
2. Pick the **eBay site**: eBay.com, .co.uk, .de, .ca, .com.au, .fr, .it or .es. Prices come in that
   site's currency.
3. Optionally narrow it down: **Min / Max sold price** to drop cases and accessories, **Condition**
   (new, used, refurbished, for parts), **Listing type** (Buy It Now, auction, best offer accepted) and
   **Days back** (up to 90).
4. Click **Start**. A keyword takes about 10 seconds.

Example input:

```json
{
  "keywords": ["nintendo switch 2", "lego 42143"],
  "site": "ebay.com",
  "condition": "used",
  "minPrice": 100
}
```

### How much it costs

You pay per sold listing returned: **$0.0032** on the Free plan, $0.0028 on Bronze, $0.0024 on Silver and
$0.002 on Gold and above. 1,000 sold listings cost $3.20 or less. Notice and error rows are free. On the Apify
Free plan a run returns up to 20 rows, because every row is bought from a paid data source; any paid plan
removes the limit.

### Good to know

- **Up to 200 sales per keyword.** You get the 200 most recent sales for each keyword. Popular items fill them
  within a day or two; to collect more, add variants of the keyword (model, storage, color, size).
- **Filters run on those 200 sales.** Condition, max price and listing type are applied after the search, so a
  narrow filter returns fewer rows. Min price is sent to eBay too.
- **Best offer sales.** When the seller accepted a best offer, eBay shows the listing price, and the accepted
  offer may be lower. Such rows have `bestOfferAccepted: true`; filter them out for strict comps.
- **Sold date is a day,** not a time — that is what eBay shows.
- **Hidden sellers.** On some sales eBay hides the seller, so those three seller fields are empty.
- A keyword with no sales comes back as a free notice row that says so.

### Use with AI agents and automations

The Actor works through the Apify API, the Apify MCP server, n8n, Make and Zapier. The output is flat JSON,
ready for spreadsheets: one call to `run-sync-get-dataset-items` returns the sold listings directly.

### FAQ

**Is this the same as eBay's "Sold items" filter?** Yes — these are completed listings that sold, with the
price, date and condition you see under eBay's Sold filter.

**Do I need an eBay account or API key?** No.

**Can I track prices over time?** Schedule the Actor daily in Apify and keep the datasets; the
`soldDate` field lets you build a price history per keyword.

**Something is wrong or missing?** Open an issue on the Actor page — we read every one and usually fix within
a day.

# Actor input Schema

## `keywords` (type: `array`):

What sold on eBay, one keyword per line, e.g. "nintendo switch 2" or "lego 42143". Each keyword returns up to 200 of its most recent sales. Be specific (model, storage, size) to get clean price comps.

## `site` (type: `string`):

Which eBay marketplace to read. Prices come in that site's currency.

## `daysBack` (type: `integer`):

How far back to look, in days (eBay keeps about 90 days of sold listings). Popular items fill 200 rows within a day or two, so this matters mostly for rare items.

## `minPrice` (type: `integer`):

Skip sales below this price, in the site's currency. Useful to drop cases, parts and accessories that share the keyword.

## `maxPrice` (type: `integer`):

Skip sales above this price, in the site's currency. Applied to the 200 recent sales, so a tight range returns fewer rows.

## `condition` (type: `string`):

Keep only sales in this condition. Applied to the 200 recent sales, so it returns fewer rows.

## `listingType` (type: `string`):

Keep only fixed-price sales, auctions, or sales where the seller accepted a best offer (the real price may be lower than shown there).

## `maxItemsPerKeyword` (type: `integer`):

How many recent sales to keep for each keyword, from 1 to 200.

## `maxItems` (type: `integer`):

Upper limit of sold-listing rows for the whole run. Protects you from an unexpectedly large bill.

## Actor input object example

```json
{
  "keywords": [
    "nintendo switch 2"
  ],
  "site": "ebay.com",
  "daysBack": 30,
  "condition": "any",
  "listingType": "any",
  "maxItemsPerKeyword": 200,
  "maxItems": 1000
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "keywords": [
        "nintendo switch 2"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("apimy/ebay-sold-listings-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 = { "keywords": ["nintendo switch 2"] }

# Run the Actor and wait for it to finish
run = client.actor("apimy/ebay-sold-listings-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 '{
  "keywords": [
    "nintendo switch 2"
  ]
}' |
apify call apimy/ebay-sold-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apimy/ebay-sold-listings-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/wxyA48d3XcO9OAK2g/builds/Ok4OwFnwh3Ooz4B79/openapi.json
