magi API & Scraper: parameters and responses
This is the reference for the 9 magi endpoints under /magi/v1 (search, sold, item, products, product, price_history, catalog, categories and trending) and their 16 parameters. Each endpoint lists its parameters, required or optional, with allowed values and defaults, and comes with a cURL, Python and JavaScript call; every response uses the same { ok, data, meta, error } envelope.
The magi API returns magi.camp - Japan's card-only flea market for Pokémon, One Piece, Yu-Gi-Oh!, Duel Masters, MTG, Weiß Schwarz and 140+ other games - as clean JSON in yen, with the Japanese text kept as sellers wrote it.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search lists listings by keyword, game, sub-category (singles, unopened boxes, packs, old-back cards), new or used, price range, one card, one seller or a grade such as PSA10, live or sold, sorted newest, cheapest, dearest or most favourited; every row has the price, the SOLD flag, favourites and whether the seller is a registered shop. sold returns only what actually sold and the price it sold at, with the page's count, minimum, median, mean and maximum. product returns one card's sale history: every completed sale with its price and quantity, the dated daily price chart, the last sale, magi's own 12-month range and all-time average, the cheapest live copy and the same card in other grades. item returns one listing in full: price with and without the buyer fee, condition, shipping, the seller's good / normal / bad rating counts, description and photos. catalog, categories and trending find card ids, game ids and what people search for. No account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.
What a PSA 10 card really sells for in Japan - one call
product for 【PSA10】リザードンex SAR 134/108 on 2026-11-08 returned 314 completed sales and a dated chart from 2024-02-11 to 2026-11-02. The cheapest copy for sale was ¥75,705; the raw card's cheapest copy was ¥25,750, so the grading premium is visible in the same response.
| Field | Value (live, 2026-11-08) | Meaning |
|---|---|---|
| last_trade_date / last_trade_price_jpy | 2026-11-02 / 74,984 | The most recent sale on the chart |
| range_12m_min_jpy - range_12m_max_jpy | 46,350 - 121,540 | magi's own 12-month range |
| average_all_time_jpy | 50,497 | magi's all-time average sale |
| price_history days=90: change_percent | -20.7 % | 94,554 on 2026-08-11 to 74,984 on 2026-11-02 |
| min_price_jpy | 75,705 | Cheapest copy for sale right now |
Prices are what a buyer pays, buyer fee included - magi adds about 3 % on top of the seller's price, and item shows both (22,660 = 22,000 + 660 fee on a live listing). magi's chart keeps one point per day for up to 200 days; trades lists every sale, and gets an exact date per sale when the two line up one-to-one.
Real request and response JSON
Captured from the indexed primary action, sold, on .
{
"method": "POST",
"url": "https://api.reefapi.com/magi/v1/sold",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "ルフィ",
"game": "one_piece"
}
}{
"ok": true,
"meta": {
"api": "magi",
"endpoint": "sold",
"mode": "live",
"latency_ms": 1376,
"record_count": 96,
"bytes": 159331,
"cache_hit": false,
"total": 2667,
"total_capped": false,
"products_total": 4503,
"page": 1,
"per_page": 96,
"last_page": 28,
"has_more": true,
"filters_applied": {
"query": "ルフィ",
"game": "one_piece",
"game_id": 129,
"status": "sold",
"sort": "newest"
},
"promoted": [
{
"item_id": "1155968236",
"title": "モンキー・D・ルフィ SR パラレル (OP01-024) 1枚",
"price_jpy": 3708,
"sold": false,
"favorites": 0,
"certified_seller": true,
"grade": null,
"image_url": "https://s3-ap-northeast-1.amazonaws.com/jiraffe-magi/prod/images/item/14166062/1s.jpg",
"url": "https://magi.camp/items/1155968236",
"promoted": true
},
{
"item_id": "1809877968",
"title": "モンキー・D・ルフィ (パラレル) [L] {OP13-001} 1枚",
"price_jpy": 4120,
"sold": false,
"favorites": 0,
"certified_seller": true,
"grade": null,
"image_url": "https://s3-ap-northeast-1.amazonaws.com/jiraffe-magi/prod/images/item/14166019/1s.jpg",
"url": "https://magi.camp/items/1809877968",
"promoted": true
},
{
"item_id": "1403269792",
"title": "モンキー・D・ルフィ (パラレル) [SEC] {OP13-118} 1枚",
"price_jpy": 6592,
"sold": false,
"favorites": 0,
"certified_seller": true,
"grade": null,
"image_url": "https://s3-ap-northeast-1.amazonaws.com/jiraffe-magi/prod/images/item/14166018/1s.jpg",
"url": "https://magi.camp/items/1403269792",
"promoted": true
}
],
"currency": "JPY",
"warnings": [],
"price_summary": {
"count": 96,
"min_jpy": 569,
"max_jpy": 1120548,
"median_jpy": 17459,
"mean_jpy": 61909
},
"charged_credits": 2,
"version": "1.0.0",
"request_id": "f9f7fc64766a4a22",
"queue_ms": 1.7,
"fetched_at": "2026-11-08T13:04:28.916Z"
},
"data": {
"rows": [
{
"item_id": "1253193853",
"title": "@ @ モンキー・D・ルフィ(パラレル) P-R OP16-034 1枚",
"price_jpy": 569,
"sold": true,
"favorites": 2,
"certified_seller": false,
"grade": null,
"image_url": "https://storage.googleapis.com/magi-production-public/ttxtblac1rx91nzdqn6of90sx2sf",
"url": "https://magi.camp/items/1253193853"
},
{
"item_id": "1481691559",
"title": "【状態A】モンキー・D・ルフィ SR パラレル (OP02-062) 1枚",
"price_jpy": 2472,
"sold": true,
"favorites": 0,
"certified_seller": true,
"grade": null,
"image_url": "https://s3-ap-northeast-1.amazonaws.com/jiraffe-magi/prod/images/item/14173560/1s.jpg",
"url": "https://magi.camp/items/1481691559"
},
{
"item_id": "950239192",
"title": "【PSA10】モンキー・D・ルフィ(パラレル) P-SEC EB02-061 1枚",
"price_jpy": 9043,
"sold": true,
"favorites": 1,
"certified_seller": true,
"grade": {
"grader": "PSA",
"grade": "10",
"label": "PSA10"
},
"image_url": "https://storage.googleapis.com/magi-production-public/asaoqlcodrfn3g2vzuorcmqhtfwy",
"url": "https://magi.camp/items/950239192"
}
]
}
}What the magi API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search magi listings: keyword, game, sub-category (singles, unopened boxes, packs, old-back …), new/used, price range, live or sold, one card product, one seller, graded (PSA10 …), sorted newest / cheapest / dearest / most favourited, 96 a page. Every row carries the SOLD flag. | Pricing teams call search to search magi listings. | query, game, series_id, category, condition, ... |
| sold | Sold listings only — what cards actually SOLD for on magi (the realised price, buyer fee included), newest sales first by default: the price check / arbitrage feed. Same filters as search; meta.price_summary gives count, min, median, mean and max of the page's sold prices. | Marketplace operators call sold to get sold listings only. | query, game, series_id, category, condition, ... |
| item | One magi listing in full: price with and without the buyer fee, SOLD flag, condition, quantity, the card product it is listed under, shipping (fee included or not, method, anonymous shipping, ships from prefecture, dispatch time), the seller's public profile (name, id, identity check, rank, good / normal / bad rating counts, registered shop / real store), description, all photos and last-update time. | Catalog enrichment teams call item to get one magi listing in full. | item_id |
| products | Search magi's card catalogue (製品): one row per card / box / graded slab with the cheapest live listing price and the number of listings — the fastest way to find a product_id for price history. Keyword, game, sub-category, price range, sort, 96 a page. | Retail analysts call products to search magi's card catalogue (製品). | query, game, series_id, category, min_price, ... |
| product | One card product with its sold-price history: every completed sale (price, quantity, how long ago), the dated daily price chart, last sale, the site's 12-month price range and all-time average, the cheapest live price, rarity / set (pack) / card number, the live and recently sold listings, and the same card in other grades (PSA10, PSA9, ARS10 …) with their prices. | Pricing teams call product to get one card product with its sold-price history. | product_id |
| price_history | A card's sold-price history ready for charts and price checks: the dated daily series (optionally only the last N days), every sale with its price, and a summary — count, min, median, mean, max, first and last date, change from first to last — plus the site's own 12-month range and all-time average. | Marketplace operators call price_history to get a card's sold-price history ready for charts and price checks. | product_id, days |
| catalog | magi's card database lookup: card products matching a name or number with their rarity, card number (型番), set / pack (封入パック), game and sub-category — 96 a page. Turns a card name into the product_id that `product` and `price_history` take. | Catalog enrichment teams call catalog to get magi's card database lookup. | query, series_id, page |
| categories | magi's category tree: the top categories (cards, sneakers …) and every card game with its id (200+: Pokémon, One Piece, Yu-Gi-Oh!, Duel Masters, MTG, Weiß Schwarz, Lorcana, sports …); with game=… also that game's sub-categories (singles, unopened boxes, packs, old-back, overseas …) and the conditions each allows. Ids go to search as game / series_id. | Retail analysts call categories to get magi's category tree. | game |
| trending | What magi users are searching for right now (the site's trending keywords). | Pricing teams call trending to get what magi users are searching for right now (the site's trending keywords).. | none |
Call sold from your stack
curl -X POST https://api.reefapi.com/magi/v1/sold \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"ルフィ","game":"one_piece"}'import os
import requests
REEF_KEY = os.environ["REEF_KEY"]
r = requests.post(
"https://api.reefapi.com/magi/v1/sold",
headers={"x-api-key": REEF_KEY},
json={
"query": "ルフィ",
"game": "one_piece"
},
timeout=90,
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/magi/v1/sold", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "ルフィ",
"game": "one_piece"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.magi.sold with {"query":"ルフィ","game":"one_piece"}.Who uses this API and why
- Japan-to-abroad arbitrage: realised yen sale prices for a card next to its cheapest live copy
- Graded card valuation: PSA 10 versus raw prices for the same card, with the full sale history
- Price alerts and portfolio tracking for Japanese Pokémon and One Piece cards
- Market research: what sells, how fast and at what price, per game and sub-category
Questions developers ask before integrating
Can I get sold prices, not just asking prices?
Yes. sold returns only listings that sold, with the price they sold at, and works with every search filter: game, keyword, card, seller, grade, price band and condition. For one card, product returns every completed sale. In the live run a sold search for ルフィ in One Piece returned 96 sales on the first page (median ¥17,459) out of 2,666.
Does it work for graded cards (PSA, BGS, ARS)?
Yes. Pass grade=PSA10 (or PSA9, BGS9.5, ARS10+, CGC10) and every row has a parsed grade. magi lists each grade of a card as its own product, so product also returns other_grades - the same card as PSA10, PSA9, ARS10 or raw, each with its cheapest price.
Which games are covered?
Everything magi lists: 143 games on 2026-11-08, from Pokémon, One Piece, Yu-Gi-Oh!, Duel Masters, MTG, Weiß Schwarz, Union Arena, Digimon and Lorcana to sports cards and retired games. categories returns every game id and each game's sub-categories, such as Pokémon singles, unopened boxes, unopened packs, old-back cards and overseas versions.
Do I get the exact date of each sale?
magi shows each sale with a relative time (6 days ago, about a month ago) and a dated chart with one point per day. trades always has the price and the relative time, days_ago when magi states whole days, and an exact date when the sales and the chart line up one-to-one. daily_chart always has dates. A single listing's sale time is not public on magi.
Are seller details included?
Each listing returns the seller's public magi name and id, identity check, rank, and the good / normal / bad rating counts magi prints on the listing, plus whether the seller is a registered shop with a real store. Phone numbers and e-mail addresses inside descriptions are removed by default.
What is the magi API?
magi API is a ReefAPI endpoint group for japan's trading-card marketplace: live and sold listings, every card's sale history and seller ratings, in jpy. It returns live JSON through POST requests under /magi/v1.
Is the magi API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. magi calls use the same shared credit balance as every other ReefAPI engine.
Do I need a magi login or account?
No login to magi is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the magi data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the magi API use?
magi actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call magi from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call magi actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the magi API a magi scraper?
It is the managed alternative to a DIY magi scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same japan's trading-card marketplace: live and sold listings, every card's sale history and seller ratings, in jpy back as clean JSON.
Why does my magi scraper keep getting blocked?
Most magi scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.