# Whatnot Seller Reviews Scraper (`dami_studio/whatnot-reviews-scraper`) Actor

Written buyer reviews of any Whatnot seller, newest first: one row per seller with up to 500 reviews inside, or one row per review. Overall, shipping, packaging and accuracy ratings, text, date, reviewer and the seller's reply. No login. $0.93 per 1,000 seller rows.

- **URL**: https://apify.com/dami_studio/whatnot-reviews-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** E-commerce, Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 sellers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Paste Whatnot usernames or profile links and get each seller's written reviews**: one row per seller with up to
500 of its newest reviews inside, or one row per review if you'd rather. Every review carries its overall, shipping,
packaging and accuracy stars, what the buyer wrote and when, who wrote it, and the seller's reply.

Whatnot only lists reviews that have text. The rating count on a seller's profile also counts ratings left without a
word, so expect far fewer reviews than that number: a seller showing 6,747 ratings had 1,791 written reviews.

| | |
|---|---|
| **Input** | Whatnot usernames or profile links, up to 100 per run |
| **Output** | One row per seller holding up to 500 reviews (the default), or one row per review: overall, shipping, packaging and accuracy stars, text, date, reviewer and the seller's reply |
| **Ceiling** | 500 reviews in a seller row and 100 sellers a run; 20,000 reviews a run with one row per review |
| **Speed** | About 5 to 7 seconds for a seller row of 500 reviews; 4,700 to 5,700 reviews a minute one row each |
| **Account needed** | None from you |
| **Price** | $0.93 per 1,000 seller rows, each holding up to 500 reviews, or $0.95 per 1,000 reviews one row each. Flat on every plan. The free plan's $5 a month covers about 5,370 seller rows or about 5,260 reviews |

### 🔍 What Whatnot Seller Reviews Scraper does

You give it sellers and pick a shape. With **One row per** on **Seller**, each seller is a single row: its username,
rating and rating count once, then up to 500 of its newest reviews in a `reviews` list. That row costs the same
whether it holds 8 reviews or 500. On **Review**, every review is a row of its own with the seller's fields repeated
on it, priced per review.

Each review is checked before it goes in. It has to belong to the seller you asked for, it can't be a repeat, and
with a date set it has to be on or after it.

Big sellers have thousands of written reviews. One with about 66,000 ratings had 11,877, going back to August 2022.
A seller row takes the newest 500; one row per review goes as far back as you let it.

### 📋 What data you get from each Whatnot seller

| What you get | Field |
|---|---|
| The seller's username, overall rating, and how many ratings that rests on | `sellerUsername`, `sellerRating`, `sellerRatingCount` |
| A link to the seller's reviews page | `sellerReviewsUrl` |
| How many reviews the seller row holds, and the reviews themselves, newest first | `reviewsInRow`, `reviews` |
| The buyer's overall stars, and the shipping, packaging and accuracy questions | `overallRating`, `shippingRating`, `packagingRating`, `accuracyRating` |
| Whatnot's average of those four | `averageRating` |
| What the buyer wrote, and the seller's public reply | `text`, `sellerResponse` |
| When the review was left, and by whom | `reviewedAt`, `reviewerUsername` |
| Whatnot's own id for the review | `reviewId` |
| When the row was read | `scrapedAt` |

### ▶️ How to scrape Whatnot seller reviews

