Whatnot
Whatnot listing price, buy-it-now or auction format, current bid, quantity, state and the seller's rating, by listing id, about 2.5 million listings per credit. Sold and ended listings by id. Keyword search of listings for sale.
Whatnot listing price, buy-it-now or auction format, current bid, quantity, state and the seller's rating, by listing id, about 2.5 million listings per credit. Sold and ended listings by id. Keyword search of listings for sale.
At a glance
Property | Value |
|---|---|
|
|
Item id | The string a listing link ends in, |
Tier |
|
Ids per call | 200 |
Search |
|
Marketplaces | Live: |
Typical call | 4–10 s for 200 ids (estimate) |
Sold and ended listings
Ask for a listing by id and Whatnot says what state it is in. whatnot.status is active, created (not started), sold or sold_out. availability.inStock is true for an active listing with a quantity of 1 or more, false for sold and sold_out, and left out for any other state. A sold listing has price: null: what Whatnot shows for it is not a price we can call one. No sold date and no sale price are given. Search shows only listings for sale.
Seller rating, not item rating
A Whatnot listing has no rating, so rating and reviews_count are null. whatnot.seller.rating and whatnot.seller.reviewCount are the SELLER's rating out of 5 and review count across all their sales: do not read them as the item's.
Placeholder prices are null
Sellers set prices of $900,000 or more on listings that are really announcements ("bookmark for my next show", giveaways). Those come back with price: null and whatnot.placeholderPrice: true, so sort=price_high starts with many null prices. The line is $900,000 because the placeholders we saw were $999,999 and up and the highest real-looking prices were graded cards under $870,000; a seller's joke price below the line (777,777, 696,969) is still returned as it is.
What `price` is for an auction
price is the price Whatnot lists with the listing, in dollars, without shipping or tax. For an auction it is the listing price, not a bid, and we could not confirm it is the opening bid. whatnot.currentBid is the highest bid so far; it is null before the first bid (it was null on every auction we sampled).
Example
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "whatnot",
"ids": ["TGlzdGluZ05vZGU6MjUwNTM3MTY3NQ==", "2479416398"]
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={
"platform": "whatnot",
"ids": ["TGlzdGluZ05vZGU6MjUwNTM3MTY3NQ==", "2479416398"],
},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
print(p["id"], p["status"], (p.get("price") or {}).get("amount"), p["whatnot"]["seller"]["rating"])const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'whatnot',
ids: ['TGlzdGluZ05vZGU6MjUwNTM3MTY3NQ==', '2479416398'],
}),
signal: AbortSignal.timeout(30_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();
for (const p of data.results) console.log(p.id, p.status, p.price?.amount, p.whatnot?.seller.rating);Whatnot fields
Besides the common search fields, each result carries a whatnot object.
Field | Description |
|---|---|
| The listing price in dollars. |
|
|
| The highest bid and the number of bids on an auction. |
| The quantity the seller lists. Sellers sometimes set a placeholder such as 999 or 1000. |
| Whatnot's own state, lower-cased: |
| The line under the title, often size and brand or the condition. |
|
|
| Search leaves |
| The listing page. Whatnot blocks plain requests to it, so open it in a browser. |
Not given | An item rating, a sold date or sale price, brand, shipping cost, and anything about buyers. |
Paging and empty results
Whatnot pages with a cursor: send
next_cursorback ascursor.pageis refused with a 400. A page can hold fewer than 50 listings with more to come: stop only whennext_cursorisnull.total_resultsstops at 10,000.format=buy_it_noworformat=auctionkeeps one kind of listing.A keyword that matches nothing is an empty list with
total_results0 (the nonsense word we tried). Any answer that is not clearly a list or a total of zero is a failure (502 TARGET_FAILED, not charged); retry it.