# eBay Multi-Marketplace Listing & Seller Data Scraper (`vexaloom-labs/ebay-multi-marketplace-listing-and-seller-data`) Actor

Search eBay listings by keyword or category across 8 marketplaces, with titles, prices, conditions, sellers, ratings, watch counts, sold counts and shipping costs.

- **URL**: https://apify.com/vexaloom-labs/ebay-multi-marketplace-listing-and-seller-data.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Multi-Marketplace Listing & Seller Data Scraper

Collect structured eBay data from eight country sites without cookies, logins, API keys or proxy setup. Five modes cover the whole buyer-side surface: keyword search, category browse, item details, seller feedback profiles, and store inventories. Every row is server-rendered data from the live site with prices, conditions, seller ratings, shipping, returns, item specifics and pagination across US, UK, Germany, France, Italy, Spain, Canada and Australia.

### What can you scrape?

| Mode | What it returns | Good for |
|---|---|---|
| **Keyword search** | Listings matching one or more queries, with filters and up to 240 rows per page | Price monitoring, assortment tracking, resale research |
| **Category browse** | Listings inside a category ID or `/b/` URL, optionally narrowed by a keyword | Category-wide price scans and new-arrival feeds |
| **Item details** | Full item page: JSON-LD product data, item specifics, seller, shipping, returns, images | Product enrichment and catalog building |
| **Seller profile** | Feedback score, positive percentage, 1/6/12-month positive-neutral-negative counts, member-since, store badge and recent feedback | Seller vetting, lead scoring, competitor research |
| **Store listings** | Active listings from a store or seller, enriched with store name, tagline, feedback percentage, items sold and followers | Store monitoring and inventory snapshots |

### Data source and access

The actor reads eBay's public server-rendered pages. eBay fronts its sites with Akamai Bot Manager, so a plain request from many IP ranges receives a generic error page. The actor first tries eBay directly, then transparently falls back to the public Google Translate website mirror of the same page. The mirror carries the identical DOM, JSON-LD, prices and currencies, so no data changes. There are **no cookies, no login, no API key and no Apify Proxy group** in the default path; a `proxy` input from older saved tasks is accepted and ignored.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search`, `browse`, `item`, `seller` or `stores` |
| `searchQueries` | string list | – | Keywords for search mode. One search per entry |
| `categories` | string list | – | Category IDs (for example `177`), `/b/` URLs or `_sacat` search URLs for browse mode |
| `browseKeyword` | string | – | Optional keyword to narrow a category |
| `itemIds` | string list | – | Item IDs or `/itm/` URLs for item mode |
| `sellerUsernames` | string list | – | Seller usernames or `/usr/` URLs for seller mode |
| `storeNames` | string list | – | Store names or `/str/` URLs for stores mode |
| `startUrls` | URL list | – | Shortcut: paste any eBay URLs and each is routed by type. Mixed search, category, item, seller and store URLs run together and share `maxItems` |
| `marketplace` | select | `US` | `US`, `GB`, `DE`, `FR`, `IT`, `ES`, `CA`, `AU` |
| `condition` | select | `""` | All, new, open box, manufacturer refurbished, seller refurbished, used, for parts |
| `buyingFormat` | select | `""` | Both, Buy It Now only, auctions only |
| `minPrice` / `maxPrice` | number | – | Price range in the marketplace currency |
| `sortBy` | select | `bestMatch` | Best match, price low/high, ending soonest, newly listed |
| `freeShipping` | boolean | false | Keep free shipping/delivery listings only |
| `returnsAccepted` | boolean | false | Keep listings that accept returns |
| `itemLocation` | select | `""` | Any location, domestic only, worldwide |
| `maxItems` | integer | 50 | Record cap across all sources (1–10,000) |
| `maxPages` | integer | 10 | Page cap per search/category/store (1–200) |
| `includeItemSpecifics` | boolean | true | Add the item-specifics table to item records |
| `includeRecentFeedback` | boolean | true | Add up to 25 recent feedback rows to seller records |

Legacy keys are mapped in code, not shown in the form: `keywords` and `query` become `searchQueries`, `startUrls` are routed by URL type, and `proxy` is ignored.

### Examples

#### Keyword search with filters

```json
{
  "mode": "search",
  "searchQueries": ["thinkpad", "macbook pro"],
  "marketplace": "GB",
  "condition": "used",
  "buyingFormat": "buyItNow",
  "minPrice": 200,
  "maxPrice": 900,
  "sortBy": "priceLowest",
  "maxItems": 120,
  "maxPages": 2
}
```

#### Browse a category

```json
{
  "mode": "browse",
  "categories": ["177", "https://www.ebay.de/b/PC-Laptops-Netbooks/177/bn_317584"],
  "marketplace": "DE",
  "maxItems": 240
}
```

#### Item, seller and store modes

```json
{
  "mode": "item",
  "itemIds": ["257633093777", "https://www.ebay.co.uk/itm/276493839365"],
  "includeItemSpecifics": true
}
```

```json
{
  "mode": "seller",
  "sellerUsernames": ["discountcomputerdepot"],
  "includeRecentFeedback": true
}
```

