# eBay Seller Feedback Scraper (`w3crawler/ebay-feedback-profile-scraper`) Actor

Bounded public-page metadata baseline for the $0.5/1K 🔥 eBay Sellers Feedback Scraper inventory entry. Target-specific fields are not claimed without a verified target URL.

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

## Pricing

from $2.99 / 1,000 seller feedbacks

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Seller Feedback Profiles and Reviews

This Actor reads public eBay seller-feedback profile pages and returns typed profile aggregates plus recent feedback cards exposed by those pages. It accepts explicit `/fdbk/feedback_profile/` URLs or constructs public profile URLs from usernames. It uses bounded anonymous public requests only: no login, private API, hidden identity resolution, access-control bypass, CAPTCHA evasion, or fabricated feedback.

Actor page: [eBay Seller Feedback Profiles and Reviews on Apify](https://console.apify.com/actors/xKYbQ8TgxWzW7x7W8)

Public target: [eBay feedback profiles](https://www.ebay.com/fdbk/feedback_profile/)

#### Value and use cases

Use it for public seller-quality research, marketplace catalog research, seller monitoring, and e-commerce due diligence. Profile rows preserve the visible seller aggregates; feedback rows preserve the public comment, masked buyer context, item link, price text, relative date, and bounded image URLs when present. Stable `recordType` and `recordId` values make the mixed dataset safe to consume.

#### Product boundary

The Actor reports only what a public feedback profile page exposes at run time. It does not promise a complete lifetime feedback history, private buyer identity, hidden ratings, or a result when eBay blocks or changes the page. A source failure or an empty public page becomes a diagnostic row instead of a fabricated profile or review.

### Input

The input is a JSON object. Unknown top-level fields are rejected. Use `startUrls`, `usernames`, or both. Explicit URLs are processed before username-generated URLs, and duplicate normalized profile URLs are removed before `maxProfiles` is applied.

| Field                | Type and limits                                                                                           | Default       | Behavior                                                                                                        |
| -------------------- | --------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | Array of at most 50 objects with an eBay HTTP(S) feedback-profile `url`                                   | `[]`          | Public `/fdbk/feedback_profile/<username>` pages to inspect first.                                              |
| `usernames`          | Array of at most 50 values matching letters, numbers, `_`, `.`, or `-`; each is at most 100 characters    | `[]`          | Usernames used to construct profile URLs on `market`.                                                           |
| `market`             | `us`, `uk`, `de`, `fr`, `it`, `es`, `ca`, or `au`                                                         | `us`          | Host used only for username-generated profiles.                                                                 |
| `feedbackType`       | `seller`, `buyer`, or `all`                                                                               | `seller`      | Adds the corresponding public filter to username-generated URLs. Explicit URLs keep their own query parameters. |
| `maxProfiles`        | Safe integer from 1 to 50                                                                                 | `10`          | Global cap on unique profile pages after explicit URLs are placed first.                                        |
| `maxReviews`         | Safe integer from 1 to 200                                                                                | `50`          | Maximum feedback cards parsed from each fetched profile page.                                                   |
| `timeoutMs`          | Safe integer from 5,000 to 120,000                                                                        | `30000`       | Per-request timeout.                                                                                            |
| `maxRetries`         | Safe integer from 0 to 3                                                                                  | `1`           | Bounded retries for transient errors, HTTP 429, and HTTP 5xx.                                                   |
| `maxBytes`           | Safe integer from 100,000 to 10,000,000                                                                   | `5000000`     | Maximum response bytes retained per profile request.                                                            |
| `proxyConfiguration` | Standard Apify Proxy object; `useApifyProxy` is boolean and `proxyUrls` accepts at most 20 non-blank URLs | direct access | Enables Apify Proxy or custom proxy URLs.                                                                       |

#### Runnable input examples

Inspect one explicit public profile:

```json
{
  "startUrls": [
    {
      "url": "https://www.ebay.com/fdbk/feedback_profile/seller24"
    }
  ],
  "feedbackType": "seller",
  "maxProfiles": 1,
  "maxReviews": 25
}
```

Construct profiles from usernames on a marketplace:

```json
{
  "usernames": ["seller24", "camera_shop"],
  "market": "uk",
  "feedbackType": "all",
  "maxProfiles": 2,
  "maxReviews": 10
}
```

Combine explicit and generated profiles with bounded transport:

```json
{
  "startUrls": [
    {
      "url": "https://www.ebay.de/fdbk/feedback_profile/vintagestoree24"
    }
  ],
  "usernames": ["seller24"],
  "market": "de",
  "feedbackType": "seller",
  "maxProfiles": 2,
  "maxReviews": 5,
  "timeoutMs": 20000,
  "maxRetries": 0,
  "maxBytes": 2000000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

Use a custom proxy URL when the environment provides one:

```json
{
  "usernames": ["seller24"],
  "maxProfiles": 1,
  "maxReviews": 5,
  "proxyConfiguration": {
    "proxyUrls": ["http://proxy.example:8000"]
  }
}
```

### Output

The dataset mixes two normal row types and minimal diagnostics. Every normal row has `recordType`, a stable `recordId`, `url`, and `scrapedAt`; missing optional fields are omitted.

#### Profile rows

`recordType: "seller_profile"` rows describe the public profile aggregate. `url` is the public feedback-profile URL, and `username` is parsed from the visible page or the validated profile path when profile markup is present.

#### Feedback rows

`recordType: "feedback_entry"` rows describe one public feedback card. When a card exposes an item link, `url` and `itemUrl` point to that public listing; otherwise `url` remains the profile URL. The Actor does not fetch item pages for enrichment.

| Field                            | Meaning                                                                                       |
| -------------------------------- | --------------------------------------------------------------------------------------------- |
| `recordType`                     | `seller_profile` or `feedback_entry` for normal rows.                                         |
| `recordId`                       | Stable seller or feedback identifier for downstream deduplication.                            |
| `feedbackId`                     | Source feedback ID when the public card exposes one.                                          |
| `url`                            | Public source URL for the row.                                                                |
| `scrapedAt`                      | ISO timestamp of the parsed profile page.                                                     |
| `username`                       | Public seller username.                                                                       |
| `feedbackScore`                  | Visible aggregate feedback score on a profile row.                                            |
| `positiveFeedbackPercent`        | Visible positive-feedback percentage on a profile row, from 0 to 100.                         |
| `ratingsLast12Months`            | Visible positive, neutral, and negative counts when the aggregate table exposes them.         |
| `detailedSellerRatings`          | Visible detailed seller ratings, such as accurate description or shipping speed, from 0 to 5. |
| `reviewCountOnPage`              | Number of public feedback comment cards exposed on the fetched page.                          |
| `feedbackType`                   | Card sentiment: `positive`, `neutral`, or `negative`.                                         |
| `comment`                        | Public feedback comment text.                                                                 |
| `buyerMasked`                    | Masked buyer label shown by eBay.                                                             |
| `buyerFeedbackCount`             | Buyer feedback count when visible.                                                            |
| `verifiedPurchase`               | Whether the card visibly labels the purchase as verified.                                     |
| `itemTitle`, `itemId`, `itemUrl` | Public item information from the feedback card.                                               |
| `priceText`                      | Public price text from the card.                                                              |
| `relativeDate`                   | Public relative date text from the card.                                                      |
| `images`                         | At most five public image URLs found on the feedback card.                                    |
| `error`, `errorCode`             | Present only on a diagnostic row; normal rows do not contain them.                            |

Example profile row:

```json
{
  "recordType": "seller_profile",
  "recordId": "seller_profile:seller24",
  "url": "https://www.ebay.com/fdbk/feedback_profile/seller24",
  "scrapedAt": "2026-09-08T10:00:00.000Z",
  "username": "seller24",
  "feedbackScore": 315,
  "positiveFeedbackPercent": 99.8,
  "ratingsLast12Months": {
    "positive": 168,
    "neutral": 1,
    "negative": 0
  },
  "detailedSellerRatings": {
    "accurateDescription": 4.8,
    "reasonableShippingCost": 4.7,
    "shippingSpeed": 5,
    "communication": 5
  },
  "reviewCountOnPage": 25
}
```

Example feedback row:

```json
{
  "recordType": "feedback_entry",
  "recordId": "feedback_entry:seller24:3001",
  "feedbackId": "3001",
  "url": "https://www.ebay.com/itm/123456789012",
  "scrapedAt": "2026-09-08T10:00:00.000Z",
  "username": "seller24",
  "feedbackType": "positive",
  "comment": "Great seller",
  "buyerMasked": "a***b",
  "buyerFeedbackCount": 42,
  "verifiedPurchase": true,
  "itemTitle": "Vintage Camera",
  "itemId": "123456789012",
  "priceText": "USD 25.00",
  "relativeDate": "Last month",
  "itemUrl": "https://www.ebay.com/itm/123456789012"
}
```

Example profile-only fallback when the page exposes aggregates but no feedback cards:

```json
{
  "recordType": "seller_profile",
  "recordId": "seller_profile:quiet-seller",
  "url": "https://www.ebay.com/fdbk/feedback_profile/quiet-seller",
  "scrapedAt": "2026-09-08T10:00:01.000Z",
  "username": "quiet-seller",
  "reviewCountOnPage": 0
}
```

#### Diagnostics

Diagnostics contain exactly `url`, `error`, `errorCode`, and `scrapedAt`. They make blocked, failed, empty, or missing-target outcomes explicit and never claim that unavailable feedback is empty.

Example missing-target diagnostic:

```json
{
  "url": "https://www.ebay.com/fdbk/feedback_profile/",
  "error": "MISSING_PROFILES",
  "errorCode": "MISSING_PROFILES",
  "scrapedAt": "2026-09-08T10:00:02.000Z"
}
```

Example blocked-source diagnostic:

```json
{
  "url": "https://www.ebay.com/fdbk/feedback_profile/seller24",
  "error": "SESSION_WARMUP_BLOCKED",
  "errorCode": "SESSION_WARMUP_BLOCKED",
  "scrapedAt": "2026-09-08T10:00:03.000Z"
}
```

### Pagination, filtering, sorting, and source behavior

#### Profile selection and precedence

The Actor normalizes the input, keeps explicit `startUrls` first, appends URLs generated from `usernames`, removes duplicate normalized URLs, and truncates the combined list to `maxProfiles`. Username-generated URLs use the selected marketplace and add a public eBay filter for `feedbackType`: `RECEIVED_AS_SELLER`, `RECEIVED_AS_BUYER`, or `RECEIVED_AS_ALL`. `feedbackType` does not rewrite an explicit URL.

#### Pagination and limits

Each selected profile URL is fetched once. There is no `maxPages`, arbitrary pagination input, or hidden request queue. `maxReviews` limits the number of feedback cards parsed from that single public page; if eBay exposes fewer cards, fewer feedback rows are returned. The generated URL asks eBay for its recent sort (`RECENTV2`), while an explicit URL keeps its own source query. There is no user-configurable sort control.

#### Parsing, filtering, and deduplication

Profile aggregates come from visible public profile selectors such as the user line, overall rating table, detailed seller ratings, and feedback-card container. Feedback entries come from public card rows, including visible comments, sentiment labels, masked buyer text, verified-purchase labels, item links, prices, dates, and image URLs. The Actor does not make a second request to item pages and does not infer missing values.

Normal rows are stable by seller username for profiles and by source feedback ID plus username for feedback cards. When a feedback ID is absent, the Actor uses a bounded content-based hash of the public card fields. Duplicate profile URLs are removed before requests; the same public feedback ID is not intentionally emitted twice in one normalized profile response.

#### Proxy, blocked, empty, and partial runs

Direct access is the default. `proxyConfiguration.useApifyProxy: true` enables Apify Proxy, and non-empty `proxyUrls` are passed to Apify's proxy configuration. Proxy use is reported as `proxyUsed` in the run summary; it does not provide credentials or bypass a source decision. The Actor warms a normal public help page and uses bounded retries only; it does not use stealth or CAPTCHA evasion.

HTTP 401, 403, and 429 responses, common challenge markers such as `bm-verify` or `/_sec/verify`, and failed warm-up requests become diagnostics. A public profile page with no recognizable profile or feedback markup becomes `NO_PUBLIC_FEEDBACK_DATA`. A profile aggregate with zero visible feedback cards is still a normal `seller_profile` row when the page exposes profile markup. Other successful profiles remain in the dataset if a later profile fails, and the summary becomes `COMPLETED_WITH_DIAGNOSTICS` when any diagnostic is emitted.

### Run summary and downloads

The key-value store record `OUTPUT_SUMMARY` contains `status`, `hasData`, `normalRecords`, `diagnosticRecords`, `datasetItems`, `profileItems`, `reviewItems`, `diagnosticItems`, `uniqueItems`, `requestedProfiles`, `processedProfiles`, `proxyUsed`, `source`, and `finishedAt`. `processedProfiles` counts normal profile rows; `reviewItems` counts feedback rows. The status is `SUCCEEDED` only when no diagnostic rows were emitted, otherwise it is `COMPLETED_WITH_DIAGNOSTICS`.

Example `OUTPUT_SUMMARY`:

```json
{
  "status": "SUCCEEDED",
  "hasData": true,
  "normalRecords": 6,
  "diagnosticRecords": 0,
  "datasetItems": 6,
  "profileItems": 1,
  "reviewItems": 5,
  "diagnosticItems": 0,
  "uniqueItems": 6,
  "requestedProfiles": 1,
  "processedProfiles": 1,
  "proxyUsed": false,
  "source": "ebay-public-feedback",
  "finishedAt": "2026-09-08T10:00:04.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Cost and limits

Apify compute, network, proxy, and dataset-storage usage depends on the number of profiles, response sizes, retries, and emitted rows. The Actor does not promise a fixed current price in this README; check the [Actor page](https://console.apify.com/actors/xKYbQ8TgxWzW7x7W8) for the current account-visible pricing. The documented 50-profile and 200-review bounds are intentionally finite.

### Running the Actor

#### Apify Console

1. Open the [Actor page](https://console.apify.com/actors/xKYbQ8TgxWzW7x7W8).
2. Enter a valid input in the Input tab, using an explicit public profile URL or a username.
3. Run the Actor and inspect profile, feedback, and diagnostic rows in the Dataset tab.
4. Open the Key-value store and review `OUTPUT_SUMMARY` before exporting.

#### API and CLI

Use the Apify API with Actor ID `xKYbQ8TgxWzW7x7W8` or run the CLI from this directory:

```bash
npm install
apify call xKYbQ8TgxWzW7x7W8 --input-file test/inputs/default.json
```

#### Local development

```bash
npm install
npm run lint
npm test
apify validate-schema
apify run --purge --input-file test/inputs/default.json
npm run validate
```

The local test input is a bounded live public probe. A fixture or diagnostic-only run does not prove normal profile or feedback records; validate the actual dataset and summary from a fresh run. Generated `storage/` output is local run state and should not be committed.

### Troubleshooting

#### The run contains only diagnostics

Read `errorCode` and `OUTPUT_SUMMARY`. `SOURCE_BLOCKED`, `SESSION_WARMUP_BLOCKED`, and transport failures describe access or request problems; `NO_PUBLIC_FEEDBACK_DATA` means the fetched page had no recognizable public profile or feedback markup. Try a different public profile or a compliant proxy configuration, but do not add credentials or attempt to evade eBay controls.

#### A profile row is present but review rows are missing

The public profile can expose aggregates without feedback cards, or its current page can expose fewer cards than `maxReviews`. This is a truthful profile-only result, not evidence that the seller has no historical feedback.

#### The run returns fewer profiles than requested

Check duplicate URLs, `maxProfiles`, invalid usernames, source redirects, and diagnostics. Explicit URLs consume the cap before username-generated URLs. A source can also expose different markup by marketplace or access state.

### Privacy, legal, and affiliation

Public feedback comments, masked buyer labels, and seller aggregates may be personal data. You are responsible for a lawful purpose, respecting eBay's terms and access policies, complying with privacy and data-protection law, and honoring applicable deletion or opt-out requirements. Do not use this Actor to identify masked buyers or collect private/login-only data. This independent community Actor is not affiliated with, endorsed by, or sponsored by eBay Inc.

For defects or contract questions, use the [Issues tab on Apify](https://console.apify.com/actors/xKYbQ8TgxWzW7x7W8/issues) and include the input shape, run ID, summary, and diagnostic code without sharing private data.

# Actor input Schema

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

Public eBay /fdbk/feedback\_profile/ URLs.

## `usernames` (type: `array`):

eBay usernames used to construct public feedback profile URLs.

## `market` (type: `string`):

Marketplace used for username-generated profiles.

## `feedbackType` (type: `string`):

Filter generated profiles to all activity, buyer activity, or seller activity.

## `maxProfiles` (type: `integer`):

Maximum unique profiles processed.

## `maxReviews` (type: `integer`):

Maximum recent public feedback cards returned for each profile.

## `timeoutMs` (type: `integer`):

Bounded timeout per public request.

## `maxRetries` (type: `integer`):

Bounded retries for transient public request failures.

## `maxBytes` (type: `integer`):

Maximum bytes retained per profile response.

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

Optional standard Apify Proxy configuration; direct access is the default.

## Actor input object example

```json
{
  "startUrls": [],
  "usernames": [],
  "market": "us",
  "feedbackType": "seller",
  "maxProfiles": 10,
  "maxReviews": 50,
  "timeoutMs": 30000,
  "maxRetries": 1,
  "maxBytes": 5000000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/ebay-feedback-profile-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/ebay-feedback-profile-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 '{}' |
apify call w3crawler/ebay-feedback-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,w3crawler/ebay-feedback-profile-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/xKYbQ8TgxWzW7x7W8/builds/xFOfAmqG6nbQ0hJTp/openapi.json
