# Whatnot Seller Scraper (`parsebird/whatnot-seller-scraper`) Actor

Scrape Whatnot sellers, listings, live shows and categories: seller ratings, followers, sold count, buyer reviews, shop listings, prices, bids, viewers and seller leaderboards. Search by keyword, URL, username or category. Export JSON, CSV or Excel.

- **URL**: https://apify.com/parsebird/whatnot-seller-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 listings

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 Seller Scraper

Whatnot Seller Scraper extracts public data from [Whatnot](https://www.whatnot.com), the live shopping marketplace: seller profiles with ratings, followers, sold count and buyer reviews, shop listings with prices, live shows with viewer counts, and category insights with seller leaderboards.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword, paste search, listing, show, seller or category URLs, enter seller usernames, or pick a category. Filter listings by sale format, price and live status, and track price and stock changes between runs.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Use the Apify actor "parsebird/whatnot-seller-scraper" via the ApifyClient to scrape public Whatnot data. Example: client.actor("parsebird/whatnot-seller-scraper").call(run_input={"resultType": "sellerProfiles", "findBy": "sellerUsernames", "sellerUsernames": ["pokemonwizard"], "includeReviews": true, "includeShowHistory": true}). Inputs: resultType (string, default "listings"; one of listings, liveShows, sellerProfiles, categoryInsights, mixedSearch), findBy (string, default "keywords"; one of keywords, searchUrls, directUrls, sellerUsernames, category), keywords (array of strings; with sellerUsernames/seller URLs they search inside each seller's shop), searchUrls (array of {url}, whatnot.com/search URLs; filters and sort in the URL are kept), directUrls (array of {url}: /listing/, /live/, /user/ or /tag/ pages), sellerUsernames (array of usernames or seller IDs), category (string, category name or slug such as "Trading Card Games" or "pokemon_cards"), maxItems (integer, empty = all; split evenly across the three record types in mixedSearch), saleFormats (array: "auction", "buyNow"), minPrice / maxPrice (number), liveOnly (boolean), listingOrder (relevance, newest, priceLowToHigh, priceHighToLow), monitorChanges (boolean, marks listings new/changed/unchanged vs the previous run of the same search), includeReviews (boolean), maxReviewsPerSeller (integer, default 50), includeShowHistory (boolean), maxShowHistoryPerSeller (integer, default 20), maxShopListingsPerSeller (integer, default 20), categoryFilters (array of filter names from the category page such as "Live", "Upcoming", "Auction", "Breaks", "Singles", "Premier Shop", "United States"), categoryOrder (popular, viewerCount, livestreamCount, name, newest), leaderboardPeriod (today, week, live), maxShowsPerCategory (integer, default 20). Output records have recordType listing (listingId, title, description, condition, attributes, price {amount, currency, catalog}, currentBid, bidCount, quantity, availability, saleFormat, isLive, offersAvailable, createdAt, updatedAt, images, seller, category, listingUrl), liveShow (showId, title, status, startTime, viewerCount, watchlistCount, thumbnailUrl, tags, category, seller, showUrl), sellerProfile (sellerId, username, displayName, biography, followerCount, followingCount, soldCount, rating, reviewCount, averageShipDays, shipsFromCountry, isVerified, isPremierShop, isLive, shopListingCount, shopListings, reviews {items, distribution}, showCount, showHistory) or categoryInsight (category, parentCategory, rank, viewerCount, livestreamCount, subcategories, shows, sellerLeaderboard). In mixedSearch, live shows and seller profiles go to the "live-shows" and "seller-profiles" datasets. Pricing: pay per listing, live show and seller profile. Full API spec: https://apify.com/parsebird/whatnot-seller-scraper/api. Get an API token at https://console.apify.com/settings/integrations.
```

### What is Whatnot Seller Scraper?

**Whatnot Seller Scraper** is a Whatnot scraping tool and **Whatnot API alternative**. It collects four kinds of public Whatnot data in one Actor:

- **Seller profiles**: followers, sold count, seller rating, review count, average shipping days, Premier Shop status, shop listings, show history and **buyer reviews** with overall, shipping, packaging and accuracy stars
- **Listings**: title, description, condition, item attributes, price, current bid, quantity, sale format (auction or Buy It Now), images, seller and category
- **Live shows**: title, status (live or upcoming), start time, **live viewer count**, watchlist count, tags, category and host
- **Category insights**: viewer and live show counts per category, subcategories, the shows running now, and the **seller leaderboard** for today, this week or live

The easiest way to try it: click **Start** with the prefilled keyword `trading cards`. To look at a seller, set **What to scrape** to *Seller profiles*, **Find by** to *Seller usernames* and enter a username such as `pokemonwizard`.

### What can Whatnot Seller Scraper do?

- 🔎 **Five ways to find data**: keywords, Whatnot search URLs, direct page URLs, seller usernames, or a category name
- 🧑‍💼 **Seller research**: profile stats, the seller's shop, upcoming and recent shows, and up to 5,000 written buyer reviews per seller with a star distribution
- 🏷️ **Listing filters**: auction or Buy It Now, minimum and maximum price, only listings in a live show, and four sort orders (best match, newest, lowest and highest price)
- 📺 **Live show tracking**: live viewer counts and watchlist counts for shows running now and upcoming shows
- 📊 **Category insights**: every top-level Whatnot category ranked the way Whatnot ranks them, or one category with its subcategories, current shows and seller leaderboard
- 🔁 **Change monitoring**: run the same search on a schedule and get each listing marked `new`, `changed` (with the old price, quantity, status or bid) or `unchanged`, plus a list of listings that disappeared
- 🧩 **Mixed search**: listings, live shows and seller profiles for one keyword in a single run
- ⚙️ Runs on Apify: [schedule](https://docs.apify.com/platform/schedules) recurring runs, call it through the [API](https://docs.apify.com/api/v2), connect it to [integrations](https://apify.com/integrations) like Google Sheets, Slack, Zapier or Make, and export results as JSON, CSV, Excel, XML or HTML

### What data can you extract from Whatnot?

**Seller profiles** (`recordType: "sellerProfile"`)

| Field | Description |
|-------|-------------|
| `username`, `displayName`, `sellerId`, `profileUrl` | Seller identity and profile link |
| `followerCount`, `followingCount`, `soldCount` | Audience size and number of items sold, as shown on Whatnot |
| `rating`, `reviewCount` | Seller rating and Whatnot's total review count |
| `averageShipDays`, `shipsFromCountry` | Average days to ship and the country the seller ships from |
| `isVerified`, `isPremierShop`, `isLive`, `onVacation`, `badges` | Seller status flags and badges |
| `shopListingCount`, `shopListings` | Size of the seller's shop and its listings with price, format, quantity and status |
| `reviews.items` | Buyer reviews: overall, shipping, packaging and accuracy stars, text, seller reply, date and reviewer |
| `reviews.distribution` | Count and share of 1-5 star reviews among the collected written reviews |
| `showCount`, `showHistory` | The seller's shows with status, start time, viewers and watchlist count |

**Listings** (`recordType: "listing"`)

| Field | Description |
|-------|-------------|
| `title`, `subtitle`, `description`, `listingUrl` | Listing text and link |
| `condition`, `attributes` | Condition and item attributes such as set, grade, grading service or language |
| `price.amount`, `price.currency`, `price.catalog` | Asking price in the listing currency, and the linked catalog product |
| `currentBid`, `bidCount` | Highest bid and number of bids on auction listings |
| `saleFormat`, `quantity`, `availability`, `isLive`, `offersAvailable` | Auction or Buy It Now, stock, status, live status and whether offers are allowed |
| `createdAt`, `updatedAt` | When the listing was created and last updated |
| `seller`, `category`, `images` | Seller username, rating and review count, category, image URLs |

**Live shows** (`recordType: "liveShow"`): `title`, `status` (`PLAYING` = live, `CREATED` = upcoming), `startTime`, `viewerCount`, `watchlistCount`, `tags`, `tagLabels`, `category`, `seller`, `thumbnailUrl`, `showUrl`.

**Category insights** (`recordType: "categoryInsight"`): `category`, `parentCategory`, `rank`, `viewerCount`, `livestreamCount`, `subcategories` (each with viewers and show count), `shows`, `sellerLeaderboard` (rank, username, followers, sold count, live status), `leaderboardPeriod`.

### How to scrape Whatnot

1. Open [Whatnot Seller Scraper](https://apify.com/parsebird/whatnot-seller-scraper) in Apify Console.
2. Choose **What to scrape**: listings, live shows, seller profiles, category insights, or mixed search.
3. Choose **Find by** and fill in the matching field, for example keywords, a search URL from your browser, seller usernames, or a category name.
4. Set **Max results**, and optionally the listing filters, seller profile options or category options.
5. Click **Start** and wait for the run to finish.
6. Download the results from the **Output** tab as JSON, CSV, Excel, XML or HTML, or read them with the API.

**Input combinations that work**

| What to scrape | Find by | What you get |
|----------------|---------|--------------|
| Listings | Keywords or search URLs | Search results for each query |
| Listings | Seller usernames or seller URLs | Each seller's shop (keywords search inside the shop) |
| Listings | Category | Listings in the category and its subcategories |
| Listings | Direct URLs | Listing pages, seller shops and category listings |
| Live shows | Keywords, search URLs, seller usernames or category | Show search results, a seller's shows, or a category's live and upcoming shows |
| Seller profiles | Keywords | Sellers from Whatnot's user search |
| Seller profiles | Seller usernames or direct URLs | The sellers you list, or the sellers of the listings and shows you link |
| Seller profiles | Category | Hosts of the shows in the category |
| Category insights | Category, keywords or category URLs | One record per category; leave the category empty to get every top-level category |
| Mixed search | Any | Listings, live shows and seller profiles for the same input |

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `resultType` | string | No | `listings` | `listings`, `liveShows`, `sellerProfiles`, `categoryInsights` or `mixedSearch` |
| `findBy` | string | No | `keywords` | `keywords`, `searchUrls`, `directUrls`, `sellerUsernames` or `category` |
| `keywords` | array | Depends on `findBy` | — | Search terms. With seller usernames or seller URLs they search inside each seller's shop |
| `searchUrls` | array | Depends on `findBy` | — | `whatnot.com/search` URLs. Filters and sort order in the URL are kept |
| `directUrls` | array | Depends on `findBy` | — | Listing, live show, seller or category page URLs |
| `sellerUsernames` | array | Depends on `findBy` | — | Usernames (the part after `whatnot.com/user/`) or seller IDs |
| `category` | string | Depends on `findBy` | — | Category name or slug, e.g. `Trading Card Games`, `pokemon_cards`, `Sneakers` |
| `maxItems` | integer | No | all | Maximum records. In mixed search it is split evenly between the three record types |
| `saleFormats` | array | No | — | `auction`, `buyNow` |
| `minPrice`, `maxPrice` | number | No | — | Price range for listings |
| `liveOnly` | boolean | No | `false` | Only listings being sold in a live show right now |
| `listingOrder` | string | No | `relevance` | `relevance`, `newest`, `priceLowToHigh`, `priceHighToLow` |
| `monitorChanges` | boolean | No | `false` | Compare listings with the previous run of the same search |
| `includeReviews` | boolean | No | `false` | Add buyer reviews to seller profiles |
| `maxReviewsPerSeller` | integer | No | 50 | Reviews per seller (up to 5,000) |
| `includeShowHistory` | boolean | No | `false` | Add the seller's shows |
| `maxShowHistoryPerSeller` | integer | No | 20 | Shows per seller |
| `maxShopListingsPerSeller` | integer | No | 20 | Shop listings per seller profile; 0 skips the shop |
| `categoryFilters` | array | No | — | Filter names from the category page, e.g. `Live`, `Upcoming`, `Auction`, `Breaks`, `Singles`, `Graded`, `Premier Shop`, `United States`, a subcategory or a tag |
| `categoryOrder` | string | No | `popular` | `popular` (Whatnot's order), `viewerCount`, `livestreamCount`, `name`, `newest` |
| `leaderboardPeriod` | string | No | `today` | `today`, `week`, `live` |
| `maxShowsPerCategory` | integer | No | 20 | Shows listed inside each category insight |
| `proxyConfiguration` | object | No | — | Optional. The Actor connects directly and moves to Apify Proxy on its own if Whatnot refuses requests |

### Output example

A seller profile with buyer reviews and show history (shortened: shop listings, reviews and shows trimmed to one item each):

```json
{
  "recordType": "sellerProfile",
  "sellerId": "UHVibGljVXNlck5vZGU6MTExMjQ1",
  "username": "pokemonwizard",
  "displayName": "Wiz",
  "biography": "Yelling & Selling with thousands of CGC and PSA graded Pokemon Cards. Welcome to my page!",
  "followerCount": 306835,
  "followingCount": 775,
  "soldCount": 370288,
  "rating": 5,
  "reviewCount": 67075,
  "averageShipDays": 1,
  "shipsFromCountry": "US",
  "isVerified": false,
  "isPremierShop": true,
  "isLive": false,
  "onVacation": false,
  "profileUrl": "https://www.whatnot.com/user/pokemonwizard",
  "shopListingCount": 0,
  "shopListings": [],
  "reviews": {
    "items": [
      {
        "reviewId": "U2VsbGVyUmV2aWV3Tm9kZTo1MDkxMzU4OTI6MTExMjQ1OjM2MjU1OTY=",
        "rating": {
          "average": 5,
          "overall": { "value": 5, "label": "Overall" },
          "shipping": { "value": 5, "label": "Shipping" },
          "packaging": { "value": 5, "label": "Packaging" },
          "accuracy": { "value": 5, "label": "Accuracy" }
        },
        "text": "Arrived well packaged!",
        "reviewedAt": "2026-10-27T06:10:36.000Z",
        "reviewer": { "username": "luckbucket", "profileUrl": "https://www.whatnot.com/user/luckbucket" }
      }
    ],
    "distribution": {
      "cohort": "public_written_reviews",
      "reviewCount": 50,
      "sourceReportedReviewCount": 67075,
      "bins": [
        { "rating": 1, "count": 1, "share": 0.02 },
        { "rating": 2, "count": 0, "share": 0 },
        { "rating": 3, "count": 0, "share": 0 },
        { "rating": 4, "count": 1, "share": 0.02 },
        { "rating": 5, "count": 48, "share": 0.96 }
      ]
    }
  },
  "showCount": 3,
  "showHistory": [
    {
      "showId": "010db4e6-6157-4d12-a9b9-8402b2d2c56e",
      "title": "Rapid Fire Sudden Death Pokemon Slabs 🔥 ☠️",
      "status": "CREATED",
      "startTime": "2026-10-27T19:30:00.000Z",
      "viewerCount": 0,
      "watchlistCount": 360,
      "showUrl": "https://www.whatnot.com/live/010db4e6-6157-4d12-a9b9-8402b2d2c56e"
    }
  ],
  "retrievedAt": "2026-10-27T10:54:03.696Z"
}
```

A listing (image URL list shortened):

```json
{
  "recordType": "listing",
  "listingId": "TGlzdGluZ05vZGU6MjQ1MzEwNDY5NA==",
  "title": "Zapdos- Pokemon Rumble (2009) Stamp [RAW] 8/16",
  "subtitle": "Heavily Played ∙ Pokemon Rumble",
  "condition": "Heavily Played",
  "attributes": { "Condition": "Heavily Played", "Set": "Pokemon Rumble", "Language": "English", "Product Type": "Card" },
  "price": {
    "amount": 150,
    "currency": "USD",
    "catalog": { "productId": "UHJvZHVjdE5vZGU6NjM5MjQ1NzU3", "name": "Zapdos- Pokemon Rumble (2009) Stamp [RAW] 8/16" }
  },
  "quantity": 1,
  "availability": "ACTIVE",
  "saleFormat": "BUY_IT_NOW",
  "isLive": false,
  "offersAvailable": true,
  "createdAt": "2026-10-17T23:48:02.000Z",
  "updatedAt": "2026-10-17T23:48:03.000Z",
  "images": ["https://images.whatnot.com/eyJidWNrZXQiOi..."],
  "seller": {
    "username": "realpizzaking",
    "displayName": "rpk",
    "profileUrl": "https://www.whatnot.com/user/realpizzaking",
    "rating": 5,
    "reviewCount": 3381,
    "isVerified": false,
    "isPremierShop": true
  },
  "category": { "name": "Pokémon Cards", "slug": "pokemon_cards", "url": "https://www.whatnot.com/tag/pokemon_cards" },
  "listingUrl": "https://www.whatnot.com/listing/TGlzdGluZ05vZGU6MjQ1MzEwNDY5NA==",
  "retrievedAt": "2026-10-27T10:55:02.242Z"
}
```

A category insight (subcategories, shows and leaderboard trimmed):

```json
{
  "recordType": "categoryInsight",
  "category": { "name": "Pokémon Cards", "slug": "pokemon_cards", "url": "https://www.whatnot.com/tag/pokemon_cards" },
  "parentCategory": { "name": "Trading Card Games", "slug": "trading_card_games", "url": "https://www.whatnot.com/tag/trading_card_games" },
  "rank": 1,
  "viewerCount": 12777,
  "livestreamCount": 294,
  "leaderboardPeriod": "week",
  "sellerLeaderboard": [
    { "rank": 1, "username": "spacenarwhalz", "displayName": "Michael Granlund", "followerCount": 385584, "soldCount": 243571, "isLive": true },
    { "rank": 2, "username": "legacy_auction_house", "displayName": "Legacy Auction House", "followerCount": 453344, "soldCount": 1052643, "isLive": true }
  ],
  "retrievedAt": "2026-10-27T10:53:34.172Z"
}
```

### Use Whatnot Seller Scraper from Python or JavaScript

Install the client with `pip install apify-client` or `npm install apify-client`, and get your API token from [Apify Console](https://console.apify.com/settings/integrations).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/whatnot-seller-scraper").call(run_input={
    "resultType": "sellerProfiles",
    "findBy": "keywords",
    "keywords": ["graded pokemon"],
    "maxItems": 25,
    "includeReviews": True,
})

for seller in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(seller["username"], seller["followerCount"], seller["soldCount"], seller["rating"])
```

**JavaScript**

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

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/whatnot-seller-scraper').call({
    resultType: 'listings',
    findBy: 'keywords',
    keywords: ['psa 10'],
    saleFormats: ['buyNow'],
    minPrice: 50,
    listingOrder: 'newest',
    maxItems: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((l) => console.log(l.price.amount, l.price.currency, l.title, l.seller.username));
```

### Use cases

- **Competitor research for Whatnot sellers**: compare followers, sold counts, ratings, shipping speed and review sentiment of sellers in your niche.
- **Price research**: collect asking prices and current bids for cards, sneakers, comics or toys, sorted by newest or price.
- **Lead lists**: build lists of active sellers in a category from the category leaderboard and show hosts.
- **Category and trend tracking**: see which categories have the most viewers and live shows, and which sellers lead each one.
- **Reputation monitoring**: schedule a weekly run of your own profile to track new buyer reviews and the star distribution.
- **Stock and price alerts**: turn on change monitoring for a search or a seller's shop and get the listings whose price, quantity or status changed.

### How it works

1. The Actor reads the same public data the Whatnot website shows to visitors who aren't logged in.
2. Searches return up to 50 results per page. Whatnot's listing search stops near 1,000 results per query, so when you ask for more, the Actor continues the same search in other sort orders and skips listings it already saved.
3. Seller profiles are filled with the shop, reviews and shows in parallel, up to the limits you set.
4. Category insights combine the category's viewer and show counts, subcategories, the shows on the category page (with your filters) and the seller leaderboard.
5. With change monitoring on, each listing is compared with the copy saved by the previous run of the same search in a named key-value store, and a `MONITOR_SUMMARY` record lists new, changed, unchanged and no-longer-found listings.
6. The run stops at **Max results**, when Whatnot has no more results, or when your spending limit is reached.

### How much does it cost to scrape Whatnot?

Whatnot Seller Scraper uses pay-per-event pricing. You pay for each listing, live show and seller profile saved. Platform usage (compute and proxy) is included in the event price, so it isn't billed separately.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Listing | $0.99 / 1,000 | $0.89 / 1,000 | $0.79 / 1,000 | **$0.69 / 1,000** |
| Live show | $0.99 / 1,000 | $0.89 / 1,000 | $0.79 / 1,000 | **$0.69 / 1,000** |
| Seller profile | $0.99 / 1,000 | $0.89 / 1,000 | $0.79 / 1,000 | **$0.69 / 1,000** |

A seller profile is one charge, including its shop listings, reviews and show history. Category insight records are not charged. At Free plan prices, the prefilled run of 50 listings costs about $0.05, and 1,000 seller profiles cost $0.99. To control spending, use **Max results**. The run also stops when it reaches the maximum cost per run you set in Apify Console.

### Is it legal to scrape Whatnot?

Whatnot Seller Scraper only collects data that Whatnot shows publicly to visitors who aren't logged in: listings, shows, seller profiles and buyer reviews. It doesn't log in and doesn't access private account data, orders or messages. Seller profiles and reviews contain personal data, such as names and usernames. If you store or process that data you're responsible for complying with the GDPR, other privacy laws and Whatnot's terms of service. Consult a lawyer if you're unsure. For more background, read Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other marketplace scrapers from ParseBird

| Actor | What it does |
|-------|--------------|
| [eBay Sold Listings Scraper](https://apify.com/parsebird/ebay-sold-listings-scraper) | Sold prices and completed listings from eBay |
| [TCGplayer Scraper](https://apify.com/parsebird/tcgplayer-scraper) | Trading card prices and listings from TCGplayer |
| [Goldin Auction Scraper](https://apify.com/parsebird/goldin-auction-scraper) | Sports card and collectibles auction lots from Goldin |
| [Facebook Marketplace Scraper](https://apify.com/parsebird/facebook-marketplace-scraper) | Listings and sellers from Facebook Marketplace |
| [Mercari US Scraper](https://apify.com/parsebird/mercari-us-scraper) | Listings from Mercari US |
| [Depop Scraper](https://apify.com/parsebird/depop-scraper) | Listings, shops, sellers and reviews from Depop |
| [Vinted Scraper](https://apify.com/parsebird/vinted-scraper) | Search, category and seller listings from Vinted |

### FAQ

**Do I need a Whatnot account or API key?**
No. The Actor reads the same public data the Whatnot website loads for logged-out visitors, so no login, cookies or API key are needed.

**Why does a seller have fewer reviews in `reviews.items` than `reviewCount`?**
`reviewCount` is Whatnot's total of all ratings. Only reviews with written text are listed publicly, so `reviews.items` holds the written ones, and `reviews.distribution` shows both numbers (`reviewCount` and `sourceReportedReviewCount`).

**Are prices in US dollars?**
Each listing keeps the currency of its seller, for example USD, GBP, EUR, CAD, AUD or JPY, in `price.currency`. The minimum and maximum price filters use Whatnot's own price filter, which compares listings across currencies.

**Does the live show record include the current bid?**
No. Whatnot sends live bids to viewers of the stream in real time, not in the public page data. Auction listings in search results do include `currentBid` and `bidCount`.

**Why does `showHistory` contain mostly upcoming shows?**
It holds the shows Whatnot lists on the seller's profile, which are mainly scheduled shows and the current one.

**What does `rank` mean in category insights?**
It is the category's position in Whatnot's own popularity order among its sibling categories. Whatnot doesn't rank purely by the current viewer count, so set **Category order** to *Most viewers* if you want that order.

**Where are the live shows and sellers in a mixed search?**
Listings go to the default dataset. Live shows and seller profiles go to the `live-shows` and `seller-profiles` datasets of the same run, so each table has its own columns. Open them from the run's **Storage** tab or through the API.

**How does change monitoring know what changed?**
It keeps the last seen title, price, quantity, status, sale format, live status, current bid, bid count and offer setting of each listing per search. The next run with the same search and filters marks each listing `new`, `changed` (with `changedFields` and the `previous` values) or `unchanged`. Listings not seen for 30 days are forgotten.

**Can I schedule runs or send results to other tools?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) for recurring runs, and [integrations](https://apify.com/integrations) to send results to Google Sheets, Slack, Zapier, Make, webhooks and more. Every run is also available through the [API](https://apify.com/parsebird/whatnot-seller-scraper/api).

**Something isn't working. What should I do?**
Open an issue on the [Issues tab](https://apify.com/parsebird/whatnot-seller-scraper/issues) with the input you used. We read every report.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/whatnot-seller-scraper/changelog.md

# Actor input Schema

## `resultType` (type: `string`):

Pick the kind of Whatnot records to return. Mixed search returns listings, live shows and seller profiles for the same input.

## `findBy` (type: `string`):

Choose how to find records, then fill in the matching field below. Category insights work with category, keywords or category URLs (or leave the category empty to get every top-level category).

## `keywords` (type: `array`):

Enter one or more search terms, the same as typing them into Whatnot search. With seller usernames or seller URLs, the keywords instead search inside each seller's shop.

## `searchUrls` (type: `array`):

Paste Whatnot search result URLs such as https://www.whatnot.com/search?query=pokemon. Filters and sort order in the URL are kept for the matching search tab.

## `directUrls` (type: `array`):

Paste listing (/listing/...), live show (/live/...), seller (/user/...) or category (/tag/...) URLs.

## `sellerUsernames` (type: `array`):

Enter Whatnot usernames (the part after whatnot.com/user/) or seller IDs. Works for seller profiles, a seller's shop listings, or a seller's live shows.

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

Enter a Whatnot category name or slug, for example Trading Card Games, pokemon_cards or Sneakers.

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

Maximum number of records to save. Leave empty to collect everything Whatnot returns. In mixed search the limit is split evenly between listings, live shows and seller profiles.

## `saleFormats` (type: `array`):

Keep only listings sold this way.

## `minPrice` (type: `number`):

Keep listings at or above this price (in the listing currency, e.g. 10 for $10).

## `maxPrice` (type: `number`):

Keep listings at or below this price.

## `liveOnly` (type: `boolean`):

Keep only listings that Whatnot marks as being sold in a live show right now.

## `listingOrder` (type: `string`):

Order of listing results.

## `monitorChanges` (type: `boolean`):

Compare each listing with the previous run of the same search and mark it as new, changed (price, quantity, status, bids) or unchanged. A summary with listings no longer found is saved as MONITOR_SUMMARY.

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

Add public buyer reviews (star ratings for overall, shipping, packaging and accuracy, review text, seller reply, date and reviewer) with a star distribution.

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

Most reviews to collect for each seller when buyer reviews are included.

## `includeShowHistory` (type: `boolean`):

Add the seller's past and scheduled live shows.

## `maxShowHistoryPerSeller` (type: `integer`):

Most shows to list for each seller when show history is included.

## `maxShopListingsPerSeller` (type: `integer`):

Most shop listings to include in each seller profile. Set 0 to skip the shop.

## `categoryFilters` (type: `array`):

Filter the shows of a category by any filter on its Whatnot page, by name: Live, Upcoming, Auction, Breaks, Singles, Graded, Premier Shop, a country (United States), a subcategory or a tag. Applies to category insights and category live shows.

## `categoryOrder` (type: `string`):

Order of categories and subcategories.

## `leaderboardPeriod` (type: `string`):

Period of the category seller leaderboard, when Whatnot publishes one.

## `maxShowsPerCategory` (type: `integer`):

Most live and upcoming shows to list inside each category insight.

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

Not needed in most cases. The Actor connects directly and switches to Apify Proxy on its own if Whatnot starts refusing requests.

## Actor input object example

```json
{
  "resultType": "listings",
  "findBy": "keywords",
  "keywords": [
    "trading cards"
  ],
  "maxItems": 50,
  "liveOnly": false,
  "listingOrder": "relevance",
  "monitorChanges": false,
  "includeReviews": false,
  "maxReviewsPerSeller": 50,
  "includeShowHistory": false,
  "maxShowHistoryPerSeller": 20,
  "maxShopListingsPerSeller": 20,
  "categoryOrder": "popular",
  "leaderboardPeriod": "today",
  "maxShowsPerCategory": 20
}
```

# Actor output Schema

## `dataset` (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 = {
    "resultType": "listings",
    "findBy": "keywords",
    "keywords": [
        "trading cards"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/whatnot-seller-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 = {
    "resultType": "listings",
    "findBy": "keywords",
    "keywords": ["trading cards"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/whatnot-seller-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 '{
  "resultType": "listings",
  "findBy": "keywords",
  "keywords": [
    "trading cards"
  ],
  "maxItems": 50
}' |
apify call parsebird/whatnot-seller-scraper --silent --output-dataset

```

## MCP server setup

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