읽기
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}보유 중인 한 상품의 언어별 현재 수량.
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에서 보유 상품 중 하나라도 가격이 없으면 미개봉 상품 가치는 null입니다. missingPrices에 누락된 가격 개수가 포함됩니다.
q(최대 150자)와 cursor로 Cardmarket에 이미 등록된 상품을 검색하세요. 페이지당 최대 24개이며 반환된 상품 ID를 다음 요청에 사용합니다.
GET /sealed/positions는 language와 productId 필터를 지원합니다. GET /sealed/positions/{productId}는 한 상품의 현재 보유 정보를 반환합니다. 현재 합계만 제공하며 전체 가격 기록은 제공하지 않습니다.
비공개 거래 기록은 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 메타데이터에서 최신 거래 기록 리비전을 읽어 expectedRevision에 사용하세요. PATCH /sealed/transactions/{id}에는 해당 거래의 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 커서 또는 리비전이 오래됨, 410 계정 삭제 중, 422 쿼리 매개변수 또는 요청 본문 오류, 429 할당량 초과, 500 예상치 못한 서버 오류, 502 카드 데이터 이용 불가, 503 API 이용 불가.
409이면 최신 리소스를 가져오거나 커서 없이 목록을 다시 시작하세요. 충돌을 새 거래 요청으로 무작정 바꾸지 마세요.
429 응답에는 Retry-After가 포함됩니다. 재시도하기 전에 지정된 초 이상 기다리세요.
모든 비공개 API 응답은 Cache-Control: private, no-store를 사용합니다. 공개 OpenAPI 문서는 /api/v1/openapi.json에서 별도로 제공합니다.
한도는 Lunidex 계정별로 적용되며 해당 계정의 모든 API 키가 공유합니다.
| 분당 읽기 | 60 |
|---|---|
| 분당 쓰기 | 10 |
| 일일 읽기 | 1,000 |
| 일일 쓰기 | 100 |
| 계정별 카드 상세 조회/일 | 100 |
| 계정별 미개봉 계산/일 | 100 |
| 비용이 큰 범주별 전체 일일 한도 | 5,000 |
카드 상세 조회와 미개봉 계산은 각각 별도의 전체 한도가 있으며 범주마다 하루 5,000회입니다. 429 응답에는 Retry-After가 포함됩니다.
OpenAPI 명세 열기