```json
{
  "mode": "stores",
  "storeNames": ["discountcomputerdepot"],
  "marketplace": "US",
  "maxItems": 60
}
```

### Output

Fields are omitted when eBay genuinely does not show them for a record; the actor never emits `null`, empty strings, empty lists or empty objects.

#### Listing and item fields

| Field | Description |
|---|---|
| `recordType` | `item`, `seller` or `store` |
| `id` / `itemId` | eBay item ID |
| `url` | Canonical item URL |
| `title`, `imageUrl`, `images` | Listing title and image URLs |
| `price`, `priceValue`, `priceCurrency` | Formatted price, numeric value and ISO currency |
| `wasPrice`, `wasPriceValue`, `discountPercent` | Original price and discount when shown |
| `condition`, `conditionDescription` | Item condition (localized card labels are normalized to eBay's English condition names) and the full condition explanation |
| `brand`, `model`, `mpn`, `gtin`, `color` | Product identifiers from JSON-LD |
| `seller`, `sellerFeedbackPercent`, `sellerFeedbackCount`, `sellerFeedbackScore` | Seller identity and reputation |
| `productRating`, `reviewCount` | Product star rating and number of ratings |
| `watchCount`, `soldCount`, `bids`, `timeLeft` | Demand and auction signals |
| `listingType`, `isBestOffer`, `isSponsored`, `programBadge` | Format, offers, sponsored flag and programme badge |
| `shippingCost`, `shippingCostValue`, `shippingCurrency`, `deliveryEstimate`, `shippingDestination` | Shipping data |
| `itemLocation`, `returns`, `returnDays`, `returnFees` | Location and returns policy |
| `quantityAvailable`, `quantitySold` | Stock and units sold |
| `paymentMethods` | Accepted payment methods |
| `itemSpecifics`, `sellerNotes` | Full item-specifics table and seller notes |
| `categoryPath` | Breadcrumb categories |
| `availability`, `startTime` | Stock state and listing start time |
| `marketplace` | Marketplace code |
| `storeName`, `storeUrl`, `storeTagline`, `storeFeedbackPercent`, `storeItemsSold`, `storeFollowers` | Store context on store-mode rows |
| `searchUrl`, `scrapedAt` | Source search URL and ISO scrape time |

#### Seller profile fields

| Field | Description |
|---|---|
| `sellerUsername`, `sellerProfileUrl` | Seller identity and feedback URL |
| `sellerFeedbackScore` | Lifetime feedback score |
| `positiveFeedbackPercent` | Positive feedback percentage for the last 12 months |
| `positiveFeedbackCount`, `neutralFeedbackCount`, `negativeFeedbackCount` | 12-month counts |
| `feedbackBreakdown` | Counts for the last 1, 6 and 12 months |
| `totalFeedbackReceived`, `automatedFeedbackCount` | Total and automated feedback |
| `memberSince`, `memberCountry` | Membership date and country |
| `isEbayStore`, `isTopRatedSeller`, `storeUrl` | Store and top-rated flags |
| `recentFeedback` | Up to 25 rows: comment, item title/ID, rating, buyer, price, when |

#### Store record fields (when a store has no active listings)

`recordType: "store"`, `storeName`, `storeUrl`, `storeTagline`, `storeFeedbackPercent`, `storeItemsSold`, `storeFollowers`, `storeListingCount`, `storeCategories`, `marketplace`, `scrapedAt`.

### Pages, limits and reliability

- Each result page asks for 60, 120 or 240 rows depending on the remaining record budget, up to eBay's 200-page search cap.
- Pagination stops on `maxItems`, `maxPages`, an empty page, a short page, a repeated page (no new IDs) or an explicit "no exact matches" page.
- Network errors, 403/429/5xx responses and throttle pages are retried with exponential backoff and jitter; the client switches between direct eBay and the public mirror automatically.
- Duplicate item IDs are removed across queries, categories, stores and mixed URL types; a richer item-detail row replaces a duplicate listing row.
- Localized condition, seller-feedback and shipping labels from the German, French, Italian and Spanish sites are normalized to the same English field values as the US, UK, Canadian and Australian sites.
- No wall-clock cut-off is used, so the actor does not silently return fewer rows than requested.

### FAQ

**Do I need cookies or an API key?** No. The actor never asks for credentials and does not use an eBay developer account.

**Do I need to configure a proxy?** No. If an old task still sends a `proxy` object, the actor logs that it is ignored and continues without it.

**Why do some listings lack watch or sold counts?** eBay only renders those counters on some cards and only above its own thresholds. Missing means the source did not show it.

**Can I scrape sold/completed listings?** Not without an eBay login, which this actor deliberately does not require. eBay serves a sign-in wall for `LH_Sold=1`/`LH_Complete=1`.

**How are prices represented?** `price` is the display string (`$339.99`, `£189.99`, `EUR 229,00`, `AU $375.00`); `priceValue` is the numeric value and `priceCurrency` the ISO code.

**How many rows can one run return?** Up to `maxItems` (maximum 10,000), subject to eBay's own 200-page ceiling per source. Split very large jobs by category, query or price range.

**Is this fast?** Listing modes use one HTTP request per page. Item mode uses one request per item. Seller and store modes add one profile/store request per source.

### Limitations

- Sold/completed listings are not available without an eBay account; the actor does not use cookies.
- eBay caps search pagination at 200 pages per query. For a broader sweep, split by category, keyword or price range.
- eBay stores show only a curated storefront plus the seller's active listings; ended listings are not part of a store inventory.
- Item descriptions are not included because eBay serves them from a separate signed frame; the structured specifics table is included instead.
- Some fields are category- or listing-conditional (bids, watchers, sold counts, GTIN, return policy). They are omitted for records where eBay does not display them.
- eBay does not render sponsored labels inside the card HTML on the German, Italian and Spanish sites, so `isSponsored` is reliable on the US, UK, Canadian, Australian and French sites and simply omitted elsewhere.
- Category browse uses the category name (from the ID page title or the `/b/` URL slug) as the search phrase because eBay's keywordless category page is a navigation page, not a listing river. If eBay blocks that category page from a run's IP, the actor falls back to eBay's broad `all` query inside the category; very unusual titles may then be missed, so narrow with `browseKeyword` for a precise sweep.
- Store statistics are shown only when eBay renders them on the storefront; sellers without a storefront return their active listings with store name and URL only.

# Actor input Schema

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

Choose a data surface: keyword search, category browse, item details, seller feedback or a store's active listings.

## `searchQueries` (type: `array`):

Keywords to search on the selected marketplace. One search per entry. Use quotes for exact phrases.

## `categories` (type: `array`):

Category IDs (for example 177) or eBay /b/ category URLs. Used in Browse mode.

## `browseKeyword` (type: `string`):

Optional keyword to narrow category browsing. Leave blank to browse the whole category.

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

eBay item IDs (for example 257633093777) or full /itm/ URLs. Used in Item details mode.

## `sellerUsernames` (type: `array`):

eBay seller usernames (for example discountcomputerdepot) or /usr/ profile URLs. Used in Seller profile mode.

## `storeNames` (type: `array`):

eBay store names or /str/ store URLs. Used in Store listings mode.

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

Legacy-friendly shortcut: paste search, category, item, seller or store URLs and each is routed to the right mode automatically. Ignored when the arrays above already cover that source.

## `marketplace` (type: `string`):

Country site used for searches and for inputs that are not already a URL.

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

Filter listings by condition. Leave on All conditions for every condition.

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

Show only Buy It Now listings, only auctions, or both.

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

Minimum item price in the marketplace's local currency.

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

Maximum item price in the marketplace's local currency.

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

How to order search results.

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

Keep only listings that advertise free shipping/delivery.

## `returnsAccepted` (type: `boolean`):

Keep only listings that accept returns.

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

Prefer items located in the marketplace country or show worldwide results.

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

Upper limit on item rows (or seller/store records) across all sources.

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

Stop after this many result pages per search, category or store. Each page holds up to 240 listings.

## `includeItemSpecifics` (type: `boolean`):

Add the full item-specifics table (brand, model, MPN, dimensions, features and other aspects) to item records.

## `includeRecentFeedback` (type: `boolean`):

Add up to 25 recent feedback entries with buyer, rating, price and date to seller records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "laptop"
  ],
  "categories": [],
  "itemIds": [],
  "sellerUsernames": [],
  "storeNames": [],
  "startUrls": [],
  "marketplace": "US",
  "condition": "",
  "buyingFormat": "",
  "sortBy": "bestMatch",
  "freeShipping": false,
  "returnsAccepted": false,
  "itemLocation": "",
  "maxItems": 2,
  "maxPages": 1,
  "includeItemSpecifics": true,
  "includeRecentFeedback": true
}
```

# Actor output Schema

## `items` (type: `string`):

Dataset containing item listings, item details, seller profiles and store records. The recordType field tells rows apart.

# 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 = {
    "mode": "search",
    "searchQueries": [
        "laptop"
    ],
    "marketplace": "US",
    "freeShipping": false,
    "returnsAccepted": false,
    "maxItems": 2,
    "maxPages": 1,
    "includeItemSpecifics": true,
    "includeRecentFeedback": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/ebay-multi-marketplace-listing-and-seller-data").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 = {
    "mode": "search",
    "searchQueries": ["laptop"],
    "marketplace": "US",
    "freeShipping": False,
    "returnsAccepted": False,
    "maxItems": 2,
    "maxPages": 1,
    "includeItemSpecifics": True,
    "includeRecentFeedback": True,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/ebay-multi-marketplace-listing-and-seller-data").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 '{
  "mode": "search",
  "searchQueries": [
    "laptop"
  ],
  "marketplace": "US",
  "freeShipping": false,
  "returnsAccepted": false,
  "maxItems": 2,
  "maxPages": 1,
  "includeItemSpecifics": true,
  "includeRecentFeedback": true
}' |
apify call vexaloom-labs/ebay-multi-marketplace-listing-and-seller-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/ebay-multi-marketplace-listing-and-seller-data"
        }
    }
}
```

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/viDUFMwWczdagyjtn/builds/4kE2H1DS8w7oBB0Z1/openapi.json
