# MySlabs API — graded trading-card marketplace (myslabs.com): live slab listings and auctions, the SOLD archive with realised price and sale date, and full listing detail. PSA, BGS, SGC, CGC; baseball, basketball, football, hockey, soccer, Pokémon and other TCGs. USD. No login, no key.

> Search live MySlabs listings: keyword (player, character, set), category (graded slabs, raw singles, lots, sealed wax), sport / game, grading company, grade, era or exact year, card attributes (rookie, auto, numbered …), raw condition, price, listing type (buy it now, auctions, private deals), live offers only, sorted newest / cheapest / dearest / most viewed / most watched, 72 a page, with the site's exact totals.
> ReefAPI engine `myslabs` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/myslabs/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.
- **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). Clients that add connectors by URL, such as ChatGPT and the Claude app, connect with OAuth 2.1 (the user pastes their key once on a ReefAPI page; discovery at `/.well-known/oauth-protected-resource/mcp`). Config files send the key as `Authorization: Bearer <key>`. `?key=<key>` in the URL also works as a last-resort fallback.

## Endpoints

### POST https://api.reefapi.com/myslabs/v1/search — 3 credits
Search live MySlabs listings: keyword (player, character, set), category (graded slabs, raw singles, lots, sealed wax), sport / game, grading company, grade, era or exact year, card attributes (rookie, auto, numbered …), raw condition, price, listing type (buy it now, auctions, private deals), live offers only, sorted newest / cheapest / dearest / most viewed / most watched, 72 a page, with the site's exact totals.

**Parameters:**
- `query` (string, optional) — Keyword(s) as sellers write titles: player / character, set, card number, parallel ('jordan fleer', 'charizard base set', 'ohtani rookie'). Every word must appear.
- `category` (enum, optional, default "slabbed_cards") — slabbed_cards (graded: PSA, BGS, SGC, CGC …; default), raw_card_singles, raw_card_lots, wax (sealed), or all. sport / era / attributes work on every card category; grader / grade only on slabbed_cards; condition on raw singles / lots. [one of: slabbed_cards, raw_card_singles, raw_card_lots, wax, all]
- `sport` (enum, optional) — Sport or game (several allowed, comma-separated): baseball, basketball, football, hockey, soccer, pokemon, formula_one, other, other_non_sport. MySlabs files most other TCGs (One Piece, MTG, Yu-Gi-Oh!) under 'other'. [one of: baseball, basketball, football, hockey, soccer, pokemon, formula_one, other, other_non_sport]
- `grader` (enum, optional) — Grading company the seller filed (slabbed_cards; several allowed): psa, bgs, sgc, cgc, bvg, csg, other (TAG, HGA, … are 'other'). [one of: psa, bgs, sgc, cgc, bvg, csg, other]
- `grade` (string, optional) — Grade (slabbed_cards; several allowed, comma-separated): 10, 9.5, 9 … 1 in half steps, or authentic.
- `era` (enum, optional) — The site's year filter (several allowed): pre_war (1869-1939), vintage (1940-1986), junk (1987-1994), modern (1995-present). [one of: pre_war, vintage, junk, modern]
- `year` (integer, optional) — Exact card year — matched as a word of the title (MySlabs has eras only).
- `attributes` (enum, optional) — Card attributes the seller ticked (several allowed): rookie, auto, serial_numbered, one_of_one, parallel, insert, base, patch_relic, sp, ssp, prospect, hall_of_fame, in_person_auto. [one of: one_of_one, parallel, base, insert, hall_of_fame, in_person_auto, auto, patch_relic, prospect, rookie, serial_numbered, sp, ssp]
- `condition` (enum, optional) — Raw card condition on MySlabs' own scale (raw_card_singles; average for raw_card_lots; several allowed): a (nrmt/mt) … e (poor/fair). [one of: a, b, c, d, e]
- `lot_type` (enum, optional) — raw_card_lots only: insert_lot, player_lot, complete_set, partial_set, team_set, other. [one of: insert_lot, player_lot, complete_set, partial_set, team_set, other]
- `price_range` (string, optional) — The site's own price buckets (several allowed): 0-249, 250-499, 500-749, 750-999, 1000-2999, 3000-4999, 5000+.
- `min_price` (number, optional) — Lowest price in USD (inclusive). Picks the site buckets that overlap and drops rows outside the exact range (sold: compared with the price shown, premium included).
- `max_price` (number, optional) — Highest price in USD (inclusive).
- `sort` (enum, optional, default "newest") — Order of results. [one of: newest, oldest, price_desc, price_asc, most_viewed, most_tracked]
- `page` (integer, optional, default 1) — Page number, 72 rows a page. Page 1 answers in ~1-3 s; later pages can take up to a minute on a cold start (a site check is cleared first), then ~2-4 s.
- `listing_type` (enum, optional, default "all") — all, buy_it_now, auction (weekly lots, with end time and current bid) or private_deal. [one of: all, buy_it_now, auction, private_deal]
- `has_live_offer` (boolean, optional, default false) — Only listings that have a live offer on them right now.

