Partner Open API · v1

원화 출금 API

회원에게 지급할 원화 금액과 계좌 정보를 전달하고, 출금 상태를 조회하거나 승인 전 신청을 회수하는 서버 간 API입니다.

Base path · /api/v1 JSON · UTF-8 HMAC-SHA256 최종 검증 · 2026-09-20

개요

파트너는 출금 신청 시 정산 체인을 지정합니다. 신청이 접수되면 확정된 USDT 금액이 파트너 잔액에서 차감되고, 출금이 실패·반려·만료되면 원금과 수수료가 전액 환급됩니다.

Base URL계약 시 제공된 호스트 + /api/v1
지원 체인TRON, BSC
원화 금액 범위10,000원 ~ 9,000,000원
멱등키partnerOrderId
체인 자동 전환 없음 신청한 체인의 가용 USDT만 확인합니다. 해당 체인의 잔액이 부족하거나 출금 지갑이 준비되지 않았다면 다른 체인으로 자동 전환하지 않고 409를 반환합니다.

인증

모든 원화 출금 Open API 요청에는 파트너 API 키로 만든 HMAC 인증 헤더 3개가 필요합니다.

헤더
X-API-KEY발급받은 파트너 API Key
X-TIMESTAMPUnix epoch . 밀리초가 아닙니다.
X-ACCESS-TOKEN아래 서명식의 Base64 결과
서명식
message   = X-TIMESTAMP + "." + X-API-KEY
signature = Base64(HMAC-SHA256(apiSecret, message))
  • 서명 대상은 timestamp.apiKey뿐입니다. HTTP 메서드, 경로, 바디는 포함하지 않습니다.
  • 인코딩은 Base64입니다. hex 문자열이 아닙니다.
  • 타임스탬프 허용 오차는 서버 시각 기준 ±300초입니다.
Node.js 예제
const crypto = require('crypto');

function authHeaders(apiKey, apiSecret) {
  const timestamp = Math.floor(Date.now() / 1000).toString();
  const accessToken = crypto
    .createHmac('sha256', apiSecret)
    .update(`${timestamp}.${apiKey}`)
    .digest('base64');

  return {
    'X-API-KEY': apiKey,
    'X-TIMESTAMP': timestamp,
    'X-ACCESS-TOKEN': accessToken,
    'Content-Type': 'application/json'
  };
}

공통 규칙

  • 성공 응답은 data 래퍼 없이 객체를 직접 반환합니다.
  • 값이 없는 필드는 응답에서 키 자체가 생략될 수 있습니다.
  • 날짜/시각은 타임존 오프셋이 없는 ISO-8601 문자열입니다. 기준 타임존은 계약 시 별도 안내합니다.
  • 소수부 뒤쪽 0은 생략될 수 있으므로 시각 문자열의 고정 길이에 의존하지 마십시오.
  • API마다 금액 타입이 다릅니다. 각 응답 표의 number/string 구분을 따르십시오.
  • 계좌번호, 예금주, 은행 코드는 신청 응답이나 조회 응답에 다시 포함되지 않습니다.

에러 응답

descriptiondata는 오류에 따라 생략될 수 있습니다.

{
  "code": "1123",
  "message": "원화 출금 주문을 찾을 수 없습니다.",
  "description": "orderCode=kwo_example"
}

출금 상태

WAITING APPROVED SETTLING COMPLETED
상태의미파트너 잔액
WAITING접수 완료, 승인 대기차감 유지
APPROVED승인 완료, 지급 처리 중차감 유지
SETTLING원화 지급 완료, 최종 처리 중차감 확정
COMPLETED출금 완료차감 확정
FAILED회수, 승인 기한 만료 또는 지급 실패전액 환급
REJECTED승인 전 개별 반려전액 환급
승인 이후에는 회수할 수 없습니다 APPROVED부터는 원화 지급이 진행될 수 있으므로 파트너 회수 요청이 409로 거부됩니다.

API Reference

POST /api/v1/krw-withdrawals 원화 출금 신청

회원에게 지급할 원화 금액과 계좌 정보를 전달합니다. 신청이 접수된 시점에 원금과 수수료가 파트너 USDT 잔액에서 차감됩니다.

Request body

