PSA Cert Lookup API
Updated . Plan numbers are the ones on the developers page that day; the live plans table wins if they ever disagree.
Quick answer
The HobbyCardIndex cert lookup API takes a PSA, BGS, CGC or SGC cert number and returns the grader's record (grade, player, year, set, card number), the matching card in our catalog with its prices at every grade, the price at that grade and a link to the cert on the grader's site. Every commercial plan includes cert lookups, from 150 a month on Lite at $99, and you can apply for a free setup month to try it.
How the cert lookup works
Everything lives under https://hobbycardindex.com/api/v1/ and takes your key in an X-API-Key header (an Authorization: Bearer header works too). Every successful response is wrapped as {"success": true, "data": {...}}; the examples on this page show what sits inside data. Prices are US dollars with two decimals.
GET /certs/{grader}/{certNumber}, where grader is psa, bgs, cgc or sgc and the number is what's printed on the slab label. One lookup a second per key. The response has three parts: cert, the grading company's own record; card, the card in our catalog that record resolves to, with the eight price lanes; and slab, the grade, whether the cert verified, the price at the slab's own grade, a verifyUrl that opens the grader's page for it, and the grader's own slab photos when it has them. PSA, CGC and TGA links open the cert itself; Beckett and SGC links open their lookup page with the number to enter.
Try it: a PSA cert
curl 'https://hobbycardindex.com/api/v1/certs/psa/12345678' \
-H 'X-API-Key: hci_live_...'
{
"cert": {
"grader": "PSA",
"certNumber": "12345678",
"grade": "10",
"player": "Mike Trout",
"year": "2011",
"set": "Topps Update",
"cardNumber": "US175",
"variety": ""
},
"card": {
"id": 12345,
"name": "Mike Trout #US175",
"setName": "Topps Update",
"category": "Baseball",
"prices": {
"loose": 293,
"psa10": 4500,
"psa9": 1250,
"psa8": 640,
"psa7": null,
"bgs10": 3900,
"cgc10": 2100,
"sgc10": 2400
},
"hciUrl": "https://hobbycardindex.com/cards/12345"
},
"slab": {
"grader": "PSA",
"grade": 10,
"certVerified": true,
"priceAtGrade": 4500,
"verifyUrl": "https://www.psacard.com/cert/12345678",
"frontImageUrl": "https://...",
"backImageUrl": "https://..."
}
}
Example values, not a live cert. Response headers X-HCI-Certs-Used and X-HCI-Certs-Allowance show where you stand for the month.
Cert lookups by plan
Lite includes 150 cert lookups a month, Growth Lite 750, Growth 3,000 and Platform 50,000; the free setup month has 100. The $100 a month add-on (pop reports and cert lookups together) raises the number to 32,000 on Lite, Growth Lite or Growth. Cert lookups end for the month at the plan's number (429 CERT_LIMIT_REACHED); there's no overage on them. A cert we've seen before answers from our records; a new one is looked up live and draws on a daily pool shared across all API customers. When that pool is gone, new certs get 429 CERT_LOOKUPS_BUSY until 00:00 UTC and the lookup isn't counted against you. A bad request costs nothing either.
Pop report API
GET /prices/{cardId}/population returns how many copies PSA, BGS, SGC and CGC have graded, grade by grade, with gem counts and gem rate, the date the report is as of and the last change. It comes with Platform (50,000 a month) or the $100 add-on (32,000) on the other sizes, has its own monthly number equal to the plan's cert lookups, and stops there (429 POP_LIMIT_REACHED). population is null when we don't hold a report for that card yet. Pop counts go out as counts; nothing in the response names where they come from.
{
"card": {
"id": 12345,
"name": "Mike Trout #US175"
},
"population": {
"totalPopulation": 41000,
"totalGems": 9800,
"asOf": "2026-10-30",
"graders": {
"PSA": {
"totalGraded": 35000,
"gems": 8200,
"gemGrade": "10"
},
"BGS": {
"totalGraded": 4100,
"gems": 900,
"gemGrade": "9.5"
}
}
}
}
Example values, trimmed. Each grader block also carries the gem rate as a percentage and, when present, ladder, the grade-by-grade breakdown.
Slab photos and the scan endpoint
The cert lookup starts from a number. If what you have is a photo of a slab, POST /scan reads the label and returns the grader, grade and cert number along with the card, so an intake flow can go photo to cert to price in two calls. The card scanner page covers that. For what the grades themselves mean, the PSA grading guide and how to read a pop report are the plain-English versions.
What you get
- PSA, BGS, CGC and SGC cert lookups on every commercial plan, from 150 a month.
- The grader's record, our matching card, its prices at eight grades and the price at the slab's grade in one response.
- The grader's own verify link, and its slab photos when it has them.
- Pop reports by grader with gem counts and gem rates, on Platform or with the add-on.
- The same key reaches sold sales, price history and photo identification. See the sports card API page for the full list.
Plans and prices
| Plan | Price | Requests a month | Photo scans | Sold-sale lookups | Cert lookups | Lookups a second | Past the requests and scans (up to 3x) |
|---|---|---|---|---|---|---|---|
| Lite | $99 a month | 25,000 | 25,000 | 5,000 | 150 | 10 | $1 per 250 more |
| Growth Lite | $249 a month | 125,000 | 125,000 | 25,000 | 750 | 15 | $1 per 500 more |
| Growth | $499 a month | 500,000 | 500,000 | 100,000 | 3,000 | 20 | $1 per 1,000 more |
| Platform | from $1,500 a month | 2,000,000 | 1,500,000 | 500,000 | 50,000, plus 50,000 pop reports | 50 | Set up with Sean, invoiced; bulk price files included |
Price history comes with every size. Sold-sale, cert and pop lookups stop at the plan's number and never run over. Two add-ons: pop reports plus cert lookups for $100 a month, which brings 32,000 of each to Lite, Growth Lite or Growth, and the daily price files for $450 a month on Growth Lite or Growth (included in Platform, not offered on Lite). Lite, Growth Lite and Growth are month to month by card, cancelled any time in Settings, API Access, and run to the end of the paid month.
The free setup month is 30 days on real data with no card: 1,000 requests and 1,000 photo scans a day, 500 sold-sale lookups and 100 cert lookups for the month. You apply in Settings, API Access once you're signed in, and Sean reviews each one. When the 30 days end, the first month of the plan you applied with is invoiced, and paying it keeps the key going. Full plan details are on the developers page.
Credit and data use
A commercial plan licenses the data for a product your users see. You can store the prices and price history you pull while the plan is active and use them on card pages, in charts, collection values and your own estimates. Sold-sale records can be shown to your users and kept in your product, but not turned into a standalone sales database, copied by the category or offered as a download. Card recognition stays with the scan endpoint: show our identifications, don't use them to build a recognizer of your own.
The terms ask for one link back to us somewhere on your site, such as "Prices and API supplied by Hobby Card Index". It does not need to be beside the prices or on your main page. When a plan ends, stored copies go within 30 days. The full wording is in the Terms of Service, section 8, and the shorter version is under Data use on the developers page.
Common questions
Is there a PSA cert lookup API?
Yes. GET /api/v1/certs/psa/{certNumber} on the HobbyCardIndex API returns the PSA record for that cert (grade, player, year, set, card number), the matching card in our catalog with its prices at every grade, the price at that grade and a link to the cert on PSA's site. The same endpoint takes bgs, cgc and sgc.
How many cert lookups does each plan include?
Lite includes 150 cert lookups a month, Growth Lite 750, Growth 3,000 and Platform 50,000. The pop reports plus cert lookups add-on, $100 a month on Lite, Growth Lite or Growth, raises that to 32,000. The free setup month has 100. Cert lookups stop at the plan's number and never run over.
Is there a pop report API?
Yes. GET /api/v1/prices/{cardId}/population returns how many copies PSA, BGS, SGC and CGC have graded, grade by grade, with gem counts and gem rate. It comes with Platform (50,000 a month) or the $100 add-on (32,000) on the other sizes. population is null when we don't hold a report for that card yet.
Can I verify a cert is real with the API?
The lookup returns the grader's own record for that number, with certVerified true when the number resolved and a verifyUrl to the cert on the grader's site, which is the strongest check an app can make. It can't tell you the slab in front of you is the one the record describes; the scan endpoint reads the label for that.
Why did a cert lookup return 429?
Two reasons. One lookup a second per key is the limit, so a burst gets RATE_LIMITED; wait a second and retry. New certs we haven't seen before draw on a daily pool shared across all API customers; when it's used up, new certs get CERT_LOOKUPS_BUSY until 00:00 UTC and the lookup isn't counted. Certs we've seen before still answer.
How much does the cert lookup API cost?
It's part of every commercial plan rather than a separate product: Lite is $99 a month with 150 cert lookups, Growth Lite $249 with 750, Growth $499 with 3,000 and Platform from $1,500 with 50,000. For heavier cert and pop use, the $100 a month add-on brings 32,000 of each to Lite, Growth Lite or Growth.