Is there an API that reads graded slabs (PSA, BGS, CGC) from a photo?
Direct answer
Yes. The NeoSatoshi Detection API reads the grading company, the grade and the cert number from PSA, BGS and CGC labels and returns them in cards[].graded, next to the card it recognised through the plastic. It works for Pokémon, One Piece, Disney Lorcana, Yu-Gi-Oh!, Magic: The Gathering and Star Wars: Unlimited, with the same request as a raw card and at the same cost of one card scan. The grade is read from the label, never estimated, and the cert number is not verified with the grading company.
What comes back for a slab
Send the photo exactly as for a raw card: there is no slab mode and no extra parameter. Every card in the response has a graded field. It is null for a raw card and an object for a slab, for example a CGC Lorcana slab:
cards[].graded
{
"grader": "CGC",
"grade": "10 Pristine",
"cert_number": "1234567890",
"card_check": "agree",
"label": {
"name": "Minnie Mouse",
"number": "241",
"code": "241/204",
"set": "Fabled",
"year": "2025"
}
}grader: PSA, BGS or CGC.nullwhen the slab was recognised but the company was not.grade: a string on that company's own scale, such as "10", "9.5", "10 Black Label", "10 Pristine" or "Authentic".nullwhen it could not be read.cert_number: as printed on the label,nullwhen unread. It is not checked against the grading company's database.card_check:agree,disagreeorunknown. It compares what the label names with the card the API recognised.label: name, number, code, set and year as printed on the label, eachnullwhen absent.
Try it in Python
This script reuses scan.py from the scanner app tutorial, which runs with the public demo key (10 detections per day, no signup). Run python slabs.py slab.jpg, or add the game: python slabs.py slab.jpg lorcana.
Python: slabs.py
import sys
from scan import detect # scan.py from the scanner app tutorial
def slab_line(card):
slab = card.get("graded")
if slab is None:
return "raw card"
company = slab["grader"] or "company not read"
grade = slab["grade"] or "grade not read"
cert = slab["cert_number"] or "not read"
return f"{company} {grade}, cert {cert}"
def needs_a_person(card):
"""A slab whose company or grade is missing, or whose label names another card."""
slab = card.get("graded")
if slab is None:
return False
return not slab["grader"] or not slab["grade"] or slab["card_check"] == "disagree"
tcg = sys.argv[2] if len(sys.argv) > 2 else "pokemon"
for card in detect(sys.argv[1], tcg)["cards"]:
flag = " <- check by hand" if needs_a_person(card) else ""
print(card.get("name"), "|", slab_line(card) + flag)Rules for your app
- Never list a slab without company and grade. If either is
null, ask your user; never fall back to listing it as a raw card. - On
card_check: "disagree"show the slab to a person: the label names another card than the one recognised, and either can be the right one. pricesstay the prices of the raw card. They are not a price for the slab, which sells for its own price.- The API reads the grade the company printed. It never judges the condition of a raw card and never checks whether a slab is genuine.
How well it reads
Measured on eBay photos of real slabs, 144 to 704 per game for Pokémon, One Piece, Yu-Gi-Oh! and Lorcana: the grade was read on 93 to 95 % of them, and where it was read, company and grade were right on 98 to 100 %. Magic: 80 of 90 slabs graded, all right. Star Wars: Unlimited: 50 of 62 recognised, 49 grades right. Glare on the label, slabs photographed sideways and tight framing are the usual reasons a grade stays unread.
Frequently asked questions
What about SGC, TAG and other graders?
Their slabs come back as a raw card or with grader set to null, never with a grade. Only PSA, BGS and CGC are read today.
Does a slab cost more?
No. A slab is one card scan, like a raw card. A photo without a card costs nothing.
Does it work with several slabs in one photo?
Send one slab per photo. Pokémon photos with several cards are processed card by card, but all our slab measurements are on one slab per photo, and the other games take one card per photo anyway.
Further reading
Read the slab section of the docs
Every field of cards[].graded, the per-game fields and a test box for your own photo. 10 free detections per day, no signup.
No account required for the first 10 detections.