# Whatnot Scraper & Price Tracker - Sellers, Shows, Reviews (`neverempty/whatnot-scraper`) Actor

For resellers, collectors and Whatnot sellers tracking competitors: listings with price and current bid, live and upcoming shows with viewers, seller followers, items sold, rating and reviews. Monitoring returns only new listings, new shows and price changes. No login. Export to CSV or Excel.

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

## Pricing

from $1.00 / 1,000 result returneds

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

## Whatnot Scraper & Price Tracker - Sellers, Shows, Reviews

**Track Whatnot prices and competitor sellers on a schedule: listings with price and current bid, live and upcoming shows with viewer counts, and seller followers, items sold, rating and reviews, exported as CSV, Excel or JSON.** Search by keyword, list sellers by username, or paste Whatnot URLs. Turn on monitoring mode and each scheduled run returns only what is new or changed: new listings, newly scheduled shows, new reviews, and price, status or follower changes, with the previous value next to the new one.

Built for resellers, card and collectible dealers, and Whatnot sellers doing price checks and competitor research. No Whatnot account, login, cookies or proxy setup needed. The example input (one search term and one seller) returned 71 rows on 2026-10-14: 50 listings, 1 seller profile and 20 shows, in 4.6 seconds.

- **Everything in one run.** Search terms, seller usernames and Whatnot URLs can all be filled at once. Every row has a `type` column (`listing`, `show`, `seller`, `user`, `review`), so one export holds the lot and a filter splits it.
- **Seller stats plus what they sell.** Followers, items sold, seller rating, review count, average ship days and live status, then the seller's live and upcoming shows, shop listings and buyer reviews.
- **Live shows with viewers.** Title, live or upcoming, start time, viewers right now, how many people saved the show, categories and tags.
- **A watcher, not just a scraper.** Monitoring mode remembers what each input returned and sends only new or changed results, so a schedule every hour gives you a feed of new listings, new shows and price drops instead of the same rows again.
- **Exact prices.** Whatnot stores prices in cents; you get `price` in dollars and `priceCents` as Whatnot sent it, plus `currentBid` and `currentBidCount` for auctions.

### What people ask, and how this Actor answers

| You want to | Input | You get |
| --- | --- | --- |
| Price-check a card or product on Whatnot | `searchQueries: ["charizard psa 10"]`, `searchSort: "price-low"` | Listings with `price`, `currentBid`, `transactionType`, `quantity`, seller and seller rating |
| Find Whatnot sellers in a niche | `searchQueries: ["sneakers"]`, `searchVertical: "USER"` | Sellers with `followerCount`, `soldCount`, `sellerRating` |
| Track competitor sellers every day | `usernames: [...]`, `monitoringMode: true` | Only sellers whose followers, items sold, rating or review count changed, with the previous numbers |
| Get told when a seller schedules a show | `usernames: [...]`, `includeShows: true`, `monitoringMode: true` | One row per newly scheduled show, and a row when a show goes live |
| Watch a keyword for new listings and price drops | `searchQueries: [...]`, `searchSort: "newest"`, `monitoringMode: true` | New listings, and listings whose price or bid changed (`previousPrice`) |
| Export a seller's buyer reviews | `usernames: [...]`, `includeReviews: true`, `oldestReviewDate: "30 days"` | Overall, shipping, packaging and accuracy scores, review text, seller reply, date |
| See what is live now in a category | `searchQueries: ["pokemon"]`, `searchVertical: "LIVESTREAM"`, `searchSort: "most-viewers"` | Live shows ranked by viewers |

### Input

Fill any of the three sections. All of them run in one go.

**Search**

- `searchQueries` - search terms, each searched separately.
- `searchVertical` - `PRODUCT` (listings), `LIVESTREAM` (shows) or `USER` (sellers). Default `PRODUCT`.
- `searchSort` - `relevance` (all types), `newest`, `price-low`, `price-high` (listings), `most-viewers` (shows).
- `maxResultsPerQuery` - results per search term or search URL (default 50, up to 5,000). Not a run total.

**Sellers**

