Any Pokémon card, identified from a photo, in one call.
The same recognition engine behind the Moonstone scanner: 60,000+ printings across English and Japanese sets, graded slabs (PSA, BGS, CGC), vintage WotC through this month's releases, holo, reverse, Poké Ball and Master Ball patterns. Battle-tested to 100% identification on adversarial eBay photo suites, and continuously regression-gated.
Free sandbox tier. No credit card to start.
curl -X POST https://www.moonstonehq.com/api/v1/scan \
-H "x-api-key: mk_live_..." \
-H "Content-Type: application/json" \
-d "{\"image\": \"$(base64 -i card.jpg)\"}"Quickstart
- Create a key. Sign in and generate a key. The secret is shown once; store it server-side. Every key starts on the free Sandbox plan.
- Send a photo. POST it to
/api/v1/scanas base64. Phone photos, listing photos, and slab photos all work; no cropping or warping needed. - Read the match.
matchis the best identification with catalog id, name, number, and set.candidatescarries the ranked alternatives,confidenceis 0 to 100.
Request
POST https://www.moonstonehq.com/api/v1/scan
Authenticate with x-api-key (or Authorization: Bearer).
| Field | Type | |
|---|---|---|
image | string, required | The card photo as base64 (raw or data URI). JPEG, PNG, or WebP. Long edge around 1200 to 1600 px scans best; hard cap ~6 MB. |
refine | boolean, default true | When retrieval is ambiguous the API automatically runs a second visual-refine pass before answering. Set false to skip it and shave latency. |
Errors
401 | Missing, invalid, or revoked API key. |
402 | Monthly quota exhausted. Upgrade your plan; requests are never silently billed past quota. |
413 | Image too large. |
429 | Per-minute rate limit hit. Honor the Retry-After header. |
502 | Scan backend unavailable. The request was not counted against your quota. |
Response
{
"object": "scan_result",
"match": {
"id": "sv2a-150",
"name": "Mewtwo",
"number": "150",
"set": "Pokemon Card 151",
"image": "https://..."
},
"candidates": [ ... up to 8, ranked ... ],
"confidence": 87,
"confident": true,
"cardBack": false,
"slabLabel": { "company": "PSA", "grade": "9", ... },
"usage": { "plan": "developer", "scansUsedThisPeriod": 41, "monthlyQuota": 500 }
}Every response carries x-monthly-used, x-monthly-quota, and x-ratelimit-limit-rpm headers so clients can meter themselves. Card backs are detected and refused without burning a candidate slot. Slab photos additionally return the parsed grading label.
Pricing
Hard quotas, honest metering: only successful scans count, failures and rate-limited calls never touch your quota, and nothing bills past your plan.
Sandbox
Free
- 25 scans / month
- 10 requests / minute
- Full catalog: EN + JP, slabs, variants
- No card required
Developer
$9 / month
- 500 scans / month
- 30 requests / minute
- Full catalog: EN + JP, slabs, variants
- Cancel anytime in the billing portal
Growth
$39 / month
- 5,000 scans / month
- 60 requests / minute
- Full catalog: EN + JP, slabs, variants
- Cancel anytime in the billing portal
Scale
$199 / month
- 50,000 scans / month
- 120 requests / minute
- Full catalog: EN + JP, slabs, variants
- Cancel anytime in the billing portal
Pokémon card scanning API: common questions
Is there an API to identify Pokémon cards from a photo?
Yes. The Moonstone Scan API identifies any Pokémon card from a single photo: send a base64 image to POST /api/v1/scan and get back the card's catalog id, name, number, set, and ranked alternatives with a confidence score. It handles phone photos, eBay listing photos, and graded slab photos without cropping.
Does the Pokémon card scanner API work on Japanese cards?
Yes. The catalog covers 60,000+ printings across English and Japanese sets, from 1996 vintage through this month's releases, including Japanese exclusives and pattern variants like Poké Ball and Master Ball reverses.
Can it read graded slabs like PSA, BGS, and CGC?
Yes. Slab photos return both the card identification and the parsed grading label (company, grade, and certification details when legible). Label evidence like set codes and variant phrasing is used to disambiguate visually similar printings.
How accurate is the card recognition?
The engine is validated continuously on 25-card suites of real, unfiltered eBay listing photos adjudicated by pixels, and shipped behind a 56-case must-pass regression gate. Recent public suites run at 100% identification, including foils, glare, and mislabeled listings.
How much does the Pokémon card scanning API cost?
A free Sandbox tier includes 25 scans per month with no credit card. Paid plans start at $9/month for 500 scans, $39/month for 5,000, and $199/month for 50,000, with hard quotas: failed calls never count, and nothing bills past your plan.
Good to know
The engine is validated by continuous 25-card suites of real, unfiltered eBay listing photos, adjudicated against pixels. The current regression gate holds 56 must-pass cases spanning glare, foil patterns, corrupted CDN images, and mislabeled slabs.
Identifications resolve to a catalog of real printings synced daily from market sources. No hallucinated cards: when the photo is a card back or unidentifiable, the API says so.
Quotas and rate limits apply per account across all keys. Keys can be named, rotated, and revoked instantly from the dashboard. Keep secrets server-side; never ship them in client apps.