# Card Ladder API — sports and trading card values from cardladder.com: card search with the CL Value, last sold price, sale count, population and market cap; one card with every other grade's value, active listings and its full per-day sales price history; active listings across eBay, Fanatics, Goldin, Heritage, MySlabs and more; player indexes and the 40 Card Ladder market indexes with their history; the trending ladder and the Daily Sales Recap. Basketball, baseball, football, hockey, soccer, Pokémon, One Piece, Magic, Yu-Gi-Oh! and more. USD. No login, no key.

> 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.
> ReefAPI engine `cardladder` · 11 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/cardladder/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/cardladder/v1/search — 2 credits
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.

**Parameters:**
- `query` (string, optional) — Words that must ALL appear in the card's label (year, set, player, variation, number, grade). Strict AND: 'charizard psa 9' finds 36 cards, 'charizard base set psa 9' finds 0 because the 1999 Base Set is labelled 'Pokemon Game'. Use fewer words and filters when a search comes back empty. Empty = every card (browse with filters / sort).
- `category` (enum, optional) — Only one card category. [one of: Basketball, Baseball, Football, Pokemon, OnePiece, Hockey, Soccer, Marvel, MultiSport, UFC/MMA, Wrestling, Yugioh, Golf, Tennis, WNBA, Magic, Disney, Racing, Fortnite, Dragonballz, Entertainment, StarWars, Swimming, Softball, PopCulture, Historical, Boxing, Metazoo, FleshAndBlood]
- `condition` (enum, optional) — Only one exact condition / grade, as Card Ladder writes it: Raw, PSA 10, PSA 9, BGS 9.5, SGC 10, CGC 10 Pristine, PSA 10/Auto 10 … [one of: BGS 10 Black, SGC 10 Pristine, CGC 10 Perfect, PSA 10, BGS 10, SGC 10, CGC 10 Pristine, CGC 10, PSA 10/Auto 10, PSA 10/Auto 9, PSA 10/Auto 8, PSA 10/Auto Auth, BGS 10/Auto 10, SGC 10/Auto 10, BGS 9.5, SGC 9.5, CGC 9.5 Gem Mint, CGC 9.5, BGS 9.5/Auto 10, SGC 9.5/Auto 10, BGS 9.5/Auto 9, PSA 9, BGS 9, SGC 9, CGC 9, PSA 9/Auto 10, PSA 9/Auto 9, PSA 9/Auto Auth, PSA 9/Auto 8, BGS 9/Auto 10, BGS 9/Auto 9, SGC 9/Auto 10, Raw, PSA 8.5, BGS 8.5, CGC 8.5, SGC 8.5, PSA 8.5/Auto 10, BGS 8.5/Auto 10, SGC 8.5/Auto 10, PSA 8, BGS 8, SGC 8, CGC 8, PSA 8/Auto 10, PSA 8/Auto 9, PSA 8/Auto Auth, PSA 8/Auto 8, BGS 8/Auto 10, SGC 8/Auto 10, PSA 7.5, BGS 7.5, SGC 7.5, CGC 7.5, BGS 7.5/Auto 10, PSA 7, BGS 7, SGC 7, CGC 7, PSA 7/Auto 10, BGS 7/Auto 10, SGC 7/Auto 10, PSA 6.5, BGS 6.5, SGC 6.5, CGC 6.5, BGS 6.5/Auto 10, PSA 6, BGS 6, SGC 6, CGC 6, PSA 6/Auto 10, BGS 6/Auto 10, SGC 6/Auto 10, PSA 5.5, BGS 5.5, SGC 5.5, CGC 5.5, PSA 5, BGS 5, SGC 5, CGC 5, PSA 5/Auto 10, SGC 5/Auto 10, PSA 4.5, BGS 4.5, SGC 4.5, CGC 4.5, PSA 4, BGS 4, SGC 4, CGC 4, PSA 4/Auto 10, SGC 4/Auto 10, PSA 3.5, BGS 3.5, SGC 3.5, CGC 3.5, PSA 3, BGS 3, SGC 3, CGC 3, PSA 3/Auto 10, PSA 2.5, BGS 2.5, SGC 2.5, CGC 2.5, PSA 2, BGS 2, SGC 2, CGC 2, PSA 2/Auto 10, PSA 1.5, BGS 1.5, SGC 1.5, CGC 1.5, PSA 1, BGS 1, SGC 1, CGC 1, PSA 1/Auto 10, PSA Authentic, BGS Authentic, SGC Authentic, CGC Authentic, PSA Authentic Altered, PSA Authentic/Auto 10, SGC Authentic/Auto 10, Encased, Sealed, TAG 10 Pristine, TAG 10 Gem Mint, TAG 9, TAG 8.5, TAG 8, TAG 7.5, TAG 7, TAG 6.5, TAG 6, TAG 5.5, TAG 5, TAG 4.5, TAG 4, TAG 3.5, TAG 3, TAG 2.5, TAG 2, TAG 1.5, TAG 1, CSG 10 Perfect, CSG 10, CSG 9.5, CSG 9, CSG 8.5, CSG 8, CSG 7.5, CSG 7, CSG 6.5, CSG 6, CSG 5.5, CSG 5, CSG 4.5, CSG 4, CSG 3.5, CSG 3, CSG 2.5, CSG 2, CSG 1.5, CSG 1, BVG 10, BVG 9.5, BVG 9, BVG 8.5, BVG 8, BVG 7.5, BVG 7, BVG 6.5, BVG 6, BVG 5.5, BVG 5, BVG 4.5, BVG 4, BVG 3.5, BVG 3, BVG 2.5, BVG 2, BVG 1.5, BVG 1, HGA 10, HGA 9.5, HGA 9, HGA 8.5, HGA 8, HGA 7.5, HGA 7, HGA 6.5, HGA 6, HGA 5.5, HGA 5, HGA 4.5, HGA 4, HGA 3.5, HGA 3, HGA 2.5, HGA 2, HGA 1.5, HGA 1, OTHER 10, OTHER 9.5, OTHER 9, OTHER 8.5, OTHER 8, OTHER 7.5, OTHER 7, OTHER 6.5, OTHER 6, OTHER 5.5, OTHER 5, OTHER 4.5, OTHER 4, OTHER 3.5, OTHER 3, OTHER 2.5, OTHER 2, OTHER 1.5, OTHER 1]
- `grading_company` (enum, optional) — Only cards graded by one company. Raw (ungraded) cards: use condition=Raw. [one of: psa, bgs, sgc, cgc, csg, tag, bvg, hga, other]
- `player` (string, optional) — Only one player's cards: a players / search row's player_id as is (e.g. Michael Jordan, Luka Doncic).
- `year_min` (integer, optional) — Card year from (inclusive).
- `year_max` (integer, optional) — Card year to (inclusive).
- `min_value` (number, optional) — CL Value at least this many USD.
- `max_value` (number, optional) — CL Value at most this many USD.
- `min_last_sold` (number, optional) — Last sold price at least this many USD.
- `max_last_sold` (number, optional) — Last sold price at most this many USD.
- `min_pop` (integer, optional) — Graded population at least this.
- `max_pop` (integer, optional) — Graded population at most this.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, score, cl_value, last_sold_price, last_sold_date, num_sales, pop, market_cap, date_added, daily_change_usd, daily_change_pct, weekly_change_pct, monthly_change_pct, quarterly_change_pct, annual_change_pct]
- `direction` (enum, optional, default "desc") — Sort direction (ignored for relevance). [one of: desc, asc]
- `page` (integer, optional, default 1) — Page number, 1 = first. The source serves the first 10,000 results (page × limit ≤ 10,000).
- `limit` (integer, optional, default 20) — Rows per page (1-100).

