# eBay Product Reviews Scraper (`apt_marble/ebay-product-reviews-scraper`) Actor

Collect eBay's public product reviews to any depth: author, star rating, date, full text, verified-purchase flag, condition bought and seller. Add a per-product rating summary with the full star breakdown and sentiment tags. Choose the eBay site; no account or login needed.

- **URL**: https://apify.com/apt\_marble/ebay-product-reviews-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 review scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## eBay Product Reviews Scraper

Turn any list of eBay products into a clean, structured feed of their customer reviews. Paste eBay product numbers (ePIDs), product-page links, reviews-page links or ordinary listing links — mixed together is fine — and get back one row per written review: the reviewer, their star rating, the date, the full review text, whether it was a verified purchase, the condition they bought and who they bought it from. Add an optional per-product rating summary and you also get the overall score, the ratings total, the written-review total, the count at each star level and eBay's own sentiment tags. Built for anyone who needs eBay review data they can trust: sellers watching sentiment on the products they carry, brands tracking how their catalog is received, and analysts building rating and quality models.

### What you can do with it

- **Watch sentiment on the products you sell** — pull every public review for a watchlist of products, on a schedule, and diff each run against the last to catch new complaints early.
- **Compare products before you stock them** — line up overall score, ratings total, written-review total and the star breakdown side by side.
- **Read the reviews in the order that matters** — most relevant, most recent, highest rated first or lowest rated first, whichever fits the question you are asking.
- **Mine the lowest-rated reviews** for the recurring problems buyers report, with the exact condition purchased and seller attached to each one.
- **Track a brand's reception over time** by re-running on a schedule and following how the star breakdown and sentiment tags move.
- **Enrich a product database** with a trustworthy rating summary per product, including the sentiment tags eBay surfaces such as "Good sound quality".

### What you get

Two kinds of row. One row per written review:

```json
{
  "rowType": "review",
  "epid": "22054478105",
  "reviewId": "10000000308904921",
  "author": "jamdclegg.11",
  "authorProfileUrl": "https://www.ebay.com/usr/jamdclegg.11",
  "rating": 5,
  "title": "life-changing if you have ASD, get overstimulated; ill-fitting(ish) for small heads",
  "body": "disclaimer: I've never had NC headphones so I have nothing to compare these to...",
  "dateText": "Dec 09, 2022",
  "dateIso": "2022-12-09",
  "helpfulVotes": 2,
  "unhelpfulVotes": 0,
  "verifiedPurchase": true,
  "conditionPurchased": "refurbished",
  "soldBySeller": "buydig",
  "position": 1,
  "sortOrder": "most_relevant",
  "url": "https://www.ebay.com/urw/product-reviews/22054478105",
  "requestedInput": "https://www.ebay.com/p/22054478105",
  "resolvedFromItemId": null,
  "marketplace": "US",
  "scrapedAt": "2026-08-18T12:00:00.000Z"
}
```

And, when the rating summary is switched on, one summary row per product:

```json
{
  "rowType": "productSummary",
  "epid": "22054478105",
  "productName": "Sony WH-1000XM5 Wireless Noise Canceling Headphones - Black",
  "brand": "Sony",
  "model": "Sony WH-1000XM5",
  "mpn": "WH-1000XM5",
  "gtin13": "0027242923232",
  "aggregateRating": 4.7,
  "ratingsCount": 148,
  "writtenReviewsCount": 146,
  "histogram": { "5": 126, "4": 10, "3": 5, "2": 2, "1": 5 },
  "histogramPercent": { "5": 85.14, "4": 6.76, "3": 3.38, "2": 1.35, "1": 3.38 },
  "aspects": [
    { "label": "Good sound quality", "percent": 100 },
    { "label": "Comfortable", "percent": 100 },
    { "label": "Lightweight", "percent": 94 }
  ],
  "soldOut": false,
  "categoryPath": ["eBay", "Electronics", "Portable Audio & Headphones", "Headphones"],
  "imageUrl": "https://i.ebayimg.com/images/g/JOcAAOSwYhpjV3jd/s-l1600.jpg",
  "productUrl": "https://www.ebay.com/p/22054478105",
  "reviewsUrl": "https://www.ebay.com/urw/product-reviews/22054478105",
  "requestedInput": "https://www.ebay.com/p/22054478105",
  "resolvedFromItemId": null,
  "marketplace": "US",
  "scrapedAt": "2026-08-18T12:00:00.000Z"
}
```

### Input reference

