# Ebay Product Scraper (`mrdoe/ebay-product-scraper`) Actor

- **URL**: https://apify.com/mrdoe/ebay-product-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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/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

### What does eBay Product Scraper do?

**eBay Product Scraper extracts structured data from [eBay](https://www.ebay.com) search results and item detail pages** - title, price, condition, seller, shipping, item specifics, images and more - with no eBay account or API key required. Point it at a keyword or a list of item numbers and get clean JSON back.

Run it on the Apify platform to get scheduled runs, a REST API, webhooks, proxy rotation, and integrations with Google Sheets, Make, Zapier, Slack and more.

#### Two operations

| Operation | What it does | Key input |
| --- | --- | --- |
| **Product Search** | Walks an eBay search-results listing page by page and returns one row per organic result | `query` / `queries` |
| **Item Details** | Fetches full detail for specific listings | `itemId` / `itemIds` |

### Why use eBay Product Scraper?

- **Price and competitor monitoring** - track how an item or a whole category is priced across sellers over time.
- **Market research** - measure demand, typical condition mix, and sold counts for a product line.
- **Reselling and sourcing** - spot underpriced listings and auctions ending soon.
- **Catalog enrichment** - pull item specifics, images and descriptions for your own storefront.

### What makes this different?

- **One Actor, two jobs** - listing scraping and detail scraping share a single interface and output schema.
- **Handles both eBay layouts** - eBay is mid-migration between two result-grid designs; this Actor reads either.
- **Honest empty-run handling** - if eBay challenges every request, the run fails loudly instead of returning an empty dataset that looks like "no results".
- **No login, no keys** - nothing to register, no OAuth.

### Data it extracts

| Field | Description |
| --- | --- |
| `itemId` | eBay item number |
| `title` | Listing title |
| `price`, `priceMax` | Price; `priceMax` is set only for multi-variation price ranges |
| `listPrice` | Original / strikethrough price when discounted |
| `currency` | ISO currency code parsed from the price |
| `condition` | New, Brand New, Open Box, Used, etc. |
| `availability`, `soldCount`, `outOfStock` | Stock and sales signals (details) |
| `shipping` | Shipping cost text (search) |
| `seller`, `sellerName`, `sellerFeedbackPercent` | Seller identity and positive-feedback percentage |
| `rating`, `reviewCount` | Aggregated product rating where eBay shows one |
| `bids`, `isAuction` | Auction status and current bid count |
| `itemSpecifics` | Key/value map from the "About this item" panel (details) |
| `description`, `breadcrumbs`, `images` | Long description, category path, image gallery (details) |
| `itemUrl` | Canonical listing URL |

### How to use eBay Product Scraper

1. Open the Actor and pick an **Operation**: *Product Search* or *Item Details*.
2. For search, type a **Search query** (or several under *Search queries - batch*). For details, paste one or more **Item numbers or URLs**.
3. Optionally set **Sort by**, **Condition**, **Buy It Now only**, a **price range**, and **Max items**.
4. Leave **Proxy configuration** on the residential default.
5. Click **Start**. Download the dataset as JSON, CSV, Excel or HTML, or pull it from the API.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `operation` | string | `search` or `productDetails` (required) |
| `query` / `queries` | string / array | Keyword(s) for the search operation |
| `itemId` / `itemIds` | string / array | Item number(s) or URL(s) for the details operation |
| `sortBy` | string | `best-match`, `price-asc`, `price-desc`, `newly-listed`, `ending-soonest` |
| `condition` | string | `new`, `open-box`, `refurbished`, `used`, `for-parts` |
| `buyItNow` | boolean | Exclude auction-only listings |
| `minPrice` / `maxPrice` | integer | USD price range for search |
| `maxItems` | integer | Cap on total rows (search only). Default 20. First 10 rows free. |
| `proxyConfiguration` | object | Proxy settings; residential recommended |

### Output

Each dataset row is one listing. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "_operation": "productDetails",
  "itemId": "146721557193",
  "title": "Corsair K70 RGB MK.2 Mechanical Gaming Keyboard - Cherry MX Red",
  "price": 109.99,
  "priceMax": null,
  "listPrice": 159.99,
  "currency": "USD",
  "condition": "New",
  "availability": "More than 10 available",
  "soldCount": 342,
  "outOfStock": false,
  "seller": null,
  "sellerName": "corsair_official",
  "sellerFeedbackPercent": 99.5,
  "rating": 4.8,
  "reviewCount": 211,
  "bids": null,
  "isAuction": false,
  "itemSpecifics": { "Brand": "Corsair", "Switch Type": "Cherry MX Red", "Connectivity": "USB" },
  "breadcrumbs": ["Computers/Tablets & Networking", "Keyboards, Mice & Pointers", "Keyboards & Keypads"],
  "image": "https://i.ebayimg.com/images/g/xyz/s-l1600.jpg",
  "images": ["https://i.ebayimg.com/images/g/xyz/s-l1600.jpg"],
  "itemUrl": "https://www.ebay.com/itm/146721557193",
  "status": "success"
}
```

### How much does it cost to scrape eBay?

The Actor is billed per result (pay-per-event): one event when a run starts, and one per row pushed. **The first 10 rows of every run are free**, so small test runs cost nothing. A typical 200-row search run uses a few cents of compute plus the per-result fee. Detail runs cost one event per item.

### Tips

- Set `maxItems` to keep search runs bounded - eBay listings for a broad keyword can run to thousands of pages.
- Use `sortBy: "ending-soonest"` plus `condition: "used"` for sourcing/reselling workflows.
- Batch `itemIds` (up to a few hundred per run) rather than one run per item.
- If a run fails with "eBay served a challenge", re-run - residential proxy sessions rotate and usually clear it.

### Known limitations

- **US marketplace only.** The Actor targets `ebay.com`; other eBay sites (`.co.uk`, `.de`, …) are not yet supported. The proxy is pinned to US exits by default so prices come back in USD; if you override the proxy country, the `currency` field records whatever eBay served.
- eBay serves its item pages in several rotating layouts. Core fields (title, price, currency, condition, availability, seller, images) come from each listing's embedded structured data and are reliable across all of them, but the full **item-specifics** table is only present in some layouts - expect `itemSpecifics` to sometimes contain just `Brand`.
- On search results, `condition` is read from the card and can be `null` for listings whose card doesn't spell it out (common for one-off vintage/collectible items).
- eBay does not show an aggregate rating for most listings, so `rating` / `reviewCount` are usually `null`.
- Sponsored placements are not separately flagged in the current eBay markup and may appear as organic rows.
- Ended or removed listings return a single row with `status: "error"` rather than partial data.

### FAQ

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

**Is scraping eBay legal?** Scraping publicly available data is generally legal, but you are responsible for how you use the data and for complying with eBay's Terms of Service and applicable law. This Actor collects only public listing data, no personal data beyond public seller usernames.

**Can it scrape sold/completed listings?** Not yet - it scrapes active listings. Open an issue on the Actor's Issues tab if you need this.

**Something looks wrong.** File it on the Issues tab with the input you used - fixes usually ship quickly.

# Actor input Schema

## `operation` (type: `string`):

Which eBay data to scrape. One operation per run.

## `query` (type: `string`):

Keyword to search eBay, e.g. "mechanical keyboard". Used by the search operation. Defaults to a demo query if left blank.

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

Many keywords in one run. Wins over "query" when filled. Duplicates and blanks are dropped.

## `itemId` (type: `string`):

An eBay item number (e.g. "146721557193") or a full eBay item URL. Used by the productDetails operation. Leave blank to have the Actor pick a current demo item.

## `itemIds` (type: `array`):

Many item numbers or item URLs in one run. Wins over "itemId" when filled.

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

Applies to search.

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

Applies to search.

## `buyItNow` (type: `boolean`):

Applies to search. Excludes auction-only listings.

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

Applies to search.

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

Applies to search.

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

Caps total rows returned across the whole run (applies to search; productDetails always returns one row per item). The first 10 rows of any run are free. Defaults to 20.

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

A residential proxy is strongly recommended - eBay rate-limits and challenges repeated traffic from one IP.

## Actor input object example

```json
{
  "operation": "search",
  "query": "mechanical keyboard",
  "buyItNow": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountryCode": "US"
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "query": "mechanical keyboard",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/ebay-product-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 = {
    "query": "mechanical keyboard",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/ebay-product-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 '{
  "query": "mechanical keyboard",
  "maxItems": 20
}' |
apify call mrdoe/ebay-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/ebay-product-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/DJy1SzKsWEA1x426S/builds/L9nMQImciuZHTVBaI/openapi.json
