# eBay Scraper: Sold Prices, Listings, Details & Seller Reviews (`reviewly/ebay-scraper`) Actor

Scrape eBay sold prices, active listings, item details and seller reviews from 17 eBay sites. Search by keyword or paste any eBay URL. Get price, shipping, item specifics, GTIN/UPC, sold-price summaries and new-listing alerts. No eBay account, API key or code needed. Export to CSV, Excel or JSON

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

## Pricing

from $4.70 / 1,000 listing details

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper: Sold Prices, Listings, Details & Seller Reviews

**Get clean eBay data from 17 marketplaces in minutes: active listings, sold prices, item specifics and seller reviews. You don't need an eBay account, an API key or any coding.**

- 🔎 **Search any way you like.** Type keywords, upload a list of up to 500, or paste eBay URLs. Every filter you set on eBay is kept.
- 💰 **Sold and completed listings** for price research, with a summary row per search (median, average, sell-through rate).
- ⚡ **Fast or detailed.** Get up to 240 listings per request from the search results, or full item pages with item specifics, GTIN/UPC/EAN, variations and seller details.
- 🔔 **Monitoring.** Each run returns only new listings, and listings whose price changed are flagged.
- 🌍 **17 eBay sites**: US, UK, Germany, France, Italy, Spain, Canada, Australia and nine more.

***

### 📌 What does this eBay Scraper do?

This Apify actor scrapes eBay search results, item pages and seller feedback. It turns them into structured rows that you can download as JSON, CSV or Excel, or send to Google Sheets, a database or your own app through the Apify API.

**Who it's for:**

- **eBay sellers and resellers** checking what an item actually sells for before they list or buy.
- **E-commerce and pricing teams** tracking competitors' prices, stock and discounts.
- **Market researchers and analysts** measuring demand, sell-through and price trends for a product category.
- **Arbitrage and sourcing buyers** watching for new underpriced listings.
- **Developers** who need eBay data in a pipeline without maintaining their own scraper.

**Real-world examples:**

- "What did a used Rolex Submariner sell for on eBay in the last 30 days?"
- "Alert me to every new Lego 42115 listing under $300."
- "Export every listing from this eBay store, with brand, MPN and UPC."
- "Pull all negative reviews of this seller from the past year."

### ✨ Key features

- **Keyword search with eBay's filters**: condition, price range, sort order, auction / Buy It Now / Accepts offers, free shipping, returns accepted, seller and category.
- **Paste any eBay URL**: search results, sellers (`/usr/`), stores (`/str/`), category pages (`/b/`), single items (`/itm/`) and feedback profiles. Filters in the URL, such as item location or `Brand=Nike`, are kept.
- **Bulk keywords**: up to 500 searches in one run. Every row is tagged with the keyword that found it.
- **Sold and completed listings** with sold date and an accepted Best Offer flag, plus a **sold-price summary** per search.
- **Full item details**: item specifics, all images, brand / MPN / UPC / EAN / GTIN, variations, exact watchers and units sold, quantity available, shipping and returns, category path, start and end dates.
- **Deal and demand signals**: original price, discount, coupons, multi-buy offers, recent price drops, units sold, watchers.
- **Seller feedback**: one row per review, with sentiment, comment, buyer score, verified purchase and the item it was left on.
- **eBay Motors**: vehicle category presets, a model-year range, and a structured `vehicle` object (year, make, model, trim, mileage, VIN, transmission, fuel, title status).
- **Monitoring** of new listings and price changes between scheduled runs.
- **Ready-made table views** in the Apify Console: Overview, Vehicles, and Deals & demand.

### 🧠 Why choose this eBay scraper?

- **Sold data included.** eBay shows sold listings only to signed-in users. The actor handles that for you, so you never share your own eBay login.
- **Two speeds, two price points.** Fast mode reads 240 listings per request and suits price tracking at scale. Detailed mode reads every item page for complete product data. You pick per run.
- **Honest data.** A field eBay doesn't show is left out. A missing field means "not shown", never a made-up zero. Approximate counts such as "35.1K" are flagged as approximate.
- **You only pay for what you keep.** Rows removed by your title, date, year or feedback filters are dropped before they are charged. "No results" marker rows are free.
- **Built for eBay's bot checks.** It uses residential proxies in the marketplace's own country and handles eBay's browser check without running a browser. That keeps runs fast and cheap.
- **Clear run status.** If a search stops early, an item doesn't exist, or eBay returns nothing, the run's status message says so in plain words.

