Skip to content

NeoSatoshi

FeaturesPricingFAQAPIBlogLoginSign UpYouTubeJoin Discord

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. null when 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". null when it could not be read.
  • cert_number: as printed on the label, null when unread. It is not checked against the grading company's database.
  • card_check: agree, disagree or unknown. It compares what the label names with the card the API recognised.
  • label: name, number, code, set and year as printed on the label, each null when 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.
  • prices stay 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.

Related questions

Is there a card scanner that reads graded slabs from PSA, BGS and CGC?

Which card recognition API should I use in 2026?

How do I build a trading card scanner app?

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.

Try it free

No account required for the first 10 detections.

NeoSatoshi

AI card detection for sellers. Speed up your listing workflow. Save hours every week.

Use Cases

BlogFAQGuidesFree ToolsListing SoftwareeBay Listing ToolShopify Listing ToolCardmarket WorkflowCard ScannerSales AnalyticsOne Piece Listing SoftwareOne Piece eBay ToolOne Piece Card ScannerLorcana Listing SoftwareYu-Gi-Oh! Listing SoftwareMagic Listing SoftwareStar Wars: Unlimited Listing Software

Developers

© 2026 NeoSatoshi

The literal and graphical information about the Pokémon Trading Card Game presented on this website, including card images and text, is copyrighted by The Pokémon Company (Pokémon), Nintendo, Game Freak, Creatures and/or pokemontcg.io. One Piece Card Game content is the property of Eiichiro Oda/Shueisha, Toei Animation and Bandai. Disney Lorcana content is the property of Disney and Ravensburger. Yu-Gi-Oh! content is the property of Studio Dice/Shueisha, TV Tokyo and Konami. Magic: The Gathering content is the property of Wizards of the Coast. Star Wars: Unlimited is a trademark of Lucasfilm Ltd. and Fantasy Flight Games. This website is not produced, endorsed or supported by any of these rights holders.

Terms Of UsePrivacy PolicyContact
Loading...

Loading page...

Your privacy

We use essential cookies to run the site. With your permission we also use analytics to improve NeoSatoshi, and marketing to measure which of our ads work. That loads a script from OpenAI. You can choose each one separately under Settings.