Population reports

How many copies of a card exist at each grade, per grading company. Population is the scarcity half of value: two cards with the same market price are not the same asset if one has nine hundred PSA 10s and the other has twelve.

Not live yet. The population route is documented ahead of its build: GET /api/v1/{game}/cards/{id}/population is not deployed, so a call today returns 404 and costs no credits. It has no endpoint page or "Try it" runner in the sidebar for that reason. Everything below is the shape it will return and the caveats that will come with it — design against it, but don't ship a UI that has nothing to render.

The shape

{
  "card_id": "sv3pt5-6",
  "total_graded": 4218,
  "companies": [
    {
      "company": "PSA",
      "total": 3140,
      "gem_rate": 0.31,
      "updated_at": "2026-07-26T04:12:00Z",
      "grades": [
        { "grade": "10", "count":  973, "qualifier_count":  0, "share": 0.310 },
        { "grade": "9",  "count": 1402, "qualifier_count": 11, "share": 0.447 },
        { "grade": "8",  "count":  488, "qualifier_count":  6, "share": 0.155 }
      ]
    },
    { "company": "CGC", "total": 702, "gem_rate": 0.44, "grades": [ … ] },
    { "company": "BGS", "total": 376, "gem_rate": 0.19, "grades": [ … ] }
  ],
  "scarcity": { "rank": 12, "percentile": 0.97 }
}

Reading it

FieldWhat it means
companies[].totalEvery copy that company has slabbed, across all grades. This is the denominator for share.
companies[].gem_rateFraction of that company's submissions that came back at the top grade. A low gem rate on a high total means the card is genuinely hard to grade well, usually because of centering or edge wear on a dark border.
grades[].countCopies at that grade. Half grades (BGS 9.5, CGC 9.5) appear as their own entries.
grades[].qualifier_countOf those, how many carry a qualifier (PSA OC, MK, ST, MC). Qualified slabs trade well below clean ones, so exclude them when you compare against a price.
scarcity.percentileWhere this card's top-grade population sits against every other card in the same expansion. 0.97 means only 3% of the set has fewer top-grade copies.

Caveats worth surfacing to your users

Population only ever goes up. It counts slabs graded, not slabs that still exist, and cracked, lost and destroyed cards are never subtracted. Treat it as an upper bound on supply.

Resubmissions inflate it. A card cracked and resubmitted for a better grade is counted at both. Companies periodically prune known resubmissions, which is why a count can occasionally fall.

Companies are not comparable one-to-one. A CGC 10 and a PSA 10 are not the same bar. Compare grades within a company, not across them.

Refresh cadence

Reports are re-pulled from each company on a rolling schedule: daily for actively traded cards, weekly for the long tail. companies[].updated_at tells you when that company's numbers were last read, and it can differ between companies in the same response. Population moves slowly; polling faster than daily just spends credits.

Pairing it with pricing

The graded values in pricing data use the same company and grade keys, so the two responses join cleanly. A common pattern is to render value alongside population per grade. That's the view that shows a PSA 9 is worth a third of a PSA 10 and that there are one and a half times as many of them.

Availability

When it ships, it will cover:

  • Pokémon Trading Card Game
  • One Piece Card Game

Coverage follows what the grading companies publish, so games too new to have a meaningful slab market won't have reports at all. The coverage table on the index is always current, and marks which families are live today.