### ⚙️ Input configuration

Fill in **one** of these: **Search query**, **Search queries**, **Start URLs** or **Seller feedback profiles**. Every other field is optional.

#### What to scrape

| Field | What it does |
|---|---|
| `searchQuery` | One keyword search, e.g. `iphone 16 pro 256gb`. eBay syntax works: quotes for an exact phrase, a minus sign to exclude a word. |
| `searchQueries` | A list of keywords (up to 500). Each one runs as its own search with the same settings. |
| `startUrls` | eBay URLs from any supported site. Set your filters on eBay and copy the address bar. |
| `feedbackProfiles` | Seller usernames or feedback-profile URLs, for review scraping. |
| `marketplace` | Which eBay site to use (default `ebay.com`). It also sets the proxy country, so match it to your URLs. |
| `mode` | `active` (default), `sold` for sold and completed listings, or `both`. |

#### Data depth

| Field | Default | What it does |
|---|---|---|
| `detailedItems` | `true` | Reads each listing's item page for full details. Set it to `false` for fast rows from the search results. |
| `includeDescription` | `false` | Adds the seller's description as plain text (one extra request per item). |
| `includeLegacyFields` | `true` | Keeps eBay's raw page modules (`buy_box`, `semantic_data`, …) and `basic_info`. Set it to `false` for lean rows. |
| `includeSummary` | `true` | Adds a sold-price summary row to each sold search. |
| `categoryPageMode` | `exact` | For brand or curated `/b/` pages: `exact` reads the page itself, `keyword` searches the category plus the page title, `category` reads the whole category. |

#### Filters for keyword searches

| Field | Values |
|---|---|
| `condition` | `any`, `new`, `used`, `refurbished`, `open_box`, `certified_pre_owned`, `for_parts` |
| `minPrice` / `maxPrice` | Whole numbers in the marketplace currency |
| `sortBy` | `best_match`, `ending_soon`, `newest`, `price_asc`, `price_desc` |
| `listingType` | `all`, `auction`, `bin` (Buy It Now), `best_offer` |
| `freeShipping`, `returnsAccepted` | `true` / `false` |
| `seller` | One seller's username. With no keyword, returns everything they list. |
| `category` | eBay category ID, e.g. `9355` for Cell Phones & Smartphones |
| `motorsCategory` | eBay Motors preset, e.g. `6001` for Cars & Trucks |
| `minYear` / `maxYear` | Model-year range for vehicles, read from the start of the title |

#### Filters that apply to every search

| Field | What it does |
|---|---|
| `titleMustMatchQuery` | Keeps only titles that contain every word of the keyword. Near matches are dropped and not charged. |
| `titleMustInclude` | Keeps only titles that contain these words. Case, accents and punctuation are ignored, so `18V-55` matches `18v55`. |
| `soldWithinDays` | Sold mode: keeps only sales from the last N days (1–730). |
| `maxItems` | Maximum rows per search (default 1000). Each keyword and each URL counts as its own search. |

#### Monitoring

| Field | What it does |
|---|---|
| `monitoringMode` | Returns only listings not seen in earlier runs of the same search. |
| `enablePriceMonitoring` | Also returns seen listings whose price changed, with `previousPrice`. |

#### Seller feedback options

`feedbackSort` (`most_recent`, `most_relevant`), `feedbackReceivedAs` (`seller`, `buyer`, `both`), `feedbackRating` (`all`, `positive`, `neutral`, `negative`), `feedbackImagesOnly`, `feedbackExcludeAutomated`.

#### Performance

`maxConcurrency` (default 5), `maxRequestRetries` (default 20) and `proxy` (keep **RESIDENTIAL**).

#### Example inputs

Fast, low-cost active listings:

```json
{ "searchQuery": "mechanical keyboard", "detailedItems": false, "includeLegacyFields": false, "maxItems": 2000 }
```

Keyword search with filters:

```json
{ "searchQuery": "vintage rolex submariner", "condition": "used", "minPrice": 2000, "sortBy": "price_asc" }
```

Sold prices from the last 30 days:

