Whatnot Scraper avatar

Whatnot Scraper

Pricing

from $0.80 / 1,000 whatnot results

Go to Apify Store
Whatnot Scraper

Whatnot Scraper

Scrape Whatnot listings, live shows, sellers, and categories in one dataset. Track viewer and show-count stats over time, monitor only new or changed items, and add an AI Fair Value estimate for Pokémon cards. No account needed.

Pricing

from $0.80 / 1,000 whatnot results

Rating

0.0

(0)

Developer

Phantom Coder

Phantom Coder

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Scrape listings, live shows, sellers, reviews, and category demand from Whatnot in one flat dataset - with monitor mode for an ongoing feed of changes, and category snapshots that show where demand is moving run over run. No Whatnot account or API key required.


Who is this for

  • Resellers and dropshippers tracking a keyword or a seller's shop daily for new or repriced listings, without refreshing Whatnot by hand
  • Category and trend researchers watching viewer counts and live-show counts for a niche (for example pokemon_cards) to spot when demand is rising or falling
  • Lead generation and competitor research teams building seller lists with follower counts, ratings, and sold counts for a keyword or category
  • Collectors and investors pulling Pokémon single-card listings with an AI-powered fair value estimate to spot underpriced copies

Why it's different

Most Whatnot scrapers return one shape of data for one mode: a keyword search, or a seller profile, or a category feed. This Actor combines all of them into one dataset with a recordType column, so a single run (or a single schedule) can cover a keyword search, a seller's shop, and a category's demand at once - and adds two things none of the alternatives combine: category and live-show stats tracked over time, and monitor mode.

For example, scheduling this Actor once a day against categories: ["pokemon_cards"] with trackCategoryStats on produces a categorySnapshot row each day like:

viewerCount: 18,420 viewerDelta: +881 (+5%) liveShowCount: 431 liveShowDelta: +13
top1SellerUsername: "cardbreakers_co" top1ShowViewers: 612 top1RankChange: +2

That viewerDelta/liveShowDelta pair - and seeing a seller jump 2 ranks in the category's top shows - is what tells you demand is moving, which a single snapshot never shows on its own.


What you get

  • Listings - price, format (auction or buy it now), condition-aware filtering, seller, and whether it is being sold live right now
  • Live shows - status, viewer count, categories, tags, and host, from a search, a category, or a seller
  • Sellers - profile, rating breakdown, follower/sold counts, and optionally their shop, shows, and reviews
  • Reviews - buyer reviews and ratings for a seller
  • Categories - the category tree, or a single category's live demand
  • Category snapshots - viewer count, live-show count, and top live shows right now, plus the change since the last run
  • Monitor mode - only new or changed listings, shows, and sellers since the last run with the same input
  • Fair Value Analysis add-on - an AI-powered fair value estimate for Pokémon single-card listings

How to use

  1. Open the Actor and, under Start points, add search terms, Whatnot URLs, sellers, or categories - any combination.
  2. Set limits and filters if you want fewer or more targeted results.
  3. Turn on Category and live-show stats tracking or Monitor mode if you plan to schedule this Actor.
  4. Click Start, then open the dataset and switch between the view tabs (Listings, Live shows, Sellers, ...) to see each record type on its own.

⚠️ The first run with monitorMode on pushes every result as new - there is nothing to compare against yet. On a later run, 0 rows is a normal result: it means nothing changed since last time, not that something failed.

Input configuration

FieldTypeDefaultDescription
searchQueriesarray["pokemon cards"]Terms to search for
searchTypestringproductsproducts, liveShows, sellers, or all
startUrlsarray[]Any Whatnot URL (listing, seller, live show, category, or search)
sellersarray[]Usernames or profile URLs
categoriesarraynoneCategory slugs or URLs, for example pokemon_cards
listCategoryTreebooleanfalseReturn the category tree instead of scraping
categoryTreeDepthinteger2Levels of subcategories to include
maxResultsPerQueryinteger30Max results per search term
maxResultsPerSellerinteger30Max shop listings/shows/reviews per seller
maxResultsPerCategoryinteger30Max live shows per category - set to 0 for category-level stats only
minPrice / maxPricenumbernonePrice range in USD
listingFormatstringanyany, auction, or buyItNow
conditionarray[]Condition values, when the category offers one
sortBystringbestMatchPrice sort for product searches, viewer sort for live-show searches
excludeSellersarray[]Usernames to leave out of every result
includeSellerShopbooleantrueReturn each seller's current shop listings
includeSellerShowsbooleantrueReturn each seller's live/scheduled shows
includeSellerReviewsbooleanfalseReturn each seller's buyer reviews
trackCategoryStatsbooleanfalseAdd a category snapshot row with deltas since the last run
monitorModebooleanfalsePush only new or changed rows since the last run
trackingStoreNamestringwhatnot-trackingKey-value store name used to remember state between runs
resetTrackingbooleanfalseClear stored tracking state before this run
enableFairValuebooleanfalseAdd-on: Fair Value Analysis for Pokémon singles ($)

