Whatnot Scraper - Live Shows, Lots & Sellers
Pricing
from $1.00 / 1,000 results
Whatnot Scraper - Live Shows, Lots & Sellers
Scrape Whatnot live and upcoming shows, queued items and lots, and seller profiles. Search by keyword or URL, then filter by category, format, seller rating, and country. Extract ratings, followers, sold counts, and more.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
2
Bookmarked
4
Total users
3
Monthly active users
7 days ago
Last modified
Categories
Share
Whatnot Scraper: Live Shows, Items & Seller Data
Whatnot is the largest live-shopping marketplace for collectibles: trading cards, sports cards, sneakers, comics, coins and toys, sold by sellers running scheduled live shows. This actor turns that into structured data: live shows playing now and scheduled for later, the items and lots sellers have listed (including the ones queued into an upcoming show), and seller profiles with ratings, followers and sold counts. Search by keyword or paste links, filter by category, format and seller quality, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Two ways in. Search by keyword, or paste a show, item, seller, category or search link and it is routed automatically to the right walk.
- Pre-sale detail on every item. Price, buying format, stock, condition and, for items queued into an upcoming show, the start time of that show, so you know what is coming before it sells.
- Seller quality on every row. Username, rating, review count, followers, sold count, verified and Premier Shop flags travel with every show and item, not just seller profiles, so you can rank by seller quality without an extra read.
- The site's own filters, all in one run. Category, show status and format, buying format, condition, graded and autographed only, minimum seller rating, Premier Shop only, seller country and a price range.
- Filters that actually work. Category handles are checked against the site's live category list before the run starts, and the price range is enforced here because the site's own price filter silently returns items below the floor anyway.
- Built for monitoring. Incremental mode returns only new and changed results on a recurring schedule, and Resume continues one interrupted run without paying for what it already collected.
- Honest about a real limit. Realised (sold) prices for finished shows are not published anywhere on the site, so this actor does not invent them, and a run that could not read the site fails loudly instead of returning an empty dataset.
Use Cases
- Collectors and resellers: track a category or seller for newly scheduled shows, fresh stock and price changes before a show starts.
- Sourcing and arbitrage: watch Buy It Now listings for a card, shoe or set across many sellers, filtered by condition and price range.
- Seller research and scouting: rank sellers by rating, followers, items sold and Premier Shop status before deciding who to watch or buy from.
- Market monitoring: run a scheduled incremental scan of a category to see new supply and pricing show up over time, without re-downloading what you already have.
- Community and fan tools: build a dashboard of live and upcoming shows in a category with viewer counts, start times and seller info.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
recordType | "show" (also "lot", "seller", "category", "rankedSeller") |
title | "Sample vintage card break night" |
url | Whatnot link to the show, item or seller |
status | "PLAYING" (also "CREATED") |
startTime / endTime | show start and end time, UTC ISO 8601 |
activeViewers / watchlistUsers | live viewer count and watchlist size (shows) |
price / currency | listed price and its currency, in major units (items) |
transactionType | "BUY_IT_NOW" (also "LIVESTREAM_AUCTION") |
currentBid / currentBidCount | live auction state (items) |
listingStatus | "ACTIVE" (items) |
categories / categoryLabel | category names on a show or item |
tags | show tags, for example "Vintage", "Graded Cards" |
scheduledShowStartTime | the start time of the show a lot is queued into |
sellerUsername / sellerUrl | the seller behind every show, item and profile |
sellerRating / sellerReviewCount | seller rating out of 5 and review count |
sellerFollowerCount / sellerSoldCount | seller audience size and lifetime sales |
sellerIsVerified / sellerIsPremierShop | verified and Premier Shop flags |
changeType / changedFields | NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED (incremental mode) |
firstSeenAt / lastSeenAt | first and most recent time this result was seen (incremental mode) |
rank / categoryView | position in the category list or trending ranking (category rows) |
viewerCount / livestreamCount / deeplink | live viewers, live shows and site path of a category (category rows) |
rank / interval / rankingType | position, window (CURRENT_DAY, CURRENT_WEEK, LIVE) and kind of a seller ranking (ranked seller rows) |
categoryId / categoryLabel | the category a ranking belongs to, with its display label from the site's category list (ranked seller rows) |
currentActiveLivestream | the show a ranked seller is streaming right now, when any |
scrapedAt | when this row was read, UTC ISO 8601 |
Item and lot records also carry the subtitle, description, quantity, image URLs, break details (format, total spots, spots filled, spots sold), variants and a catalogue product match with its price range. Seller records also carry the display name, bio, following count, average shipping days, store banner, live and can-go-live flags, and, with "Read each seller's full profile" on, their most recent reviews (rating, text, the seller's reply and the date).
Output views. The dataset has eight views: Results (everything), Live shows, Items and lots, Sellers, Categories, Seller leaderboards, Seller reviews (one row per attached review) and Changes (incremental mode: new, updated, reappeared and expired rows). Each run also stores a run summary under the OUTPUT key of the key-value store, counting rows by record type.
How to Use
- Pick a mode:
search(by keyword),url(paste links),seller(usernames),categories(category list and trending) orleaderboard(seller rankings per category). - In search mode, add one or more keywords and a Result type (live shows, items and lots, sellers, or the platform's mixed feed). In URL mode, paste show, item, seller, category or search links (see the link table below).
- Narrow with the filters that apply to your Result type: category, show status and format, buying format, condition, graded or autographed only, minimum seller rating, Premier Shop only, seller country, and a price range.
- Set Max results to control run size and cost, then click Start.
Link shapes in URL mode
Left untouched, the Whatnot links field scrapes one example of each of the shapes below, so a URL-mode run with the field unchanged returns a sample of every kind of record: Max results is shared fairly across the links (each link gets its share of what is left, a link pasted twice is read once), so the first large link cannot use up the whole cap. Clear the list or paste your own links to scrape only those.
| Link shape | Example | Returns |
|---|---|---|
| Category page | whatnot.com/tag/pokemon_cards | Shows in that category |
| Legacy category page | whatnot.com/category/pokemon_cards | Same as the category page |
| Locale-prefixed category | whatnot.com/en-GB/tag/pokemon_cards | Same as the category page |
| Host without www | whatnot.com/tag/pokemon_cards | Same as the category page |
| Seller profile | whatnot.com/user/spacenarwhalz | The seller, their scheduled shows and their shop |
| Seller shop | whatnot.com/user/spacenarwhalz/shop | Only that seller's shop lots |
| Seller reviews | whatnot.com/user/spacenarwhalz/reviews | The seller row with their recent reviews attached |
| Keyword search | whatnot.com/search?query=charizard | Search results; type=shows, type=items or type=sellers picks the result kind. Other filters in the link are not applied: the run logs a warning and you use the Filters inputs |
| Live show | whatnot.com/live/<show id> | That one show |
| Item | whatnot.com/listing/<item id> | That one item |
Category names such as "Pokemon Cards" are accepted wherever a category is asked for and are matched against the site's live category list; a name that matches nothing stops the run and lists the closest matches.
Search for items by keyword:
{"mode": "search","queries": ["charizard"],"resultType": "lots","maxItems": 20}
Every live show in a category right now:
{"mode": "search","resultType": "shows","categories": ["pokemon_cards"],"showStatus": ["PLAYING"],"maxItems": 20}
Filtered Buy It Now items in a price range, from well-rated sellers:
{"mode": "search","queries": ["vintage lego"],"resultType": "lots","buyingFormat": ["BUY_IT_NOW"],"minSellerRating": "4.5","minPrice": 10,"maxPrice": 200,"maxItems": 50}
Paste links (category and search):
{"mode": "url","urls": ["https://www.whatnot.com/tag/pokemon_cards","https://www.whatnot.com/search?query=charizard"]}
A seller link (whatnot.com/user/<username>) returns that seller's profile plus their scheduled shows and their shop.
Categories and seller leaderboards
- Categories (
mode=categories):categoryViewlistreturns the site's top-level categories in the site's own order;trendingreturns every category that has viewers right now, ranked by live viewer count (50 rows when Max results is unset). Each row has the live viewer count, the live show count, the site path and an image. The site does not publish a sub-category tree to anonymous visitors (no tag has a parent), so sub-category listings are not available; a category's shows are still reachable with a/tag/<category>link. - Seller leaderboards (
mode=leaderboard): the overall seller ranking inside each category you list in Categories (none listed means every top-level category), for the interval you pick: today, this week, live right now, or all three. Each row has the rank, the interval, the seller and the show they are streaming now. Rankings are regional: the country of the proxy exit changes who is listed, so keep the proxy country fixed between scheduled runs if you compare them. Max results is shared across the categories and intervals.
Category and ranked seller rows are returned results like any other row, and incremental mode works on them (a ranked seller is tracked per category, interval and seller).
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/whatnot-scraper").call(run_input={"mode": "search", "queries": ["charizard"], "resultType": "lots"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["price"], item["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/whatnot-scraper').call({ mode: 'search', queries: ['charizard'], resultType: 'lots' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Max results and page limits
Max results (maxItems) is the run's overall cap; 0 means no limit. In search mode, each keyword gets its own share of the cap, so one popular keyword cannot swallow the whole run. Max pages per keyword or link (maxPages) bounds how many result pages (24 results each) a single keyword or link is walked before moving on; 0 means no page limit, so the run stops only at Max results or when the site runs out of results.
Resume and recurring updates
- Resume from a previous run (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and this actor skips everything already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled monitoring of the same search. The first run returns everything asNEW. Later runs return onlyNEW,UPDATEDandREAPPEAREDby default, so you catch a newly scheduled show, a show going live, a price change or a fresh lot in a category you watch. Audience counters (viewers, watchlist, followers, sold count, reviews; for category rows the live viewer and show counts, for seller leaderboard rows the viewers of the show the seller is streaming) are deliberately ignored when deciding what changed, because they drift constantly; they stay in the output, only the comparison skips them. Therankof category and leaderboard rows is ignored too, since a position only moves when those counters do; a seller entering or leaving a leaderboard still shows up as aNEWorEXPIREDrow. A result isUPDATEDwhen any other field changes (status, start time, price, listing status, current bid and bid count, title, variant quantity).ignoreFieldsForChangeslets you exclude more fields from that comparison, as a top-level name or a nested path such assellerReviews[].text.stateKeynames or shares the stored state; leave it empty and the actor derives one from the mode, Result type, keywords, links and filters, so two different searches never mix by default.emitUnchangedandemitExpiredalso return (and bill) unchanged and expired rows;EXPIREDis only produced once a run has fully scanned the tracked search, never after a capped, resumed or empty run.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field (
mcpConnectors). Notion gets a rich page per result and needsnotionParentPageUrlset to the page items should be created under; the other connectors get a best-effort write or digest. maxNotifyListingscaps how many results are written to each connector per run.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave mcpConnectors empty to skip it entirely.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword search), url (scrape pasted links), seller (read sellers by username), categories (category list or trending) or leaderboard (seller rankings per category). |
resultType | string | shows | What a search (or a pasted search/category link) returns: shows, lots, sellers, or mixed. A pasted show, item or seller link always returns its own kind. |
queries | array | ["charizard"] | Search keywords (search mode). Each keyword gets its own share of Max results. |
urls | array | one example of each link shape | Whatnot links to scrape (url mode): show, item, seller (profile, shop or reviews), category or search links. |
sellers | array | (none) | Seller mode: usernames (a leading @ or a pasted profile link works). Each returns the profile row, scheduled shows and shop items. At least one valid username is required, otherwise the run stops before reading anything; an invalid entry is skipped with a warning naming it. |
shopQuery | string | (none) | Narrows each seller's shop items to titles matching this text (seller mode and pasted seller links). |
categories | array | (none) | Only return results in these categories, by name or handle (prefilled with pokemon_cards in the Console). Checked against the site's live category list at the start of the run. |
showStatus | array | (none) | Only return shows in these states: PLAYING or CREATED. Applies to Result type shows or mixed. |
showFormat | array | (none) | Only return shows run in these formats (auction, breaks, buy it now, graded, singles, surprise sets). Applies to Result type shows or mixed. |
buyingFormat | array | (none) | Only return items sold this way: BUY_IT_NOW or LIVESTREAM_AUCTION. Applies to Result type lots or mixed. |
conditions | array | (none) | Only return items marked with these free-text conditions, for example "Near Mint" or "Graded". |
gradedOnly | boolean | false | Only return items marked as professionally graded. |
autographedOnly | boolean | false | Only return items marked as autographed. |
minSellerRating | string | any | Minimum seller rating: any, 4.0, 4.5, or 5.0. |
premierShopOnly | boolean | false | Only return results from sellers marked as Premier Shops. |
sellerCountries | array | (none) | Only return results from sellers in these countries. |
minPrice | integer | (none) | Only return items priced at or above this amount. Enforced by this actor on each record's own price. |
maxPrice | integer | (none) | Only return items priced at or below this amount. Enforced by this actor on each record's own price. |
sortBy | string | (none) | Ordering asked of the site: recommended, viewers-desc, viewers-asc for shows; best-match, price-asc, price-desc, newest for items and sellers. |
fetchSellerDetails | boolean | false | Read each seller's full public profile and attach it to every result (adds the Seller profile attached event for each result that carries it; cached within a run). |
categoryView | string | list | Categories mode: list (top-level categories) or trending (ranked by live viewers). |
leaderboardInterval | string | CURRENT_WEEK | Leaderboard mode: CURRENT_WEEK, CURRENT_DAY, LIVE or ALL. |
maxSellerReviews | integer | 20 | How many of each seller's most recent reviews to attach, when fetchSellerDetails is on or a seller link is pasted. 0 attaches none everywhere, including on a pasted /user/<name>/reviews link (that link then returns the seller row without reviews). Maximum 50. Each review carries its overall rating plus shipping, packaging and accuracy sub-scores. |
maxItems | integer | 20 | Maximum number of results returned across the whole run. 0 for unlimited. |
maxPages | integer | 0 | Maximum result pages walked per keyword or link, at 24 results a page. 0 for no page limit. |
resumeFromRunId | string | (none) | Continue one interrupted run from a previous run or dataset id, without re-collecting what it already gathered. |
incrementalMode | boolean | false | Return only new and changed results on scheduled runs against the same search. |
ignoreFieldsForChanges | array | [] | Field names (or nested paths like variants.quantity) to leave out when deciding whether a result changed. Incremental mode only. |
stateKey | string | (none) | Name or share an incremental-mode state. Leave empty to derive one from the search scope. |
emitUnchanged | boolean | false | Also return (and bill) results unchanged since the last run, marked UNCHANGED. |
emitExpired | boolean | false | Also return (and bill) results no longer found after a complete scan, marked EXPIRED. |
proxy | object | Apify Proxy | Connection settings. |
mcpConnectors | array | (none) | Optional: send results to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which result pages are created. |
maxNotifyListings | integer | 50 | Cap on results written to each connector per run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"recordType": "show","id": "00000000-0000-0000-0000-000000000000","showId": "00000000-0000-0000-0000-000000000000","url": "https://www.whatnot.com/live/00000000-0000-0000-0000-000000000000","title": "Sample vintage card break night","description": "Mixed vintage breaks, sample spots to start.","status": "PLAYING","isLiveNow": true,"isScheduled": false,"startTime": "2026-01-01T18:00:00Z","endTime": null,"activeViewers": 250,"watchlistUsers": 80,"categories": ["Sample Category"],"categorySlugs": ["sample_category"],"tags": ["Sample Tag"],"isFreeShippingEnabled": true,"buyerMaxShippingCost": 5.0,"currency": "USD","thumbnailUrl": "https://images.whatnot.com/sample-thumbnail.jpg","sellerUsername": "example_seller","sellerUrl": "https://www.whatnot.com/user/example_seller","sellerRating": 4.8,"sellerReviewCount": 500,"sellerFollowerCount": 10000,"sellerSoldCount": 8000,"sellerIsVerified": true,"sellerIsPremierShop": false,"changeType": "NEW","changedFields": [],"firstSeenAt": "2026-01-01T18:00:00Z","lastSeenAt": "2026-01-01T18:00:00Z","scrapedAt": "2026-01-01T18:05:00Z"}
Plan Requirement
The default proxy setting works out of the box. If a run reports that requests were refused, or for large or frequent runs, the residential proxy group gives more headroom; pick it under Connection. Residential and the other non-default options are billed by traffic and cost more, so switch only when you need to.
FAQ
How much does it cost?
You pay per result returned, plus a start charge per run. Reading each seller's full profile is opt-in and adds the Seller profile attached event (the registered seller-enrichment event shown on the Pricing tab): one event per returned result that carries the seller's full profile, charged as each such result is saved, and never for a result that was filtered out, skipped as unchanged or failed to read. Category and ranked seller rows are billed as ordinary results. Attached reviews are included in that profile read and are capped by maxSellerReviews (default 20, maximum 50) so a run's cost stays bounded. The Pricing tab shows the current rates. Use Max results to cap the cost of any run.
Is it legal to scrape Whatnot?
This actor collects only publicly available marketplace data. You are responsible for how you use it: follow Whatnot's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.
Can I get only new or changed results on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared results, and unchanged ones are not billed unless you turn emitUnchanged on.
Why doesn't this actor return sold or final auction prices?
Realised (sold) prices for finished shows are not published by the site: its own show-status filter has no "ended" value, a show carries no connection to what it sold, and a seller's show list returns only future shows. This actor returns the pre-sale picture instead: which shows are running and scheduled, which lots are queued into them, and at what starting price.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, the run stops with a clear message so "nothing matched" is never confused with "nothing could be read". Run it again in a few minutes, or enable Apify Proxy in the Connection section. If the site changed its data format, the run names that cause directly; no keyword, filter or proxy change will help.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ Want more sports data?
Pair this actor with these related scrapers from the same team:
| ๐ท๏ธ Vinted.fr Scrape Vinted.fr, France's C2C second-hand fashion marketplace: search with... | ๐ท๏ธ Poshmark Scraper Scrape Poshmark fashion-resale listings: keyword search, brand and category browse, sold... |
| ๐ฅฆ El Corte Inglรฉs Scraper Scrape El Corte Inglรฉs elcorteingles.es products across fashion, electronics, home... | ๐ฅฆ Lidl.es Products, Weekly Offers, Prices & Reviews Scraper Scrape Lidl.es grocery and non-food products across weekly offers, tools, home, garden... |
| ๐ท๏ธ Vinted Multi-Country Scraper Scrape Vinted across 27 country marketplaces: keyword search with brand, price and... | ๐ StockX Scraper Scrape StockX market data by keyword, category or URL. Every row carries lowest ask... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.