**Returns:** rows[]: listing_id, auction_lot_id, url, title, price (USD; auctions = starting or current bid), price_label (Buy It Now / Starting Bid / Current Bid), price_on_request + page_data_price (private deals), listing_type (buy_it_now | auction | private_deal), auction_ends_at (UTC) + auction_ends_at_et, availability, currency, description, identity{year, season, card_number, grader, grade, grade_numeric, grade_label, auto_grade, sub_grades, serial_number, print_run, rookie, autograph, cert_number, source} (parsed from the title / description), image_url, images[]. meta: total (site count for the chosen listing type), counts{all, buy_it_now, auction, private_deal}, page, per_page (72), last_page, has_more, price_summary, filters_applied, rows_dropped_by_price, warnings.

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

### POST https://api.reefapi.com/myslabs/v1/sold — 3 credits
MySlabs' SOLD archive — what graded cards actually sold for, with the sale date: same filters as search (keyword, category, sport, grader, grade, era / year, attributes, condition, price), sorted by listing date or price, 72 a page, plus a sale-date window. meta.price_summary gives count, min, median, mean and max of the page's sold prices.

**Parameters:**
- `query` (string, optional) — Keyword(s) as sellers write titles: player / character, set, card number, parallel ('jordan fleer', 'charizard base set', 'ohtani rookie'). Every word must appear.
- `category` (enum, optional, default "slabbed_cards") — slabbed_cards (graded: PSA, BGS, SGC, CGC …; default), raw_card_singles, raw_card_lots, wax (sealed), or all. sport / era / attributes work on every card category; grader / grade only on slabbed_cards; condition on raw singles / lots. [one of: slabbed_cards, raw_card_singles, raw_card_lots, wax, all]
- `sport` (enum, optional) — Sport or game (several allowed, comma-separated): baseball, basketball, football, hockey, soccer, pokemon, formula_one, other, other_non_sport. MySlabs files most other TCGs (One Piece, MTG, Yu-Gi-Oh!) under 'other'. [one of: baseball, basketball, football, hockey, soccer, pokemon, formula_one, other, other_non_sport]
- `grader` (enum, optional) — Grading company the seller filed (slabbed_cards; several allowed): psa, bgs, sgc, cgc, bvg, csg, other (TAG, HGA, … are 'other'). [one of: psa, bgs, sgc, cgc, bvg, csg, other]
- `grade` (string, optional) — Grade (slabbed_cards; several allowed, comma-separated): 10, 9.5, 9 … 1 in half steps, or authentic.
- `era` (enum, optional) — The site's year filter (several allowed): pre_war (1869-1939), vintage (1940-1986), junk (1987-1994), modern (1995-present). [one of: pre_war, vintage, junk, modern]
- `year` (integer, optional) — Exact card year — matched as a word of the title (MySlabs has eras only).
- `attributes` (enum, optional) — Card attributes the seller ticked (several allowed): rookie, auto, serial_numbered, one_of_one, parallel, insert, base, patch_relic, sp, ssp, prospect, hall_of_fame, in_person_auto. [one of: one_of_one, parallel, base, insert, hall_of_fame, in_person_auto, auto, patch_relic, prospect, rookie, serial_numbered, sp, ssp]
- `condition` (enum, optional) — Raw card condition on MySlabs' own scale (raw_card_singles; average for raw_card_lots; several allowed): a (nrmt/mt) … e (poor/fair). [one of: a, b, c, d, e]
- `lot_type` (enum, optional) — raw_card_lots only: insert_lot, player_lot, complete_set, partial_set, team_set, other. [one of: insert_lot, player_lot, complete_set, partial_set, team_set, other]
- `price_range` (string, optional) — The site's own price buckets (several allowed): 0-249, 250-499, 500-749, 750-999, 1000-2999, 3000-4999, 5000+.
- `min_price` (number, optional) — Lowest price in USD (inclusive). Picks the site buckets that overlap and drops rows outside the exact range (sold: compared with the price shown, premium included).
- `max_price` (number, optional) — Highest price in USD (inclusive).
- `sort` (enum, optional, default "newest") — Order of results. [one of: newest, oldest, price_desc, price_asc, most_viewed, most_tracked]
- `page` (integer, optional, default 1) — Page number, 72 rows a page. Page 1 answers in ~1-3 s; later pages can take up to a minute on a cold start (a site check is cleared first), then ~2-4 s.
- `sold_after` (string, optional) — Only sales on/after this date (YYYY-MM-DD) — applied to the rows of the page fetched (combine with sort / pages for a longer window).
- `sold_before` (string, optional) — Only sales on/before this date (YYYY-MM-DD), same rule as sold_after.