- `usernames` - usernames (`legacy_auction_house`, `@legacy_auction_house`) or profile URLs.
- `includeProfile` (default on), `includeShows` (default on), `includeShop` (default off), `includeReviews` (default off) - which parts to return per seller.
- `showStatus` - `all`, `live` or `upcoming` shows. `maxShows` - shows per seller (default 20).
- `shopQuery` - optional words to filter each seller's shop listings. `maxListings` - shop listings per seller (default 50).
- `maxReviews` - reviews per seller, newest first (default 50). `oldestReviewDate` - a date (`2026-10-01`) or a period (`30 days`, `12 hours`, `2 weeks`); reading stops at the first older review.

**Direct URLs**

- `startUrls` - profile (`/user/<name>`), show (`/live/<show id>`), listing (`/listing/<listing id>`) or search (`/search?query=...&searchVertical=...`) links from whatnot.com.

**Monitoring**

- `monitoringMode` - return only new or changed results (see below).
- `changeOn` - `new-or-changed` (default) or `new-only`.
- `resetMonitoringState` - forget everything remembered and start over (turn it off again after one run).

Example:

```json
{
    "searchQueries": ["pokemon booster box"],
    "searchVertical": "PRODUCT",
    "maxResultsPerQuery": 50,
    "usernames": ["legacy_auction_house"],
    "includeShows": true,
    "includeShop": true,
    "includeReviews": true,
    "maxReviews": 100,
    "oldestReviewDate": "30 days"
}
```

### Output

One row per result. Common columns: `type`, `id`, `url`, `input` (the search term, username or URL that produced the row), `inputType`, `scrapedAt`.

- **listing** - `title`, `subtitle`, `description`, `price`, `priceCents`, `currency`, `currentBid`, `currentBidCount`, `transactionType` (`BUY_IT_NOW` or `AUCTION`), `listingStatus`, `quantity`, `isLive`, `imageUrl`, `imageCount`, `productId`, `sellerUsername`, `sellerId`, `sellerRating`, `sellerReviewCount`.
- **show** - `title`, `showStatus` (`live` or `upcoming`), `startTime`, `viewers`, `watchlistCount`, `categories`, `tags`, `thumbnailUrl`, `sellerUsername`, `sellerId`.
- **seller** - `username`, `displayName`, `bio`, `followerCount`, `followingCount`, `soldCount`, `sellerRating`, `reviewCount`, `averageShipDays`, `isLive`, `isVerifiedSeller`, `isPremierShop`, `canGoLive`, `badges`, `profileImageUrl`.
- **user** (seller found by a search) - `username`, `followerCount`, `soldCount`, `sellerRating`, `reviewCount`, `isLive`.
- **review** - `averageRating`, `ratingOverall`, `ratingShipping`, `ratingPackaging`, `ratingAccuracy`, `reviewText`, `sellerResponse`, `reviewerUsername`, `reviewedAt`, `sellerUsername`.

A listing row looks like this (values shortened):

```json
{
    "type": "listing",
    "id": "2381982360",
    "url": "https://www.whatnot.com/listing/TGlzdGluZ05vZGU6MjM4MTk4MjM2MA==",
    "title": "Pokemon booster box CSV7",
    "price": 39,
    "priceCents": 3900,
    "currency": "USD",
    "transactionType": "BUY_IT_NOW",
    "listingStatus": "ACTIVE",
    "quantity": 15,
    "sellerUsername": "nick_bangz",
    "sellerRating": 5,
    "sellerReviewCount": 463,
    "input": "pokemon booster box",
    "inputType": "searchQuery"
}
```

### Monitoring mode: only new and changed results

Save your input as a task, schedule it (every hour, every day), and turn on `monitoringMode`.

- The **first run** returns everything once with `change: "new"` and remembers it.
- **Later runs** return only results that are new for that input, and with `changeOn: "new-or-changed"` also:
  - `price-changed` - a listing's price or current bid changed (`previousPrice`, `previousCurrentBid`),
  - `status-changed` - a listing's status or quantity, or a show's status, start time or title changed (`previousStatus`),
  - `stats-changed` - a seller's followers, items sold, rating or review count changed (`previousFollowerCount`, `previousSoldCount`).