```json
{ "searchQuery": "nintendo switch oled", "mode": "sold", "soldWithinDays": 30, "titleMustMatchQuery": true }
```

Filters copied from eBay (Nike running shoes located in Germany):

```json
{ "startUrls": [{ "url": "https://www.ebay.de/sch/i.html?_nkw=laufschuhe&Marke=Nike&LH_LocatedIn=1&_salic=77" }], "marketplace": "ebay.de", "detailedItems": false }
```

A keyword list with strict titles:

```json
{ "searchQueries": ["lego 42115", "lego 42143"], "titleMustMatchQuery": true, "maxItems": 200 }
```

Negative seller feedback:

```json
{ "feedbackProfiles": ["<seller>"], "feedbackRating": "negative", "maxItems": 500 }
```

eBay Motors:

```json
{ "searchQuery": "honda civic", "motorsCategory": "6001", "minYear": 2018, "maxYear": 2022, "condition": "used" }
```

#### 💡 Tips for best results

- **Use fast mode** (`detailedItems: false`) for price tracking and large keyword lists. It is much faster and cheaper.
- **Use `titleMustMatchQuery`** to stop eBay's "Results matching fewer words" from padding your data.
- **Set the marketplace to match your URLs** so you see local listings and shipping quotes.
- **Turn off `includeLegacyFields`** if you export to CSV or Excel and want fewer columns.

### 📤 Output format

You get one flat row per listing. Download it as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.

#### Sample listing row (detailed mode)

```json
{
  "itemId": "276582090868",
  "url": "https://www.ebay.com/itm/276582090868",
  "title": "Dyson V15 Detect Total Clean Extra | Yellow/Nickel | Refurbished",
  "price": "$369.99",
  "priceValue": 369.99,
  "currency": "USD",
  "condition": "Certified - Refurbished",
  "conditionId": "2000",
  "shipping": "Free delivery",
  "shippingType": "free",
  "shippingCost": 0,
  "totalPrice": 369.99,
  "itemLocation": "Located in United States",
  "sellerUsername": "dysonofficial",
  "sellerFeedbackScore": 179322,
  "sellerFeedbackPercentage": 99.2,
  "sellerHasStore": true,
  "sellerAccountType": "business",
  "originalPrice": "$749.99",
  "originalPriceValue": 749.99,
  "recentPriceDrop": true,
  "certifiedRefurbished": true,
  "quantitySold": 13797,
  "watchers": 9885,
  "itemSpecifics": { "Brand": "Dyson", "Model": "V15", "MPN": "448182-02", "…": "…" },
  "brand": "Dyson",
  "mpn": "448182-02",
  "upc": "885609036021",
  "images": ["https://i.ebayimg.com/images/g/…/s-l1600.jpg"],
  "categoryId": "20614",
  "categoryPath": "Home & Garden > Household Supplies & Cleaning > Vacuum Cleaners",
  "listingStatus": "ACTIVE",
  "startDate": "2024-08-05T15:59:44.000Z",
  "endDate": "2026-11-05T16:59:44.000Z",
  "searchQuery": "dyson v15",
  "searchUrl": "https://www.ebay.com/sch/i.html?_nkw=dyson+v15",
  "detailed": true,
  "scrapedAt": "2026-10-21T12:22:39.078Z"
}
```

#### Main fields

| Field | Meaning |
|---|---|
| `itemId`, `url`, `title` | eBay item number, link and title |
| `price`, `priceValue`, `currency` | Price as shown, as a number, and its currency |
| `shipping`, `shippingCost`, `totalPrice` | Shipping text, cost, and price plus shipping |
| `condition`, `conditionId` | eBay condition label and code |
| `sellerUsername`, `sellerFeedbackScore`, `sellerFeedbackPercentage` | Seller and their reputation |
| `sellerAccountType`, `sellerHasStore` | Business or private seller, and whether they have an eBay store |
| `originalPrice`, `discount`, `recentPriceDrop` | Deal signals |
| `quantitySold`, `watchers` | Demand signals |
| `itemSpecifics`, `brand`, `mpn`, `upc`, `ean`, `gtin` | Product identifiers for matching to your catalog |
| `bidCount`, `timeLeft`, `hasReservePrice` | Auctions only |
| `sold`, `soldDate`, `bestOfferAccepted` | Sold mode only |
| `vehicle` | eBay Motors listings: year, make, model, trim, mileage, VIN, and more |
| `searchQuery`, `searchUrl` | The search that found the row |

