# Toretoku API — Japanese trading-card shop トレトク (toretoku.jp): selling price in JPY per condition rank (S sealed, A-D) with stock, for Yu-Gi-Oh!, Pokémon, MTG, Duel Masters, One Piece, Rush Duel and Weiß Schwarz, the shop's live order feed, and its buy-back prices (買取) for Yu-Gi-Oh! and Pokémon. No login, no key.

> Cards and sealed products Toretoku sells in one game, one row per condition rank: price in JPY, exact stock, rarity, card number, language and set; filter by name or number, set, rank, language, price, SALE and the game's own card filters; sort by popularity, newest, price or last price change.
> ReefAPI engine `toretoku` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/toretoku/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/toretoku/v1/search — 2 credits
Cards and sealed products Toretoku sells in one game, one row per condition rank: price in JPY, exact stock, rarity, card number, language and set; filter by name or number, set, rank, language, price, SALE and the game's own card filters; sort by popularity, newest, price or last price change.

**Parameters:**
- `game` (enum, required) — Which game: yugioh, pokemon, mtg, duel_masters, one_piece, yugioh_rush_duel, weiss_schwarz or other (also accepted: ポケカ, 遊戯王, ygo, dm, ws). [one of: yugioh, pokemon, mtg, duel_masters, one_piece, yugioh_rush_duel, weiss_schwarz, other]
- `keyword` (string, optional) — Card name, or the number printed on the card (PROMO 203/XY-P). Japanese names as the shop writes them; several words narrow it. Up to 50 characters.
- `set_id` (integer, optional) — One set (the `sets` action's set_id). Sale-side ids; buyback_search has its own.
- `series_id` (integer, optional) — One series / block (from `sets`).
- `category_id` (integer, optional) — One top-level category such as 拡張パック or プロモーションカード (from `sets`).
- `in_stock` (boolean, optional, default true) — Only ranks the shop has in stock. On by default, as on the site; false also lists sold-out ranks with their last price.
- `condition` (string, optional) — Condition ranks, comma-separated: S (未開封, sealed), A, B, C, D.
- `language` (string, optional) — Card language, comma-separated: japanese, english, spanish, german, italian, chinese, french, korean, portuguese, russian, other.
- `min_price` (integer, optional) — Lowest price in JPY, tax included.
- `max_price` (integer, optional) — Highest price in JPY, tax included.
- `on_sale` (boolean, optional, default false) — Only items the shop currently has marked down (SALE).
- `foil` (boolean, optional) — MTG only: true = foil only, false = non-foil only.
- `error_card` (boolean, optional) — MTG only: true = misprints only, false = none.
- `color` (string, optional) — Card colour, comma-separated. mtg: white, black, blue, red, green, brown, gold, colorless. one_piece: red, green, blue, purple, black, yellow. weiss_schwarz: red, blue, yellow, green, purple.
- `card_type` (string, optional) — Comma-separated. yugioh: normal_trap, continuous_trap, counter_trap, normal_spell, continuous_spell, quick_play_spell, field_spell, equip_spell, ritual_spell, normal_monster, effect_monster, tuner_monster, ritual_monster, pendulum_monster, fusion_monster, synchro_monster, xyz_monster, link_monster, gemini_monster. one_piece: leader, character, stage, event, don. weiss_schwarz: character, event, climax, first_player.
- `attribute` (string, optional) — One Piece attribute, comma-separated: slash, strike, ranged, special, wisdom, unknown.
- `cost` (integer, optional) — One Piece: cost (life for leaders), 0-10.
- `level` (integer, optional) — Weiß Schwarz: level, 0-3.
- `sort` (enum, optional, default "popular") — Order of the rows. [one of: popular, newest, price_asc, price_desc, price_updated, condition]
- `page` (integer, optional, default 1) — Page number; meta.last_page says how many there are.
- `per_page` (integer, optional, default 30) — Rows per page: 30, 50, 100, 150, 200 or 250.

**Returns:** rows[]: id (give it to `card`), sku (this rank's stock code), product_code (the shop's code for the card), game, name, rarity, card_number, language (null when the shop prints none), language_label, condition (S = sealed, A, B, C, D), condition_label, price_jpy (tax included), stock (units of this rank), in_stock, set{id, name, series_id, series, category_id, category} (null on a sold-out row: the shop omits it there; id null when the shop's name is shared by several sets or the item is filed under a series, as supplies are), image, url, currency, price_includes_tax. One row is one rank of one card; the same card appears once per rank. meta: page, per_page, last_page, has_more, sort, filters_applied, warnings. The shop prints no total count.

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

### POST https://api.reefapi.com/toretoku/v1/card — 2 credits
One Toretoku product in full: price, SALE flag and stock for every condition rank (sold-out ranks too), rarity, card number, language, set — and, for Yu-Gi-Oh! and Pokémon, what the shop pays for it.

**Parameters:**
- `product_id` (string, required) — A search row's `id`, or a toretoku.jp/item/details/<id> URL.
- `include_buyback` (boolean, optional, default true) — Also read what the shop pays for this card (yugioh and pokemon).

**Returns:** card{id, product_code, game, name, rarity, card_number, language, language_label, set{id, name, series_id, series, category_id, category}, price_jpy (cheapest rank in stock), stock, in_stock, conditions[]{condition, condition_label, sku, price_jpy, price_excl_tax_jpy, on_sale, stock, in_stock}, note, attributes, image, url}, buyback (same as buyback_card; null when not offered for this game; status not_listed when the shop has no buy entry for it).

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

### POST https://api.reefapi.com/toretoku/v1/buyback_search — 1 credit
What Toretoku pays (買取) for Yu-Gi-Oh! and Pokémon cards: buy price in JPY for an A-rank copy, by name, card number or set, sorted by buy price, with the shop's own total count.

**Parameters:**
- `game` (enum, required) — yugioh or pokemon: the two games Toretoku publishes buy prices for. [one of: yugioh, pokemon]
- `keyword` (string, optional) — Card name, or the number printed on the card (PROMO 203/XY-P). Japanese names as the shop writes them; several words narrow it. Up to 50 characters.
- `category_id` (integer, optional) — A category, series or set id from `sets` with side=buyback (any level; buy-side ids differ from the sale side's). keyword or category_id is required.
- `priced_only` (boolean, optional, default true) — Only cards the shop quotes a price for (指定買取). false also lists cards it takes only in a bulk parcel (まとめ買取), which have buyback_price_jpy null.
- `sort` (enum, optional, default "price_desc") — Order of the rows. [one of: price_desc, price_asc]
- `page` (integer, optional, default 1) — Page number; meta.last_page says how many there are.
- `per_page` (integer, optional, default 30) — Rows per page: 30, 50, 100, 150, 200 or 250.

**Returns:** rows[]: item_code (give it to `buyback_card`), product_code, game, name, rarity, card_number, buyback_price_jpy (what the shop pays for an A-rank copy; null when the shop quotes no price), buyback_status (specific = priced, bulk_only = taken only in a まとめ買取 parcel), buyback_condition, shop_sell_price_jpy (the shop's own A-rank selling price for the same card, on priced rows), image, url, currency. meta: total (the shop's count), page, per_page, last_page, has_more, sort, filters_applied.

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

### POST https://api.reefapi.com/toretoku/v1/buyback_card — 1 credit
One card on the buy-back site: the price the shop pays for an A-rank copy (or that it takes it only in a bulk parcel), its language, set and notes.

**Parameters:**
- `item_code` (string, required) — A buyback_search row's item_code, the numeric product code, or a toretoku.jp/kaitori URL.
- `game` (enum, required) — yugioh or pokemon: the two games Toretoku publishes buy prices for. [one of: yugioh, pokemon]

**Returns:** card{item_code (give it to `buyback_card`), product_code, game, name, rarity, card_number, buyback_price_jpy (what the shop pays for an A-rank copy; null when the shop quotes no price), buyback_status (specific = priced, bulk_only = taken only in a まとめ買取 parcel), buyback_condition, shop_sell_price_jpy (the shop's own A-rank selling price for the same card, on priced rows), image, url, currency, language, language_label, set{id, name, series_id, series, category_id, category}, note}.

**Example request body:**
```json
{
  "game": "pokemon",
  "item_code": "183543jat"
}
```

### POST https://api.reefapi.com/toretoku/v1/sets — 2 credits
Every set Toretoku lists for one game with its series and top-level category — the ids `search` takes (side=sale) or `buyback_search` takes (side=buyback).

**Parameters:**
- `game` (enum, required) — Which game: yugioh, pokemon, mtg, duel_masters, one_piece, yugioh_rush_duel, weiss_schwarz or other (also accepted: ポケカ, 遊戯王, ygo, dm, ws). [one of: yugioh, pokemon, mtg, duel_masters, one_piece, yugioh_rush_duel, weiss_schwarz, other]
- `side` (enum, optional, default "sale") — Which tree: the ids of `search` (sale) or of `buyback_search` (buyback; yugioh, pokemon). [one of: sale, buyback]

**Returns:** sets[]{game, category_id, category, series_id, series, set_id, name, url}. meta: game, side, sets.

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

### POST https://api.reefapi.com/toretoku/v1/recent_orders — 1 credit
Toretoku's live order feed (注文速報) for one game: the 30 latest orders with time, card, condition rank and the price paid — no buyer data.

**Parameters:**
- `game` (enum, required) — Which game: yugioh, pokemon, mtg, duel_masters, one_piece, yugioh_rush_duel, weiss_schwarz or other (also accepted: ポケカ, 遊戯王, ygo, dm, ws). [one of: yugioh, pokemon, mtg, duel_masters, one_piece, yugioh_rush_duel, weiss_schwarz, other]

**Returns:** rows[]: position, ordered_at (Japan time, ISO-8601), id, game, name, condition, condition_label, price_jpy, image, url, currency.

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

### POST https://api.reefapi.com/toretoku/v1/games — 1 credit
The games Toretoku covers, the value each action takes, and which ones have a buy-back price list.

**Parameters:** none

**Returns:** rows[]: game, name, name_en, has_buyback, conditions[], languages[], 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=toretoku
- Human docs page: https://reefapi.com/docs/toretoku
- Overview page: https://reefapi.com/toretoku-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