- `changedFields` lists exactly which columns changed, and `previousCheckedAt` says when the result was last checked.
- When nothing changed, the run returns one free `no-change` row.

What is remembered is kept per input (search term, seller or URL) in your account, so the same listing can be new for one search and already known for another.

### FAQ

**How do I track Whatnot prices automatically?**
Save a search as a task with `searchSort: "newest"` and `monitoringMode: true`, then schedule it. Each run returns only new listings and listings whose price or current bid changed, with `previousPrice` and `previousCurrentBid` beside the new values.

**How do I get a Whatnot seller's followers, items sold and rating?**
Put the username or profile URL in `usernames`. The seller row has `followerCount`, `soldCount`, `sellerRating`, `reviewCount`, `averageShipDays` and `isLive`.

**How do I export Whatnot listings to Excel or CSV?**
Run a search, then open the run's **Export** button and pick CSV or Excel. Every row is flat, with a `type` column to filter listings, shows, sellers and reviews.

**How do I find out when a Whatnot seller schedules a live show?**
Add the seller to `usernames` with `includeShows: true` and `monitoringMode: true`, and schedule the task. Each newly scheduled show comes back as one row, and another row when it goes live. The task's **Integrations** tab can send those rows to Google Sheets, Slack or a webhook.

**How do I compare Whatnot sellers in my niche?**
Search with `searchVertical: "USER"` to list sellers for a keyword, then put the usernames you care about in `usernames` to get full profiles, shows, shop listings and buyer reviews side by side.

### Pricing

Pay per result: each returned row is one `result-returned` event, at the price shown on the **Pricing** tab. Rows that explain why nothing came back (not found, no results, invalid input, budget reached, no change) are free.

In monitoring mode, each result read and compared costs a small `result-checked` fee, changed or not, plus `result-returned` for the rows that come back. The Actor never reads more than the run's maximum total charge can pay for, and results it could not return are not remembered, so they arrive on the next run.

### Good to know

- Data is what Whatnot shows publicly to a visitor who is not logged in. Prices and bids are asking prices and live bids, not completed sale prices.
- Seller shows are the live and upcoming ones; Whatnot does not list a seller's past shows to visitors. Items sold during a show and their final prices need a login, so they are not included.
- Category leaderboards (top sellers per category) are not included.
- Whatnot returns at most 50 results per page; the Actor reads page after page up to your limits.
- Reviewer names are the public Whatnot usernames shown on the seller's review page. The Actor does not collect emails, phone numbers or addresses.
- A seller, show or listing that does not exist comes back as a free `not-found` row. If Whatnot does not answer after 3 tries, you get a free `blocked` row and nothing is guessed.
- Up to 100 inputs (search terms, usernames and URLs together) per run.
- Do not run the same monitoring input in two schedules at the same moment; the two runs can overwrite each other's memory.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

Words to search on Whatnot, e.g. "pokemon booster box" or "jordan 1". Each term is searched separately in the result type chosen below. Leave empty to skip search. If you fill none of the three sections, one example search is run (not in monitoring mode).

## `searchVertical` (type: `string`):

What a search term returns: PRODUCT = listings (buy it now and auctions) with price and seller, LIVESTREAM = live and upcoming shows with viewers, USER = seller accounts with followers and items sold.

## `searchSort` (type: `string`):

relevance = Whatnot's best match (works for every result type). newest, price-low and price-high work with listings. most-viewers works with live shows.

## `maxResultsPerQuery` (type: `integer`):

How many results each search term (and each search URL) returns at most. This is per term, not a run total: 3 terms x 50 = up to 150 rows. Results are read 50 at a time. Up to 5,000.

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

