# Ebay Scraper (`mido_99/ebay-scraper`) Actor

🛍️ Scrape eBay search results, seller stores, and item pages into clean, ready-to-use data.

- **URL**: https://apify.com/mido\_99/ebay-scraper.md
- **Developed by:** [Mohamed Hany](https://apify.com/mido_99) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 listing item scrapeds

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 Data Extractor

**Scrape eBay at scale** and get clean, structured data from **search results**, **seller stores**, **category listings**, and **individual item pages** on **eBay**. Just paste in eBay URLs, pick a mode, and get back a ready-to-use dataset of titles, prices, conditions, sellers, images, and full item specifics - no coding required.

### 🔎 What does eBay Data Extractor do?

This Actor turns eBay listing pages into structured, downloadable data. Choose from **four modes**:

| Mode | What it scrapes |
|------|------------------|
| 🔍 Search | Paginated search results for any keyword, including filters like category and Buy-It-Now |
| 🏬 Store | Every listing from a seller's storefront |
| 📂 Category | Every listing from a browse/category page like `/b/PC-Laptops-Netbooks/177/...` |
| 📄 Item | A single item's full detail page - specifics, images, shipping, and returns. Accepts both `/itm/<id>` and `/p/<productId>?iid=<id>` URLs |

Results are collected into a dataset you can preview instantly or download as **JSON, CSV, Excel, or HTML**.

### 💡 Why use eBay Data Extractor?

| Use case | What it helps you do |
|----------|------------------------|
| 📈 Price monitoring & repricing | Track competitor prices across searches and stores |
| 🔬 Market & product research | Gather conditions, specifics, and shipping terms at scale |
| 🗂️ Catalog building | Extract item specifics and images for your own listings |
| 🤝 Lead generation | Discover active sellers and storefronts in your niche |

You can also **schedule** recurring scrapes and connect your results to tools like Google Sheets, Make, and Zapier.

### 🚀 How to use eBay Data Extractor

1. Open the Actor and go to the **Input** tab.
2. Choose a **Mode**: search, store, category, or item.
3. Paste one or more **Start URLs** that match your chosen mode.
4. Optionally set a limit on results and pages, and enable a proxy for extra reliability.
5. Click **Start**. When the run finishes, open the **Output** tab to preview and download your data.

> 💬 Tip: Make sure your URLs match the mode you selected - for example, use search-page URLs when in search mode, or `/b/` category-page URLs when in category mode. Item mode accepts both `/itm/<id>` listing URLs and `/p/<productId>?iid=<id>` catalog-product URLs.

### ⚙️ Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| Start URLs | array | eBay URLs to scrape, matching your selected mode | `ebay.com/sch/i.html?_nkw=laptop` |
| Mode | choice | Search, Store, Category, or Item | Search |
| Max results | number | Maximum number of items to collect in total. Set to 0 for no limit | 100 |
| Max pages | number | How many pages to go through per URL (search/store/category only) | 5 |
| Source run ID | string | Optional. Reuses the results from an earlier run - see FAQ below | — |
| Ship-to country | string | Country code or name (e.g. `US`, `Germany`) controlling which listings/shipping options eBay shows | `US` |
| Proxy configuration | object | Proxy settings. Residential proxy is priced higher than the default datacenter proxy (see Pricing below) | Apify Proxy (datacenter) |

**Example input:**

```json
{
    "mode": "search",
    "startUrls": [
        { "url": "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard&LH_BIN=1" }
    ],
    "maxResults": 200,
    "maxPages": 5,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

### 📦 Output

Every scraped listing becomes one item in your dataset. Download it as **JSON, HTML, CSV, or Excel**, or access it through the API.

**Example output (search mode):**

```json
{
    "mode": "search",
    "itemId": "204567891234",
    "title": "Dell XPS 13 Laptop 16GB RAM 512GB SSD",
    "price": 649.99,
    "currency": "USD",
    "priceRaw": "$649.99",
    "originalPrice": 799.99,
    "discount": "was - US $799.99",
    "condition": "Pre-Owned",
    "availability": "Only 2 left",
    "shipping": "+$15.00 shipping",
    "returns": "30 days returns",
    "itemLocation": "United States",
    "soldCount": 311,
    "watcherCount": null,
    "bidCount": null,
    "timeLeft": null,
    "bestOffer": true,
    "isSold": false,
    "soldDate": null,
    "seller": "techdeals",
    "sellerFeedbackPercent": "99.2%",
    "sellerFeedbackCount": "12,034",
    "display_image": "https://i.ebayimg.com/images/g/abcAAOSw/s-l500.jpg",
    "itemUrl": "https://www.ebay.com/itm/204567891234",
    "sourceUrl": "https://www.ebay.com/sch/i.html?_nkw=laptop"
}
```

**Example output (category mode):**

```json
{
    "mode": "category",
    "itemId": "295678912345",
    "title": "HP EliteBook 840 G3 Laptop 14\" i5 8GB 256GB SSD",
    "price": 379.99,
    "currency": "USD",
    "priceRaw": "$379.99",
    "condition": "Brand New · HP",
    "discount": "was - US $779.99",
    "shipping": "Free shipping",
    "soldCount": 1719,
    "display_image": "https://i.ebayimg.com/images/g/xyzAAOSw/s-l500.jpg",
    "itemUrl": "https://www.ebay.com/itm/295678912345",
    "sourceUrl": "https://www.ebay.com/b/PC-Laptops-Netbooks/177/bn_1577693"
}
```

**Example output (store mode):**

```json
{
    "mode": "store",
    "storeName": "techdeals-outlet",
    "storeSlug": "techdeals-outlet",
    "itemId": "186234567890",
    "title": "Lenovo ThinkPad T14 Laptop i7 16GB 512GB SSD",
    "price": 429.0,
    "currency": "USD",
    "priceRaw": "$429.00",
    "discount": "was - US $549.00",
    "display_image": "https://i.ebayimg.com/images/g/defAAOSw/s-l500.jpg",
    "itemUrl": "https://www.ebay.com/itm/186234567890",
    "sourceUrl": "https://www.ebay.com/str/techdeals-outlet"
}
```

> Store mode doesn't return condition, shipping, or sold-count fields - only what's shown on the storefront's own listing cards.

**Example output (item mode, abridged):**

```json
{
    "mode": "item",
    "itemId": "204567891234",
    "title": "Dell XPS 13 Laptop 16GB RAM 512GB SSD",
    "price": 649.99,
    "currency": "USD",
    "priceRaw": "$649.99",
    "discount": "was - US $799.99",
    "condition": "Pre-Owned",
    "category": ["Computers/Tablets & Networking", "Laptops & Netbooks", "PC Laptops & Netbooks"],
    "seller": "techdeals",
    "sellerUrl": "https://www.ebay.com/usr/techdeals",
    "sellerFeedbackScore": "12,034",
    "sellerFeedbackPercent": "99.2%",
    "seller_details": { "Member since": "2011", "Average response time": "within 24 hours" },
    "topReviews": [
        { "user": "b***r", "date": "Past month", "text": "Exactly as described, fast shipping." }
    ],
    "itemSpecifics": { "Brand": "Dell", "Model": "XPS 13 9310", "RAM Size": "16 GB" },
    "display_image": "https://i.ebayimg.com/images/g/abcAAOSw/s-l500.jpg",
    "images": [
        "https://i.ebayimg.com/images/g/abcAAOSw/s-l500.jpg",
        "https://i.ebayimg.com/images/g/abcAAOSx/s-l500.jpg"
    ],
    "description": "Dell XPS 13 in excellent condition...",
    "shipping": "+$15.00 shipping",
    "returns": "30 days returns",
    "itemUrl": "https://www.ebay.com/itm/204567891234",
    "sourceUrl": "https://www.ebay.com/itm/204567891234"
}
```

#### Data fields you'll get

| Field | Available in | Description |
|-------|---------------|--------------|
| Mode | all | Which mode produced the row |
| Item ID | all | eBay's listing number |
| Title | all | Listing title |
| Price / currency | all | The price and currency of the listing |
| Original price / discount | search, store, item | The pre-discount price and "was" text, when the listing shows one |
| Availability | search | How many are left in stock, when eBay shows it |
| Condition | search, category, item | Item condition (e.g. "Brand New") |
| Shipping | search, category, item | Shipping cost and terms |
| Returns | search, item | Returns policy |
| Item location | search | Ship-from location (e.g. "United States") |
| Sold count | search, category | How many have sold, when eBay shows it |
| Watcher count | search | Number of people watching the listing |
| Bid count | search | Number of bids on an auction |
| Time left | search | Time remaining on an auction (e.g. "2h 25m left") |
| Best offer | search | Whether the listing accepts "or Best Offer" |
| Is sold / sold date | search | Filled in when scraping a sold-listings search (see below) |
| Seller | search, item | Seller's username |
| Seller feedback | search, item | Seller's feedback score and positive-feedback percentage |
| Seller link / details | item | Link to the seller's profile, plus extras like member-since date and average response time |
| Top reviews | item | Recent buyer reviews (username, date, text) |
| Store name / slug | store | Storefront name and URL slug |
| Category | item | The item's category path (e.g. Electronics > Laptops) |
| Image / images | all / item | Main photo on every mode, plus the full photo gallery on item pages |
| Item specifics | item | Product details like Brand, Model, and more |
| Description | item | Item description text, when available |
| Item URL / source URL | all | Link to the listing, and the URL you started from |

#### Scraping sold listings

To get **sold/completed listings**, use eBay's own filter: on any search page, check **"Sold items"** under Show only, then copy that page's URL into Start URLs under search mode — no separate mode needed. eBay only keeps about 90 days of sold history, and results depend on your ship-to location, so **enable Apify Proxy with US-based IPs** for the most complete results.

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

This Actor uses simple, transparent **pay-per-result** pricing - you're only charged for the data you actually receive, not for compute time. Platform usage (compute, storage, bandwidth) is **included free** in every price below.

| What you're charged for | Free | Starter | Scale | Business |
|--------------------------|------|---------|-------|----------|
| Search / store / category listing scraped | $3.00 / 1,000 | $3.00 / 1,000 | $2.70 / 1,000 | $2.40 / 1,000 |
| ↳ same, with residential proxy | $4.00 / 1,000 | $4.00 / 1,000 | $3.60 / 1,000 | $3.20 / 1,000 |
| Item detail page scraped | $5.00 / 1,000 | $5.00 / 1,000 | $4.50 / 1,000 | $4.00 / 1,000 |
| ↳ same, with residential proxy | $8.00 / 1,000 | $8.00 / 1,000 | $7.20 / 1,000 | $6.40 / 1,000 |
| Actor start (flat, per run) | $0.00005 | $0.00005 | $0.00005 | $0.00005 |

A few things worth knowing:

- You're charged **once per result** - search, store, and category results are all billed as "listings," while item mode costs a bit more since it opens a full page for every item.
- **Residential proxy costs more** - about 1.6x on item mode. The default (datacenter) proxy works great for almost every run; only switch to residential if you're running into blocks.
- Your run automatically stops once it hits your spending cap or result limit, so costs never run away from you.
- The Apify free tier is enough to try the Actor out on a small run; Starter/Scale/Business plans unlock the discounted rates above automatically - no separate setup needed.

### 📌 Tips for best results

- **Set limits**: cap your max results and max pages to only what you need.
- **Stay reliable**: enable a proxy, especially for larger runs - eBay can be sensitive to high-volume traffic.
- **Start small**: test with a handful of URLs before scaling up to a full run.

### ❓ FAQ, disclaimers & support

- **Is scraping eBay legal?** This Actor only collects publicly accessible listing data (no login required, no personal data), which keeps it within generally accepted scraping practice.
- **Can I automatically scrape full item details from a previous search/store/category run?** Yes — set **Mode** to `item` and paste the earlier run's **Run ID** (visible in its Console URL or the **Actor runs** list) into the new **Source run ID** input. The Actor will fetch full details for every item that run found, no manual export needed.
- **Can that happen automatically, without me copying run IDs by hand?** Yes, using an Apify integration:

  1. Open eBay Data Extractor and set up your search - add your **Start URLs**.
  2. Click **Save as a new task** and name it something like *Search then get details*.
  3. Open the task and go to **Integrations**.
  4. Click **Add integration** and choose this same Actor.
  5. The input will be pre-filled for you - just double-check it, or switch on **Residential proxy** for more reliable results.
  6. Save the integration.

  That's it! From now on, whenever the search run finishes, the item run kicks off automatically using the item URLs it found.

### 🛠️ Support

- 🐛 If you face any issue using this actor, please report them in the [issues](https://apify.com/mido_99/ebay-scraper/issues/open) tab.
- 📧 If you have any question or feature requests, feel free to [reach out](mailto:mohamed.hany.ali.hassan@gmail.com) the author of this actor.

# Actor input Schema

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

The eBay pages to scrape — search results, a store, an item, or a category page. Make sure each URL matches the Mode you select below.

## `mode` (type: `string`):

What kind of eBay page your Start URLs are: search results, a store, an item, or a category.

## `sourceRunId` (type: `string`):

Optional: continue from a previous Search, Store, or Category run. Enter that run's ID and set Mode to 'Item' to fetch full details for every item it found.

## `maxResults` (type: `integer`):

Stop after collecting this many items in total, across all Start URLs. Set to 0 for no limit.

## `maxPages` (type: `integer`):

How many pages to go through per URL. Not used in Item mode.

## `shipToCountry` (type: `string`):

Two-letter country code (e.g. US, GB, DE) — full country names also accepted (e.g. Germany).

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

Select proxies to be used by actor. Residential proxy is priced higher per item than the default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.ebay.com/sch/i.html?_nkw=laptop"
    },
    {
      "url": "https://www.ebay.com/str/example-store"
    },
    {
      "url": "https://www.ebay.com/itm/123456789012"
    },
    {
      "url": "https://www.ebay.com/p/11056436136?iid=336641444750"
    },
    {
      "url": "https://www.ebay.com/b/PC-Laptops-Netbooks/177/bn_1577693"
    }
  ],
  "mode": "search",
  "maxResults": 100,
  "maxPages": 5,
  "shipToCountry": "US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per scraped eBay listing/item. Field shape depends on the run's `mode` (search/store/category/item) — see the dataset's Overview, Detail, Search, and Category views for the field breakdown per mode.

## `debugHtml` (type: `string`):

Raw HTML of pages that failed to parse cleanly (zero items or an anomalous result), saved under `debug-<mode>-<id>-p<page>` keys for troubleshooting. Empty on clean runs.

## `failedUrls` (type: `string`):

JSON array of this run's failed requests (source URL, mode, error, error message) — the same failures recorded in the dataset as `failed-item` rows, mirrored here for quick review. Empty array on clean runs.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.ebay.com/sch/i.html?_nkw=laptop"
        },
        {
            "url": "https://www.ebay.com/str/example-store"
        },
        {
            "url": "https://www.ebay.com/itm/123456789012"
        },
        {
            "url": "https://www.ebay.com/p/11056436136?iid=336641444750"
        },
        {
            "url": "https://www.ebay.com/b/PC-Laptops-Netbooks/177/bn_1577693"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mido_99/ebay-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 = {
    "startUrls": [
        { "url": "https://www.ebay.com/sch/i.html?_nkw=laptop" },
        { "url": "https://www.ebay.com/str/example-store" },
        { "url": "https://www.ebay.com/itm/123456789012" },
        { "url": "https://www.ebay.com/p/11056436136?iid=336641444750" },
        { "url": "https://www.ebay.com/b/PC-Laptops-Netbooks/177/bn_1577693" },
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mido_99/ebay-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 '{
  "startUrls": [
    {
      "url": "https://www.ebay.com/sch/i.html?_nkw=laptop"
    },
    {
      "url": "https://www.ebay.com/str/example-store"
    },
    {
      "url": "https://www.ebay.com/itm/123456789012"
    },
    {
      "url": "https://www.ebay.com/p/11056436136?iid=336641444750"
    },
    {
      "url": "https://www.ebay.com/b/PC-Laptops-Netbooks/177/bn_1577693"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mido_99/ebay-scraper --silent --output-dataset

```

## MCP server setup

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