# eBay Sold Listings Scraper — Completed Sales & Sold Prices (`crawloop/ebay-sold-listings-scraper`) Actor

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.

- **URL**: https://apify.com/crawloop/ebay-sold-listings-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 17 total users, 10 monthly users, 87.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.50 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## eBay Sold Listings Scraper — Completed Sales & Sold Prices

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

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

> **Crawloop eBay E-commerce & Resale Suite** — live active listings, completed sold comps, and pricing intelligence.

| Active listings | Sold listings | Pricing intelligence |
| :--- | :--- | :--- |
| [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper) | **eBay Sold Listings Scraper** ◄── you are here | [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) |
| Live listings, BIN/auction, watchers, competition | Completed sales, raw sold rows, sold dates | Recommended price, demand score, CSV/report |

### When to use this Actor

- **eBay sold price lookup** — real completed sales from the last 1–90 days
- **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](https://apify.com/crawloop/ebay-sold-price-intelligence)
- **Active / live listings** — use [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper)
- **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
- **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 & fast** — `curl_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 URLs** — `startUrls` 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"`). Volume depends on SERP coverage; use broader keywords / higher `daysToScrape` for larger pulls.

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `keywords` | Array | — | Search queries; each runs in parallel (required if no `startUrls`) |
| `startUrls` | Array | — | Pasted eBay Sold/Completed search URLs (filters + site parsed from each URL) |
| `daysToScrape` | Integer | `30` | Completed sales lookback (1–90 days) |
| `count` | Integer | `100` | Max sold listings per keyword/URL |
| `dedupeItemIds` | Boolean | `true` | Skip duplicate `itemId` across jobs in the same run |
| `ebaySite` | String | `"ebay.com"` | Regional eBay domain (for keyword jobs) |
| `itemCondition` | String | `"any"` | `any`, `new`, `used`, `refurbished` |
| `listingType` | String | `"any"` | `any`, `auction`, `buy_it_now` |
| `freeShippingOnly` | Boolean | `false` | Free shipping filter (`LH_FS` on eBay) |
| `excludeSellers` | Array | `[]` | Seller usernames to skip |
| `categoryId` | String | `"0"` | eBay category (`0` = all) |
| `minPrice` / `maxPrice` | Number | — | Sold price range |
| `sortOrder` | String | `"endedRecently"` | Sort sold results |
| `proxyConfiguration` | Object | Residential | Apify Proxy settings |

#### Input Example

```json
{
    "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

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

### Output Format

Each dataset row = one **completed eBay sale**.

| Field | Description |
| :--- | :--- |
| `itemId` | eBay listing ID |
| `title` | Listing title |
| `soldPrice` / `soldPriceValue` | Final sold price (string + numeric) |
| `soldCurrency` | Currency code |
| `totalPrice` / `totalPriceValue` | Sold price + shipping |
| `endedAt` | Sale end time (UTC ISO 8601) |
| `condition` / `conditionId` | Localized label + normalized code |
| `listingType` | `buy_it_now`, `auction`, `best_offer_accepted` |
| `bidsCount` | Auction bid count when available |
| `shippingPrice` / `shippingPriceValue` / `shippingType` | Shipping cost and type |
| `sellerUsername` / `sellerFeedbackScore` | Seller profile |
| `keyword` | Search query that found this sale |
| `url` | Clean item URL |

#### Output Example

```json
{
    "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"
}
```

### 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 Case | What you get |
| :--- | :--- |
| **Sold comps for resale** | Historical sold prices for flips and liquidation buys |
| **Market pricing data** | 30/60/90-day sold price bands per keyword |
| **Category research** | Sold data by `categoryId` and condition |
| **Cross-border pricing** | Same keyword on `.com` vs `.de` with local currency |
| **Custom analytics** | Feed raw JSON into your own pricing models |
| **AI / MCP workflows** | Run via Apify API, clients, or MCP and summarize sold comps |

### Integration examples

#### Node.js

```javascript
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

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

```bash
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](https://docs.apify.com/platform/integrations/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"
- "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"

### Suite next step

For recommended list price, demand level, and CSV/Markdown reports, run [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) on the same keyword. For live competition, use [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper).

### FAQ

#### How is this different from Sold Price Intelligence?

This Actor returns **raw sold listing rows**. [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) adds recommended price, demand scoring, confidence, and ready-made CSV/Markdown reports.

#### How is this different from the Active Listings Scraper?

[eBay Active Listings Scraper](https://apify.com/crawloop/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.

#### 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`; each query runs in parallel with the same filters. Duplicate `itemId`s across keywords are skipped by default (`dedupeItemIds`).

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

### Related Actors

| Actor | Use for |
| :--- | :--- |
| [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper) | Live ask prices, watchers, competition |
| **eBay Sold Listings Scraper** ◄── you are here | Raw completed sales / sold comps |
| [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) | Recommended price, demand, CSV/report |

# Actor input Schema

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

One or more eBay search keywords for sold/completed listings. Each keyword runs as a separate parallel search with the same filters. Optional if startUrls is provided.

## `startUrls` (type: `array`):

Paste eBay Sold/Completed search page URLs. Filters (\_nkw, category, price, condition, listing type, free shipping, site) are read from each URL. Can be used alone or together with keywords.

## `dedupeItemIds` (type: `boolean`):

When true, skip the same eBay itemId if it appears under multiple keywords/URLs in this run (saves PPE charges).

## `daysToScrape` (type: `integer`):

Include completed eBay sales from the last N days (1–90). Older sold listings are filtered out.

## `count` (type: `integer`):

Maximum number of completed (sold) listings to collect for each keyword.

## `categoryId` (type: `string`):

eBay category filter (use '0' for all categories).

## `subcategoryId` (type: `string`):

Optional subcategory filter. If set, overrides the main Category field.

## `ebaySite` (type: `string`):

Regional eBay domain for sold listing search — e.g. ebay.com (US), ebay.co.uk, ebay.de, ebay.fr.

## `sortOrder` (type: `string`):

Sort order for search results.

## `minPrice` (type: `number`):

Minimum sold price filter (in site currency).

## `maxPrice` (type: `number`):

Maximum sold price filter (in site currency).

## `itemLocation` (type: `string`):

Search items based on seller's location.

## `itemCondition` (type: `string`):

Filter by item condition.

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

Filter by buy-it-now or auction format.

## `freeShippingOnly` (type: `boolean`):

Only return listings that offer free shipping.

## `excludeSellers` (type: `array`):

List of seller usernames to exclude from the results.

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

Select proxies to bypass eBay bot protection. Apify Residential Proxies recommended.

## Actor input object example

```json
{
  "keywords": [
    "rtx 4080"
  ],
  "dedupeItemIds": true,
  "daysToScrape": 30,
  "count": 100,
  "categoryId": "0",
  "subcategoryId": "",
  "ebaySite": "ebay.com",
  "sortOrder": "endedRecently",
  "itemLocation": "default",
  "itemCondition": "any",
  "listingType": "any",
  "freeShippingOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `soldListings` (type: `string`):

Dataset of completed sale items (price, condition, seller, shipping).

# 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": [
        "rtx 4080"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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": ["rtx 4080"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/ebay-sold-listings-scraper").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": [
    "rtx 4080"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call crawloop/ebay-sold-listings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3bCC4ZiBk97P55baF/builds/J5jPmzHFPIuUYVLjX/openapi.json