**Returns:** rows[]: card_id, slug, label, year, set, number, variation, player, player_id, category, condition, grading_company, psa_spec_id, cl_value (Card Ladder's estimated value, USD), last_sold_price, last_sold_date, num_sales, pop, market_cap (pop × value), ladder_score, undervalued_gap, daily_change_usd, daily/weekly/monthly/quarterly/annual_change_pct (fractions: 0.05 = +5 %), key_card, outlier_index, hidden, status, date_added, image, ebay_query, url, extra{}. meta: total (cards matching), total_is_capped (the source counts to 10,000), page, limit, has_more, filters_applied, warnings.

**Example request body:**
```json
{
  "query": "luka doncic prizm",
  "condition": "PSA 10"
}
```

### POST https://api.reefapi.com/cardladder/v1/card — 2 credits
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.

**Parameters:**
- `card_id` (string, required) — A search / ladder / player / index row's card_id as is. Its slug (1984-star-michael-jordan-base-101-psa-7) or a cardladder.com card URL also works.

**Returns:** card{card_id, slug, label, year, set, number, variation, player, player_id, category, condition, grading_company, grader, grade, autograph_grade, cl_value, last_sold_price, last_sold_date, num_sales, pop, market_cap, ladder_score, …_change_pct, cert, slab_serial, profile_id, gem_rate_id, psa_spec_id, psa_pop_link, pop_last_updated, set_information(_link), stats{cl_value, guide_value, guide_value_confidence, last_sold_price, all_time_high, roi, market_cap, oldest_sale{date, price}, newest_sale{date, price}, last_month{num_sales, high, low, average, last_sold_price}, last_year{…}}, other_grades[{card_id, condition, label, cl_value, url}], other_variations[], similar_cards[], active_listings[], price_history_summary{sale_days, sales, first_date, last_date, high, low}, price_history[{date, avg_price, sales_count, fanatics_top_percent, private_sale}], last_updated, url, extra{}}

**Example request body:**
```json
{
  "card_id": "Ls7mp5BrdoOtLGgWmlcQ"
}
```

### POST https://api.reefapi.com/cardladder/v1/card_price_history — 2 credits
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.

**Parameters:**
- `card_id` (string, required) — A search / ladder / player / index row's card_id as is. Its slug (1984-star-michael-jordan-base-101-psa-7) or a cardladder.com card URL also works.
- `from` (string, optional) — Only sale days on or after this date (YYYY-MM-DD).
- `to` (string, optional) — Only sale days on or before this date (YYYY-MM-DD).

**Returns:** card{card_id, label, condition, cl_value, last_sold_price, url}, summary{sale_days, sales, first_date, last_date, high, low, first_price, last_price}, points[{date (YYYY-MM-DD), avg_price (USD; the day's average when sales_count > 1), sales_count, fanatics_top_percent, private_sale}] oldest first

**Example request body:**
```json
{
  "card_id": "Ls7mp5BrdoOtLGgWmlcQ",
  "from": "2024-01-01"
}
```

### POST https://api.reefapi.com/cardladder/v1/card_grades — 2 credits
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.

**Parameters:**
- `card_id` (string, required) — A search / ladder / player / index row's card_id as is. Its slug (1984-star-michael-jordan-base-101-psa-7) or a cardladder.com card URL also works.

**Returns:** card{card_id, label, condition, cl_value, url}, rows[{card_id, condition, label, cl_value, ratio, url, is_this_card}] highest value first

**Example request body:**
```json
{
  "card_id": "Ls7mp5BrdoOtLGgWmlcQ"
}
```

### POST https://api.reefapi.com/cardladder/v1/listings — 2 credits
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.

**Parameters:**
- `query` (string, optional) — Words to look for in the listing title. Empty = every active listing.
- `platform` (enum, optional) — Only listings on one marketplace. [one of: eBay, Fanatics-Weekly, Goldin, Fanatics-Premier, Alt, Heritage, Fanatics-Vault, REA, CardHobby, Lelands, AuctionOfChampions, Sothebys, MemoryLane, Pristine, HugginsAndScott, SCP, MileHigh, LoveOfTheGame, MySlabs, 90sAuctions, CollectAuctions, SterlingSportsAuctions, JSPAuctions, WheatlandAuctions, CollectorInvestorAuctions, ClassicAuctions, Iconic, Private]
- `listing_type` (enum, optional) — Only auctions, best-offer or fixed-price listings. [one of: Auction, BestOffer, FixedPrice]
- `min_price` (number, optional) — Listing price at least this many USD.
- `max_price` (number, optional) — Listing price at most this many USD.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, price, end_date, watchers, bids, created_date, updated_date]
- `direction` (enum, optional, default "desc") — Sort direction (ignored for relevance). [one of: desc, asc]
- `page` (integer, optional, default 1) — Page number, 1 = first. The source serves the first 10,000 results (page × limit ≤ 10,000).
- `limit` (integer, optional, default 20) — Rows per page (1-100).

**Returns:** rows[]: listing_id, item_id, platform, platform_label, listing_type, title, price (USD), bids, watchers, end_date (null with no_end_date=true for listings without an end), created_date, updated_date, seller, seller_feedback, url, image, thumbnail, extra{}. meta: total, total_is_capped, page, has_more.

**Example request body:**
```json
{
  "query": "michael jordan",
  "platform": "Goldin"
}
```

### POST https://api.reefapi.com/cardladder/v1/players — 2 credits
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.

**Parameters:**
- `query` (string, optional) — Player name words. Empty = every player (browse with category / sort).
- `category` (enum, optional) — Only one card category. [one of: Basketball, Baseball, Football, Pokemon, OnePiece, Hockey, Soccer, Marvel, MultiSport, UFC/MMA, Wrestling, Yugioh, Golf, Tennis, WNBA, Magic, Disney, Racing, Fortnite, Dragonballz, Entertainment, StarWars, Swimming, Softball, PopCulture, Historical, Boxing, Metazoo, FleshAndBlood]
- `min_cards` (integer, optional) — Players with at least this many cards tracked.
- `max_cards` (integer, optional) — Players with at most this many cards tracked.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, daily_sales, daily_sales_count, total_cards, total_value, total_market_cap, key_card_value, cards_in_index, weekly_change_pct, monthly_change_pct, quarterly_change_pct, half_year_change_pct, ytd_change_pct, annual_change_pct, five_year_change_pct, all_time_change_pct]
- `direction` (enum, optional, default "desc") — Sort direction (ignored for relevance). [one of: desc, asc]
- `page` (integer, optional, default 1) — Page number, 1 = first. The source serves the first 10,000 results (page × limit ≤ 10,000).
- `limit` (integer, optional, default 20) — Rows per page (1-100).

**Returns:** rows[]: player_id, player, label, category, total_cards, cards_in_index, total_value, total_market_cap, daily_sales_usd, daily_sales_count, key_card_value (the key card's CL Value), has_key_card, key_card_id, weekly/monthly/quarterly/half_year/ytd/annual/five_year/all_time_change_pct (fractions), last_updated, image, url. meta: total, page, has_more.

**Example request body:**
```json
{
  "query": "jordan"
}
```

### POST https://api.reefapi.com/cardladder/v1/player — 3 credits
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).

**Parameters:**
- `player_id` (string, required) — A players row's player_id as is (e.g. Luka Doncic, Michael Jordan).

**Returns:** player{player_id, player, category, index_value, total_cards, cards_in_index, total_value, total_market_cap, daily_sales_usd, daily_sales_count, key_card_value, …_change_pct, key_card{card_id, label, cl_value, market_cap, url}, membership{filters}, index_history[{date, index_value}], sales_history[{date, sales_usd}], as_of, url}, rows[] (top cards, card_id, slug, label, year, set, number, variation, player, player_id, category, condition, grading_company, psa_spec_id, cl_value (Card Ladder's estimated value, USD), last_sold_price, last_sold_date, num_sales, pop, market_cap (pop × value), ladder_score, undervalued_gap, daily_change_usd, daily/weekly/monthly/quarterly/annual_change_pct (fractions: 0.05 = +5 %), key_card, outlier_index, hidden, status, date_added, image, ebay_query, url, extra{})

**Example request body:**
```json
{
  "player_id": "Luka Doncic"
}
```

### POST https://api.reefapi.com/cardladder/v1/indexes — 2 credits
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.

**Parameters:** none

**Returns:** rows[]: index_id, label, icon, index_value, daily_sales_usd, total_cards, weekly/monthly/quarterly/half_year/ytd/annual/five_year/all_time_change_pct (fractions), url. This is the site's index summary; it can trail the index's own page by a recalculation (2/6 differed by < 0.6 %) — `index` is authoritative.

### POST https://api.reefapi.com/cardladder/v1/index — 3 credits
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.

**Parameters:**
- `index_id` (string, required) — An indexes row's index_id (cl50index, pokemon, basketball, vintage, lowpop …).
- `page` (integer, optional, default 1) — Page of the index's constituent cards (20 per page). Page 1 also carries the index history.

**Returns:** index{index_id, label, description, index_value, total_cards, cards_in_index, total_value, total_market_cap, daily_sales_usd, daily_sales_count, …_change_pct, membership{filters | cardIds}, index_history[{date, index_value}], sales_history[{date, sales_usd}], as_of, url}, rows[] (constituent cards). meta: page, has_more.

**Example request body:**
```json
{
  "index_id": "pokemon"
}
```

### POST https://api.reefapi.com/cardladder/v1/ladder — 2 credits
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.

**Parameters:**
- `category` (enum, optional) — One category; empty = all categories (the site's 'Sports Card Price Guide'). [one of: Basketball, Baseball, Football, Pokemon, OnePiece, Hockey, Soccer, Marvel, MultiSport, UFC/MMA, Wrestling, Yugioh, Golf, Tennis, WNBA, Magic, Disney, Racing, Fortnite, Dragonballz, Entertainment, StarWars, Swimming, Softball, PopCulture, Historical, Boxing, Metazoo, FleshAndBlood]
- `page` (integer, optional, default 1) — Page number, 1 = first. The source serves the first 10,000 results (page × limit ≤ 10,000).
- `limit` (integer, optional, default 20) — Rows per page (1-100).

**Returns:** rows[]: card_id, slug, label, year, set, number, variation, player, player_id, category, condition, grading_company, psa_spec_id, cl_value (Card Ladder's estimated value, USD), last_sold_price, last_sold_date, num_sales, pop, market_cap (pop × value), ladder_score, undervalued_gap, daily_change_usd, daily/weekly/monthly/quarterly/annual_change_pct (fractions: 0.05 = +5 %), key_card, outlier_index, hidden, status, date_added, image, ebay_query, url, extra{}. meta: page, has_more, category.

**Example request body:**
```json
{
  "category": "Basketball"
}
```

### POST https://api.reefapi.com/cardladder/v1/daily_sales_recap — 3 credits
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.

**Parameters:**
- `post_id` (string, optional) — A recap's post_id (from meta.recent_recaps). Empty = the latest recap.
- `date` (string, optional) — The recap published on this day (YYYY-MM-DD, UTC). Empty = the latest.

**Returns:** recap{post_id, title, date, total_sales_usd, total_sales_count, sections[{title, count, items[{card_id (all-time highs), label, price, url}]}], url}. meta: recent_recaps[{post_id, date}] when looked up by date / latest.

**Example request body:**
```json
{
  "post_id": "ofpK0ks96p0X1MQJfDIY"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=cardladder
- Human docs page: https://reefapi.com/docs/cardladder
- Overview page: https://reefapi.com/cardladder-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
