Sets: a set can be given by name or by URL slug, including sets with "&" (for example sv-scarlet-and-violet-151); before any history is read the names are checked against TCGplayer's set list for the chosen game. An unknown set stops the run with an error and similar names (TCGplayer itself silently returns every product for an unknown set); when some sets are known, unknown ones are listed in the status message.
Cards or sealed products is now applied in the TCGplayer search, so sealed on a general term such as charizard returns the sealed products instead of scanning cards and dropping them.
searchQueries no longer has a default term: a call through the API with only a game or set reads that game or set instead of searching for charizard (the example stays in the Store form prefill).
Status messages tell apart "products have no sales history" from "no printing matched your filters".
Requests honour the Retry-After header on HTTP 429/5xx; removed the unused cheerio dependency.
README: market price is the latest 3-day window, not a live quote; added a FAQ on limits and run time.
Tested locally with three inputs: a set with "&" in its slug (3 products, rows returned), sealed products on a general term (32 matching products, 8 scanned, all rows sealed), and a misspelled set (run fails with an error before any history request).
0.1
Initial release: price change, units sold, sales per day and days of supply per printing and language for cards and sealed products.
Tested locally with three inputs: a typical one (charizard, Pokemon, 30 products), an edge case (sealed booster boxes with no sales series for one product) and a search with no results (one status row, not billed).