필드타입필수설명
partnerUserIdstringY파트너 사용자 식별자, 최대 100자
partnerOrderIdstringY파트너 주문 멱등키, 최대 100자
krwAmountnumberY정수, 10,000~9,000,000 KRW
chainstringYTRON 또는 BSC
bankCodestringY아래 표의 3자리 은행 코드
accountNumberstringY수취 계좌번호, 최대 50자
accountHolderstringY예금주, 최대 50자

은행 코드

bankCode에는 다음 3자리 코드를 사용하십시오. 2026-09-20 기준 활성 은행 카탈로그입니다.

코드은행명코드은행명
002KDB산업은행003IBK기업은행
004KB국민은행007Sh수협은행
011NH농협은행020우리은행
023SC제일은행031iM뱅크
032BNK부산은행034광주은행
035제주은행037전북은행
039BNK경남은행045새마을금고
048신협071우체국
081하나은행088신한은행
089케이뱅크090카카오뱅크
092토스뱅크
Request
{
  "partnerUserId": "user-001",
  "partnerOrderId": "krw-20260920-0001",
  "krwAmount": 10000,
  "chain": "BSC",
  "bankCode": "004",
  "accountNumber": "000000000000",
  "accountHolder": "테스트"
}

Response

필드타입설명
orderCodestringCryptoments 주문 코드. 이후 조회와 회수에 사용
statusstring접수 직후 WAITING
krwAmountnumber회원에게 지급할 원화 금액
chainstring정산 체인
exchangeRatenumber신청 시 확정된 KRW/USDT 환율
debitUsdtnumber파트너 잔액 총 차감액 = 원금 + 수수료
feeUsdtnumber파트너 부담 수수료
ttlExpiresAtstring승인 기한. 승인 후 생략
txHashstring완료 후 제공. 이전에는 생략
201 Created · 신규 신청
{
  "orderCode": "kwo_example0001",
  "status": "WAITING",
  "krwAmount": 10000,
  "chain": "BSC",
  "exchangeRate": 1369.0000,
  "debitUsdt": 7.377647918188458728,
  "feeUsdt": 0.073046018991964937,
  "ttlExpiresAt": "2026-09-20T18:39:40"
}
멱등 범위는 진행 중인 주문까지입니다 같은 partnerOrderId의 비종결 주문이 있으면 기존 주문을 200 OK로 반환하며 잔액을 다시 차감하지 않습니다. 주문이 COMPLETED, FAILED, REJECTED로 종결된 뒤에는 같은 값으로도 새 주문이 생성될 수 있습니다. 서로 다른 출금에는 절대 같은 값을 재사용하지 마십시오.

주요 응답 코드

201신규 접수 성공
200동일 partnerOrderId의 비종결 주문 반환
401인증 실패 또는 타임스탬프 만료
404체인 또는 통화 설정 없음
409시세, 잔액, 지갑 또는 접수 조건 불충족
422금액 범위 또는 요청 필드 검증 실패
POST /api/v1/krw-withdrawals/{orderCode}/recall 원화 출금 회수

WAITING 상태의 신청을 회수합니다. 요청 바디는 없습니다. 성공하면 원금과 수수료가 즉시 전액 환급되고 주문은 FAILED로 종결됩니다.

승인 전까지만 가능 이미 APPROVED인 주문은 원화 지급이 진행될 수 있어 회수할 수 없습니다.

응답

응답 필드는 출금 신청 응답과 같습니다. 이미 FAILED인 주문을 다시 호출해도 200을 반환합니다.

200회수 성공 또는 이미 실패 종결된 주문
404 / 1123주문 없음. 다른 파트너 주문도 404
409 / 1125이미 승인되어 회수 불가
409 / 1124완료·반려 등 다른 종결 상태
409 / 1127접수 확정 중. 잠시 후 재시도

파트너가 직접 호출한 회수에는 별도 상태 웹훅을 보내지 않습니다. 회수 API 응답으로 처리 결과를 확정하십시오.

GET /api/v1/krw-withdrawals/{orderCode} 원화 출금 단건 조회

주문의 현재 상태를 조회합니다. 웹훅은 유실되거나 중복될 수 있으므로 최종 상태를 확정할 때 이 API를 사용하십시오.

응답

응답 필드는 출금 신청 응답과 같습니다. 완료 전에는 txHash가 생략됩니다.

