Track Whatnot seller inventory in real time. Give it seller usernames and get every active listing back — price, quantity, status, transaction type, sales channels. Also runs keyword search across the PRODUCT listings surface. No login, no cookies, Pay-Per-Event.
Full implementation, not a scaffold stub: src/models.py (Pydantic v2
ActorInput + ResultRow), src/graphql_queries.py (pinned GetUser /
ProfileShop / Search query text, harvested and schema-validated live
against www.whatnot.com/services/graphql/), src/http_client.py
(curl-cffi retry/backoff, rotating impersonation profiles), src/client.py
(GraphQL call wrappers), src/parser.py (ListingNode -> ResultRow),
src/scraper.py (per-target fault isolation + pagination + the
objectSize>50 zero-edge trap guard + the geo-skew warning), src/main.py
(Apify SDK wiring, PPE charging, pinned BUYPROXIES94952 + US proxy).
Two input modes: sellerUsernames (primary — per-seller shop inventory,
matches the highest-run-count incumbent's usage pattern) and
searchKeywords (secondary — PRODUCT vertical keyword search).
56 tests (models, parser against a real captured fixture, http_client
retry/backoff + GraphQL error handling, client wrappers, scraper fault
isolation + trap assertions + geo guard, main.py wiring). ruff and
pyright src/ clean.
Verified live 2026-09-16 via direct GraphQL replay (no Apify run spent):
GetUser and ProfileShop returned real seller/listing data; Search
confirmed the documented objectSize(first)>50 trap reproduces exactly
(first=50 -> 50 edges/totalCount=10000, first=100 -> 0 edges/
totalCount=0, both HTTP 200).