# Ka-nabell API — Japanese trading-card shop カーナベル (ka-nabell.com): single-card selling prices per condition grade (Pokémon S/A/B/C, Yu-Gi-Oh! and Duel Masters A/B/C/D + unassessed) with stock, PSA slabs, sales velocity, and the shop's buy-back prices (買取価格) with how many it still wants. JPY, Japanese card names kept. No login, no key.

> Search Ka-nabell's single cards for one game by name, card number, set, series, rarity, condition in stock, price and price trend; sort by price, best sellers, newest or the site's set order. Each row carries the sale price and stock per condition AND the buy-back price — the shop's own sell / buy spread on one line.
> ReefAPI engine `kanabell` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/kanabell/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/kanabell/v1/search — 2 credits
Search Ka-nabell's single cards for one game by name, card number, set, series, rarity, condition in stock, price and price trend; sort by price, best sellers, newest or the site's set order. Each row carries the sale price and stock per condition AND the buy-back price — the shop's own sell / buy spread on one line.

**Parameters:**
- `game` (enum, required) — Which game: pokemon, yugioh or duel_masters — the three Ka-nabell sells and buys (also accepted: ポケカ, 遊戯王, デュエマ, ygo, dm). [one of: pokemon, yugioh, duel_masters]
- `keyword` (string, optional) — Card name or keyword as the shop writes it — Japanese name or kana (ピカチュウ, ぴかちゅう), several words narrow it (リザードン SAR); a card number (QCCU-JP170, 180/171) also matches. The same matching the site's own search box uses.
- `set_id` (integer, optional) — One set / expansion (the shop's pack id; the `sets` action lists them with names and codes, e.g. yugioh 876 = イモータル・フェニックス, pokemon 900 = 30th セレブレーション).
- `series_id` (integer, optional) — One series / block (the `sets` action lists series; yugioh 1 = 第13期).
- `rarity_id` (string, optional) — One rarity: for pokemon the code (C, U, R, RR, RRR, SR, SAR, AR, UR, HR …); for yugioh and duel_masters the numeric id. The `rarities` action lists every value with its name.
- `card_number` (string, optional) — Exact card number as printed: yugioh 'QCCU-JP170', pokemon '180/171' or '001/SV-P', duel_masters 'P36/Y21' (case-insensitive).
- `in_stock` (boolean, optional, default false) — Only cards the shop has in stock now (any condition). Off by default, as on the site, which also lists sold-out cards.
- `condition` (enum, optional) — Only cards with stock in this condition grade. Pokémon grades S/A/B/C; Yu-Gi-Oh! and Duel Masters A/B/C/D plus unassessed (未査定特価). [one of: S, A, B, C, D, unassessed]
- `min_price` (integer, optional) — Lowest price in JPY, applied to the card's cheapest in-stock condition (as the site's price filter); implies in stock.
- `max_price` (integer, optional) — Highest price in JPY, applied to the card's cheapest in-stock condition; implies in stock.
- `price_trend` (enum, optional) — Only cards whose last sale-price change in the last 30 days went down (the site's 最新値下げ list) or up. [one of: down, up]
- `graded` (boolean, optional, default false) — Only graded slabs (PSA / BGS / CGC products such as '(PSA10)N'). Each row's graded, grader and grade say which.
- `card_kind` (enum, optional) — Pokémon only: card kind, as the site's 種類 filter; comma-separate several (item,supporter). [one of: pokemon, item, supporter, stadium, pokemon_tool, basic_energy, special_energy]
- `regulation` (string, optional) — Pokémon only: format the card is legal in, as the site writes it (スタンダード, エクストラ, 殿堂).
- `legacy_card_id` (integer, optional) — The card id from the OLD ka-nabell.com site (before the 2026-10 relaunch); finds the products that card became.
- `sort` (enum, optional, default "set_order") — Order of the rows. [one of: set_order, relevance, price_asc, price_desc, best_selling_7d, best_selling_30d, recently_sold, newest, price_updated, buyback_desc]
- `page` (integer, optional, default 1) — Page number; meta.last_page says how many there are (the shop serves the first 10,000 results of a search).
- `per_page` (integer, optional, default 30) — Rows per page (1-100, default 30).

**Returns:** rows[]: id (Ka-nabell product id — give it to `card`), game, name (product name as the shop writes it, Japanese kept; slabs read '(PSA10)N'), name_kana, card_name, card_name_kana, card_number, set{id, name, code, released_at}, series{id, name, code}, rarity{id, name, code}, card_id, graded + grader + grade (slabs), price_jpy (the cheapest condition IN STOCK — the site's 円〜 price; null when sold out), in_stock, stock (units, all conditions), conditions[]{condition (S/A/B/C/D/unassessed), condition_label (状態A, 未査定特価), price_jpy, stock, in_stock, arriving (units bought in, not shelved yet), last_price_change}, max_per_order, sale_listed, last_price_change{condition, price_jpy, previous_price_jpy (null = first price), direction, changed_at}, price_updated_at, sold_count_7d, sold_count_30d, last_sold_at, buyback_price_jpy (what Ka-nabell PAYS for a top-condition copy — S for Pokémon, A for Yu-Gi-Oh!/Duel Masters; published exactly when the shop's buy page prints it, i.e. while it still wants copies), buyback_status (buying / bulk_only — the shop takes it only inside a bulk まとめ買取 parcel and prints no price / closed), buyback_open, buyback_top_condition, buyback_rate_table{name (通常 / 良品 / 美品 / 完美品 …), percent_by_condition}, buyback_by_condition_jpy (top price × the site's published % per condition, rounded down — computed: the site prints the %, not the yen), buyback_wanted_qty (買取可能枚数), buyback_last_change, buyback_price_updated_at, buyback_price_guaranteed, legacy_card_id (old site's card id), image, images[], url (sale page), buyback_url, listed_at, currency (JPY), price_includes_tax (true). meta: total (the shop's own count), page, per_page, last_page, has_more, filters_applied, sort, warnings.

**Example request body:**
```json
{
  "game": "pokemon",
  "keyword": "ピカチュウ",
  "in_stock": true
}
```

### POST https://api.reefapi.com/kanabell/v1/card — 1 credit
One Ka-nabell card product in full: price and stock per condition grade, last price changes, sales in the last 7 / 30 days, the buy-back price with the shop's per-condition rate table and how many it still wants, the card's text and stats, images — plus the same card in the shop's other sets, rarities and PSA slabs with their prices.

**Parameters:**
- `product_id` (string, required) — A Ka-nabell product id (a row's `id`, a UUID) or a ka-nabell.com card URL (/ec/sell/<game>/single/<id> or /ec/buy/<game>/single/<id>).
- `game` (enum, optional) — Optional: the game, when you know it (the id alone is enough). [one of: pokemon, yugioh, duel_masters]
- `include_other_printings` (boolean, optional, default true) — Also list the same card in the shop's other sets / rarities / slabs (the site's 同名カードをさがす), with their prices — one more backend query.

**Returns:** card{id (Ka-nabell product id — give it to `card`), game, name (product name as the shop writes it, Japanese kept; slabs read '(PSA10)N'), name_kana, card_name, card_name_kana, card_number, set{id, name, code, released_at}, series{id, name, code}, rarity{id, name, code}, card_id, graded + grader + grade (slabs), price_jpy (the cheapest condition IN STOCK — the site's 円〜 price; null when sold out), in_stock, stock (units, all conditions), conditions[]{condition (S/A/B/C/D/unassessed), condition_label (状態A, 未査定特価), price_jpy, stock, in_stock, arriving (units bought in, not shelved yet), last_price_change}, max_per_order, sale_listed, last_price_change{condition, price_jpy, previous_price_jpy (null = first price), direction, changed_at}, price_updated_at, sold_count_7d, sold_count_30d, last_sold_at, buyback_price_jpy (what Ka-nabell PAYS for a top-condition copy — S for Pokémon, A for Yu-Gi-Oh!/Duel Masters; published exactly when the shop's buy page prints it, i.e. while it still wants copies), buyback_status (buying / bulk_only — the shop takes it only inside a bulk まとめ買取 parcel and prints no price / closed), buyback_open, buyback_top_condition, buyback_rate_table{name (通常 / 良品 / 美品 / 完美品 …), percent_by_condition}, buyback_by_condition_jpy (top price × the site's published % per condition, rounded down — computed: the site prints the %, not the yen), buyback_wanted_qty (買取可能枚数), buyback_last_change, buyback_price_updated_at, buyback_price_guaranteed, legacy_card_id (old site's card id), image, images[], url (sale page), buyback_url, listed_at, currency (JPY), price_includes_tax (true), attributes (the game's card data: Pokémon types, HP, moves, abilities, regulations, illustrators; Yu-Gi-Oh! level / ATK / DEF / attribute / race / monster types / text; Duel Masters civilizations, cost, power, races, text), sale_note, buyback_note}, other_printings[] (same row shape, without attributes). meta: other_printings_total.

**Example request body:**
```json
{
  "product_id": "26427365-b237-4f8b-b575-c5e48c587d73"
}
```

### POST https://api.reefapi.com/kanabell/v1/buyback_search — 2 credits
Ka-nabell's buy-back list (買取) for one game: what the shop PAYS for each card (top condition, with the % it pays for lower ones) and how many it still wants; filter by name, card number, set, rarity, buy-price range, the 買取強化 list and recent buy-price rises.

**Parameters:**
- `game` (enum, required) — Which game: pokemon, yugioh or duel_masters — the three Ka-nabell sells and buys (also accepted: ポケカ, 遊戯王, デュエマ, ygo, dm). [one of: pokemon, yugioh, duel_masters]
- `keyword` (string, optional) — Card name or keyword as the shop writes it — Japanese name or kana (ピカチュウ, ぴかちゅう), several words narrow it (リザードン SAR); a card number (QCCU-JP170, 180/171) also matches. The same matching the site's own search box uses.
- `set_id` (integer, optional) — One set / expansion (the shop's pack id; the `sets` action lists them with names and codes, e.g. yugioh 876 = イモータル・フェニックス, pokemon 900 = 30th セレブレーション).
- `series_id` (integer, optional) — One series / block (the `sets` action lists series; yugioh 1 = 第13期).
- `rarity_id` (string, optional) — One rarity: for pokemon the code (C, U, R, RR, RRR, SR, SAR, AR, UR, HR …); for yugioh and duel_masters the numeric id. The `rarities` action lists every value with its name.
- `card_number` (string, optional) — Exact card number as printed: yugioh 'QCCU-JP170', pokemon '180/171' or '001/SV-P', duel_masters 'P36/Y21' (case-insensitive).
- `buying_only` (boolean, optional, default false) — Only cards the shop still wants (買取可能枚数 above 0).
- `emphasized` (boolean, optional, default false) — Only the shop's 買取強化 list (cards it is pushing to buy).
- `min_buyback` (integer, optional) — Lowest buy-back price in JPY (top condition), as the buy site's 買取価格 filter; implies buying_only (a price is published only while the shop buys the card).
- `max_buyback` (integer, optional) — Highest buy-back price in JPY (top condition).
- `price_trend` (enum, optional) — Only cards whose last buy-price change in the last 30 days went up (the buy site's 買取価格アップ list) or down. [one of: down, up]
- `graded` (boolean, optional, default false) — Only graded slabs (PSA / BGS / CGC products such as '(PSA10)N'). Each row's graded, grader and grade say which.
- `card_kind` (enum, optional) — Pokémon only: card kind, as the site's 種類 filter; comma-separate several (item,supporter). [one of: pokemon, item, supporter, stadium, pokemon_tool, basic_energy, special_energy]
- `regulation` (string, optional) — Pokémon only: format the card is legal in, as the site writes it (スタンダード, エクストラ, 殿堂).
- `sort` (enum, optional, default "set_order") — Order of the rows. [one of: set_order, relevance, buyback_desc, buyback_asc, buyback_updated, newest]
- `page` (integer, optional, default 1) — Page number; meta.last_page says how many there are (the shop serves the first 10,000 results of a search).
- `per_page` (integer, optional, default 30) — Rows per page (1-100, default 30).

**Returns:** rows[]: same row as search (buy-back fields first in importance: buyback_price_jpy, buyback_by_condition_jpy, buyback_rate_table, buyback_wanted_qty, buyback_last_change; the sale price and stock are on the same row). meta: total, page, per_page, last_page, has_more, filters_applied, sort.

**Example request body:**
```json
{
  "game": "yugioh",
  "sort": "buyback_desc"
}
```

### POST https://api.reefapi.com/kanabell/v1/sets — 2 credits
Every set / expansion (収録) Ka-nabell lists for one game, with its code, series, release date and how many products it has and has in stock — the ids `search` takes as set_id.

**Parameters:**
- `game` (enum, required) — Which game: pokemon, yugioh or duel_masters — the three Ka-nabell sells and buys (also accepted: ポケカ, 遊戯王, デュエマ, ygo, dm). [one of: pokemon, yugioh, duel_masters]
- `series_id` (integer, optional) — Only the sets of one series.

**Returns:** sets[]{id, name, code, released_at, series{id, name, code}, products, products_in_stock, url}, series[]{id, name, code, sets, products} in the site's order.

**Example request body:**
```json
{
  "game": "duel_masters"
}
```

### POST https://api.reefapi.com/kanabell/v1/rarities — 1 credit
Every rarity Ka-nabell uses for one game with its id, name and abbreviation (the values `search` takes as rarity_id) and how many products have it.

**Parameters:**
- `game` (enum, required) — Which game: pokemon, yugioh or duel_masters — the three Ka-nabell sells and buys (also accepted: ポケカ, 遊戯王, デュエマ, ygo, dm). [one of: pokemon, yugioh, duel_masters]

**Returns:** rows[]: id, name, code, products, products_in_stock — in the site's rarity order.

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

### POST https://api.reefapi.com/kanabell/v1/games — 1 credit
The games Ka-nabell sells and buys (Pokémon, Yu-Gi-Oh!, Duel Masters) with live product, in-stock and open-for-buy-back counts and each game's condition scale.

**Parameters:** none

**Returns:** rows[]: game, name, name_en, products, products_in_stock, products_open_for_buyback, conditions[], buyback_top_condition, sale_url, buyback_url.

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