200 OK
{
  "orderCode": "kwo_example0001",
  "status": "COMPLETED",
  "krwAmount": 10000,
  "chain": "BSC",
  "exchangeRate": 1369.0000,
  "debitUsdt": 7.377647918188458728,
  "feeUsdt": 0.073046018991964937,
  "txHash": "0xabc123..."
}
200조회 성공
404 / 1123주문 없음. 다른 파트너 주문도 404

상태 웹훅

파트너가 등록한 웹훅 URL로 최종 상태를 통지합니다. 웹훅은 보조 수단이며, 최종 확인은 단건 조회 API를 사용하십시오.

event발생 시점
KRW_WITHDRAWAL_COMPLETED출금 완료
KRW_WITHDRAWAL_FAILED승인 기한 만료 또는 지급 실패
KRW_WITHDRAWAL_REJECTED승인 전 개별 반려
Payload example
{
  "event": "KRW_WITHDRAWAL_COMPLETED",
  "orderCode": "kwo_example0001",
  "status": "COMPLETED",
  "partnerUserId": "user-001",
  "krwAmount": 10000,
  "exchangeRate": "1369.0000",
  "debitUsdt": "7.377647918188458728",
  "feeUsdt": "0.073046018991964937",
  "chainType": "BSC",
  "txHash": "0xabc123...",
  "occurredAt": "2026-09-20T18:13:28.51"
}
  • krwAmount는 number입니다.
  • exchangeRate, debitUsdt, feeUsdt는 정밀도 보존을 위한 string입니다.
  • 실패·반려 이벤트에는 reason이 포함되며 txHash는 생략될 수 있습니다.
  • 계좌번호, 은행 코드, 예금주는 웹훅에 포함되지 않습니다.
  • 파트너가 직접 호출한 회수에는 웹훅을 보내지 않습니다.
현재 버전은 별도 웹훅 서명 헤더를 제공하지 않습니다 웹훅만으로 되돌릴 수 없는 처리를 확정하지 마십시오. 동일한 이벤트가 중복 도착할 수 있으므로 event, orderCode, status 조합으로 멱등 처리하고 최종 상태는 단건 조회 API로 확인하십시오.
파트너 응답처리
HTTP 2xx전달 성공
모든 비-2xx, 타임아웃, 연결 실패실패로 처리하고 재시도

최초 전송을 포함해 최대 5회 시도합니다. 파트너 수신 서버는 중복 전달을 허용해야 합니다.

오류 코드

HTTPcode의미권장 조치
422금액 범위 또는 요청 필드 검증 실패10,000~9,000,000원과 필수 필드 확인
4091121시세 편차 초과잠시 후 새 요청 검토
4091122출금 요청이 접수되지 않음차감은 환급됨. 사유 확인 후 재신청
4041123주문을 찾을 수 없음주문 코드와 소유 파트너 확인
4091124이미 종결된 주문목록 또는 단건 조회로 상태 확인
4091125이미 승인된 주문회수 불가
4091127접수 확정 중잠시 후 같은 요청 재시도
4091128지정 체인 출금 지갑 미준비다른 체인 사용 여부를 별도 판단
409INSUFFICIENT_BALANCE지정 체인 가용 잔액 부족잔액 충전 후 재신청

인증 실패는 401, 요청 필드 검증 실패는 422입니다. 같은 HTTP 상태라도 의미가 다를 수 있으므로 반드시 응답의 code로 분기하십시오.

연동 체크리스트

  1. X-TIMESTAMP를 epoch 초로 보내는지 확인합니다.
  2. X-ACCESS-TOKEN을 Base64 HMAC으로 생성하는지 확인합니다.
  3. partnerOrderId는 출금 의도마다 고유하게 만들고 다른 출금에 재사용하지 않습니다.
  4. 동일 키 재호출은 기존 주문이 비종결 상태일 때만 멱등합니다. 응답 유실 후 시간이 지났다면 자동 재신청하지 말고 목록의 partnerOrderId로 먼저 대조합니다.
  5. chain별 잔액을 구분하고 자동 폴백을 가정하지 않습니다.
  6. 목록 응답의 krwAmount 문자열을 허용합니다.
  7. 응답의 optional 필드가 키째 생략되어도 파싱할 수 있게 합니다.
  8. 웹훅은 중복 처리하고, 상태 확정은 단건 조회 API로 수행합니다.
  9. 운영 전 정상 완료·승인 전 회수·실패/반려 시나리오를 각각 검증합니다.