DEV Community

CleanScrape
CleanScrape

Posted on

What a PSA 10 Charizard costs on Whatnot, from 73 live listings

Whatnot is the live shopping marketplace where a lot of trading cards, sneakers and collectibles change hands, often during live streams. It has no public API for listings, so I built a small tool on Apify that turns a Whatnot search into a table, with the seller's track record on every row.

Here is one real use: what does a PSA 10 Charizard cost on Whatnot right now, and who is selling them?

The search

The input works like the filters on the website: a keyword, a category, and Whatnot's own card filters.

{
  "searchQueries": ["charizard"],
  "categories": ["Pokémon Cards"],
  "gradedOnly": true,
  "gradingServices": ["PSA"],
  "grades": ["10"],
  "buyFormat": "buy_it_now",
  "sort": "price_asc",
  "maxResultsPerSearch": 300
}
Enter fullscreen mode Exit fullscreen mode

The run returned 73 listings in 16 seconds. Each row has the price, currency, quantity, category, the date it was listed and a link, plus the seller's items sold on Whatnot, followers, rating and number of reviews.

The prices

Price Listings
Under $100 10
$100 to $499 36
$500 to $1,999 17
$2,000 and up 9

The cheapest was $15 and the most expensive $490,000, a 1999 first edition. One more listing asked $999,999, a placeholder price rather than a real offer, so I left it out of the table. The middle listing of all 73 was $300 ($292.50 without the placeholder).

Two things to keep in mind. These are asking prices: Whatnot shows sold prices only to logged-in users, and the tool never logs in. And "PSA 10" is a filter on how sellers tag their listings, so a few titles mention other grades. Read the titles before you compare.

Who is selling

The seller columns are what make this more than a price list. The cheapest PSA 10 Charizard from a seller rated 5.0 with over a thousand sales was $100, from a seller with 11,846 items sold. In Python, with the Apify client:

from statistics import median
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("cleanscrape/whatnot-scraper").call(run_input={
    "searchQueries": ["charizard"],
    "categories": ["Pokémon Cards"],
    "gradedOnly": True, "gradingServices": ["PSA"], "grades": ["10"],
    "buyFormat": "buy_it_now", "sort": "price_asc", "maxResultsPerSearch": 300,
})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
real = [r for r in rows if r["price"] < 999999]
print(len(rows), "listings, median", median(r["price"] for r in real))
trusted = [r for r in real if r["sellerRating"] == 5 and (r["sellerSoldCount"] or 0) >= 1000]
for r in trusted[:5]:
    print(r["price"], r["title"], r["sellerUsername"], r["sellerSoldCount"])
Enter fullscreen mode Exit fullscreen mode

Live shows

Switch "What to find" to live and upcoming shows and the same category gives you the streams. The top 100 live Pokémon card shows had 6,041 viewers between them when I ran it, the biggest over a thousand. Each show row has the title, viewers, start time, format (52 Singles, 29 Surprise Sets and 19 Breaks in this run), tags and seller, and you can ask for the items for sale in each show too.

Only new listings

For deal alerts, sort by "Newly listed", turn on "Only listings or shows not saved before" and schedule the task. Each run looks at the newest listings and returns the ones earlier runs did not save, plus price drops on ones they did. The skipped ones are not charged.

Try it

Whatnot Scraper on Apify. You pay per listing saved, and the search above cost about $0.15. It works on all eight Whatnot marketplaces: the US, Canada, the UK, Germany, France, Belgium, the Netherlands and Australia.

Top comments (0)