개발자/시작하기
CardV Merchant API
CardV는 기프트카드, 게임 충전, eSIM 같은 선불 디지털 상품을 기업 고객에게 판매합니다. Merchant API를 쓰면 귀사 서버에서 이 상품들을 자동으로 구매할 수 있습니다. 잔액을 확인하고, 상품을 찾고, 가격을 조회한 뒤 주문하고, 발급된 코드를 받아 오는 흐름입니다. 주문 대금은 CardV 선불 지갑에서 결제됩니다. 지갑 충전이나 주문 내역 조회 같은 나머지 업무는 Merchant Portal(이하 포털)에서 처리합니다.
#문서 목록
| 문서 | 내용 |
|---|---|
| 인증 | 요청 헤더, 주문 서명, API 키 관리 |
| 상품과 주문 | 잔액, 상품, 가격, 주문, 코드 |
| 공통 규칙 | 금액, 날짜, ID, 요청 한도, 오류 |
| Webhook | 귀사 서버로 보내는 주문 알림 |
| Sandbox | 테스트 방법과 서비스 오픈 체크리스트 |
| 보안 | API 키와 코드 보호 |
#환경
| Live | Sandbox | |
|---|---|---|
| API 기본 URL | https://b2b.cardv.net/api/v1 | https://sandbox.cardv.net/api/v1 |
| Merchant Portal | https://b2b.cardv.net/portal/ | 같은 포털에서 Sandbox로 전환 |
Sandbox는 테스트 머니로 움직이는 별도의 CardV 테스트 환경입니다. API 키, 잔액, 주문, 상품 ID는 환경마다 모두 다릅니다.
#빠른 시작
가입을 신청합니다. 포털에서 가맹점 계정을 신청하고 이메일 인증을 마칩니다.
승인을 기다립니다. CardV가 사업자 정보를 확인한 뒤 Merchant ID(가맹점 ID)를 발급합니다. 예:
M00000001Sandbox를 엽니다. 포털에 로그인한 뒤 상단에서 Sandbox를 선택합니다. 테스트 머니 1,000 USD가 지급됩니다.
API 키를 만듭니다. 포털의 Integrations → API keys 메뉴로 이동합니다. 키를 만든 뒤, CardV가 이메일로 보내는 인증 코드를 입력해 키를 확인합니다. 확인한 키는 시크릿 저장소에 보관합니다.
잔액을 확인합니다.
export CARDV_BASE=https://sandbox.cardv.net export CARDV_MERCHANT_ID=M00000001 # yours export CARDV_API_KEY=cvb2b_... # from your secret store AUTH=(-H "X-Merchant-Id: $CARDV_MERCHANT_ID" -H "X-Api-Key: $CARDV_API_KEY") curl -sS "$CARDV_BASE/api/v1/balance" "${AUTH[@]}"상품을 찾습니다.
curl -sS "$CARDV_BASE/api/v1/skus?search=steam&limit=20" "${AUTH[@]}""availability": "available"인 상품을 하나 골라sku_id를 적어 둡니다.가격을 조회합니다.
curl -sS "$CARDV_BASE/api/v1/skus/S000001/quote?quantity=1" "${AUTH[@]}"merchant_price를 확인합니다. 한 개당 실제로 결제할 금액입니다.주문합니다. 주문 요청에는 서명이 필요합니다. 인증 문서의 예제 코드에 아래 본문을 넣어 보내세요.
{ "external_order_id": "TEST-0001", "items": [ {"sku_id": "S000001", "quantity": 1, "expected_unit_price": "9.2500"} ] }성공하면 HTTP 201과 함께
O-00001234같은 CardV 주문 ID를 받습니다.코드를 받습니다. 상태가
succeeded가 될 때까지GET/api/v1/orders/O-00001234를 호출합니다. 코드는items[].deliveries[].display_fields에 들어 있습니다. 주문이 끝났을 때 Webhook으로 알림을 받을 수도 있습니다.Sandbox 체크리스트를 모두 통과하면 Live로 전환합니다.
위의 ID와 가격은 예시입니다. 실제로는 귀사 계정에서 조회되는 값을 사용하세요.
#API 한눈에 보기
엔드포인트는 모두 7개이며, 경로는 /api/v1로 시작합니다.
| 엔드포인트 | 용도 | 서명 |
|---|---|---|
GET/account | 회사 정보와 API 사용 가능 여부 | 불필요 |
GET/balance | 사용 가능한 잔액 | 불필요 |
GET/skus | 구매 가능한 상품 목록과 귀사 가격 | 불필요 |
GET/skus/{sku_id} | 상품 1개 조회 | 불필요 |
GET/skus/{sku_id}/quote | 수량별 현재 가격 | 불필요 |
POST/orders | 주문(지갑에서 결제) | 필요 |
GET/orders/{order_id} | 주문 상태와 코드 | 불필요 |
그 밖의 엔드포인트를 API 키로 호출하면 HTTP 403이 반환됩니다.
{"detail": "This operation is only available in the Merchant Portal."}휴대폰 요금 충전(통화 충전)은 API로 제공하지 않습니다.
#ID 종류
| 구분 | 예시 | 설명 |
|---|---|---|
| Merchant ID | M00000001 | 귀사 고유 ID입니다. 바뀌지 않습니다. |
| SKU(구매할 수 있는 상품) | S000456 | 가격 조회와 주문에 씁니다. |
| CardV 주문 ID | O-00001234 | 귀사 주문 정보와 함께 저장하세요. |
| 자체 주문번호 | SHOP-10001 | 귀사가 직접 정하는 번호입니다(external_order_id). |
ID는 문자열로 저장하고, 형식을 해석하지 마세요. 자세한 내용은 공통 규칙을 참고하세요.
#포털에서 하는 일
- 지갑 충전, 잔액 부족 알림 이메일 설정
- 주문 내역 조회, 검색, CSV 내보내기
- 주문 인보이스
- 지갑 거래 내역과 정산 대사
- Webhook 설정, 발송 내역 확인, 재발송
- API 키 관리
- IP 허용 목록
- 팀원과 역할 관리
- 감사 로그
- 2단계 인증(2FA)
- Live와 Sandbox 전환
#호환성과 문의
응답에 새 필드나 새 상태 값이 예고 없이 추가될 수 있습니다. 모르는 필드는 무시하고, 모르는 주문 상태는 "아직 완료되지 않음"으로 처리하세요. 오류 메시지의 문구에 의존하지 마세요.
문의는 [email protected]으로 보내 주세요. Merchant ID, 환경(Live/Sandbox), 주문 ID, 발생 시각(UTC), HTTP 상태 코드를 함께 적어 주시면 됩니다.
API 키, 서명, Webhook 시크릿, 카드 코드는 절대 보내지 마세요.
연동 관련 문의는 Merchant ID와 주문 ID 또는 요청 ID를 포함해 [email protected]로 보내 주세요.