1. Open [Whatnot Seller Reviews Scraper](https://apify.com/dami_studio/whatnot-reviews-scraper) and click
   **Try for free**.
2. Paste usernames or profile links into **Sellers**, one per line.
3. Leave **One row per** on **Seller**, or switch it to **Review**.
4. Set **Reviews per seller** (500 fills a seller row), and **Reviews since** if you only want recent ones. Click
   **Start**.
5. Download the dataset as JSON, or read it through the Apify API.

Start it with no sellers to see the row shape first: one labelled sample row, not charged.

### 💰 How much does it cost to scrape Whatnot seller reviews?

**$0.93 per 1,000 seller rows**, each holding up to 500 reviews, and **$0.95 per 1,000 reviews** when you take one row per review. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 5,370 seller rows, or about 5,260 reviews.

Note rows and the sample row are free, and so are sellers with no written reviews or none since your date. If you set
a maximum charge for the run, it stops before anything it couldn't pay for.

On big sellers the shape decides the bill. The newest 500 reviews of that 66,000-rating seller cost $0.00093 as one
seller row and about $0.48 as 500 review rows. All 11,877 of them come to about $11.28.

### 📥 What you give it

```json
{
  "sellers": ["pokemonwizard", "unovagirls", "cardson6th"],
  "oneRowPer": "seller",
  "maxReviewsPerSeller": 500
}
```

| Field | Default | What it is |
|---|---|---|
| `sellers` | none, box starts at `pokemonwizard` | Usernames with or without the `@`, or links to a profile or its reviews page. Up to 100. The same seller twice is read once. |
| `oneRowPer` | `seller` | `seller`: one row per seller with its newest reviews inside. `review`: one row per review. |
| `maxReviewsPerSeller` | `100`, box starts at `50` | The most reviews from one seller, newest first, up to 20,000. A seller row holds 500 at most, so a bigger number counts as 500 there. |
| `maxReviews` | `1000`, box starts at `200` | One row per review only: the most reviews in the whole run, up to 20,000. Seller rows don't use it, since each seller is one row. |
| `reviewsSince` | none | Only reviews written on or after this. A date such as `2026-09-01`, or a span back from today: `30 days`, `2 weeks`, `6 months`, `1 year`. |

**Another date format is refused before the run starts**, so "last week" or "09/01/2026" won't run. A
date like 2026-04-31, or one in the future, stops the run before anything is fetched. A link to a listing or a show
isn't a seller, so it's skipped with a note and the run goes on.

### 📤 What you get back

A real seller row from a test run on 3 October 2026, cut to two of its 500 reviews:

```json
{
  "sellerUsername": "unovagirls",
  "sellerRating": 5,
  "sellerRatingCount": 6747,
  "sellerReviewsUrl": "https://www.whatnot.com/user/unovagirls/reviews",
  "reviewsInRow": 500,
  "scrapedAt": "2026-10-03T05:56:32.502Z",
  "reviews": [
    {
      "reviewId": "U2VsbGVyUmV2aWV3Tm9kZTo0ODgwMTc2NDA6NjgyMzExOToyNDQxNTM0MA==",
      "overallRating": 5,
      "averageRating": 5,
      "shippingRating": 5,
      "packagingRating": 5,
      "accuracyRating": 5,
      "text": "Card came in as shown & well protected during transport.",
      "sellerResponse": null,
      "reviewedAt": "2026-10-02T13:59:06.000Z",
      "reviewerUsername": "spacecowboy99"
    },
    {
      "reviewId": "U2VsbGVyUmV2aWV3Tm9kZTozNDQwNzQyODM6NjgyMzExOTo0MDcwOTYx",
      "overallRating": 5,
      "averageRating": 5,
      "shippingRating": 5,
      "packagingRating": 5,
      "accuracyRating": 5,
      "text": "Great cards, quality as stated, and quick shipping!! and they make some awesome lenticulars",
      "sellerResponse": "Thank you so much for your kind words. So glad you like the lenticular.",
      "reviewedAt": "2026-04-25T20:42:54.000Z",
      "reviewerUsername": "packm4n"
    }
  ]
}
```

One row per review gives rows like this one, from the same morning:

```json
{
  "reviewId": "U2VsbGVyUmV2aWV3Tm9kZTo0Mzc0OTA3Mzc6NjgyMzExOToxMzExNjMz",
  "sellerUsername": "unovagirls",
  "overallRating": 5,
  "averageRating": 5,
  "shippingRating": 5,
  "packagingRating": 5,
  "accuracyRating": 5,
  "text": "always a joy spending the evening with the unovagirls! thanks for always packaging my items with care and always having unique items for us buyers!",
  "sellerResponse": "Thank you & we appreciate you so much!!",
  "reviewedAt": "2026-08-18T22:40:27.000Z",
  "reviewerUsername": "zoayna",
  "sellerRating": 5,
  "sellerRatingCount": 6747,
  "sellerReviewsUrl": "https://www.whatnot.com/user/unovagirls/reviews",
  "scrapedAt": "2026-10-03T05:54:32.766Z"
}
```

| Field | How to read it |
|---|---|
| `reviewsInRow` | How many reviews the seller row holds. Fewer than you asked for means that's every written review the seller has, or every one since your date, unless a note row says the seller stopped short. |
| `sellerRatingCount` | Every rating the seller has, written or not, so it's well above the reviews you get. |
| `averageRating` | Whatnot's average of the four ratings, to one decimal. A review rating 2 overall, 4 for shipping, 1 for packaging and 5 for accuracy reads 3. |
| `text` | `null` on the rare review whose text is blank: 20 of 11,877 on one seller. |
| `sellerResponse` | The seller's public reply, or `null`. |
| `reviewedAt` | When the review was left, in UTC. |
| `reviewId` | Whatnot's own id for the review. It stays the same from run to run, so you can drop reviews you already have. |

### 🧾 Reading the output

| Row | How to spot it | Charged |
|---|---|---|
| A seller row | a `reviews` list and `reviewsInRow`, no `_diagnostic` or `_sample` | yes, once per row |
| A review row | a `reviewId` at the top level, no `_diagnostic` or `_sample` | yes, once per review |
| A note about a seller or an entry | `_diagnostic: true`, with a `code` and a `message` | no |
| The sample row | `_sample: true` | no |

The sample row is a real review in the shape you picked, and only turns up when you give no sellers.

| `code` | What happened |
|---|---|
| `SELLER_NOT_FOUND` | No Whatnot account has that username. |
| `NO_WRITTEN_REVIEWS` | The seller exists but has no reviews with text. |
| `NO_REVIEWS_SINCE` | Nothing was written on or after your date. |
| `STOPPED_EARLY` | Whatnot stopped handing over that seller's older reviews. What came before is in the dataset. |
| `PAGE_NOT_READ` | Part of the seller's list couldn't be read, so that seller stopped there. |
| `NOT_READ` | The seller couldn't be read at all this time. Try again later. |
| `INVALID_SELLER` | An entry that isn't a username or a profile link. |
| `BAD_INPUT` | The input can't work as given, so nothing was fetched. |

To keep only the data, drop the rows where `_diagnostic` is true. `RUN_REPORT` in the run's key-value store lists each
seller with its status, and why the run stopped.

**Seller rows are made for JSON and the API.** A CSV or Excel download stops at 2,000 columns, which cuts a seller
row off after its 199th review. For a spreadsheet, pick one row per review, or add `unwind=reviews` to the dataset's
API link to get one line per review with the seller's fields beside it.

### 💡 What people use it for

- Checking a seller before a big buy or a box break: their last 500 reviews and the replies, in one row.
- Comparing every seller in a category on shipping, packaging and accuracy. A hundred sellers is a hundred rows.
- Watching your own shop. Schedule it daily with **Reviews since** at `2 days` and keep the `reviewId`s you haven't
  seen.
- Feeding review text into sentiment analysis, one row per review.

From a search to a shortlist, in three runs:

1. Run [Whatnot Scraper](https://apify.com/dami_studio/whatnot-scraper) on a search word in your category and copy
   the `sellerUsername` column of its listing rows.
2. Paste those usernames here and sort the seller rows on `sellerRating` and `sellerRatingCount`.
3. Put the sellers you keep into Whatnot Scraper's `sellerUsernames` to see what each has listed now.

### 🚧 What it does not do

- **No ratings without words.** Whatnot doesn't list them. They are counted in `sellerRatingCount`.
- **No more than 500 reviews in a seller row.** For a full history, take one row per review, up to 20,000 a run.
- **No item or order.** A Whatnot review doesn't say what was bought or what it cost.
- **Nothing about the reviewer beyond the username.**
- **No rating filter.** Whatnot lists newest first and no other way, so filter on `overallRating` afterwards.
- **Not reviews a user left for others.** Only the reviews a seller received.
- **The very largest sellers can stop short.** Now and then Whatnot won't hand over the older reviews of a seller with
  hundreds of thousands of ratings. A free note row says how far it got; a short seller row is still charged as a row.

### 🧭 Which Whatnot scraper do you need?

| If you want | Use |
|---|---|
| Written reviews of Whatnot sellers, one row per seller or per review | This one |
| Whatnot listings, live shows, or seller profiles with followers and items sold | [Whatnot Scraper](https://apify.com/dami_studio/whatnot-scraper) |
| What things actually sold for on eBay | [eBay Sold Listings Scraper](https://apify.com/dami_studio/ebay-sold-listings-scraper) |
| Reviews of an online shop on Trustpilot | [Trustpilot Scraper](https://apify.com/dami_studio/trustpilot-scraper) |

### ❓ Questions people ask

#### Do I need a Whatnot account to get seller reviews?

No. No login and no API key, just the usernames.

#### Why are there fewer reviews than the rating count on the profile?

Whatnot's count covers every rating; its list holds the written ones, a sixth to a third of the ratings on the sellers
we tried. Open the seller's reviews page in a private browser window: what a logged-out visitor sees there is what
comes back.

#### Should I get one row per seller or one row per review?

Seller rows for many sellers at little cost. One row per review for more than 500 from one seller, for a
spreadsheet, or for just a few reviews.

#### Can I call it from code or connect it to an AI assistant?

Yes. The [API tab](https://apify.com/dami_studio/whatnot-reviews-scraper/api/python) has code for Python, JavaScript
and the command line. For Claude, ChatGPT or another MCP client, connect
`https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/whatnot-reviews-scraper`. Either way it runs on your
Apify account at the same price.

#### Is scraping Whatnot reviews legal?

The reviews are public, but reviewer usernames are personal data under GDPR and similar laws, and Whatnot's terms
restrict automated use, so have a reason and read them. Apify's
[write-up on scraping and the law](https://blog.apify.com/is-web-scraping-legal/) is a starting point; we are not
lawyers.

### 🆘 If something breaks

Open the **Issues** tab on the actor page and send the run ID and the usernames you used. The status message and
`RUN_REPORT` say which seller fell short.

# Actor input Schema

## `sellers` (type: `array`):

Whatnot usernames, with or without the @, or links to a seller's profile or reviews page. Up to 100 in one run.

## `oneRowPer` (type: `string`):

Seller: one row for each seller, holding its newest reviews, up to 500. Reviews per seller sets how many. You pay per seller row, however many reviews it holds. Review: one row for each review, and you pay per review.

## `maxReviewsPerSeller` (type: `integer`):

The most reviews from one seller, newest first. A seller row holds up to 500, so a bigger number fills it to 500. With one row per review, big sellers have thousands, so this is your main spending cap.

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

With one row per review: the most reviews in the whole run, across every seller. Each review returned is one charge. Seller rows don't use it, since each seller is one row.

## `reviewsSince` (type: `string`):

Only reviews written on or after this date. Write a date such as 2026-09-01, or a span back from today such as 30 days, 2 weeks, 6 months or 1 year. A date in any other format is refused before the run starts. Leave it empty for every review.

## Actor input object example

```json
{
  "sellers": [
    "pokemonwizard"
  ],
  "oneRowPer": "seller",
  "maxReviewsPerSeller": 50,
  "maxReviews": 200
}
```

# Actor output Schema

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

One row per seller with its newest reviews inside, or one row per written review, whichever you chose. Free rows marked \_diagnostic say when a seller wasn't found, had no written reviews, or stopped early.

## `report` (type: `string`):

What happened for each seller: reviews returned, pages read, whether a cap or your date stopped it, and why the run stopped.

# 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 = {
    "sellers": [
        "pokemonwizard"
    ],
    "maxReviewsPerSeller": 50,
    "maxReviews": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/whatnot-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 = {
    "sellers": ["pokemonwizard"],
    "maxReviewsPerSeller": 50,
    "maxReviews": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/whatnot-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 '{
  "sellers": [
    "pokemonwizard"
  ],
  "maxReviewsPerSeller": 50,
  "maxReviews": 200
}' |
apify call dami_studio/whatnot-reviews-scraper --silent --output-dataset

```

## MCP server setup

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