| Setting | Type | Default | What it does |
| --- | --- | --- | --- |
| Products | list of text | — | The products whose reviews you want. An eBay product number (ePID), a product-page link (…/p/…), a reviews-page link (…/urw/…) and an ordinary listing link (…/itm/…) all work, mixed in the same list. Listing links are matched to their catalog product first; a listing that is not part of the eBay catalog has no reviews page and is reported as unavailable. Duplicates that point at the same product are collapsed. **Required.** |
| Review order | choice | `Most relevant` | The order eBay serves the reviews in: most relevant, most recent, highest rated first, or lowest rated first. Use "Most recent" for monitoring new feedback. |
| Maximum reviews per product | whole number | `100` | Stop after this many written reviews per product. Products with fewer reviews simply return what exists. Set 0 to skip review text entirely and collect only the rating summary. Maximum 5000. |
| Include the product rating summary | true/false | `true` | Add one summary row per product: name, brand, overall rating, ratings total, written-review total (a different number), the count at each star level and eBay's sentiment tags. |
| eBay site | choice | `United States` | Which country's eBay site to read. Reviews for the same catalog product can differ between sites, and results reflect the site you choose. |
| Parallel products | whole number | `4` | How many products to work on at the same time. Higher is faster; leave at 4 unless you have a reason. Maximum 10. |

Switching the summary off removes its row entirely rather than filling it with empty values, so you never pay for data you excluded.

### Output fields

**Review rows** (`rowType` = `review`)

| Field | Type | Description |
| --- | --- | --- |
| `rowType` | text | `review` for a written review, `productSummary` for the per-product summary. |
| `epid` | text | eBay's catalog product number the row belongs to. |
| `reviewId` | text | eBay's own identifier for the review. |
| `author` | text | The reviewer's public username. |
| `authorProfileUrl` | text | Link to the reviewer's public eBay profile. |
| `rating` | number | Star rating the reviewer gave, 1 to 5. |
| `title` | text | The review headline. |
| `body` | text | The full review text. |
| `dateText` | text | The date exactly as eBay displays it, e.g. "Dec 09, 2022". |
| `dateIso` | text | The same date in `YYYY-MM-DD` form, filled only when it reads cleanly. |
| `helpfulVotes` / `unhelpfulVotes` | number | How many people marked the review helpful or unhelpful. A shown zero is a real zero, not a blank. |
| `verifiedPurchase` | true/false | Whether eBay marks the review as a verified purchase. |
| `conditionPurchased` | text | The item condition the reviewer bought, such as new, pre-owned or refurbished. |
| `soldBySeller` | text | The seller the reviewer bought from. |
| `position` | number | The review's place in the order you chose. |
| `sortOrder` | text | The review order this run used. |
| `url` | text | Link to the reviews page the review sits on. |
| `requestedInput` | text | Exactly what you supplied for this product, so rows are easy to join back. |
| `resolvedFromItemId` | text | When you supplied a listing link, the listing number it was matched from; empty otherwise. |
| `marketplace` | text | The eBay site the row was collected from. |
| `scrapedAt` | text | When the row was collected. |

**Product summary rows** (`rowType` = `productSummary`)

| Field | Type | Description |
| --- | --- | --- |
| `productName` / `brand` / `model` / `mpn` / `gtin13` | text | Catalog details for the product, when eBay publishes them. |
| `aggregateRating` | number | The product's overall star rating. |
| `ratingsCount` | number | Total number of star ratings — this includes rating-only entries, so it is a larger figure than the written-review total. |
| `writtenReviewsCount` | number | Number of written reviews eBay publishes for the product — a different figure from the ratings total. |
| `histogram` | object | The count of ratings at each star level, 5 down to 1. |
| `histogramPercent` | object | The share of ratings at each star level. |
| `aspects` | list | eBay's summarised sentiment tags, such as "Good sound quality", each with the percentage of reviewers who agree. |
| `soldOut` | true/false | Whether the catalog product is currently shown as sold out. |
| `categoryPath` | list | The product's category trail. |
| `imageUrl` | text | The product's main image. |
| `productUrl` / `reviewsUrl` | text | Clean links to the product page and its reviews page. |

### Pricing

You pay per result, with no monthly minimum.

| What you are charged for | Price |
| --- | --- |
| Review scraped — one written review added to your dataset | **$1.00 per 1,000** |
| Product rating summary — one summary row with the full star breakdown and sentiment tags | **$2.00 per 1,000** |

**Worked example.** You follow 200 products, ask for up to 100 reviews each, and leave the rating summary on. That is up to 200 summary rows (200 × $0.002 = $0.40) plus the reviews actually found. If those products average 60 written reviews each, that is 12,000 review rows (12,000 × $0.001 = $12.00), so about **$12.40** for the run. Products with fewer reviews cost less, and a product with no written reviews costs nothing beyond its summary. Products eBay no longer publishes are reported in the run summary and are not charged.

