Price & Population Data API
A price for every grade at every grading company — a median of completed sales, with the sale count, window and trend behind each number — plus PSA populations. Keyed by the card ID in every PokeInvest card URL, so there's no matching step.
Prices: every grade, every grader, with the evidence
Not a formula. Each figure is the median of real completed sales at that exact grade and grading company, published only when there are three or more inside the window. Sale counts, window, newest sale and the change against the previous window ride along, so your model knows how much to trust each number.
GET https://www.pokeinvest.io/api/prices/pi_16322
X-API-Key: your_key
{
"pokeinvest_id": "pi_16322",
"name": "Gengar EX #108",
"set_name": "Pokemon Fire Red & Leaf Green",
"currency": "USD",
"ungraded": { "median_usd": 949.5, "sales": 32, "window_days": 90,
"newest_sale": { "usd": 1050.0, "date": "2026-09-25" }, ... },
"graded": [
{ "grader": "PSA", "grade": "10", "median_usd": 26525.0, "sales": 4, "window_days": 365,
"low_usd": 21000.0, "high_usd": 32000.0,
"newest_sale": { "usd": 27500.0, "date": "2026-08-30" }, "change_vs_previous_window": null },
{ "grader": "PSA", "grade": "9", "median_usd": 8700.0, "sales": 16, "window_days": 90,
"change_vs_previous_window": 0.58, ... },
{ "grader": "CGC", "grade": "Pristine 10", ... },
{ "grader": "BGS", "grade": "9.5", "median_usd": 6550.0, "sales": 20, ... }
],
"estimates": { "note": "vendor figures, not measured by us", "psa_10": 26000.0, ... },
"population": { "psa_total": 3300, "psa_10": 105, "cgc_total": 428, "psa_last_updated": "2026-09-20" }
}
- Measured, and labelled as such — anything under
gradedorungradedcame from sales we can show. Vendor figures live underestimatesand never mix in. - Tiers above 10 are separate — BGS Black Label, CGC Pristine 10 and a plain 10 are different prices, because they are.
- Recomputed every night from 547,000+ completed sales, behind a gate that refuses to publish a price that moved on thin evidence. 2,800+ cards carry measured prices today and the count grows nightly; the rest return estimates only.
Populations: the same key, the same IDs
GET https://www.pokeinvest.io/api/population/pi_46078
X-API-Key: your_key
{
"pokeinvest_id": "pi_46078",
"tcgplayer_id": "146698",
"name": "Mewtwo GX #78",
"set_name": "Pokemon Shining Legends",
"population": {
"psa_10": 2628, "psa_9": 6132, "psa_8": 3806,
"psa_7": 792, "psa_6": 272, "psa_5": 162,
"psa_4": 89, "psa_3": 63, "psa_2": 28, "psa_1": 97,
"total": 14072
},
"gem_rate_pct": 18.68,
"psa_last_updated": "2026-01-04"
}
- Look cards up however you already track them — by our
pokeinvest_id, or straight by TCGplayer product id. Both resolve on both endpoints, and both come back on every response so the data joins to whatever you already have. - IDs that don't move — a
pokeinvest_idis never reused and never renumbered. If we ever merge two records the old ID keeps resolving, so nothing you've stored goes stale. - Honest freshness — populations refresh era by era; every response carries that card's last-updated date so you always know what you're looking at.
- Simple errors — 401 bad key, 404 unknown card, 429 past your monthly cap. Nothing exotic.
Population history: every grade, over time
A dated snapshot of the PSA population report, taken weekly. A point is written only when a card's counts changed, so a flat card has few points and that is the truth, not a gap. Series begin September 2026.
GET https://www.pokeinvest.io/api/population-history/pi_46078
X-API-Key: your_key
{
"pokeinvest_id": "pi_46078",
"name": "Mewtwo GX #78",
"set_name": "Pokemon Shining Legends",
"grader": "PSA",
"points": [
{ "date": "2026-09-07", "total": 13990, "psa_10": 2628, "psa_9": 6132, "psa_8": 3806, ... },
{ "date": "2026-10-11", "total": 14102, "psa_10": 2651, "psa_9": 6180, "psa_8": 3831, ... }
]
}
Sales: the completed sales behind every price
Date, price, grader and grade, platform, listing. The same rows the card page shows as its receipts; sales held out as the wrong card, a lot, a proxy or damaged are not here. Up to 500 newest; filter with ?grade=PSA+10 or ?days=90.
GET https://www.pokeinvest.io/api/sales/pi_16322?grade=PSA+10
X-API-Key: your_key
{
"pokeinvest_id": "pi_16322",
"name": "Gengar EX #108",
"currency": "USD",
"count": 4,
"sales": [
{ "date": "2026-08-30", "price_usd": 27500.0, "grader": "PSA", "grade": "10",
"platform": "eBay", "sale_type": "marketplace",
"title": "2004 Pokemon EX Fire Red Leaf Green Gengar ex #108 PSA 10", "url": null },
{ "date": "2026-07-12", "price_usd": 26000.0, "grader": "PSA", "grade": "10",
"platform": "Goldin", "sale_type": "auction", "url": "https://goldin.co/item/..." }
]
}
- Every language — Japanese, Chinese and Korean sets are in the same catalogue with the same IDs; 9,600 Japanese cards carry a measured price today and 17,700 carry a PSA population.
- Auction links are permanent — Goldin, Fanatics, Heritage, MySlabs and Pristine keep lot pages up. eBay retires ended listings and redirects them to a catalogue page, so its link is withheld rather than sent wrong.
Prices and populations · 10,000 calls a month · resets on the 1st · cancel anytime
Card checkout via Stripe. Your key arrives by email within a minute of paying.
Need every card at once instead? The bulk CSV export is $79/mo.
Questions
How are the prices computed?
Every completed sale we collect is filed to a card and a grade — the grading company has to be named in the listing; a "PSA 10 potential" is a raw card — and sales that are lots, other-language printings or damaged copies are set aside. A price is the median of what is left at that grade: the last 90 days for ungraded cards and for grades with five or more recent sales, the last year otherwise. It is published only with three or more sales inside its window. Medians, never averages, so one mispriced sale cannot move a number.
How fresh is the population data?
Populations are rescraped era by era. Current sets refresh every few weeks; older sets can go a few months between refreshes. That's why every response includes psa_last_updated for the exact card — no guessing.
Which cards are covered?
24,000+ English Pokémon cards with PSA population data, out of 52,000+ tracked cards. Cards without population data return the card with null population fields rather than an error.
How do I find a card's ID?
It's the number in the card's PokeInvest URL, and it's visible on every card page. Every API response echoes it back too.
How do I cancel?
Self-serve: manage your subscription here — we email you a secure billing link where you can cancel, change your card, or grab invoices. Your key keeps working until the end of the period you've paid for. Or just reply to any email from us and say cancel.
Need more than 10k calls or different data?
Email [email protected] — pricing endpoints, higher limits, and bulk exports are all conversations I'm happy to have.