**Good to know:**

- **Fast vs detailed rows.** Fast rows have price, condition, shipping, location, image, seller name and feedback, auction data and deal signals. Detailed rows add item specifics, identifiers, all images, seller store and member-since date, exact watchers and units sold, variations, dates, category, shipping and returns details.
- **Cross-border listings** keep the seller's own price in `nativePriceValue` and `nativeCurrency`. `priceValue` holds eBay's conversion into the site's currency.
- **Near matches** that eBay adds under "Results matching fewer words" have `nearMatch: true`.
- **Price changes** in monitoring mode have `priceChanged: true` and `previousPrice`.

#### Sold-price summary row

Illustrative values:

```json
{
  "_analytics": true,
  "type": "sold-price-summary",
  "query": "nintendo switch oled",
  "marketplace": "ebay.com",
  "currency": "USD",
  "count": 187,
  "minPrice": 140,
  "maxPrice": 349.99,
  "averagePrice": 226.4,
  "medianPrice": 225,
  "recommendedPrice": 225,
  "totalSold": 2410,
  "totalActive": 1830,
  "sellThroughRate": 0.5684,
  "soldPerDay": 26.78
}
```

#### Seller feedback row

Fields: `seller`, `feedbackId`, `sentiment`, `comment`, `buyer` (masked by eBay), `buyerScore`, `automated`, `verifiedPurchase`, `imageCount`, `relativeTime`, `itemTitle`, `itemId`, `itemUrl`, `itemPrice`.

#### Marker rows (free)

A search with no results writes `{ "_searchMeta": true, "totalResults": 0, … }`, so you can tell "nothing found" from "not run". Skip rows that have `_searchMeta` or `_analytics` when you count listings.

### ▶️ How to use the eBay Scraper

1. **Open the actor** in the Apify Store and click **Try for free**.
2. **Choose what to scrape.** Type a keyword in **Search query**, or paste eBay URLs into **Start URLs**.
3. **Pick a marketplace and a listing mode**: Active, Sold / completed, or Both.
4. **Choose fast or detailed.** Leave **Fetch full item details** on for complete product data, or turn it off for speed.
5. **Set Max number of items** and click **Start**.
6. **Download your data** from the **Output** tab as CSV, Excel or JSON, or use the Overview, Vehicles and Deals & demand views.

#### Common workflows

- **Daily new-listing alerts.** Turn on `monitoringMode`, save the task, add a **Schedule** (for example every morning), and connect a Slack, email or webhook integration.
- **Weekly price comps.** Use `mode: "sold"` with `soldWithinDays: 7` and a keyword list, scheduled weekly, and export it to Google Sheets.
- **Competitor store export.** Paste the store URL (`https://www.ebay.com/str/<store>`) with detailed mode on.
- **API access.** Call the actor from Python, Node.js or any HTTP client with the Apify API, and read the dataset when the run finishes.

### 📈 Use cases

1. **Price research before you list.** Sold mode gives you the median sale price and sell-through rate, so you price to sell rather than guess.
2. **Competitor and MAP monitoring.** Track competitors' prices, discounts and stock every day, and catch resellers breaking your minimum advertised price.
3. **Arbitrage and sourcing.** Watch searches for new listings below a target price, and act before other buyers do.
4. **Market and product research.** Measure demand with units sold, watchers and sold-per-day across a category, a brand or a list of SKUs.
5. **Seller due diligence and lead lists.** Scrape seller feedback to check a supplier's reputation, or build a list of business sellers in a niche to contact.

### 🛠️ Advanced tips