### Limits & what this actor cannot do

- This returns the public written reviews eBay shows for a catalog product, together with the full star breakdown — not a private archive. What eBay serves openly is what you get.
- Only catalog products have a reviews page. An ordinary listing that is not part of the eBay product catalog has no reviews page, and is reported as unavailable rather than returned empty.
- The ratings total and the written-review total are different figures with different meanings — the ratings total counts rating-only entries, the written-review total counts reviews with text. Both are returned; neither substitutes for the other.
- Ratings, review counts and sold-out state are a snapshot at the moment of collection and keep changing afterwards.
- Some review dates are shown by eBay as text only ("Dec 09, 2022"); where the date reads cleanly it is also given in standard `YYYY-MM-DD` form, and left empty rather than guessed when it does not.
- Reviews for the same catalog product can differ between eBay sites; results reflect the site you select.
- Products that are removed, ended or unavailable are reported as unavailable rather than returned as empty rows.
- Speed depends on the size of the job and on eBay's own response times; no fixed speed is promised.
- eBay's terms govern automated access. You are responsible for using the data lawfully and in line with the source site's terms, and for handling any personal data in line with applicable privacy law.

### FAQ

**Do I need an eBay account?**
No. The actor reads only what eBay shows the public.

**Does it need my login or password?**
No. There is nothing to connect and nothing to configure — paste your products and press start.

**Can I schedule it?**
Yes. Schedule it hourly, daily or weekly from the Apify console, and each run writes a fresh dataset you can diff against the last one to spot new reviews.

**Is the data complete?**
It is complete for the reviews eBay publishes openly for a catalog product, together with the full star breakdown. eBay shows written reviews only for products in its catalog, so an ordinary listing that is not catalogued has no reviews page — the actor says so instead of guessing.

**Why do the ratings total and the review total differ?**
Because they count different things: the ratings total includes people who left a star rating with no text, while the written-review total counts only reviews that carry text. Both numbers are returned so you can use whichever one your analysis needs.

**Can I collect only the rating summary, without the individual reviews?**
Yes. Set the maximum reviews per product to 0 and leave the rating summary on, and each product returns just its summary row.

# Actor input Schema

## `products` (type: `array`):

The products whose reviews you want. Paste an eBay product number (ePID), a product page link (…/p/…), a reviews page link (…/urw/…) or a listing link (…/itm/…) — mixed freely in one list. Listing links are matched to their catalog product first; a listing that is not part of the eBay catalog has no reviews page and is reported as unavailable.

## `sort` (type: `string`):

The order eBay serves the reviews in. "Most recent" is the one to use for monitoring new feedback.

## `maxReviewsPerProduct` (type: `integer`):

Stop after this many written reviews per product. Products with fewer reviews simply return what exists. Set 0 to skip review text entirely and collect only the product rating summary.

## `includeProductSummary` (type: `boolean`):

Add one summary row per product: name, brand, overall rating, ratings total, written-review total (a different number), the count at each star level and eBay's aspect tags such as "Good sound quality".

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

Which country's eBay site to read. Reviews for the same catalog product can differ between sites.

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

How many products to work on at the same time. Higher is faster; leave at 4 unless you have a reason.

## Actor input object example

```json
{
  "products": [
    "https://www.ebay.com/p/22054478105"
  ],
  "sort": "most_relevant",
  "maxReviewsPerProduct": 100,
  "includeProductSummary": true,
  "marketplace": "US",
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

Every row this run produced — reviews and product summaries.

## `runSummary` (type: `string`):

What this run collected, and anything it could not read.

# 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 = {
    "products": [
        "https://www.ebay.com/p/22054478105"
    ],
    "sort": "most_relevant",
    "maxReviewsPerProduct": 100,
    "includeProductSummary": true,
    "marketplace": "US",
    "maxConcurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/ebay-product-reviews-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 = {
    "products": ["https://www.ebay.com/p/22054478105"],
    "sort": "most_relevant",
    "maxReviewsPerProduct": 100,
    "includeProductSummary": True,
    "marketplace": "US",
    "maxConcurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/ebay-product-reviews-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 '{
  "products": [
    "https://www.ebay.com/p/22054478105"
  ],
  "sort": "most_relevant",
  "maxReviewsPerProduct": 100,
  "includeProductSummary": true,
  "marketplace": "US",
  "maxConcurrency": 4
}' |
apify call apt_marble/ebay-product-reviews-scraper --silent --output-dataset

```

## MCP server setup

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