Methodology

How War Room sources, calculates, and refreshes the data behind every price, pop report, and ROI estimate. Last reviewed: 2026-05-17.

Data sources

Source What we use it for Refresh cadence
pokemontcg.io Card catalog, set metadata, card images Weekly (Sundays)
PriceCharting PSA-graded prices (PSA 7/8/9/9.5/10), pop-report mirror Pop: nightly · Prices: weekly
TCGplayer Ungraded market price, real-time inventory signals Daily catalog refresh
eBay (Browse + sold-listings) Recent sold comps, arbitrage signal, deal alerts Live (on-demand) + nightly digests
Pokémon Center, Target, Walmart, Best Buy Sealed-product restock + retailer pricing Polling every 60-300 seconds

How we calculate comps

A "comp" is a recent sold-listing price for the same card in the same condition. We pull from eBay sold listings (the industry gold-standard for fair-market valuation because they reflect actual buyer-seller settlement, not ask prices) and supplement with TCGplayer market data. For graded cards we filter sold listings by cert range and grading service to avoid mixing raw + graded sales. Outliers (greater than 2 standard deviations from the median) are flagged and excluded from the displayed range.

Grading ROI math

Every card with both an ungraded price AND a PSA-10 price shows two ROI figures:

breakeven_price = ungraded_price + PSA_grading_fee
projected_uplift_pct = (psa10 − ungraded − fee) ÷ ungraded × 100

Default PSA grading fee assumes the "Value Bulk" service tier ($25/card); this is configurable per user. Critically, the ROI assumes a PSA 10 outcome — the actual gem rate per card (percentage of submissions grading PSA 10) is shown next to the ROI so you can adjust expectations. A card with 1% gem rate and a +500% PSA 10 uplift has an expected value of +5%, not +500%.

Pop reports

Pop (population) reports show how many copies of a card have been graded by PSA at each grade. Lower pop counts at high grades typically indicate scarcity and drive premium prices. We mirror PriceCharting's pop dataset and join it to our catalog via a normalized card key ({name}::{set}::{number}). Cards where the catalog set name doesn't match PriceCharting's slug fall back to a secondary lookup by (card name, card number) with set-slug disambiguation — this catches the vintage Base / Jungle / Fossil / Neo set where naming conventions diverge.

Honest limitations

  • ~50% of cards have no PSA pop data. Mostly promo sets (SWSH/SM/XY Black Star Promos) where PriceCharting doesn't track the per-card pop. Card pages still render the catalog metadata + image but skip the pop/price sections.
  • Prices may lag. The weekly refresh cycle means displayed prices can be up to 7 days stale. For fast-moving cards (event-driven spikes), use the live Price Check tool which pulls real-time eBay data.
  • Foreign-language and graded-variant cards may be missing or mis-priced. Our catalog and pop data is English-Pokémon TCG; Japanese print runs, Korean variants, and stamped promos can confuse the join logic. We're working on it.
  • We are not affiliated with Nintendo, The Pokémon Company, PSA, or any of the marketplaces we aggregate. Data is sourced from publicly available endpoints; trademarks and copyrights remain with their owners. War Room is an independent analytics platform.

Questions about the methodology? contact@tcgwarroom.com