- **Cost and speed.** Fast mode makes one request per 240 listings, while detailed mode makes one per listing. For thousands of keywords, use fast mode and run a detailed run only on the items you care about.
- **Proxy.** Keep the **RESIDENTIAL** group. If no country is set, the actor connects from the marketplace's country (US for ebay.com, GB for ebay.co.uk, DE for ebay.de, …). A connection from another country sees fewer listings and different shipping quotes.
- **Rate limits.** If the log shows HTTP 429, lower `maxConcurrency` to 3. Failed requests retry from a fresh IP.
- **Scaling.** Split very large keyword lists over several runs or tasks, and set a **maximum cost per run** in the run options to cap spend. The actor delivers the rows that fit, then stops cleanly.
- **Monitoring history** is stored per exact search URL in the key-value store `ebay-scraper-monitoring`. Changing the URL, even by adding a filter, starts a new history. Don't run two monitoring runs of the same search at once.
- **Category-only searches** (a category ID with no keyword, or a plain `/b/` page) are read from eBay's browse page, which returns detailed rows.

### 💵 Pricing

This actor uses pay-per-event pricing. You pay per result row, and the rates are shown on the actor's **Pricing** tab.

| Event | Charged for |
|---|---|
| `fast-item` | each fast listing row |
| `detailed-item` | each detailed listing row |
| `sold-item` | each sold / completed listing row |
| `sold-summary` | each sold-price summary row |
| `feedback-review` | each seller-feedback review row |

**Free Apify plan:** up to 700 results per calendar month (UTC), counted over all your runs. When you reach the limit, the run stops with a message that says when the allowance resets, and results already delivered are kept. Paid Apify plans have no monthly limit.

You are never charged for rows dropped by your filters, for "not found" items, for marker rows, or for sold searches that eBay refuses.

### ❓ FAQ and troubleshooting

**Do I need an eBay account or API key?**
No. Active listings, item pages and feedback are read from eBay's public pages. For sold listings, the actor uses its own signed-in session.

**Is scraping eBay legal?**
This actor collects publicly visible data. You are responsible for how you use it, including eBay's terms and data-protection laws such as GDPR. If you're unsure, ask a lawyer.

**My sold search returned no rows.**
eBay refused the signed-in session. The run's status message says so, and you were not charged for those searches. Active searches in the same run are not affected. Try again later or contact support.

**I got fewer results than eBay shows.**
eBay often reports an estimated total that is higher than the number of listings it actually serves. Also check that `marketplace` matches your URL's site, and that `titleMustMatchQuery` or your other filters aren't removing rows.

**Some fields are missing from a row.**
eBay doesn't show that information on that listing, or you're in fast mode. Turn on `detailedItems` for item specifics, identifiers and seller details.

**The feedback count looks rounded, e.g. 35.1K.**
In fast mode, eBay shows abbreviated counts on search cards, and those rows have `sellerFeedbackScoreIsApproximate: true`. Detailed rows have the exact number.

**The run says "Partial result".**
A search page kept failing after all retries, so that search stopped early. The message names the search and the page. Run it again, or lower `maxConcurrency`.

**My free run stopped at 700 results.**
That's the free plan's monthly allowance. It resets on the 1st of the month (UTC). Upgrading to a paid Apify plan removes the limit.

**Can I scrape a whole category without a keyword?**
Yes. Set `category`, or paste a `/b/` category URL. These are read from eBay's browse page as detailed rows.

**Which eBay sites are supported?**
ebay.com, ebay.co.uk, ebay.de, ebay.fr, ebay.it, ebay.es, ebay.ca, ebay.com.au, ebay.nl, ebay.at, ebay.ch, ebay.ie, ebay.pl, ebay.com.hk, ebay.com.my, ebay.ph and ebay.com.sg.

### 📞 Support

- **Questions or feature requests:** open an issue on the actor's **Issues** tab in the Apify Console.
- **Email:** <me@ahmedhrid.com>
- **Reporting a bug:** include the run ID (or a link to the run), the input you used, and what you expected. That's usually enough to reproduce it quickly.

Custom fields, another marketplace or a tailored data feed? Get in touch.

### Disclaimer

This actor is not affiliated with, endorsed by or sponsored by eBay Inc. It reads publicly available listing, search and feedback pages. Only sold searches use a signed-in eBay session. You are responsible for complying with eBay's terms and applicable data-protection law.

# Actor input Schema

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

