# Card Labo API — Japanese trading-card shop chain カードラボ (c-labo-online.jp): selling prices and stock for single cards, graded slabs and sealed product across about 30 games, and the shop's buy-back prices (買取価格) with how many it still wants. JPY, Japanese titles kept. No login, no key.

> Search Card Labo's online shop by name or card number, game, category or curated list; only what is available, sorted by price. Each row carries the yen price, stock count and availability, and the card's rarity and number.
> ReefAPI engine `cardlabo` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/cardlabo/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/cardlabo/v1/search — 2 credits
Search Card Labo's online shop by name or card number, game, category or curated list; only what is available, sorted by price. Each row carries the yen price, stock count and availability, and the card's rarity and number.

**Parameters:**
- `keyword` (string, optional) — Card name or card number as the shop writes it, in Japanese or kana (リザードン, りざーどん); several words narrow it (リザードン SAR); a card number such as IMPH-JP018 or 110/080 also matches. English names do not match: titles are Japanese.
- `game` (enum, optional) — Limit to one game (also accepted: ポケカ, 遊戯王, ワンピ, デュエマ, ygo, op, dm). Most games are scoped by their own category; Pokémon, Yu-Gi-Oh!, Weiß Schwarz, Vanguard and Battle Spirits span several, so there the rows are checked and meta.total can be an estimate. For sealed product use category_id. [one of: pokemon, yugioh_rush, yugioh, one_piece, weiss_rose, weiss_blau, weiss_schwarz, mtg, duel_masters, love_live, godzilla, vanguard, battle_spirits, digimon, union_arena, dragon_ball_fw, hololive, gundam, lorcana, shadowverse_evolve, conan, ultraman, final_fantasy, buildivide_bright, buildivide, lycee, osica, dream_order, fan_stars, kiseki, kamitsubaki, xross_stars, animal, nivel_arena, haikyu, harry_potter, palworld, wuthering_waves, kaiun, gotoubun, mememe, force_of_the_horse]
- `category_id` (string, optional) — One shop category (a game series, set or rarity list); the `categories` action lists them. Ids differ between the shop and the buy-back site. On the buy-back site it cannot be combined with keyword.
- `group_id` (string, optional) — One curated list (特価コーナー, PSA/PCG graded ...); the `categories` action lists them under groups. On the buy-back site it cannot be combined with keyword.
- `in_stock` (boolean, optional, default false) — Only what can be ordered now (the shop's own 在庫あり filter, which includes open pre-orders). Off by default, as on the site, which also lists sold-out items.
- `sort` (enum, optional, default "default") — Order of the rows. [one of: default, price_asc, price_desc]
- `page` (integer, optional, default 1) — Page number; meta.last_page says how many there are.
- `per_page` (integer, optional, default 60) — Rows per page: 60 or 120, the two sizes the shop has.

**Returns:** rows[]: id (give it to `card` / `buyback_card`), game, name (the shop's title, Japanese kept), card_name, card_number (as printed, including the shop's + / ++ printing marks), set{id, name, code}, rarity, rarity_raw (the bracket as printed), variant (card type or treatment), product_type (single, graded_single, sealed, sealed_box, oripa, supply, bulk_lot, other), condition (the marking in the title, or 中古良品 for a single with none, the shop's stated rule), is_preorder, is_play_grade, is_foil, graded, grader, grade, release_date, release_note, image, url, currency (JPY), price_includes_tax (true), price_jpy (null when withheld), price_members_only, in_stock (the shop's 在庫あり, open pre-orders included), stock (null when the shop shows no count), stock_unit, availability (in_stock, sold_out, accepting_orders, unknown), stock_text. meta: total (the shop's own count), page, per_page, last_page, has_more, sort, filters_applied, warnings.

**Example request body:**
```json
{
  "game": "pokemon",
  "keyword": "リザードン",
  "in_stock": true
}
```

### POST https://api.reefapi.com/cardlabo/v1/card — 2 credits
One Card Labo product in full: price, stock, purchase limit, the set and category it is filed under, its stated condition and images, plus what the shop pays to buy the same card back when the buy-back site lists it.

**Parameters:**
- `product_id` (string, required) — A Card Labo product id (a search row's `id`) or a c-labo-online.jp product URL.
- `include_buyback` (boolean, optional, default true) — Also look the card up on the buy-back site and return what the shop pays for it (one more page). Matched on the identical title only.

**Returns:** card{id (give it to `card` / `buyback_card`), game, name (the shop's title, Japanese kept), card_name, card_number (as printed, including the shop's + / ++ printing marks), set{id, name, code}, rarity, rarity_raw (the bracket as printed), variant (card type or treatment), product_type (single, graded_single, sealed, sealed_box, oripa, supply, bulk_lot, other), condition (the marking in the title, or 中古良品 for a single with none, the shop's stated rule), is_preorder, is_play_grade, is_foil, graded, grader, grade, release_date, release_note, image, url, currency (JPY), price_includes_tax (true), price_jpy (null when withheld), price_members_only, in_stock (the shop's 在庫あり, open pre-orders included), stock (null when the shop shows no count), stock_unit, availability (in_stock, sold_out, accepting_orders, unknown), stock_text, member_price_jpy (the member price when the shop withholds price_jpy; null otherwise), categories[]{id, name}, description, max_per_order}, buyback{match (exact, none, not_applicable, unavailable), id, buyback_price_jpy, buyback_status, buyback_wanted_qty, url}, buyback_candidates[] (same printed number on the buy-back site when the title is not identical).

**Example request body:**
```json
{
  "product_id": "209603",
  "include_buyback": false
}
```

### POST https://api.reefapi.com/cardlabo/v1/buyback_search — 1 credit
Card Labo's buy-back list (買取): what the shop pays for each card and how many it still wants, by name or card number, game, category or curated list, highest price first if you like.

**Parameters:**
- `keyword` (string, optional) — Card name or card number as the shop writes it, in Japanese or kana (リザードン, りざーどん); several words narrow it (リザードン SAR); a card number such as IMPH-JP018 or 110/080 also matches. English names do not match: titles are Japanese.
- `game` (enum, optional) — Limit to one game (also accepted: ポケカ, 遊戯王, ワンピ, デュエマ, ygo, op, dm). Most games are scoped by their own category; Pokémon, Yu-Gi-Oh!, Weiß Schwarz, Vanguard and Battle Spirits span several, so there the rows are checked and meta.total can be an estimate. For sealed product use category_id. [one of: pokemon, yugioh_rush, yugioh, one_piece, weiss_rose, weiss_blau, weiss_schwarz, mtg, duel_masters, love_live, godzilla, vanguard, battle_spirits, digimon, union_arena, dragon_ball_fw, hololive, gundam, lorcana, shadowverse_evolve, conan, ultraman, final_fantasy, buildivide_bright, buildivide, lycee, osica, dream_order, fan_stars, kiseki, kamitsubaki, xross_stars, animal, nivel_arena, haikyu, harry_potter, palworld, wuthering_waves, kaiun, gotoubun, mememe, force_of_the_horse]
- `category_id` (string, optional) — One shop category (a game series, set or rarity list); the `categories` action lists them. Ids differ between the shop and the buy-back site. On the buy-back site it cannot be combined with keyword.
- `group_id` (string, optional) — One curated list (特価コーナー, PSA/PCG graded ...); the `categories` action lists them under groups. On the buy-back site it cannot be combined with keyword.
- `sort` (enum, optional, default "default") — Order of the rows. [one of: default, buyback_desc, buyback_asc]
- `page` (integer, optional, default 1) — Page number; meta.last_page says how many there are.
- `per_page` (integer, optional, default 60) — Rows per page: 60 or 120, the two sizes the shop has.

**Returns:** rows[]: id (give it to `card` / `buyback_card`), game, name (the shop's title, Japanese kept), card_name, card_number (as printed, including the shop's + / ++ printing marks), set{id, name, code}, rarity, rarity_raw (the bracket as printed), variant (card type or treatment), product_type (single, graded_single, sealed, sealed_box, oripa, supply, bulk_lot, other), condition (the marking in the title, or 中古良品 for a single with none, the shop's stated rule), is_preorder, is_play_grade, is_foil, graded, grader, grade, release_date, release_note, image, url, currency (JPY), price_includes_tax (true), buyback_price_jpy (what Card Labo pays; null for a bulk lot), buyback_status (buying, open, bulk, closed, unknown), buyback_wanted_qty (募集数), buyback_wanted_unit, status_text. meta: total, page, per_page, last_page, has_more, sort, filters_applied, warnings.

**Example request body:**
```json
{
  "game": "pokemon",
  "keyword": "リザードン",
  "sort": "buyback_desc"
}
```

### POST https://api.reefapi.com/cardlabo/v1/buyback_card — 1 credit
One buy-back product in full: the price Card Labo pays, how many it still wants, the set and category, the stated condition and the card image.

**Parameters:**
- `product_id` (string, required) — A buy-back product id (a buyback_search row's `id`) or a c-labo-kaitori.jp product URL.

**Returns:** card{id (give it to `card` / `buyback_card`), game, name (the shop's title, Japanese kept), card_name, card_number (as printed, including the shop's + / ++ printing marks), set{id, name, code}, rarity, rarity_raw (the bracket as printed), variant (card type or treatment), product_type (single, graded_single, sealed, sealed_box, oripa, supply, bulk_lot, other), condition (the marking in the title, or 中古良品 for a single with none, the shop's stated rule), is_preorder, is_play_grade, is_foil, graded, grader, grade, release_date, release_note, image, url, currency (JPY), price_includes_tax (true), buyback_price_jpy (what Card Labo pays; null for a bulk lot), buyback_status (buying, open, bulk, closed, unknown), buyback_wanted_qty (募集数), buyback_wanted_unit, status_text, categories[]{id, name}, description}.

**Example request body:**
```json
{
  "product_id": "209603"
}
```

### POST https://api.reefapi.com/cardlabo/v1/categories — 2 credits
Card Labo's whole category tree and curated lists on either site, with the ids `search` and `buyback_search` take.

**Parameters:**
- `side` (enum, optional, default "shop") — Which site's list to read; their ids are different. [one of: shop, buyback]
- `game` (enum, optional) — Only this game's top-level categories and everything under them. [one of: pokemon, yugioh_rush, yugioh, one_piece, weiss_rose, weiss_blau, weiss_schwarz, mtg, duel_masters, love_live, godzilla, vanguard, battle_spirits, digimon, union_arena, dragon_ball_fw, hololive, gundam, lorcana, shadowverse_evolve, conan, ultraman, final_fantasy, buildivide_bright, buildivide, lycee, osica, dream_order, fan_stars, kiseki, kamitsubaki, xross_stars, animal, nivel_arena, haikyu, harry_potter, palworld, wuthering_waves, kaiun, gotoubun, mememe, force_of_the_horse]
- `parent_id` (string, optional) — Only the direct children of this category.
- `max_depth` (integer, optional) — Only categories down to this depth (0 = top level).

**Returns:** categories[]{id, name, parent_id, depth, has_children, url}, groups[] (same shape). meta: categories, groups.

**Example request body:**
```json
{
  "max_depth": 0
}
```

### POST https://api.reefapi.com/cardlabo/v1/games — 2 credits
The games the `game` filter accepts, with the top-level category ids of each on the shop and the buy-back site.

**Parameters:** none

**Returns:** rows[]: game, name, name_en, tag (the title prefix the shop uses), shop_category_ids[], buyback_category_ids[].

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