includeSellerShop and includeSellerShows are on by default, so scraping a seller normally returns their shop listings and shows as extra rows alongside the seller row itself - each one charged as a result, same as any other row. For example, 1 seller with 30 shop listings and 2 shows returns 33 rows, about $0.036 on Free.

{
"searchQueries": ["pokemon cards"],
"searchType": "products",
"categories": ["pokemon_cards"],
"maxResultsPerQuery": 30,
"trackCategoryStats": true,
"enableFairValue": false
}

Output

One flat dataset, discriminated by recordType. A field only used by one record type is simply absent (not null-padded) on the others.

listing:

{
"recordType": "listing",
"listingId": 2452163974,
"url": "https://www.whatnot.com/listing/TGlzdGluZ05vZGU6MjQ1MjE2Mzk3NA==",
"title": "Charizard ex 199/165 SIR 151 PSA 10",
"status": "ACTIVE",
"listingFormat": "buyItNow",
"priceUsd": 450,
"currency": "USD",
"isLive": false,
"categoryLabel": "Pokemon Cards",
"sellerUsername": "firepalmcreations",
"sellerUrl": "https://www.whatnot.com/user/firepalmcreations",
"sellerRatingOverall": 5,
"fairValueUsd": 315.97,
"fairValueBasis": "psa10",
"psa10PriceUsd": 520,
"discountVsBasisPct": 13.5,
"source": "search",
"searchQuery": "pokemon cards",
"scrapedAt": "2026-10-21T16:00:00.000Z"
}

liveShow:

{
"recordType": "liveShow",
"id": "dc46af2c-5e85-496c-9011-82c053949cb0",
"url": "https://www.whatnot.com/live/dc46af2c-5e85-496c-9011-82c053949cb0",
"title": "Pokemon break night",
"status": "PLAYING",
"isLive": true,
"viewerCount": 612,
"categoryLabels": ["Pokemon Cards"],
"sellerUsername": "cardbreakers_co",
"scrapedAt": "2026-10-21T16:00:00.000Z"
}

seller:

{
"recordType": "seller",
"username": "pokemoncards",
"url": "https://www.whatnot.com/user/pokemoncards",
"followerCount": 360,
"soldCount": 923,
"ratingOverall": 4.9,
"ratingNumReviews": 233,
"isPremierShop": false,
"shopListingCount": 42,
"upcomingShowCount": 2,
"scrapedAt": "2026-10-21T16:00:00.000Z"
}

review:

{
"recordType": "review",
"sellerUsername": "firepalmcreations",
"averageRating": 5,
"overallReview": "Fast shipping, card exactly as described.",
"reviewedByUsername": "buyer123",
"reviewedOn": "2026-10-01T00:00:00Z",
"scrapedAt": "2026-10-21T16:00:00.000Z"
}

category:

{
"recordType": "category",
"slug": "pokemon_cards",
"label": "Pokemon Cards",
"viewerCount": 17539,
"liveShowCount": 418,
"url": "https://www.whatnot.com/tag/pokemon_cards",
"scrapedAt": "2026-10-20T16:00:00.000Z"
}

categorySnapshot:

{
"recordType": "categorySnapshot",
"category": "pokemon_cards",
"viewerCount": 18420,
"viewerDelta": 881,
"viewerDeltaPct": 5,
"liveShowCount": 431,
"liveShowDelta": 13,
"previousScrapedAt": "2026-10-20T16:00:00.000Z",
"top1SellerUsername": "cardbreakers_co",
"top1ShowViewers": 612,
"top1RankChange": 2,
"scrapedAt": "2026-10-21T16:00:00.000Z"
}

Empty result - a run with no matches succeeds with a clear status message and an empty dataset:

{ "statusMessage": "Scraped 0 row(s) from 0 of 1 start point(s). 1 returned nothing." }

Failed run - when Whatnot can't be reached for every start point, the run fails instead of returning an empty dataset, and no results are charged:

{ "statusMessage": "Whatnot could not be reached for 1 of 1 start point(s), and nothing was scraped. This is a temporary block or outage, not an empty result. Re-run the Actor in a few minutes." }