eBay URLs from any of the 17 supported sites (ebay.com, ebay.co.uk, ebay.de, ebay.fr, ebay.it, ebay.es, ebay.ca, ebay.com.au, ebay.nl, ebay.at, ebay.ch, ebay.ie, ebay.pl, ebay.com.hk, ebay.com.my, ebay.ph, ebay.com.sg). Accepted: search results (/sch/i.html?…, and category searches /sch/<number>/i.html?…), sellers (/usr/<seller>), stores (/str/<store>), category pages (/b/<name>/<categoryId>/bn\_<id>), single items (/itm/<id>) and seller feedback (/fdbk/…).<br><br>Filters in a search URL are kept: set them on eBay and copy the address bar (item location, item specifics such as Brand=Nike, several conditions, accepts offers, free shipping, sellers to include or exclude). Other URL shapes are read from eBay's website, where Listing mode, fast mode and the keyword filters below do not apply. Set Marketplace to the site your URLs come from. Leave empty if you use Search query or Search queries.

## `searchQuery` (type: `string`):

Keyword(s) to search, e.g. "iphone 16 pro 256gb". Supports eBay search syntax (quotes for an exact phrase, minus to exclude). Combined with the marketplace, mode and filters below.

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

A list of keywords. Each keyword runs as its own search with the same Marketplace, Listing mode and filters, and Max number of items applies to each. Every row carries searchQuery (the keyword it came from) and searchUrl. A keyword listed twice (ignoring case and spacing) runs once. Up to 500 keywords per run. While this list is in use, the untouched example Start URL is ignored.

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

