# eBay Sold Listings Scraper (`datasteady/ebay-sold-listings`) Actor

Pay Per Result eBay sold & completed listings scraper real sold prices, seller feedback, condition, shipping. And the price you see is your entire bill.

- **URL**: https://apify.com/datasteady/ebay-sold-listings.md
- **Developed by:** [Sait](https://apify.com/datasteady) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 results

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

**Pay Per Result eBay sold & completed listings scraper — real sold prices, straight from eBay. And the price you see is your entire bill.** Search any keyword, filter by category, condition, price range, and date, and get every sold comp in one dataset. No API key, no login. **Platform usage included, retries and IP rotation on us, empty runs cost nothing** — and the Actor is monitored around the clock, so breakage never reaches you silently.

### What it's for

Sold listings are the ground truth for pricing. This scraper gives resellers, flippers, and market researchers the actual sold prices — not asking prices:

- 💰 **Real sold comps** — price, shipping, total, and sold date for every completed listing
- 📊 **Price research & repricing** — know what an item *actually* sells for before you buy or list
- 🔎 **Seller intelligence** — seller username, feedback score, positive %
- 📦 **Full detail** — condition, buy-it-now vs auction, bid count, best-offer-accepted, thumbnails

### Why this scraper?

- 💸 **All-inclusive pricing** — no platform usage charges, no subscription. The per-result price is the whole bill.
- ⚡ **Fast** — direct HTML, results in seconds even for large searches.
- 🔁 **Built-in IP rotation** — every retry gets a fresh US residential IP. Blocks are our cost, not yours.
- 🩺 **Monitored around the clock** — scheduled health checks catch eBay-side changes before your pipeline does.

### Output

One dataset item per sold listing:

```json
{
  "title": "Nintendo Switch Lite 32GB Handheld System - Gray",
  "soldPrice": "114.99",
  "soldCurrency": "USD",
  "shippingPrice": null,
  "totalPrice": "114.99",
  "shippingType": "free",
  "endedAt": "2026-07-23T00:00:00.000Z",
  "itemId": "158110766373",
  "url": "https://www.ebay.com/itm/158110766373",
  "keyword": "nintendo switch",
  "condition": "Pre-Owned",
  "conditionId": 3000,
  "sellerUsername": "itsabeau_81",
  "sellerFeedbackScore": 1700,
  "sellerPositivePercent": 99.6,
  "listingType": "buy_it_now",
  "buyingFormat": "buyItNow",
  "isBestOfferAccepted": false,
  "bidCount": null,
  "thumbnailUrl": "https://i.ebayimg.com/images/g/.../s-l500.jpg",
  "scrapedAt": "2026-07-23T09:27:41.831Z"
}
```

Download as JSON, CSV, Excel, XML, or JSONL — or pull it via API. **Prices are strings** (e.g. `"114.99"`), matching the format your existing pipeline expects.

### How to use it

1. Click **Try for free**.
2. Type one or more terms into **Keywords** (or a single term into **Keyword**).
3. Optionally set **Days to Scrape**, **Count**, **Category**, **Condition**, **Min/Max Price**, **eBay Site**.
4. Run — sold comps land in the dataset in seconds.

#### Track sold prices on a schedule

Put the Actor on an Apify **schedule** with your keywords and a short **Days to Scrape** (e.g. 1–3): each run appends the latest sold comps — a live price history for repricing tools, dashboards, or arbitrage alerts. You pay per result, so a small watchlist costs almost nothing.

### Input parameters

| Field | Type | Description |
|---|---|---|
| `keywords` | array | Search terms; each runs a separate sold search. |
| `keyword` / `search` | string | Single-term aliases (drop-in compatibility). |
| `ebaySite` | string | `ebay.com` · `.co.uk` · `.de` · `.fr` · `.it` · `.es` · `.ca` · `.com.au` |
| `daysToScrape` | integer | Only listings ended within the last N days. |
| `count` | integer | Max listings to return. |
| `categoryId` / `subcategoryId` | string | eBay category filter (`0` = all). |
| `sortOrder` | string | `endedRecently` · `timeNewlyListed` · `pricePlusPostageLowest/Highest` · `distanceNearest` |
| `minPrice` / `maxPrice` | number | Sold price range filter. |
| `itemLocation` | string | `default` · `domestic` · `worldwide` |
| `itemCondition` | string | `any` · `new` · `used` |
| `includeCompletedListings` | boolean | Include completed (not just sold); needed for Best-Offer detection. |

#### Supported eBay sites

`ebay.com` (US) · `ebay.co.uk` · `ebay.de` · `ebay.fr` · `ebay.it` · `ebay.es` · `ebay.ca` · `ebay.com.au`. Prices and the currency field follow the chosen site.

### Completed listings & Best Offer Accepted

eBay's sold-search page shows a **sold price** for every completed listing, but for **Best Offer** listings the price displayed is the original asking price — the accepted-offer amount isn't in the public HTML. Turning on **`includeCompletedListings`** (default: on) tells the scraper to read the full completed-listings view, where each Best-Offer item is flagged. In the output:

- `isBestOfferAccepted: true` marks listings sold via an accepted offer.
- `soldPrice` is the listed price; treat Best-Offer sales as "sold at or below this price".

Leave the flag on unless you specifically want only fixed-price and auction sales.

### Finding category IDs

Leave `categoryId` as `0` to search all categories (the usual choice). To narrow a search, open the category on eBay and copy the number from its URL — e.g. `.../b/Video-Games/1249/...` → `categoryId: "1249"`. `subcategoryId` works the same way for a sub-level within that category.

### Migrating from another eBay sold scraper?

Input keys and output fields mirror the most-used eBay sold listings actor exactly — same `keywords`, same item shape, prices as strings. **Change the actor ID, keep everything else.** Your downstream parsing keeps working, minus the extra platform-usage bill.

### FAQ

**Is scraping eBay legal?** The Actor reads the same publicly available sold-listing data eBay shows any visitor, without login. Use it in line with eBay's terms and your local regulations.

**Why are prices strings?** To match the incumbent's output format exactly, so a drop-in switch needs zero code changes.

# Actor input Schema

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

Search terms. Each runs a separate eBay sold search.

## `keyword` (type: `string`):

Single search term (alias for keywords). Accepted for drop-in compatibility.

## `search` (type: `string`):

Single search term (alias for keywords). Accepted for drop-in compatibility.

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

eBay country site to scrape.

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

Return listings that ended within the last N days.

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

Maximum number of listings to return.

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

eBay top-level category ID. '0' = all categories.

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

eBay subcategory ID (leave blank for all).

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

How to sort results.

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

Minimum sold price filter (in the site's currency).

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

Maximum sold price filter (in the site's currency).

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

Filter by item location.

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

Filter by item condition.

## `includeCompletedListings` (type: `boolean`):

Include completed (not just sold) listings. Required for Best Offer Accepted detection.

## Actor input object example

```json
{
  "ebaySite": "ebay.com",
  "daysToScrape": 30,
  "count": 100,
  "categoryId": "0",
  "subcategoryId": "",
  "sortOrder": "endedRecently",
  "itemLocation": "default",
  "itemCondition": "any",
  "includeCompletedListings": true
}
```

# Actor output Schema

## `results` (type: `string`):

Sold listings with prices, condition, seller feedback.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("datasteady/ebay-sold-listings").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("datasteady/ebay-sold-listings").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 '{}' |
apify call datasteady/ebay-sold-listings --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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