Card Ladder API & Scraper
The Card Ladder API turns cardladder.com into JSON in eleven actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search finds cards in Card Ladder's database (basketball, baseball, football, hockey, soccer, Pokémon, One Piece, Magic, Yu-Gi-Oh! and 20 more categories), filtered by category, exact condition (Raw, PSA 10, BGS 9.5, SGC 10 and 222 more), grading company, player, year, value, last sold price and population, and sorted by value, sales, pop, market cap, ladder score, date or % change. Each row is one card in one grade with Card Ladder's CL Value, the last sold price and date, the number of recorded sales, the population, the market cap and the 1-day to 1-year change. card returns one card in full: the CL Value with its confidence, all-time high, ROI, oldest and newest sale, last-month and last-year high, low and average, the PSA pop link, the cert, the value of every other grade of the same card, similar cards, active listings and the complete per-day sales history back to the card's first recorded sale. card_price_history and card_grades return the history (with a date range) and the grade ladder on their own. listings searches the active listings Card Ladder tracks on eBay, Fanatics, Goldin, Heritage, MySlabs and more. players, player, indexes and index return the player indexes and the 40 Card Ladder market indexes with their full history and constituent cards, ladder returns the trending cards, and daily_sales_recap the nightly Daily Sales Recap. Values are in US dollars. One ReefAPI key, the standard { ok, data, meta, error } envelope, no Card Ladder account.
Which Card Ladder number is which
Card Ladder publishes several values per card; they answer different questions. Field names as the API returns them, measured 2026-10-15.
| field | what it is | example (1984 Star Michael Jordan #101 PSA 7) |
|---|---|---|
| cl_value | Card Ladder's estimated value of the card in this grade | 169,465.92 |
| last_sold_price / last_sold_date | The most recent recorded sale | 170,000.00 on 2026-10-07 |
| num_sales | Sales Card Ladder has recorded for this card and grade | 89 |
| pop | Graded population of this grade | 166 |
| market_cap | pop × value | 28,131,342.22 |
| ladder_score | Growth over the last 2 weeks (the ladder's sort) | 3,762.2 |
| …_change_pct | Change as a fraction: 0.327 = +32.7 % | monthly 0.327 |
| price_history[].avg_price | Average sale price on that day (sales_count sales) | 28,800.00 on 2022-08-18 |
Every card row is one grade of one card; card_grades lists the other grades of the same card with their own CL Value (21 for this Jordan rookie). Player rows carry key_card_value, the CL Value of the player's key card, and index_value, the level of the player index.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/cardladder/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "luka doncic prizm",
"condition": "PSA 10"
}
}{
"ok": true,
"meta": {
"api": "cardladder",
"endpoint": "search",
"mode": "live",
"latency_ms": 990.5,
"record_count": 20,
"bytes": 28447,
"cache_hit": false,
"total": 53,
"total_is_capped": false,
"page": 1,
"limit": 20,
"has_more": true,
"partial": false,
"filters_applied": {
"query": "luka doncic prizm",
"condition": "PSA 10",
"sort": "relevance"
},
"upstream_requests": 1,
"warnings": [],
"currency": "USD",
"charged_credits": 2,
"version": "1.0.0",
"request_id": "2708084e723d4f05",
"queue_ms": 1.1,
"fetched_at": "2026-10-15T13:28:22.465Z"
},
"data": {
"rows": [
{
"card_id": "QDWKiTWGa2YfBHj2TuWs",
"slug": "2019-prizm-luka-doncic-base-75-psa-10",
"label": "2019 Prizm Luka Doncic Base #75 PSA 10",
"year": "2019",
"set": "Prizm",
"number": "75",
"variation": "Base",
"player": "Luka Doncic",
"player_id": "Luka Doncic",
"category": "Basketball",
"condition": "PSA 10",
"grading_company": "psa",
"psa_spec_id": 2898422,
"cl_value": 52.16,
"last_sold_price": 52.11,
"last_sold_date": "2026-10-11T10:00:00.000Z",
"num_sales": 1100,
"pop": 11010,
"market_cap": 574271.67,
"ladder_score": 87.91145293072826,
"undervalued_gap": 0.0009422011913608548,
"daily_change_usd": 0.02,
"daily_change_pct": null,
"weekly_change_pct": 0.828421052631579,
"monthly_change_pct": 1.7754993342210388,
"quarterly_change_pct": 1.4396067415730338,
"annual_change_pct": 1.120879120879121,
"key_card": false,
"outlier_index": false,
"hidden": false,
"status": null,
"date_added": "2020-08-15T20:23:53.193Z",
"image": "https://firebasestorage.googleapis.com/v0/b/cardladder-71d53.appspot.com/o/cards%2FQDWKiTWGa2YfBHj2TuWs?alt=media",
"ebay_query": "2019 Doncic Prizm 75 PSA 10 -sgc -bgs -gma -bccg -fresh -convention -hyped -far -likely -silver -finalists -green -red -blue -zion -white -rwb -pink -fireworks -orange -mojo -gold -fast -break -disco -emergent -impact -choice -tiger -hyper -mojo -purple -ruby -select -optic -contenders -mosaic -lot -fearless -orange -2018 -dominance -20 -21",
"url": "https://www.cardladder.com/ladder/card/QDWKiTWGa2YfBHj2TuWs",
"extra": {
"employee": "2mOVnw2QgkY6J8CfKfCyxTrpOTr1"
}
},
{
"card_id": "bsWRQeDJXkDhtzESLOjZ",
"slug": "2018-prizm-luka-doncic-emergent-base-3-psa-10",
"label": "2018 Prizm Luka Doncic Emergent Base #3 PSA 10",
"year": "2018",
"set": "Prizm",
"number": "3",
"variation": "Emergent Base",
"player": "Luka Doncic",
"player_id": "Luka Doncic",
"category": "Basketball",
"condition": "PSA 10",
"grading_company": "psa",
"psa_spec_id": 2690686,
"cl_value": 60.45,
"last_sold_price": 61,
"last_sold_date": "2026-10-03T10:00:00.000Z",
"num_sales": 1398,
"pop": 4925,
"market_cap": 297704.14,
"ladder_score": 25.889795918367344,
"undervalued_gap": -0.009056691120711597,
"daily_change_usd": -0.01,
"daily_change_pct": null,
"weekly_change_pct": null,
"monthly_change_pct": -0.29069767441860467,
"quarterly_change_pct": -0.0402769037130271,
"annual_change_pct": 0.1747713047664902,
"key_card": false,
"outlier_index": false,
"hidden": false,
"status": null,
"date_added": "2020-09-08T08:12:52.942Z",
"image": "https://firebasestorage.googleapis.com/v0/b/cardladder-71d53.appspot.com/o/cards%2FbsWRQeDJXkDhtzESLOjZ?alt=media",
"ebay_query": "2018 Prizm Emergent Doncic PSA 10 -BGS -SGC -GMA -BCCG -Beckett -9.5 -9 -8.5 -8 -7 -6 -5 -4 -2 -Lot -Set -Complete -Box -Boxes -Pack -Packs -Hanger -Blaster -Green -Silver -Refractor -Refractors",
"url": "https://www.cardladder.com/ladder/card/bsWRQeDJXkDhtzESLOjZ",
"extra": {
"employee": "2mOVnw2QgkY6J8CfKfCyxTrpOTr1"
}
},
{
"card_id": "PKuJ7wWM5mB9QtgcoHjD",
"slug": "2018-prizm-luka-doncic-purple-wave-280-psa-10",
"label": "2018 Prizm Luka Doncic Purple Wave #280 PSA 10",
"year": "2018",
"set": "Prizm",
"number": "280",
"variation": "Purple Wave",
"player": "Luka Doncic",
"player_id": "Luka Doncic",
"category": "Basketball",
"condition": "PSA 10",
"grading_company": "psa",
"psa_spec_id": 2690154,
"cl_value": 2001.61,
"last_sold_price": 2000,
"last_sold_date": "2026-10-08T10:00:00.000Z",
"num_sales": 127,
"pop": 113,
"market_cap": 226181.37,
"ladder_score": 23.308108108108108,
"undervalued_gap": 0.0008025038118929615,
"daily_change_usd": 0.76,
"daily_change_pct": null,
"weekly_change_pct": 0,
"monthly_change_pct": 0.08108108108108109,
"quarterly_change_pct": 0.21212121212121213,
"annual_change_pct": 0.041666666666666664,
"key_card": false,
"outlier_index": false,
"hidden": false,
"status": null,
"date_added": "2020-07-01T02:08:33.114Z",
"image": "https://firebasestorage.googleapis.com/v0/b/cardladder-71d53.appspot.com/o/cards%2FPKuJ7wWM5mB9QtgcoHjD?alt=media",
"ebay_query": "2018 luka doncic purple wave psa 10 -lot -bgs -9",
"url": "https://www.cardladder.com/ladder/card/PKuJ7wWM5mB9QtgcoHjD",
"extra": {
"employee": "2mOVnw2QgkY6J8CfKfCyxTrpOTr1"
}
}
]
}
}What the Card Ladder API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Card Ladder's card database. Each row is one card in one condition / grade with its CL Value, last sold price and date, number of recorded sales, graded population, market cap, ladder score and 1-day to 1-year % changes. Filter by category, condition, grading company, player, year, value, last sold price and population; sort by value, sales, pop, market cap, score, date or % change. Words in `query` must all appear in the card's label. | Pricing teams call search to search Card Ladder's card database. | query, category, condition, grading_company, player, ... |
| card | One card in full by its card_id: CL Value with its confidence, last sold price, all-time high, ROI, market cap, ladder score, % changes, oldest and newest sale, last-month and last-year high / low / average / count, graded population and PSA pop link, cert and slab serial, the value of EVERY other grade of the same card, other variations, similar cards, active listings, and the full per-day sales history back to the card's first recorded sale. | Marketplace operators call card to get one card in full by its card_id. | card_id |
| card_price_history | The per-day sales price history of one card, every recorded sale day back to its first sale (the average price that day and how many sales), optionally between two dates, with high / low / first / last over the range. | Catalog enrichment teams call card_price_history to get the per-day sales price history of one card, every recorded sale day back to its first sale (…. | card_id, from, to |
| card_grades | Every grade of the same card (Raw, PSA 1-10, BGS, SGC, CGC …) with its CL Value — the value ladder of one card. The card itself is included. | Retail analysts call card_grades to get every grade of the same card (Raw, PSA 1-10, BGS, SGC, CGC …) with its CL Value. | card_id |
| listings | Active card listings Card Ladder tracks across eBay, Fanatics (Weekly, Premier, Buy Now), Goldin, Heritage, MySlabs, Pristine and more: title, price, auction / best offer / fixed price, bids, watchers, end date, seller and the listing link. | Pricing teams call listings to get active card listings Card Ladder tracks across eBay, Fanatics (Weekly, Premier, Buy Now), Gol…. | query, platform, listing_type, min_price, max_price, ... |
| players | Search Card Ladder's player indexes: cards tracked, total value and market cap of the player's cards, last-day sales, the key card and the player index % change over 1 week to all time. Each row's player_id opens the `player` action. | Marketplace operators call players to search Card Ladder's player indexes. | query, category, min_cards, max_cards, sort, ... |
| player | One player's index: the index level, cards tracked, total value and market cap, the key card, % changes, the FULL index history and the sales-volume history, and the player's top 20 cards by ladder score (more with search + player). | Catalog enrichment teams call player to get one player's index. | player_id |
| indexes | The 40 Card Ladder market indexes (CL50, Pokémon, Basketball, Baseball, Football, Vintage, Modern, Low-Pop, High-End …) with the current index level, last-day sales, cards counted and % change over 1 week to all time. | Retail analysts call indexes to get the 40 Card Ladder market indexes (CL50, Pokémon, Basketball, Baseball, Football, Vintage, Mo…. | none |
| index | One market index: the index level, total value and market cap, % changes, its membership rule, the FULL index history (Pokémon back to 2004) and sales-volume history, and its constituent cards, 20 per page. | Pricing teams call index to get one market index. | index_id, page |
| ladder | Card Ladder's trending ladder (the 'Card Price Guide' page): cards ordered by ladder score (their growth over the last 2 weeks), for one category or all, 20 per page by default. | Marketplace operators call ladder to get card Ladder's trending ladder (the 'Card Price Guide' page). | category, page, limit |
| daily_sales_recap | Card Ladder's nightly Daily Sales Recap: total sales amount and count of the day, the cards that sold at an all-time high (with card_id and price), and the sales it excluded as suspicious ('Purgatory'). The latest recap, one day's, or one by post_id. | Catalog enrichment teams call daily_sales_recap to get card Ladder's nightly Daily Sales Recap. | post_id, date |
Call search from your stack
curl -X POST https://api.reefapi.com/cardladder/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"luka doncic prizm","condition":"PSA 10"}'import requests
r = requests.post(
"https://api.reefapi.com/cardladder/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "luka doncic prizm",
"condition": "PSA 10"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/cardladder/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "luka doncic prizm",
"condition": "PSA 10"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.cardladder.search with {"query":"luka doncic prizm","condition":"PSA 10"}.Who uses this API and why
- Value a graded collection: card for each card gives the CL Value, last sale and pop of the exact grade you own.
- Decide whether to grade: card_grades shows what the same card is worth Raw, PSA 8, 9 and 10.
- Chart a card: card_price_history gives every sale day back to the first recorded sale.
- Watch the market: index and player return the CL50, the category indexes and any player's index with full history.
- Find deals: listings filtered by platform, listing type and price, next to the card's CL Value.
Questions developers ask before integrating
Is the CL Value a sale price?
No. cl_value is Card Ladder's own estimate for the card in that grade. The actual sales are in the card's price_history (one point per day with a sale: the average price that day and the number of sales) and in last_sold_price / last_sold_date. On the cards checked, last sold price, last sold date and pop matched what the card's page shows.
How far back does the sales history go?
To the card's first recorded sale. The 1984 Star Michael Jordan #101 PSA 7 has 85 sale days since 2022-08-18 (89 sales). card_price_history takes from and to dates to cut a range, and returns high, low, first and last price over it.
Why does my search return nothing?
Every word in query must appear in the card's label. 'charizard psa 9' finds 36 cards, 'charizard base set psa 9' finds none because Card Ladder labels the 1999 Base Set 'Pokemon Game'. Use fewer words and the condition, category, player and year filters. An empty result is returned as ok with 0 rows.
Which grades and grading companies are covered?
Raw and every grade Card Ladder tracks for PSA, BGS (including Black Label), SGC, CGC, CSG, TAG, BVG, HGA and others, plus autograph grades such as PSA 10/Auto 10 — 226 conditions. Pass one as condition; grading_company filters by company.
What are the indexes?
Card Ladder's 40 market indexes (CL50, Pokémon, Basketball, Baseball, Football, Vintage, Modern, Low-Pop, High-End and more) and a player index for every tracked player. index and player return the current level, the % change from 1 week to all time, the full history (Pokémon back to 2004) and the constituent cards, 20 per page.
Which marketplaces do the listings come from?
Active listings Card Ladder tracks on eBay, Fanatics (Weekly, Premier and Buy Now), Goldin, Heritage, MySlabs, Pristine, Auction of Champions and more: title, price, auction / best offer / fixed price, bids, watchers, end date, seller and the link. Filter by platform, listing type and price.
How many results can I page through?
Up to 100 rows per page and the first 10,000 results of a search; meta.total says how many matched (it stops counting at 10,000, flagged by total_is_capped). Narrow with filters to reach the rest.
How do I go from a search row to the card?
Pass the row's card_id to card, card_price_history or card_grades as it is; the card's slug or its cardladder.com link work too. Player rows carry player_id for player, index rows index_id for index.
What is the Card Ladder API?
Card Ladder API is a ReefAPI endpoint group for card ladder's sports and trading card values as json: the cl value, last sale and population of every card and grade, its full daily sales history, active listings, player indexes and the 40 card ladder market indexes. It returns live JSON through POST requests under /cardladder/v1.
Is the Card Ladder API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Card Ladder calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Card Ladder login or account?
No login to Card Ladder is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Card Ladder data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Card Ladder API use?
Card Ladder actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Card Ladder from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call cardladder actions with the same key, credit pool and JSON envelope used by normal REST requests.