# eBay Listings Scraper (`confidential_gnat/ebay-listings-scraper`) Actor

Scrape eBay (ebay.com) search results and item pages: title, price, condition, shipping, seller and feedback, sold count, images and item specifics. Search by keyword or URL, with a cache that returns only new or changed listings. Export JSON, CSV or Excel.

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

## Pricing

from $2.00 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## eBay Listings Scraper

![eBay Listings Scraper cover](https://i.postimg.cc/nrwQR5qv/Gemini-Generated-Image-wrkltfwrkltfwrkl.jpg)

**Scrape listings from eBay (ebay.com)**: search results and item pages with title, price, condition, shipping, seller and feedback, sold count, images and item specifics. Paste an eBay search URL or an item URL, or type keywords, and export as **JSON, CSV or Excel** or call it as an **API**. A built-in cache returns only the **new or changed listings** on every run.

**Target website:** [ebay.com](https://www.ebay.com)

### ✨ Features of this eBay listings scraper

- **Search results extraction** — every result of a search is opened on its own item page, so each record is complete: price and list price, condition, buying format, shipping, location, returns, seller with feedback and the main image.
- **Item page extraction** — full item data: quantity and sold count, watchers, all images, categories, brand, model, listing date and the item specifics table, for search results and for item links alike.
- **Auctions, variations and offers** — the exact auction end time, the options of listings with variations (color, size, network) with their stock state, bulk-price tiers, sale countdown and discount.
- **Returns, shipping and payments** — return window, who pays for returns, handling time, delivery estimate, shipping service, warranty and accepted payment methods.
- **Seller notes and identifiers** — the full seller condition notes, UPC, EAN, model number and category ID.
- **Search by keyword or URL** — type keywords or paste an eBay search URL with its filters (category, price range, condition and more).
- **Cache for new listings only** — use the same cache project name on every scheduled run to skip unchanged listings.
- **Pagination support** — walks through the result pages, up to about 10,000 results per search.
- **Proxy support** — a proxy is used by default, so you do not need to set one up; you can switch to your Apify Proxy.
- **No browser required** — plain requests keep runs fast and cheap.

### 🚀 How to scrape eBay listings in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (an eBay search URL, an item URL or keywords).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing for the eBay scraper

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- New Apify accounts include **$5 of free monthly credit**.
- The actor uses plain HTTP requests instead of a browser, so it costs significantly less to run than browser-based scrapers.
- A proxy is used by default, so you do not need to configure anything; choosing Apify Proxy (residential) instead costs more.

### 🔧 eBay scraper input configuration

The input form starts with the eBay URLs and keywords, then the listing limit and the cache name. The proxy settings are last.

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| eBay URLs (`startUrls`) | array | — | an iPhone 13 search | An eBay search results page with its filters, or an item page. |
| Search keywords (`queries`) | array | — | — | Keywords to search on ebay.com, one search each. |
| Max listings per search or URL (`maxItems`) | integer | — | 5 | Maximum listings saved for each start URL or keyword. eBay serves about 10,000 results per search. |
| Cache project name (`cacheProjectName`) | string | — | — | Reuse the same name on every run to get only new and changed listings. Each record gets `changeType`: `new` or `updated`. |
| Proxy configuration (`proxyConfiguration`) | object | — | used by default | Turn on Apify Proxy to choose your own proxy instead; eBay needs residential proxies. |

**Supported URL types:**

- A search: `https://www.ebay.com/sch/i.html?_nkw=iphone+13` (filters in the address are used)
- An item: `https://www.ebay.com/itm/227257764251`

Sold and completed listing searches need an eBay login and are not supported.

### 🖼️ eBay scraper input screenshot

![eBay Listings Scraper input form in Apify Console: eBay URLs, search keywords, max listings per search or URL and cache project name](https://i.postimg.cc/C5Kq4YnM/Gemini-Generated-Image-6yusgq6yusgq6yus.jpg)

Numbered labels in the screenshot:

1. **eBay URLs** — eBay search result pages (with their filters) or item pages to scrape.
2. **Search keywords** — keywords searched on ebay.com, one search each.
3. **Max listings per search or URL** — how many listings to save for each URL or keyword.
4. **Cache project name** — reuse the same name on scheduled runs to get only new and changed listings.

### 📦 eBay scraper output data

Every result is one flat record with the keys `type`, `id`, `url`, `title`, `subtitle`, `condition`, `priceText`, `priceMin`, `priceMax`, `currency`, `originalPrice`, `buyingFormat`, `acceptsBestOffer`, `bidCount`, `shippingText`, `shippingCost`, `location`, `returnsText`, `soldCount`, `quantityAvailable`, `watchers`, `sellerName`, `sellerUrl`, `sellerFeedbackPercent`, `sellerFeedbackCount`, `badges`, `imageUrl`, `images`, `categories`, `categoryId`, `brand`, `model`, `mpn`, `upc`, `ean`, `modelNumber`, `color`, `availability`, `listedAt`, `lastUpdatedAt`, `auctionEndsAt`, `saleEndsIn`, `discountPercent`, `discountAmount`, `volumePricing`, `variations`, `soldToday`, `returnsAccepted`, `returnDays`, `freeReturns`, `returnMethod`, `handlingTime`, `deliveryEstimate`, `shippingService`, `warranty`, `paymentMethods`, `sellerNotes`, `itemSpecifics`, `changeType`, `source`, `scrapedAt`. Every record has all keys; a value the page does not carry is `null`. Every record comes from its item page (`type` `item`); a listing whose item page could not be loaded keeps what the search result showed (`type` `listing`). The dataset has 2 views:

- **Listings** — a compact table of title, image, price, currency, condition, format, shipping, seller, sold count and the listing link.
- **Item details** — auction end time, sold today, watchers, return days, free returns, handling time, delivery estimate, shipping service, warranty and the listing link.

**Output at a glance:**

| Title | Price | Condition | Format | Shipping | Seller | Sold |
| ----- | ----- | --------- | ------ | -------- | ------ | ---- |
| [Apple iPhone 13 Mini (Excellent Condition) - (Unlocked,](https://www.ebay.com/itm/336482670833) | 349.99–419.99 USD | Pre-Owned | FIXED_PRICE | 9.99 | cocosprinkles | — |
| [Unlocked Apple iPhone 12 - 64GB - Works But No Wi-Fi - ](https://www.ebay.com/itm/327420125134) | 161.49 USD | Pre-Owned | FIXED_PRICE | 11.99 | cocosprinkles | — |
| [Apple iPhone 13 Mini (Great Condition) - (Unlocked, AT&](https://www.ebay.com/itm/227257764251) | 329.99 USD | Pre-Owned | FIXED_PRICE | 9.99 | cocosprinkles | — |
| [Apple iPhone 13 Pro Max - (Excellent Condition) Unlocke](https://www.ebay.com/itm/326433263140) | 474.99–649.99 USD | Pre-Owned | FIXED_PRICE | 11.99 | cocosprinkles | — |
| [Apple iPhone 13 A2482 128GB Unlocked Very Good Conditio](https://www.ebay.com/itm/128012807768) | 239.07–513.47 USD | Very Good - Refurbished | FIXED_PRICE | free | verizon | 367 |
| [Apple iPhone 13 A2482 128GB - Fully Unlocked- Black & B](https://www.ebay.com/itm/127446929166) | 245 USD | Refurbished | FIXED_PRICE | free | — | 477 |

**Sample output (raw JSON):**

```json
[
  {
    "type": "listing",
    "id": "336482670833",
    "url": "https://www.ebay.com/itm/336482670833",
    "title": "Apple iPhone 13 Mini (Excellent Condition) - (Unlocked, AT&T, Verizon, T-Mobile)",
    "subtitle": "Apple iPhone 13 · 256 GB · Factory Unlocked",
    "condition": "Pre-Owned",
    "priceText": "$349.99 to $419.99",
    "priceMin": 349.99,
    "priceMax": 419.99,
    "currency": "USD",
    "originalPrice": 499.99,
    "buyingFormat": "FIXED_PRICE",
    "acceptsBestOffer": false,
    "bidCount": null,
    "shippingText": "+$9.99 delivery",
    "shippingCost": 9.99,
    "location": "United States",
    "returnsText": "Free returns",
    "soldCount": null,
    "quantityAvailable": null,
    "watchers": null,
    "sellerName": "cocosprinkles",
    "sellerUrl": null,
    "sellerFeedbackPercent": 99.8,
    "sellerFeedbackCount": 42200,
    "badges": [],
    "imageUrl": "https://i.ebayimg.com/images/g/ofgAAeSw2iRpjOIJ/s-l500.webp",
    "images": null,
    "categories": null,
    "brand": null,
    "model": null,
    "mpn": null,
    "availability": null,
    "listedAt": null,
    "itemSpecifics": null,
    "changeType": null,
    "source": "https://www.ebay.com/sch/i.html?_nkw=iphone+13",
    "scrapedAt": "2026-10-29T18:35:25.730Z"
  },
  {
    "type": "item",
    "id": "127446929166",
    "url": "https://www.ebay.com/itm/127446929166",
    "title": "Apple iPhone 13 A2482 128GB - Fully Unlocked- Black & Blue - Good Condition",
    "subtitle": null,
    "condition": "Refurbished",
    "priceText": "US $245.00",
    "priceMin": 245,
    "priceMax": 245,
    "currency": "USD",
    "originalPrice": null,
    "buyingFormat": "FIXED_PRICE",
    "acceptsBestOffer": false,
    "bidCount": null,
    "shippingText": "Free UPS Ground. See detailsfor shipping",
    "shippingCost": 0,
    "location": "Lisle, Illinois, United States",
    "returnsText": "30 days returns. Seller pays for return shipping. See details- for more information about returns",
    "soldCount": 477,
    "quantityAvailable": 10,
    "watchers": 437,
    "sellerName": null,
    "sellerUrl": null,
    "sellerFeedbackPercent": 99.6,
    "sellerFeedbackCount": 4841,
    "badges": null,
    "imageUrl": "https://i.ebayimg.com/images/g/HnIAAOSwKz9nFp4Z/s-l1600.jpg",
    "images": [
      "https://i.ebayimg.com/images/g/HnIAAOSwKz9nFp4Z/s-l1600.jpg",
      "https://i.ebayimg.com/images/g/Vl8AAOSwaMJnFp4X/s-l1600.jpg"
    ],
    "categories": [
      "Electronics",
      "Cell Phones & Accessories",
      "Cell Phones & Smartphones"
    ],
    "brand": "Apple",
    "model": "Apple iPhone 13",
    "mpn": null,
    "availability": "InStock",
    "listedAt": "2025-10-22T19:34:53Z",
    "itemSpecifics": [
      {
        "name": "Condition",
        "value": "Good - Refurbished"
      },
      {
        "name": "Seller Notes",
        "value": "“This iPhone 13 is in good condition. Means Expect Average Scratches, Scuffs / Dings. Available in ..."
      },
      {
        "name": "Custom Bundle",
        "value": "No"
      }
    ],
    "changeType": null,
    "source": "https://www.ebay.com/itm/127446929166",
    "scrapedAt": "2026-10-29T18:35:06.446Z"
  }
]
```

### 🔁 Save money: scrape only new eBay listings with the cache

Scheduled runs usually meet the same listings again and again, and without a cache you pay for them every time. This actor has a built-in cache that **skips previously scraped listings, so you pay only for new and changed ones across multiple runs**.

1. Set **Cache project name** to any name, for example `ebay-iphone-watch`.
2. Keep the same name on every run, for example from an [Apify Schedule](https://docs.apify.com/platform/schedules).
3. Each run returns only what is new: `changeType: "new"` for new listings and `"updated"` for listings whose title or price changed.

Listings already saved with the same title and price are skipped and do not count towards **Max listings**, so each run goes deeper into the results instead of repeating the same ones. Different names keep separate caches, and a search result and an item page of the same listing are cached separately.

### 🐍 How to scrape eBay with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/ebay-listings-scraper").call(run_input={
    "startUrls": [{"url": "https://www.ebay.com/sch/i.html?_nkw=iphone+13"}],
    "maxItems": 100,
    "cacheProjectName": "iphone-13",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/ebay-listings-scraper').call({
    startUrls: [{ url: 'https://www.ebay.com/sch/i.html?_nkw=iphone+13' }],
    maxItems: 100,
    cacheProjectName: 'iphone-13',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~ebay-listings-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.ebay.com/sch/i.html?_nkw=iphone+13"}], "maxItems": 100, "cacheProjectName": "iphone-13"}'
```

### 💡 What you can use eBay listing data for

- Price monitoring and competitor tracking for products and categories.
- Resale and arbitrage research: find underpriced listings and fast sellers by sold count.
- Market research on prices, conditions and shipping for used and new goods.
- Building price comparison sites, alerts and deal feeds.
- Seller research with feedback score and number of items sold.

The data is typically used by resellers, e-commerce teams, price comparison sites, analysts and collectors.

### ⚠️ Limitations of the eBay scraper

- **About 10,000 results per search** — eBay serves no more per search; use filters such as price ranges or categories in the URL to cover more.
- **No sold or completed listings** — those searches need an eBay login.
- **Slow by design** — the actor paces its requests and retries blocked ones, so large runs take time.

### ❓ eBay scraper FAQ

#### Can I scrape eBay legally?

The actor only collects listing data that is already publicly visible on eBay, with no login, paywall or private content. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with eBay's Terms of Service and applicable laws, especially if you use seller data.

#### What data does the eBay scraper return?

Each listing has its title, price (or range), currency, condition, buying format, shipping, location, returns, sold count, quantity, watchers and the seller with feedback, plus all images, categories, brand, model, listing date and item specifics. If an item page cannot be loaded after several attempts, the record keeps what the search result showed.

#### How many listings can I scrape from one eBay search?

**Max listings per search or URL** limits the saved listings for each start URL or keyword. eBay serves about 10,000 results per search, so narrow big searches with filters.

#### Do I need a proxy to scrape ebay.com?

You do not have to set one: the actor uses a proxy by default, and it worked in testing. You can turn on Apify Proxy instead, but eBay needs residential proxies, which makes runs more expensive.

#### Can I run this eBay scraper on a schedule?

Yes. Create an Apify Schedule for the actor and set a **Cache project name** so every run returns only new and changed listings.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Is this the cheapest eBay scraper actor?

Possibly yes. It uses plain HTTP requests instead of a browser, and its built-in cache skips listings you already scraped, so across multiple runs you pay only for new and changed listings. Set a **Cache project name** and keep it the same on every run to get this saving.

### 🔗 Relevant actors for marketplace and product data

| Scraper | Description |
| ------- | ----------- |
| [🛒 Mercari Japan Scraper](https://apify.com/confidential_gnat/mercari-japan-listings-scraper) | Mercari Japan listings: price in JPY, on-sale or sold status and more. |
| [🛍️ Google Shopping Scraper](https://apify.com/confidential_gnat/google-shopping-scraper) | Google Shopping product listings for any search query. |
| [🌐 AliExpress Products Scraper](https://apify.com/confidential_gnat/aliexpress-products-scraper) | Products from AliExpress search results and product pages. |
| [📦 Alibaba.com Products Scraper](https://apify.com/confidential_gnat/alibaba-products-scraper) | Wholesale products from Alibaba.com by product search. |
| [🏷️ Craigslist Listings Scraper](https://apify.com/confidential_gnat/craigslist-listings-scraper) | Craigslist classified listings in any city and category. |

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [🥾 AllTrails Scraper — Hiking, Biking & Running Trails](https://apify.com/confidential_gnat/alltrails-scraper) | Hiking, biking and running trails by park, city or state. |
| [📌 Pinterest Pins, Boards & Profiles Scraper](https://apify.com/confidential_gnat/pinterest-pins-scraper) | Pins, videos, boards and profiles from Pinterest searches and URLs. |
| [💼 Dice Jobs Scraper](https://apify.com/confidential_gnat/dice-jobs-scraper) | Tech job listings from Dice by keyword or URL. |
| [🔮 Kalshi Markets Scraper](https://apify.com/confidential_gnat/kalshi-markets-scraper) | Prediction market prices, implied probability and volume from Kalshi. |
| [🍷 Vivino Wine Scraper](https://apify.com/confidential_gnat/vivino-wine-scraper) | Wine data from Vivino: name, winery, vintage and ratings. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/ebay-listings-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

An eBay search results page (https://www.ebay.com/sch/i.html?\_nkw=iphone+13) with its filters, or an item page (https://www.ebay.com/itm/227257764251). Sold and completed listings need a login and are not supported.

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

Keywords to search on ebay.com, one search each, for example iphone 13.

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

Maximum listings saved for each start URL or keyword. eBay serves about 10,000 results per search.

## `cacheProjectName` (type: `string`):

Reuse the same name on every scheduled run to get only new and changed listings: unchanged listings (same title and price) are skipped. Each record gets changeType new or updated.

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

The actor uses a proxy by default. Turn on Apify Proxy to choose your own instead; eBay needs residential proxies, which makes runs more expensive.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.ebay.com/sch/i.html?_nkw=iphone+13"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.ebay.com/sch/i.html?_nkw=iphone+13"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/ebay-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 = { "startUrls": [{ "url": "https://www.ebay.com/sch/i.html?_nkw=iphone+13" }] }

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/ebay-listings-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=iphone+13"
    }
  ]
}' |
apify call confidential_gnat/ebay-listings-scraper --silent --output-dataset

```

## MCP server setup

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