Understanding the data

  • Category snapshot deltas (viewerDelta, viewerDeltaPct, liveShowDelta) compare this run's numbers to the last snapshot taken for that category with this Actor, however long ago that was - they are null on the first run, because there is nothing to compare against yet.
  • topNRankChange is how many places that seller's show moved up (positive) or down (negative) in the category's top 3 by viewers since the last snapshot; null means it was not in the previous top 3 at all.
  • Monitor mode changeType: new (not seen before); listing - priceChanged or statusChanged; live show - statusChanged; seller - soldCountChanged, followerCountChanged, or liveStatusChanged. previousValue carries that field's old value. When more than one tracked field changed in the same run, changeType reports the highest-priority one and changedFields lists every field that changed, comma-separated.
  • Fair value basis: fairValueBasis is the grade stated in the listing title - raw (ungraded), psa9, or psa10. fairValueUsd is an estimate for an ungraded copy, so discountVsFairValuePct is only set on raw listings. discountVsBasisPct compares every matched listing to the market price for its own grade (rawPriceUsd, psa9PriceUsd, or psa10PriceUsd).

Common use cases

  • Daily repricing watch: schedule with monitorMode: true and your keyword; act on any row with changeType: "priceChanged" and previousValue - priceUsd > 5. For a typical 30-result search, the first run costs about $0.033 on Free (everything is new); every run after that only charges for rows that actually changed, typically a few cents a month.
  • Category demand tracking: schedule daily with trackCategoryStats: true; flag a category once viewerDeltaPct > 20 two days running as "heating up."
  • Underpriced grading flips: enable Fair Value Analysis and filter for discountVsBasisPct > 15 on fairValueBasis: "psa10" rows.
  • Seller due diligence before a trade: scrape a seller URL with includeSellerReviews: true and check ratingAccuracy and ratingShipping before relying on their shipping estimate.
  • Competitor seller lists: search a niche keyword with searchType: "sellers", then sort the seller rows by followerCount or soldCount in your spreadsheet and export them for outreach.

FAQ

Do I need a Whatnot account? No. Everything this Actor returns is public, logged-out data.

Why did I get 0 results? Either the search term or seller has nothing matching your filters right now, or (with monitorMode on) nothing changed since the last run - check the status message, which always says which case it was.

How is discountVsFairValuePct calculated? (fairValueUsd - priceUsd) / fairValueUsd × 100, on ungraded (raw) listings only. Positive means the listing is priced below the estimate. Graded listings use discountVsBasisPct instead.

Does condition always filter? Only when the category offers that attribute - see the condition field description above for how matching works.

Can I track more than one category? Yes - list as many as you like in categories; each gets its own tracked history.


Limitations

  1. Whatnot does not expose sold prices or completed-sale history to a logged-out session - only active listings.
  2. Follower lists, following lists, and a show's buyer list are login-only and always empty; they are not included in the output.
  3. Fair Value Analysis covers Pokémon single cards only, mainly Scarlet & Violet and Mega Evolution sets, and only when the listing title clearly states the card name and collector number - sellers who write free-text titles without a number will not match. Graded listings are priced only for PSA 9 and PSA 10; listings graded by another company or at another grade get no fair value and are not charged.
  4. Category "leaderboard" rankings are approximated from current live viewer counts, since a sales-based seller leaderboard is a login-only feature.
  5. condition filtering depends on the category offering that attribute; not every category does.
  6. Monitor mode and category-stats history live in a key-value store tied to this Actor's own runs under your account - duplicating the Actor or changing trackingStoreName starts a fresh history.
  7. Seller reviews are reachable only up to about 128 per seller, a limit on Whatnot's own side - includeSellerReviews never returns more than that even for a seller with far more.
  8. A run processes at most 60 start points (searches, URLs, sellers, and categories combined); extra ones are dropped, and the run's status message says by how many.
  9. Monitor and category-stats state is scoped to one tracking store (trackingStoreName). Do not run overlapping schedules of the same input against the same store at the same time - concurrent runs reading and writing the same state can produce inconsistent deltas.

Pricing

Pay-per-event. Only the Actor start fee ($0.00005) applies to a run that returns nothing.

EventFreeStarterScaleBusinessEnterprise
Actor start$0.00005$0.00005$0.00005$0.00005$0.00005
Whatnot result (per row)$0.0011$0.001$0.0009$0.0008$0.0008
Add-on: Fair Value Analysis (per matched listing)$0.07$0.06$0.05$0.04$0.04

A typical 30-result search run costs about $0.033 on Free.