**Returns:** rows[]: listing_id, sale_id, url, title, sold_price (USD, as the archive shows it: 1% buyer premium included), sold_price_before_premium, sold_date (YYYY-MM-DD), sale_type (fixed_price | auction), shipping_charged, currency, description, identity{year, season, card_number, grader, grade, grade_numeric, grade_label, auto_grade, sub_grades, serial_number, print_run, rookie, autograph, cert_number, source} (parsed from the title / description), image_url, images[]. meta: page, per_page (72), last_page, has_more, price_summary{count, min, max, median, mean}, sold_date_range{first, last}, filters_applied, rows_dropped_by_price, rows_dropped_by_date, duplicate_sale_records (when the site repeats a listing without a sale date), warnings.

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

### POST https://api.reefapi.com/myslabs/v1/listing — 2 credits
One MySlabs listing in full — live, sold or an auction lot: title, category, raw condition, description, price, buy-now / make-an-offer and the seller's minimum offer, shipping cost, checkout options, views and watchers, the grading company the site verifies certs against, card identity (year, grade, card number, print run, cert when the seller wrote it), all photos; sold listings add sold price and date; auction lots add auction name, current / final bid, bid count, end time, reserve status, next minimum bid and the bid history.

**Parameters:**
- `listing_id` (string, required) — A listing id (rows[].listing_id) or a myslabs.com/slab/view/<id>/ or /auction/view/<lot>/ URL.
- `auction_lot_id` (string, optional) — An auction lot id (rows[].auction_lot_id) — instead of listing_id.
- `include_bids` (boolean, optional, default true) — Auction lots: also fetch the live status (reserve, next minimum bid) and the bid history (masked bidder as the site prints it, amount, time).

**Returns:** listing{listing_id, auction_lot_id, url, title, category, condition, description, status (active | sold), currency, price, price_on_request, page_data_price, sold_price (before the buyer premium, as the listing page shows it), sold_price_with_premium, sold_date, buy_now_available, accepts_offers, minimum_offer, shipping_cost, shipping_text, checkout_options[], views, tracking_count, availability, grader_verified{grader, slab_type_code, cert_lookup_hint}, identity{year, season, card_number, grader, grade, grade_numeric, grade_label, auto_grade, sub_grades, serial_number, print_run, rookie, autograph, cert_number, source} (parsed from the title / description), images[], image_url, seller (null: hidden from logged-out visitors), seller_hidden, price_history (null) + price_history_note, auction{lot_id, auction_name, status, current_bid, final_bid, bid_count, ends_at, ends_at_et, reserve_met, has_reserve, next_minimum_bid, extended_bidding, bids[]{bidder, bidder_feedback, amount, time, time_et}}}

**Example request body:**
```json
{
  "listing_id": "1971429"
}
```

### POST https://api.reefapi.com/myslabs/v1/filters — 2 credits
The filter values MySlabs offers for a category right now (sports / games, grading companies, grades, eras, attributes, conditions, lot types, price buckets) with this API's names for them.

**Parameters:**
- `category` (enum, optional, default "slabbed_cards") — slabbed_cards (graded: PSA, BGS, SGC, CGC …; default), raw_card_singles, raw_card_lots, wax (sealed), or all. sport / era / attributes work on every card category; grader / grade only on slabbed_cards; condition on raw singles / lots. [one of: slabbed_cards, raw_card_singles, raw_card_lots, wax, all]

**Returns:** category, groups[]{group, label, param (this API's parameter), values[]{value (site), label, name (this API's value)}}, sorts[], listing_types[]

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

## 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=myslabs
- Human docs page: https://reefapi.com/docs/myslabs
- Overview page: https://reefapi.com/myslabs-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
