# eBay Scraper - Listings, Prices & 8 Markets (`delicious_zebu/ebay-product-listing-scraper`) Actor

Scrape eBay search results, filtered listings and category pages across 8 marketplaces. Build a search from built-in filters - keywords, category, price, condition, seller, location - or paste URLs. Returns title, price, currency, condition, seller rating, shipping, sold count and more.

- **URL**: https://apify.com/delicious_zebu/ebay-product-listing-scraper.md
- **Developed by:** [Zebu Data](https://apify.com/delicious_zebu) (community)
- **Categories:** E-commerce
- **Stats:** 1,000 total users, 108 monthly users, 99.9% runs succeeded, 61 bookmarks
- **User rating**: 4.26 out of 5 stars

## Pricing

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

### What does eBay Product Listing Scraper do?

**eBay Product Listing Scraper** extracts product data from [eBay](https://www.ebay.com) search results, filtered results, and category pages across **8 eBay marketplaces** — US, UK, Germany, France, Italy, Spain, Canada, and Australia.

It works as an unofficial **eBay API alternative**. You can either build a search from the **built-in advanced filters** — no URL needed — or paste eBay listing URLs. Either way you get clean, structured data: title, price, currency, condition, seller rating, shipping, sold count, item location, image, and the listing URL.

### Why use eBay Product Listing Scraper?

🔍 **Two ways to search.** Build a search right in the input form (keywords + filters), or paste eBay search/category URLs. Fill in both and the Actor scrapes both.

🎛️ **14 filters that mirror eBay's own Advanced Search.** Keyword match mode, excluded words, title+description search, category, price range, buying format, condition, free shipping, item location, ships-to country, and specific sellers (include or exclude). No URL building, no guessing parameter names.

🌍 **8 eBay marketplaces.** Switch the marketplace to get that country's listings, currency, and language — eBay Germany returns German listings in EUR, eBay UK returns GBP, and so on.

🏷️ **Category and brand pages too.** Not just `/sch/` search URLs — `ebay.com/b/...` category and brand pages work as well.

🔤 **Batch keywords.** Enter a list of search terms and each one runs as its own search using the same filters.

⚡ **240 listings per page.** The Actor requests eBay's maximum page size, so large searches finish in fewer round trips.

🧾 **Seller data included.** Seller username, positive feedback percentage, and feedback count come back with every listing.

#### What can you use eBay data for?

- **Price monitoring** — track how prices and shipping costs move across sellers and countries
- **Competitor research** — see what other sellers list, at what price, and how much they sell
- **Product and market research** — find demand signals like sold counts and watcher counts
- **Dropshipping and sourcing** — filter by condition, location, and price to find supply
- **Cross-market comparison** — run the same keyword on 8 marketplaces and compare

#### Capabilities at a glance

| | eBay Product Listing Scraper |
|---|---|
| Input methods | Built-in advanced search **and** pasted URLs |
| Search filters | 14, mirroring eBay's Advanced Search form |
| Marketplaces | 8 (US, UK, DE, FR, IT, ES, CA, AU) |
| Page types | Search results, filtered results, category/brand pages |
| Listings per page | 240 (eBay's maximum) |
| Batch keywords | Yes — each keyword runs as its own search |
| Output fields | 26 |

### What data can you extract from eBay?

Every listing comes back with these 26 fields:

| Field | Type | Description |
|---|---|---|
| `product_title` | string | Listing title as shown on eBay |
| `price` | string | Current price, formatted the way eBay shows it (`$123.49`, `EUR 45,00`). Can be a range for multi-variant listings |
| `currency` | string | Currency code detected from the price — `USD`, `GBP`, `EUR`, `CAD`, `AUD`, and others |
| `original_price` | string | Pre-discount price, when the listing shows one |
| `condition` | string | Item condition — `Brand New`, `Pre-Owned`, `New (Other)`, `Open Box`. On non-English sites it also carries the seller type, exactly as eBay writes it (e.g. `Gebraucht \| Privat`) |
| `item_attributes` | string | Size, capacity, brand and any seller subtitle eBay shows under the title (e.g. `US M 11 + more · Nike`) |
| `seller_name` | string | Seller's eBay user ID |
| `seller_feedback_percent` | string | Seller's positive feedback percentage |
| `seller_feedback_count` | string | Number of feedback ratings, abbreviated as eBay shows it (e.g. `2.6K`) |
| `rating` | string | Product star rating, when the listing has product reviews |
| `review_count` | string | Number of product reviews |
| `sold_count` | string | Sold count as eBay shows it (e.g. `17+ sold`) |
| `watchers` | string | Watcher count (e.g. `12+ watchers`) |
| `buying_format` | string | `Buy It Now`, `or Best Offer`, or auction details with bid count and time left |
| `shipping_cost` | string | Shipping or delivery line as eBay shows it (e.g. `+$14.95 delivery`, `Free delivery`) |
| `free_returns` | boolean | Whether the listing advertises free returns |
| `item_location` | string | Where the item ships from, when eBay renders it |
| `authenticity_guarantee` | boolean | Whether the listing carries eBay's Authenticity Guarantee badge |
| `card_attribute` | array | Every label on the listing card, raw — coupons, tiered discounts, badges and anything without its own field |
| `image_url` | string | Product image, at the largest size eBay exposes on listing pages |
| `product_url` | string | Link to the listing |
| `item_id` | string | eBay item number |
| `marketplace` | string | Which eBay market the listing came from — `US`, `GB`, `DE`, `FR`, `IT`, `ES`, `CA`, `AU` |
| `page_number` | integer | Which result page the listing came from |
| `scraped_at` | string | UTC timestamp (ISO 8601) of when the page was fetched |
| `input_url` | string | The search or category URL this listing came from |

### How to scrape eBay listings

1. **Open the Actor** on Apify Store and click **Try for free**.
2. **Choose how to search** — either type one or more keywords under *Advanced search* and pick your filters, or paste eBay search/category URLs under *Search by URL*.
3. **Pick the marketplace** — select the eBay country site you want (defaults to eBay US), and optionally set *Proxy country* to match.
4. **Click Start** — the Actor collects up to 240 listings per page and writes results as it goes.
5. **Download your data** — export as JSON, CSV, Excel, XML or HTML, or pull it through the Apify API.

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

This Actor charges **$2.00 per 1,000 results**. Apify's platform costs are included in that price — there is no separate compute charge to work out.

Apify's **free plan** comes with $5 in monthly usage credits, which is about **2,500 eBay listings per month at no cost**. Paid plans start at $19/month and add more credits plus higher limits.

Because the Actor talks to eBay over plain HTTP instead of driving a full browser, runs finish quickly — a 240-listing page typically takes 10–20 seconds — so you spend your credits on results rather than on waiting.

Use **Max pages per URL** if you want a hard ceiling on how much a single run collects.

### Input

You can use either input method, or both at once. Full descriptions are on the Actor's **Input** tab.

#### Option 1 — Advanced search (no URL needed)

| Field | Type | Description |
|---|---|---|
| `keywords` | array | Search terms, one per line. Each runs as its own search using the filters below |
| `ebaySite` | select | Which eBay marketplace to search — changes currency, language and which listings appear |
| `keywordMatch` | select | All words / any words / exact phrase / exact words in any order |
| `excludeKeywords` | string | Skip listings containing these words |
| `searchTitleDescription` | boolean | Also search inside item descriptions, not just titles |
| `category` | select | Limit the search to one main eBay category |
| `minPrice` / `maxPrice` | integer | Price range, in the marketplace's currency |
| `buyingFormat` | select | Buy It Now, Auction, Accepts offers, or Classified ads |
| `condition` | select | New, Used, or Not specified |
| `freeShipping` | boolean | Only listings with free shipping |
| `locatedIn` | select | Only items physically located in this country |
| `availableTo` | select | Only items that ship to this country |
| `sellers` | string | Specific seller usernames, comma-separated |
| `sellersMode` | select | Include only those sellers, or exclude them |

#### Option 2 — Search by URL

| Field | Type | Description |
|---|---|---|
| `listingUrls` | array | eBay search URLs (`ebay.com/sch/...`) or category/brand URLs (`ebay.com/b/...`) |

#### Options for both

| Field | Type | Default | Description |
|---|---|---|---|
| `maxPages` | integer | `0` | Result pages to scrape per URL, 240 listings each. `0` scrapes every page |
| `sortBy` | select | Best Match | Same options as eBay's own Sort dropdown. Overrides any sort order in your input URL |
| `proxyCountry` | select | United States | Which country's version of eBay to load. eBay localizes prices, shipping and availability by country |

### Output

Each listing is one dataset item. This is a real record from a run on eBay US:

```json
{
    "page_number": 1,
    "item_id": "135575967654",
    "product_title": "Mens Sizes 7.5-15 Nike Air Max 2017 Triple Black 849559-004 Brand New Fast Ship",
    "condition": "Brand New",
    "item_attributes": "US M 11 + more · Nike",
    "price": "$123.49",
    "currency": "USD",
    "image_url": "https://i.ebayimg.com/images/g/zAYAAeSwAlxnu8Xl/s-l500.webp",
    "original_price": "$129.99",      // only when the listing shows a pre-discount price
    "rating": "3.0",                  // only when the listing has product reviews
    "review_count": "2",
    "sold_count": "17+ sold",         // only when eBay shows a sold count
    "watchers": "",                   // only when eBay shows a watcher count
    "shipping_cost": "+$14.95 delivery",
    "item_location": "United States",
    "buying_format": "Buy It Now",
    "free_returns": false,
    "authenticity_guarantee": true,   // eBay's Authenticity Guarantee badge
    "seller_name": "hdhy1678",
    "seller_feedback_percent": "99.9",
    "seller_feedback_count": "2.6K",
    "card_attribute": [               // raw labels, including anything without its own field
        "Buy It Now",
        "+$14.95 delivery",
        "Located in United States",
        "17+ sold",
        "Authenticity Guarantee"
    ],
    "product_url": "https://www.ebay.com/itm/135575967654",
    "marketplace": "US",
    "scraped_at": "2026-09-19T07:24:07Z",
    "input_url": "https://www.ebay.com/sch/i.html?_nkw=nike+air+max"
}
```

### Tips

- **Match the proxy country to the marketplace.** eBay localizes its pages, so prices, shipping costs and even which listings appear depend on the proxy IP's country. If you search eBay Germany, set *Proxy country* to Germany for the most realistic view.
- **`Located in` and `Proxy country` are different things.** *Located in* filters where the item physically is. *Proxy country* changes which regional version of eBay gets loaded. They work independently.
- **Category and brand pages return fewer fields.** eBay renders `ebay.com/b/...` pages from a different template that has no seller info, item location, or product ratings. Those fields come back empty for such URLs — the data simply isn't on the page. Search URLs and the advanced search return the full field set.
- **One image per listing.** eBay's listing pages expose a single product image per item. The extra thumbnails you see when hovering a card are loaded by eBay's JavaScript and aren't part of the page data.
- **Expect a small number of duplicates across pages.** eBay reshuffles results between page requests, so a listing can appear on two pages. Deduplicate on `item_id` if you need a strictly unique set.
- **eBay caps deep pagination** at roughly 100–200 pages per search. For very broad keywords, narrow the search with filters instead of paging deeper.
- **Run it on a schedule** to track prices over time, and connect the results to Google Sheets, Slack, Zapier, Make or your own webhook through Apify integrations.

### FAQ and support

#### Is it legal to scrape eBay?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

#### Can I scrape sold or completed eBay listings?

Not with this Actor. eBay now puts sold and completed listings behind a sign-in wall, so those filters aren't offered here rather than silently returning nothing. For realized sale prices, use a dedicated sold-listings Actor.

#### Can I paste a single item URL?

No — this Actor reads listing pages, not individual items. Paste a search URL (`ebay.com/sch/...`) or a category URL (`ebay.com/b/...`), or use the advanced search. For a single product's full details, use [eBay Product Details Scraper](https://apify.com/delicious_zebu/ebay-product-details-scraper).

#### How do I scrape listings from one specific seller?

Put their eBay username in the **Sellers** field under advanced search and leave **Sellers mode** on *Include only these sellers*. To scrape an entire store instead, use [eBay Store Scraper](https://apify.com/delicious_zebu/ebay-store-scraper).

#### Which eBay marketplaces are supported?

Eight: eBay US, UK, Germany, France, Italy, Spain, Canada and Australia. Pasted URLs keep whatever domain you give them, so other eBay domains generally work too.

#### How many listings can I get in one run?

Each result page holds up to 240 listings, and eBay allows roughly 100–200 pages per search. Use **Max pages per URL** to set your own ceiling, and batch multiple keywords to cover more ground in a single run.

#### Related Actors

Looking for more eBay data? 😊

1. [eBay Product Details Scraper](https://apify.com/delicious_zebu/ebay-product-details-scraper) — full details for individual products: seller name, items sold, positive feedback, price, condition, images, shipping, delivery, return policy, item number, full description and item specifics.
2. [eBay Store Scraper](https://apify.com/delicious_zebu/ebay-store-scraper) — all products from any eBay store, with seller name, title, price, condition, shipping info, return policy and item specifics.
3. [eBay Product Reviews Scraper with Advanced Filters](https://apify.com/delicious_zebu/ebay-product-reviews-scraper-with-advanced-filters) — product reviews with filters for sorting, rating type, and image-only reviews.

#### Support

Found a bug or want a field that isn't here yet? Open an issue on the Actor's **Issues** tab, or leave feedback on the Actor page. We read everything and ship fixes quickly.

# Actor input Schema

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

Search terms — one per line. Each runs as a separate eBay search using the filters below. You can also enter an item number, or use eBay syntax like an "exact phrase" in quotes.

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

Which eBay country site to run the search on. This changes the marketplace itself — currency, language, and which listings appear (e.g. eBay Germany shows German listings in EUR). Only affects the advanced search above; pasted URLs in Option 2 keep their own site. Note: on non-English sites, a few text fields (item location, shipping, sold, watchers) may occasionally be empty.

## `keywordMatch` (type: `string`):

How keywords are matched, same as eBay's advanced search.

## `excludeKeywords` (type: `string`):

Skip listings that contain these words.

## `searchTitleDescription` (type: `boolean`):

Also search within item descriptions, not just titles.

## `category` (type: `string`):

Limit the search to one main eBay category. For a sub-category, paste a category page URL under 'Option 2 — Search by URL' instead.

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

Lowest price to include, in the currency of the marketplace set by 'eBay site' above (e.g. USD on ebay.com, EUR on ebay.de).

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

Highest price to include, in the currency of the marketplace set by 'eBay site' above (e.g. USD on ebay.com, EUR on ebay.de).

## `buyingFormat` (type: `string`):

How the item is sold. Only one format applies at a time, matching eBay (which uses a single buying format). Leave as 'Any' to include all formats.

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

Item condition, matching eBay's advanced search. 'New' and 'Used' are broad and work across all categories.

## `freeShipping` (type: `boolean`):

Only show items with free shipping.

## `locatedIn` (type: `string`):

Only items physically located in this country. Different from 'Proxy country', which sets the IP location used to load eBay's localized pages.

## `availableTo` (type: `string`):

Only items that ship to this country. Different from 'Located in', which is where the item physically is.

## `sellers` (type: `string`):

eBay seller usernames (the seller's user ID), comma-separated, e.g. nike_store, best_deals_99. Use 'Sellers mode' below to keep only these sellers or to exclude them.

## `sellersMode` (type: `string`):

Whether the sellers above are included or excluded. Only takes effect when 'Sellers' is filled in.

## `listingUrls` (type: `array`):

List of eBay listing page URLs (e.g., https://www.ebay.com/sch/i.html?\_nkw=dresses or https://www.ebay.com/sch/i.html?\_from=R40&\_nkw=shoe&\_sacat=0\&Brand=Nike\&rt=nc\&Occasion=Wedding&\_dcat=93427)

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

How many result pages to scrape per URL. Each page has up to 240 items. Leave at 0 to scrape every page, or set a number to stop early (e.g. 5).

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

Order of the results, matching eBay's own "Sort" dropdown on the listing page. This setting overrides any sort order already present in your input URL.

## `proxyCountry` (type: `string`):

Which country's eBay results to load. eBay shows different prices, shipping, currency, and listings by country, so pick the country whose view you want (e.g. United States to see what a US shopper sees). This is different from the 'Located in' filter, which is where items are physically located.

## Actor input object example

```json
{
  "keywords": [
    "nike air max",
    "adidas ultraboost"
  ],
  "ebaySite": "www.ebay.com",
  "keywordMatch": "1",
  "searchTitleDescription": false,
  "category": "0",
  "minPrice": 25,
  "maxPrice": 200,
  "buyingFormat": "",
  "condition": "",
  "freeShipping": false,
  "locatedIn": "",
  "availableTo": "",
  "sellers": "nike_store, best_deals_99",
  "sellersMode": "1",
  "listingUrls": [
    "https://www.ebay.com/sch/260010/i.html?_from=R40&_nkw=shoe&Brand=Nike&Occasion=Wedding&_dcat=93427"
  ],
  "maxPages": 0,
  "sortBy": "12",
  "proxyCountry": "US"
}
```

# Actor output Schema

## `overview` (type: `string`):

Table view of eBay product listings using the 'overview' view from dataset_schema.json.

## `rawResults` (type: `string`):

All eBay product listing items from the default dataset without a specific view.

# 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": [
        "High-speed infrared sensor"
    ],
    "ebaySite": "www.ebay.com",
    "maxPages": 0,
    "sortBy": "12",
    "proxyCountry": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("delicious_zebu/ebay-product-listing-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": ["High-speed infrared sensor"],
    "ebaySite": "www.ebay.com",
    "maxPages": 0,
    "sortBy": "12",
    "proxyCountry": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("delicious_zebu/ebay-product-listing-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 '{
  "keywords": [
    "High-speed infrared sensor"
  ],
  "ebaySite": "www.ebay.com",
  "maxPages": 0,
  "sortBy": "12",
  "proxyCountry": "US"
}' |
apify call delicious_zebu/ebay-product-listing-scraper --silent --output-dataset

```

## MCP server setup

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