A category start point always pushes 1 category row, plus up to maxResultsPerCategory liveShow rows, plus 1 categorySnapshot row when stats tracking is on. With the default maxResultsPerCategory of 30, a daily tracked-category schedule pushes 32 rows/day - about $0.035/day, or about $1.06/month on Free. Set maxResultsPerCategory to 0 to track only the category-level stats (2 rows/day - about $0.066/month on Free).

Monitor mode only charges for listings, live shows, and sellers that are new or changed, so a quiet day can cost nothing beyond the Actor start fee. Category, category snapshot, and review rows are returned and charged on every run.


Output field reference

listing

FieldDescription
id, listingId, url, title, subtitle, descriptionListing identity
status, transactionType, listingFormatWhatnot status and whether it is an auction or buy it now
priceUsd, currency, compareAtPriceUsd, quantityPricing and quantity available
currentBidUsd, currentBidCountAuction state
isLive, liveShowUrlWhether it is being sold live right now, and where
imageUrl, imageUrlsImages
categoryLabel, categoryIdCategory
sellerUsername, sellerUrl, sellerRatingOverall, sellerReviewCount, sellerIsVerified, sellerIsPremierShopSeller
createdAt, updatedAtTimestamps
source, searchQueryHow this row was found (search, sellerShop, or url), and the search term, when it came from one
scrapedAtWhen this row was scraped, ISO 8601
fairValueUsd, fairValueBasis, discountVsFairValuePctAdd-on: fair value estimate for an ungraded copy, the listing's grade basis, and the discount against the estimate (raw listings only) - (fairValueUsd - priceUsd) / fairValueUsd × 100
rawPriceUsd, psa9PriceUsd, psa10PriceUsd, discountVsBasisPctAdd-on: market price per grade and the discount against the one matching the listing's grade - (basisPrice - priceUsd) / basisPrice × 100
gemRatePct, psa10Pop, totalPop, gemRateDateAdd-on: grading population
price1dChangePct, price7dVs30dChangePctAdd-on: price momentum
changeType, previousValue, changedFieldsMonitor mode only

liveShow

FieldDescription
id, url, titleShow identity
status, isLive, startTime, endTimeStatus and timing
viewerCount, totalWatchlistUsersAudience
categoryLabels, categoryIds, tagsClassification
thumbnailUrl, shippingSourceCountryMedia and shipping
sellerUsername, sellerUrl, sellerRatingOverall, sellerIsVerified, sellerIsPremierShopHost
source, searchQueryHow this row was found (search, seller, category, or url), and the search term, when it came from one
scrapedAtWhen this row was scraped, ISO 8601
changeType, previousValue, changedFieldsMonitor mode only

seller

FieldDescription
username, url, displayName, bioIdentity
isSeller, isVerifiedSeller, canGoLive, isLive, vacationModeStatus
followerCount, followingCount, soldCount, averageShipDays, shippingSourceCountryAudience and fulfillment
ratingOverall, ratingNumReviews, ratingShipping, ratingPackaging, ratingAccuracyRating breakdown
isPremierShop, profileImageUrl, storeImageUrlShop
shopListingCount, upcomingShowCountShop listing and show counts (null unless includeSellerShop or includeSellerShows is on)
reviewCountTotal number of reviews the seller has
source, searchQueryHow this row was found (search, seller, or url), and the search term, when it came from one
scrapedAtWhen this row was scraped, ISO 8601
changeType, previousValue, changedFieldsMonitor mode only

review

FieldDescription
sellerUsername, sellerUrlWhich seller this review is for
reviewId, averageRating, overallReview, sellerResponse, reviewedOnThe review
reviewedByUsernameReviewer
ratingShipping, ratingPackaging, ratingAccuracySub-ratings
scrapedAtWhen this row was scraped, ISO 8601

category

FieldDescription
slug, label, categoryIdIdentity
parentSlug, parentLabel, depthTree position, when using listCategoryTree
tagType, viewerCount, liveShowCountCurrent demand
url, imageUrlLinks
scrapedAtWhen this row was scraped, ISO 8601

categorySnapshot

FieldDescription
category, categoryLabel, categoryUrlIdentity
viewerCount, liveShowCountCurrent demand
viewerDelta, viewerDeltaPct, liveShowDeltaChange vs. the previous snapshot - null on the first run
previousScrapedAtWhen that previous snapshot was taken
top1SellerUsername … top3SellerUsername, topNShowTitle, topNShowUrl, topNShowViewersTop 3 live shows right now, by viewers
topNRankChangePlaces moved up (+) or down (-) since the last snapshot; null if not previously in the top 3
scrapedAtWhen this row was scraped, ISO 8601

See also: TCGplayer Listings Scraper and Cardmarket Listings Scraper.

Questions or issues? Open a ticket in the Issues tab on the Actor page.