Whatnot usernames (e.g. legacy_auction_house) or profile URLs (https://www.whatnot.com/user/<name>). For each seller you get the profile row and, with the switches below, the seller's live and upcoming shows, shop listings and buyer reviews. Leave empty to skip.

## `includeProfile` (type: `boolean`):

One row per seller: followers, following, items sold, seller rating, review count, average ship days, verified and Premier Shop flags, whether the seller is live now.

## `includeShows` (type: `boolean`):

The seller's live and scheduled shows: title, live or upcoming, start time, viewers now, how many people saved the show, categories and tags. Whatnot lists only live and upcoming shows here, not past ones.

## `showStatus` (type: `string`):

all = live and upcoming shows, live = only shows that are live now, upcoming = only scheduled shows.

## `maxShows` (type: `integer`):

How many shows of each seller are returned at most. Up to 500.

## `includeShop` (type: `boolean`):

The seller's active shop listings (buy it now and auctions): title, price, current bid, quantity, status and image.

## `shopQuery` (type: `string`):

Optional words to filter each seller's shop listings, e.g. "psa 10". Empty = all shop listings.

## `maxListings` (type: `integer`):

How many shop listings of each seller are returned at most. Up to 2,000.

## `includeReviews` (type: `boolean`):

The seller's buyer reviews, newest first: overall, shipping, packaging and accuracy scores, review text, the seller's reply, the reviewer's public username and the date.

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

How many reviews of each seller are returned at most, newest first. Up to 2,000.

## `oldestReviewDate` (type: `string`):

Optional. A date (2026-10-01) or a period back from now ("30 days", "12 hours", "2 weeks"). Reviews older than this are not returned, and reading stops at the first older review. Empty = no date limit.

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

Paste Whatnot links: a profile (https://www.whatnot.com/user/<name>, read like a seller username above), a show (https://www.whatnot.com/live/<show id>), a listing (https://www.whatnot.com/listing/<listing id>) or a search (https://www.whatnot.com/search?query=<words>\&searchVertical=PRODUCT, LIVESTREAM or USER, sorted by best match). Leave empty to skip.

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

Off = every result comes back each run, charged per row. On = the Actor remembers what it returned for each search term, seller or URL and, on later runs, returns only new results (a new listing, a newly scheduled show, a new review, a new seller in a search) and, with the setting below, results whose price, status or stats changed, with the previous value. The first run returns everything once to set the baseline. In monitoring mode every result read costs a small check fee, changed or not, plus the row price for the rows returned. Do not put the same input in two schedules that can run at the same time.

## `changeOn` (type: `string`):

new-or-changed = when it is new, or when a listing's price, current bid, status or quantity, a show's status, start time or title, or a seller's followers, items sold, rating or review count changed. new-only = only results not returned before.

## `resetMonitoringState` (type: `boolean`):

Clears everything remembered by monitoring runs of this Actor in your account, so the next monitoring run returns every result once again. Turn it off again after one run: left on in a schedule, every run returns everything and charges for it.

## Actor input object example

```json
{
  "searchQueries": [
    "pokemon booster box"
  ],
  "searchVertical": "PRODUCT",
  "searchSort": "relevance",
  "maxResultsPerQuery": 50,
  "usernames": [
    "legacy_auction_house"
  ],
  "includeProfile": true,
  "includeShows": true,
  "showStatus": "all",
  "maxShows": 20,
  "includeShop": false,
  "maxListings": 50,
  "includeReviews": false,
  "maxReviews": 50,
  "monitoringMode": false,
  "changeOn": "new-or-changed",
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per result, with a type column: listing (title, price, current bid, bids, quantity, status, image, seller and seller rating), show (title, live or upcoming, start time, viewers, saves, categories, tags), seller (followers, items sold, rating, reviews, ship days), user (search result) or review (scores, text, seller reply, date). In monitoring mode, the previous price, status or stats. Not found, no results, invalid input and budget stops come back as free rows that say why.

# 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 = {
    "searchQueries": [
        "pokemon booster box"
    ],
    "usernames": [
        "legacy_auction_house"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/whatnot-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 = {
    "searchQueries": ["pokemon booster box"],
    "usernames": ["legacy_auction_house"],
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/whatnot-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 '{
  "searchQueries": [
    "pokemon booster box"
  ],
  "usernames": [
    "legacy_auction_house"
  ]
}' |
apify call neverempty/whatnot-scraper --silent --output-dataset

```

## MCP server setup

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