Which eBay site to search (affects currency, language of eBay's labels and inventory), and the country the actor connects from. A regional domain in a pasted URL picks the site for that URL, but the connection country still follows this setting, so set it to the site your URLs come from.

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

Active – current live listings (default).<br>Sold / completed – sold listings for price comps, plus one sold-price summary row per search. eBay shows sold results only to signed-in users; the actor reads them through a signed-in eBay session. If eBay refuses it, sold searches end with a clear message instead of rows (not charged).<br>Both – an active and a sold search for each search.

## `detailedItems` (type: `boolean`):

ON (default): each active listing's item page is read for item specifics, gallery images, seller details (store, business/private, member since), returns, exact sold and watcher counts, variations and product identifiers. One extra request per listing. OFF: rows come straight from the search results (price, condition, shipping and its cost, seller name and feedback, image, location), up to 240 per request — much faster and cheaper.

## `includeDescription` (type: `boolean`):

Adds a description field with the seller's own description as plain text. One extra request per item, detailed rows only.

## `includeLegacyFields` (type: `boolean`):

ON (default) keeps eBay's raw item-page modules (buy_box, semantic_data, about_this_item, …) on detailed rows and a copy of the search card under basic_info on every listing row. Turn OFF for lean, flat rows; every documented field stays and billing does not change.

## `categoryPageMode` (type: `string`):

How to scrape /b/<name>/<categoryId>/bn\_<id> pages. A page titled like its eBay category is always scraped through eBay's search. For brand, model and curated pages:<br>Exact page (default) – read the page itself (detailed rows only).<br>Add the page title as keywords – search the category plus the title words.<br>Whole category – search the entire category, ignoring the page's own filter.

## `soldWithinDays` (type: `integer`):

Sold / Both modes: keep only listings sold in the last N days. Older sales are not charged.

## `includeSummary` (type: `boolean`):

One analytics row per sold search (median / average / min / max price, sell-through rate, sold per day, recommended price). Charged as its own event.

## `titleMustMatchQuery` (type: `boolean`):

Keep only listings whose title contains every word of the search keyword (each search uses its own keyword, including a pasted URL's \_nkw). Near matches are dropped before they are written, so they are not charged.

## `titleMustInclude` (type: `string`):

Keep only listings whose title contains every word given here. Overrides Title must match the search keyword. Ignores case, accents and punctuation, so 18V-55 and 18v55 are the same.

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

Filter by item condition (keyword searches only).

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

Lower price bound in the marketplace currency (keyword searches only).

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

Upper price bound in the marketplace currency (keyword searches only).

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

Result order for keyword searches.

## `listingType` (type: `string`):

Buying format (keyword searches only).

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

Keyword searches only.

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

Keyword searches only.

## `seller` (type: `string`):

Limit keyword searches to one seller's username (eBay \_ssn). With no keyword, returns everything that seller lists. It does not filter pasted Start URLs; add \_ssn=<seller> to a URL instead.

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

Limit keyword searches to an eBay category by numeric ID (eBay \_sacat), e.g. 9355 for Cell Phones & Smartphones. Takes precedence over the eBay Motors preset.

## `motorsCategory` (type: `string`):

Limit keyword searches to an eBay Motors category (ebay.com category tree). Ignored when Category ID is set.

## `minYear` (type: `integer`):

Vehicles: lowest model year to keep, read from the year at the start of each title. Listings whose title does not start with a year are kept.

## `maxYear` (type: `integer`):

Vehicles: highest model year to keep. Same rule as Min model year.

## `monitoringMode` (type: `boolean`):

Returns only listings not seen in earlier runs of the same search. History is kept per exact search URL in a named key-value store, so changing a URL starts a new history. The first run returns up to Max number of items and records every listing it read. Do not run two monitoring runs of the same search at once.

## `enablePriceMonitoring` (type: `boolean`):

With monitoring mode, also returns seen listings whose price changed, flagged priceChanged: true with previousPrice.

## `feedbackProfiles` (type: `array`):

Seller usernames or feedback-profile URLs, e.g. <seller> or https://www.ebay.com/fdbk/feedback_profile/<seller>. One row per review. Max number of items caps reviews per seller.

## `feedbackSort` (type: `string`):

Feedback scraping only.

## `feedbackReceivedAs` (type: `string`):

Feedback received as a seller, as a buyer, or both (feedback scraping only).

## `feedbackRating` (type: `string`):

Only reviews with this rating (feedback scraping only).

## `feedbackImagesOnly` (type: `boolean`):

Feedback scraping only.

## `feedbackExcludeAutomated` (type: `boolean`):

Hide eBay's auto-generated feedback (feedback scraping only).

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

Maximum rows per search: each keyword, the Search query and each Start URL is its own search (and in Both mode its active and sold halves each get this many). Also caps reviews per feedback profile. URLs read from eBay's website share one limit.

## `maxConcurrency` (type: `integer`):

Requests in flight at once, each on its own connection. Lower it (e.g. 3) if eBay rate-limits (HTTP 429).

## `minConcurrency` (type: `integer`):

Kept for compatibility; the actor runs Max concurrency connections.

## `maxRequestRetries` (type: `integer`):

Retries of a failed request, each from a fresh connection. Rate-limit (HTTP 429) retries count too. Values below 12 are raised to 12.

## `proxy` (type: `object`):

Keep RESIDENTIAL. The country is set to the Marketplace's country when left empty; eBay shows a connection from another country fewer listings and other shipping quotes.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.ebay.com/sch/i.html?_nkw=baseball+caps&_sacat=0&LH_BIN=1"
    }
  ],
  "searchQuery": "iphone 16 pro",
  "marketplace": "ebay.com",
  "mode": "active",
  "detailedItems": true,
  "includeDescription": false,
  "includeLegacyFields": true,
  "categoryPageMode": "exact",
  "includeSummary": true,
  "titleMustMatchQuery": false,
  "condition": "any",
  "sortBy": "best_match",
  "listingType": "all",
  "freeShipping": false,
  "returnsAccepted": false,
  "motorsCategory": "none",
  "monitoringMode": false,
  "enablePriceMonitoring": false,
  "feedbackSort": "most_recent",
  "feedbackReceivedAs": "seller",
  "feedbackRating": "all",
  "feedbackImagesOnly": false,
  "feedbackExcludeAutomated": false,
  "maxItems": 1000,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every row in a table of the main listing fields: title, price, condition, shipping, seller, auction data and the search that found it.

## `deals` (type: `string`):

Reference price, discount, coupons, multi-buy offers, recent price drops, units sold and watchers per listing.

## `vehicles` (type: `string`):

eBay Motors listings with year, make, model, trim, mileage, VIN, transmission, fuel and title status.

## `allFields` (type: `string`):

Every row with all its fields, including item specifics, images, sold-price summary rows (\_analytics) and seller-feedback rows. Skip rows with \_searchMeta or \_analytics when counting listings.

# 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=baseball+caps&_sacat=0&LH_BIN=1"
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reviewly/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=baseball+caps&_sacat=0&LH_BIN=1" }],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("reviewly/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=baseball+caps&_sacat=0&LH_BIN=1"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call reviewly/ebay-scraper --silent --output-dataset

```

## MCP server setup

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