PSA population and graded prices
PSA graded card prices by grade, population reports for a single card or a whole set, card search and a full list of PSA sets per game, with one API key.
Four PSA endpoints for graded trading cards:
| Endpoint | What you get |
|---|---|
GET /psa/search | Find a card and its PSA specId |
GET /psa/card | Prices by grade, recent sales and the population report for one card |
GET /psa/sets | Find a PSA set, or list every set for a game, with its headingId |
GET /psa/set | The population of every card in a set, for every grade, in one call |
All four use your normal API key, monthly quota and rate limit. Each call counts as one request, and failed calls are never charged.
Find a card
Search by card name, set and number. Each match comes back with the specId you pass to /psa/card.
curl "https://api.ebaysoldlistingsapi.com/psa/search?keyword=charizard+base+set&count=5" \
-H "Authorization: Bearer YOUR_API_KEY"| Parameter | Values | Default |
|---|---|---|
keyword | Card name, set, number, up to 200 characters | Required |
count | 1 to 20 matches | 10 |
page | 1 to 50 | 1 |
{
"keyword": "charizard base set",
"marketplace": "psa",
"totalResults": 57628,
"totalItems": 5,
"items": [
{
"specId": "5217539",
"description": "2019 Pokemon Chinese Sun & Moon All Stars Collection 032 Charizard GX Set A",
"subject": "Charizard GX Set A",
"cardNumber": "032",
"setName": "Pokemon Chinese Sun & Moon All Stars Collection",
"year": "2019",
"category": "Tcg Cards"
}
]
}Prices and population for one card
Send a specId from the search, or a keyword and the best match is used (other close matches are
listed in otherMatches).
curl "https://api.ebaysoldlistingsapi.com/psa/card?specId=5217539&count=20" \
-H "Authorization: Bearer YOUR_API_KEY"| Parameter | Values | Default |
|---|---|---|
specId | PSA spec ID (digits) | Required unless keyword is sent |
keyword | Card name, set, number, up to 200 characters | None |
count | 0 to 50 recent sales in items | 10 |
timeRange | Months of sales to include, 0 to 120 (0 = all available) | 0 |
grade | A PSA grade from 1 to 10 (half grades allowed) or raw, to filter items | All grades |
marketplace | ebay, fanatics, goldin or heritage, to keep only that marketplace's sales in items | All marketplaces |
marketplace filters the count most recent sales the call reads; it does not search further back. Most PSA sales are
on eBay, so for auction houses (Heritage Auctions especially) use count=50 and a longer timeRange, and expect a few
matching sales per call. For keyword search across a whole auction house, see
auction house sold prices.
The response has:
priceByGrade: for each grade, the number of sales, average, minimum, maximum and latest price.population: total graded, the gem rate (share graded 10) and the count for every grade, with copies graded with a qualifier (for example 9 OC) counted separately inwithQualifier.items: recent sales with date, price, sale type, grading company, grade, cert number and listing link.summary: median, mean, range and quartiles of the returned sales.
{
"card": {
"specId": "5217539",
"subject": "CHARIZARD GX",
"cardNumber": "#032",
"setName": "POKEMON CHINESE SUN & MOON ALL STARS COLLECTION",
"year": "2019"
},
"priceByGrade": [
{ "grade": "10", "sales": 1, "averagePrice": 48, "minPrice": 48, "maxPrice": 48, "latestPrice": 48 }
],
"population": {
"total": 26,
"gemRate": 69.23,
"grades": [{ "grade": "10", "count": 18, "withQualifier": 0 }]
},
"items": [
{
"saleDate": "2025-04-05T00:04:00.000Z",
"salePrice": 2.25,
"saleType": "Auction",
"gradingCompany": "UNGRADED",
"grade": null,
"certNumber": null,
"url": "https://www.ebay.com/itm/365490372146"
}
]
}Every set for a game
Send a game to list every PSA set for that game, newest first, and page through all of them. Add a
keyword or year to narrow the list. Without a game, a keyword searches set names across all games.
curl "https://api.ebaysoldlistingsapi.com/psa/sets?game=pokemon&count=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"| Parameter | Values | Default |
|---|---|---|
game | See the list below | None |
keyword | Words in the set name, at least 2 characters | Required unless game is sent |
year | 4-digit year | All years |
count | 1 to 100 sets per page | 25 |
page | 1 to 1000 | 1 |
Games: pokemon, one-piece, magic, yugioh, dragon-ball, lorcana, digimon, weiss-schwarz,
union-arena, flesh-and-blood, star-wars-unlimited, cardfight-vanguard, duel-masters,
battle-spirits, final-fantasy, gundam, shadowverse, riftbound, grand-archive and wixoss.
Keep requesting the next page while hasNextPage is true. totalResults is the number of sets that
match.
{
"keyword": "151",
"marketplace": "psa",
"game": "pokemon",
"page": 1,
"hasNextPage": true,
"totalResults": 21,
"totalItems": 3,
"items": [
{
"headingId": "249038",
"name": "Pokemon German Mew de-151",
"year": "2023",
"url": "https://www.psacard.com/pop/tcg-cards/2023/pokemon-german-mew-de-151/249038",
"gradedTotal": 9947
}
]
}Population of a whole set
Send a set's headingId (from /psa/sets), or the set's PSA population page link as url. One call
returns every card in the set.
curl "https://api.ebaysoldlistingsapi.com/psa/set?headingId=57801" \
-H "Authorization: Bearer YOUR_API_KEY"| Parameter | Values | Default |
|---|---|---|
headingId | PSA set ID from /psa/sets | Required unless url is sent |
url | The set's PSA population page, for example https://www.psacard.com/pop/tcg-cards/1999/pokemon-game/57801 | None |
Each card has its number, English name, variety, PSA specId and its population for every grade
(Authentic, then 1 to 10 including half grades). totals is the same breakdown for the whole set. Large
sets can take 10 to 20 seconds.
{
"set": { "headingId": "57801", "name": "Pokemon Game", "year": "1999", "gradedTotal": 1154473 },
"totalCards": 490,
"totals": {
"total": 1158021,
"grades": [{ "grade": "9", "count": 278101, "withQualifier": 214 }, { "grade": "10", "count": 112472, "withQualifier": 0 }]
},
"items": [
{
"specId": "544021",
"cardNumber": "1",
"name": "Alakazam-Holo",
"variety": null,
"population": {
"total": 20791,
"grades": [{ "grade": "9", "count": 3695, "withQualifier": 2 }, { "grade": "10", "count": 457, "withQualifier": 0 }]
}
}
]
}Errors and pacing
| Status | code | Meaning |
|---|---|---|
| 400 | invalid_params | A parameter is missing or invalid; the message says which |
| 502 | upstream_blocked | PSA did not complete this call; retry after a short pause |
| 503 | server_busy | PSA is busy right now; retry after retry_after seconds |
| 429 | rate_limited | More than 6 /psa/set calls in a minute; wait for the Retry-After header, then continue |
Failed calls are not charged. /psa/set is paced at up to 6 calls per minute per account, which keeps whole-catalogue
pulls steady (about 8,600 sets a day). For bulk pulls, spread calls out rather than sending large parallel bursts, and
do not retry a failed set right away. Results are kept for a short time, so repeating the same call is fast.
Active listings
Set sold=false on GET /scrape to return current live eBay listings with asking price, bids, time left, watchers and units sold.
TCGplayer sales and listings
GET /tcgplayer/sold returns TCGplayer completed sales with optional market price history, and GET /tcgplayer/listings returns current listings, for Pokemon, Magic, Yu-Gi-Oh, One Piece and other trading cards.