# eBay Sold Listings Scraper - Sold Prices & Sales Comps (`convertfleetdotonline/ebay-sold-listings-search`) Actor

Search eBay sold & completed listings and extract real, confirmed sale prices instead of asking prices. Works on 8 eBay marketplaces, supports sold-date range, condition, price and buying-format filters. Export title, sold price, sold date, seller, shipping and more as JSON/CSV/Excel.

- **URL**: https://apify.com/convertfleetdotonline/ebay-sold-listings-search.md
- **Developed by:** [Hasnain Nisar](https://apify.com/convertfleetdotonline) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 0 monthly users, 45.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## eBay Sold Listings Search

Get **real, confirmed eBay sale prices** — not asking prices. This actor searches eBay's sold & completed listings by keyword, filters them by sold-date range, and returns clean, structured records you can export as JSON, CSV, or Excel.

Active listings tell you what sellers *hope* to get. Sold listings tell you what buyers *actually paid* — which is what matters for pricing comps, resale margin checks, and market research.

### What you get for every sold item

| Field | Example |
| --- | --- |
| `title` | `Apple iPhone 13 128GB Blue Unlocked` |
| `price` / `priceValue` / `currency` | `$383.99` / `383.99` / `USD` |
| `soldDate` / `soldDateText` | `2026-07-20` / `Sold Jul 20, 2026` |
| `condition` | `Open Box` |
| `subtitle` | `Open Box · Apple iPhone 13 · 128 GB · Unlocked` |
| `buyingFormat` / `bids` / `bestOffer` | `BUY_IT_NOW` / `null` / `false` |
| `shipping` / `shippingValue` / `freeShipping` | `+$44.66 delivery` / `44.66` / `false` |
| `itemLocation` | `United States` |
| `sellerName` / `sellerFeedbackPercent` / `sellerFeedbackCount` | `webtradeinllc` / `99.9` / `5400` |
| `badges` | `["eBay Refurbished"]` |
| `url` / `imageUrl` / `itemId` | canonical item link, main photo, listing ID |
| `keyword` / `marketplace` / `page` / `totalResults` | search context for every row |

Prices and sold dates are shown by eBay in each site's local format (`EUR 335,68`, `Verkauft 20. Jul 2026`, `Vendu le 20 juil. 2026`…). The actor normalizes all of them into numeric `priceValue`, ISO-4217 `currency`, and ISO `soldDate` so your spreadsheet formulas work on every marketplace.

### 8 supported marketplaces

ebay.com (US) · ebay.co.uk (UK) · ebay.de (Germany) · ebay.fr (France) · ebay.it (Italy) · ebay.es (Spain) · ebay.ca (Canada) · ebay.com.au (Australia)

### How to use it

1. Enter one or more **keywords**, exactly as you would type them into the eBay search box.
2. Pick a **marketplace** (default: ebay.com).
3. Optionally set a **sold-date range**, **condition**, **price range**, **buying format**, or an eBay **category ID**.
4. Run the actor and export the dataset in the format you need.

#### Example input

```json
{
    "keywords": ["iphone 13 128gb", "iphone 13 pro 256gb"],
    "marketplace": "ebay.com",
    "maxItemsPerKeyword": 200,
    "soldFrom": "2026-06-01",
    "soldTo": "2026-06-30",
    "condition": "used",
    "sortBy": "endedRecently"
}
```

This returns up to 200 used-condition sales per keyword that closed in June 2026, newest first.

### Date-range filtering

eBay's own search has no "sold between" filter, so the actor does it for you: it reads the sold date off every result and keeps only listings inside your `soldFrom`–`soldTo` window. Keep the default sort (**Most recently sold first**) and the actor stops paginating as soon as it reaches sales older than `soldFrom`, which keeps runs fast and cheap.

### Common use cases

- **Pricing comps** — see the actual closing prices of items like yours before you list.
- **Resale / arbitrage margin checks** — compare supplier prices against real eBay outcomes, including shipping.
- **Market research** — track how sale prices for a product move week over week, or differ between the US, UK, and EU markets.
- **Inventory valuation** — bulk-value a collection using confirmed sales rather than wishful asking prices.

### Tips

- One row of output = one sold listing; run several keywords in one run to build a comparison table in a single dataset.
- `totalResults` on each row tells you the overall size of the sold market eBay reports for that keyword.
- Auction sales include the number of `bids`; `bestOffer: true` means the listing accepted Best Offers, so the displayed price may be the pre-negotiation listing price — eBay does not disclose accepted offer amounts.
- If the log shows repeated bot-challenge messages, switch the proxy configuration to residential proxies and re-run.

### FAQ

**How far back do sold listings go?** eBay keeps roughly the last 90 days of sold listings in search. Date ranges older than that will return few or no results.

**Does it work without proxies?** The actor retries with several browser fingerprints and rotates proxy sessions automatically, which is usually enough with the default Apify proxy. Residential proxies are the fallback for stubborn blocks.

**Is scraping sold listings legal?** The actor only collects data that eBay displays publicly to any visitor. It collects no personal data beyond public seller usernames. Make sure your own use of the data complies with the laws and terms that apply to you.

# Actor input Schema

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

One search query per line, exactly as you would type it into the eBay search box (e.g. <code>iphone 13 128gb unlocked</code>). Each keyword is searched separately.

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

Which eBay site to search. Prices and sold dates are shown in that site's currency and locale; the actor normalizes them into <code>priceValue</code>, <code>currency</code>, and ISO <code>soldDate</code>.

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

Maximum number of sold listings to return for each keyword.

## `soldFrom` (type: `string`):

Only keep items sold on or after this date (YYYY-MM-DD). Leave empty for no lower bound. Tip: keep the default sort (<b>Most recently sold</b>) so the actor can stop paginating early once it reaches older sales.

## `soldTo` (type: `string`):

Only keep items sold on or before this date (YYYY-MM-DD). Leave empty for no upper bound.

## `sortBy` (type: `string`):

Order in which eBay returns sold listings. <b>Most recently sold</b> is recommended, especially with date filters.

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

Only include items in this condition.

## `buyingFormat` (type: `string`):

Only include items sold through this format.

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

Minimum sold price, in the marketplace currency (whole units, e.g. 50).

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

Maximum sold price, in the marketplace currency (whole units, e.g. 500).

## `categoryId` (type: `integer`):

Optional numeric eBay category ID to restrict the search (the <code>\_sacat</code> URL parameter, e.g. <code>9355</code> for Cell Phones & Smartphones).

## `cookies` (type: `string`):

eBay gates sold & completed listings hard against datacenter IPs — anonymous requests get a "Pardon Our Interruption" challenge or a sign-in redirect. Pasting the cookies of a signed-in eBay session removes that almost entirely.<br><br><b>How to get them:</b> sign in to eBay in your browser → open DevTools (F12) → <b>Network</b> tab → reload the page → click the first request → copy the whole <code>cookie:</code> request header and paste it here. A JSON array from a cookie-exporter extension also works.<br><br>Leave empty to try anonymously (works best with residential proxies).

## `proxyConfiguration` (type: `object`):

Proxies used for eBay requests. <b>Residential proxies are strongly recommended</b> — eBay challenges or sign-in-walls almost all datacenter traffic on sold-listing searches. If residential proxies are not on your plan, paste eBay cookies above instead. When the HTTP requests are blocked, the actor automatically retries the page in a real browser to clear the JavaScript challenge.

## Actor input object example

```json
{
  "keywords": [
    "iphone 13 128gb"
  ],
  "marketplace": "ebay.com",
  "maxItemsPerKeyword": 100,
  "sortBy": "endedRecently",
  "condition": "any",
  "buyingFormat": "any",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": [
        "iphone 13 128gb"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("convertfleetdotonline/ebay-sold-listings-search").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": ["iphone 13 128gb"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "iphone 13 128gb"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call convertfleetdotonline/ebay-sold-listings-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=convertfleetdotonline/ebay-sold-listings-search",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wckJftHERWJIhbXK4/builds/6kfCF8AuGstaGvKAZ/openapi.json
