読み取り
GET エンドポイントを呼び出せます。アカウント情報の表示やエクスポートだけを行う連携に使用してください。
Lunidex アカウントに同期済みのデータへ、サーバー側の連携サービスからアクセスします。キーを作成して最初のリクエストを送り、カード、未開封商品、ページネーション、安全な書き込みを確認しましょう。
API キーをブラウザーのコード、モバイルアプリ、公開リポジトリ、URL、スクリーンショット、共有ログに含めないでください。サーバー側のシークレット管理サービスに保存し、Authorization ヘッダーでのみ送信してください。
連携には API キー、サーバー側に保存したシークレット、API ベース URL への HTTPS リクエストが必要です。
Lunidex ダッシュボードの API キーカードを開き、名前と読み取り専用または読み書き権限を選びます。完全なシークレットは一度だけ表示されるため、メッセージを閉じる前にコピーしてください。
ホスティングサービスのシークレット管理機能に LUNIDEX_API_KEY として保存してください。リポジトリにコミットしたり、ブラウザーへ送信したりしないでください。
サーバーから GET /me を呼び出します。非公開エンドポイントには Authorization: Bearer の後にキーを付けます。
curl --fail-with-body \
-H "Authorization: Bearer $LUNIDEX_API_KEY" \
https://lunidex.app/api/v1/meconst API_BASE_URL = "https://lunidex.app/api/v1";
const apiKey = process.env.LUNIDEX_API_KEY;
if (!apiKey) throw new Error("Missing LUNIDEX_API_KEY");
const response = await fetch(API_BASE_URL + "/me", {
headers: { Authorization: "Bearer " + apiKey },
});
const result = await response.json();
if (!response.ok) {
throw new Error(result.error?.code ?? "REQUEST_FAILED");
}
console.log(result.data);非公開の /api/v1 リクエストごとに HTTP Authorization ヘッダーでキーを送信します。API は data エンベロープの JSON を返し、非公開レスポンスには Cache-Control: private, no-store を設定します。
GET エンドポイントを呼び出せます。アカウント情報の表示やエクスポートだけを行う連携に使用してください。
GET と書き込みエンドポイントの両方を呼び出せます。コレクションまたは未開封商品の取引記録を更新する、信頼できるサーバー連携にのみ使用してください。
API で参照できるのは Neon の Lunidex アカウントに同期されたデータのみです。端末だけにあるデータは取得できません。アカウント情報にメールアドレスは含まれません。
一覧は data と meta.nextCursor を返します。次のページではカーソルを変更せずに渡し、null になったら終了します。
const API_BASE_URL = "https://lunidex.app/api/v1";
const apiKey = process.env.LUNIDEX_API_KEY;
let cursor = null;
if (!apiKey) throw new Error("Missing LUNIDEX_API_KEY");
do {
const query = new URLSearchParams({ limit: "100" });
if (cursor) query.set("cursor", cursor);
const response = await fetch(API_BASE_URL + "/cards?" + query, {
headers: { Authorization: "Bearer " + apiKey },
});
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code ?? "REQUEST_FAILED");
console.log(result.data);
cursor = result.meta?.nextCursor ?? null;
} while (cursor);各パスは API のベース URL からの相対パスです。各行に必要なアクセス権と OpenAPI 契約に記載されたパラメーターを示します。機械可読な仕様には完全なスキーマ、リクエストとレスポンスの例、操作ごとのエラーが含まれます。以下のセクションでは主な使い方を説明します。
/openapi.json公開された機械可読仕様。API キーは不要です。
/meメールアドレスを含まない限定的なアカウント情報。
/summary主なアカウント統計、物理枚数と種類別カード数、EUR セント単位の未開封商品の合計。
/cards言語とセットで絞り込める、ページ分割されたカード保有情報。
cursor(クエリ)limit(クエリ)language(クエリ)set(クエリ)/cards/{cardId}TCGdex のメタデータと自分の保有情報。カード価格は含みません。
cardId(パス)· 必須language(クエリ)/cards/{cardId}カード、言語、バリアントごとの絶対数量を設定します。
cardId(パス)· 必須/sealed/catalogue既存の Cardmarket 未開封商品カタログを検索します。
q(クエリ)cursor(クエリ)/sealed/positionsページ分割された現在の保有状況、原価、保存済み市場価格。
cursor(クエリ)limit(クエリ)language(クエリ)productId(クエリ)/sealed/positions/{productId}保有する 1 商品の言語別現在数量。
productId(パス)· 必須/sealed/transactions改訂番号とフィルターに対応する非公開取引記録。
cursor(クエリ)limit(クエリ)language(クエリ)productId(クエリ)type(クエリ)includeVoided(クエリ)voided(クエリ)/sealed/transactions購入、売却、交換を作成します。冪等キーが必要です。
Idempotency-Key(ヘッダー)· 必須/sealed/transactions/{id}このアカウントに属する取引を取得します。
id(パス)· 必須/sealed/transactions/{id}改訂番号を確認して取引を更新します。
id(パス)· 必須/sealed/transactions/{id}/void改訂番号を確認して取引を無効にします。
id(パス)· 必須GET /cards は TCGdex のカタログ全体を読み込まず、保有中のバリアントを一覧表示します。各項目には cardId、setId、language、variant、quantity が含まれ、language と set で絞り込めます。
GET /cards/{cardId} は TCGdex の有用なメタデータと、アカウント内でのそのカードの保有状況を返します。language クエリで絞り込めます。
PUT /cards/{cardId} には language、variant(unspecified、normal、reverse、holo)、0〜10,000 の絶対数量を指定します。0 を指定するとそのバリアントを削除します。
{
"language": "en",
"variant": "reverse",
"quantity": 2
}言語情報のない古い保有データも表示されます。language が null になり、legacy として示される場合があります。
この API はカードの価格を返しません。
未開封商品の保有状況には言語ごとの数量、原価、Lunidex に保存済みの価格に基づく現在価値が含まれます。金額は EUR の整数セントです。価格がない場合 valueCents は null となり missingPrice で示されます。summary には missingPrices も含まれます。
GET /summary では、保有商品のうち 1 つでも価格がない場合、未開封商品の価値は null になります。missingPrices に不足件数が含まれます。
q(最大 150 文字)と cursor を使って、Cardmarket に登録済みの商品を検索します。1 ページは最大 24 件です。返された商品 ID を後続のリクエストに使います。
GET /sealed/positions は language と productId で絞り込めます。GET /sealed/positions/{productId} は 1 商品の現在の保有状況を返します。現在の合計を返し、完全な価格履歴は返しません。
非公開取引記録は language、productId、type(buy、sell、exchange)、includeVoided、voided で絞り込めます。安全な変更のため改訂番号が含まれます。
PUT /cards/{cardId} は数量を加算せず、指定値に置き換えます。同じリクエストを繰り返しても数量は変わらず、0 でバリアントを削除できます。書き込み前にカード、セット、言語、利用可能なバリアントが検証されます。
POST /sealed/transactions は buy、sell、exchange を受け付けます。Idempotency-Key ヘッダー(8〜200 文字)と expectedRevision が必要です。同じリクエストを再試行するときは同じキーを使い、取引が重複しないようにします。初回に取引を作成し、再送時は元の結果を返します。
curl --request POST "https://lunidex.app/api/v1/sealed/transactions" \
-H "Authorization: Bearer $LUNIDEX_API_KEY" \
-H "Idempotency-Key: lunidex-import-example-001" \
-H "Content-Type: application/json" \
--data '{
"expectedRevision": 0,
"kind": "buy",
"cardmarketProductId": 12345,
"language": "en",
"date": "2026-09-27",
"quantity": 1,
"unitPriceCents": 2500
}'書き込み前に GET /sealed/transactions のメタデータから最新の取引記録 revision を取得し、expectedRevision に設定します。PATCH /sealed/transactions/{id} には対象取引の revision も必要です。古い revision は 409 になります。再試行を判断する前に取引と記録を再取得してください。
PATCH /sealed/transactions/{id}
POST /sealed/transactions/{id}/void
POST /sealed/transactions/{id}/void には revision と expectedRevision が必要です。作成、更新、無効化には Lunidex の取引と同じ検証、割り当て、監査記録が使われます。
{
"revision": 1,
"expectedRevision": 0
}成功時は { "data": ..., "meta": ... }(meta は省略可能)を返します。エラー時は { "error": { "code": ..., "message": ..., "details": ... } }(details は省略可能)を返します。
主な応答: 400 取引データ不正、401 キー無効、403 権限不足、404 リソースなしまたは未保有、409 カーソルまたは revision が古い、410 アカウント削除中、422 クエリパラメーターまたはリクエスト本文が不正、429 上限到達、500 予期しないサーバーエラー、502 カードデータ利用不可、503 API 利用不可。
409 の場合は最新リソースを取得するか、カーソルを外して一覧を再開してください。競合をそのまま新しい取引として再送しないでください。
429 応答には Retry-After が含まれます。再試行する前に指定された秒数以上待ってください。
すべての非公開 API レスポンスは Cache-Control: private, no-store を使用します。公開 OpenAPI 仕様は /api/v1/openapi.json から取得できます。
上限は Lunidex アカウントごとに適用され、同じアカウントの API キー間で共有されます。
| 1 分あたりの読み取り | 60 |
|---|---|
| 1 分あたりの書き込み | 10 |
| 1 日あたりの読み取り | 1,000 |
| 1 日あたりの書き込み | 100 |
| アカウントごとのカード詳細取得(1 日) | 100 |
| アカウントごとの未開封計算(1 日) | 100 |
| 高コスト処理ごとの全体上限(1 日) | 5,000 |
カード詳細と未開封商品の計算には、それぞれ別の全体上限として 1 カテゴリあたり 1 日 5,000 回が設定されています。429 応答には Retry-After が含まれます。
OpenAPI 仕様を開く