이 문서는 코빗의 구 WebSocket API에 대해 설명하고 있습니다. 구 WebSocket API는 2025년 5월까지만 지원이 이루어지며 6월부터는 서비스가 종료될 예정이므로, 새로운 WebSocket API를 이용해 주시기를 부탁드립니다.
새로운 웹소켓 API는 구 웹소켓 API와 대부분 호환되나, 아래와 같은 차이점이 있습니다:
MyAsset
타입 추가MyOrder
, MyTrade
타입에 필드 추가WebSocket API는 코빗 서버와 이용자 클라이언트 간의 양방향 통신을 위한 웹소켓 연결 인터페이스입니다. WebSocket API를 사용하면 코빗 가상자산 거래소의 실시간 정보를 가장 빠른 속도로 수신할 수 있습니다.
REST API를 사용할 경우에는 이용자가 HTTP 요청을 해서 응답을 받아야 비로소 정보를 알 수 있지만, WebSocket API를 사용할 경우에는 코빗 서버와 이용자 클라이언트 간 양방향 연결이 계속 이루어져 있어 시세 변동이나 주문 체결 등의 이벤트가 발생하면 코빗 서버에서 이용자 클라이언트로 실시간으로 정보를 지속적으로 제공합니다. 따라서, 시세나 주문, 체결 등의 실시간 정보를 빠르고 편리하게 수신하고자 한다면 REST API보다는 WebSocket API의 사용을 권장합니다.
WebSocket API에서 제공하는 데이터는 공개 정보인지, 개별 이용자만의 정보인지에 따라 Public
타입과 Private
타입으로 나눌 수 있으며, Public 타입 데이터는 별다른 인증 없이 수신할 수 있습니다. 반면, Private 타입 데이터를 수신하기 위해서는 웹소켓 연결 시 코빗 Open API 키 인증을 해야만 수신할 수 있습니다.
Public 타입 데이터는 웹소켓을 통한 데이터 구독 요청을 보내면, 요청 당시의 최신 데이터를 스냅샷
데이터로 바로 제공합니다. (스냅샷 데이터는 실시간 데이터가 아닙니다.) 스냅샷 데이터가 아닌 데이터는 모두 실시간
데이터입니다.
ticker
: 지정한 거래쌍의 스냅샷, 실시간 현재가를 제공합니다.orderbook
: 지정한 거래쌍의 스냅샷, 실시간 호가를 제공합니다.trade
: 지정한 거래쌍의 스냅샷, 실시간 체결 내역을 제공합니다.myOrder
: 내 주문에 관한 실시간 상태 변화 정보를 제공합니다.myTrade
: 내 체결에 관한 실시간 체결 발생 정보를 제공합니다.wss://ws-api.korbit.co.kr/v2/ws
Public 타입 데이터(현재가, 호가, 체결)는 별다른 인증 없이 단순히 웹소켓 연결 후 구독 메시지를 보내는 것만으로 수신할 수 있습니다. 하지만, Private 타입 데이터(내 주문, 내 체결)는 웹소켓 연결 시 코빗 Open API 키를 이용한 인증을 거쳐야만 수신할 수 있습니다.
REST API의 인증 방법과 동일하게 웹소켓 연결 시 X-KAPI-KEY
헤더와 HMAC-SHA256
또는 ED25519
서명을 한 요청을 보내서 인증을 진행합니다. 즉, 요청 헤더에는 X-KAPI-KEY
, URL 쿼리스트링에는 timestamp
, signature
정보를 입력해야 합니다.
서명된 요청 보내기의 설명과 첨부하는 예시 코드를 참고해 주세요.
// Node.js 구현 예제, 필요시 npm i ws 실행
import crypto from "crypto";
import WebSocket from "ws";
const apiKey = "XyAZ_apaUv9pg4ZyGzNHTxabfIDrWIRpPBgk5-olIuM"; // API 키
const apiSecret = "ZwKS2evdxj9j3Neir2s0UHAmpNFfo4a0iHawEElGCBs"; // HMAC-SHA256 비밀 키
const wsUrl = "wss://ws-api.korbit.co.kr/v2/ws"; // 기본 URL
// HMAC-SHA256 서명 생성
const createHmacSignature = (query) => {
return crypto.createHmac("sha256", apiSecret).update(query, "utf-8").digest("hex");
};
const timestamp = Date.now(); // 현재 시각 타임스탬프(밀리세컨드)
const params = new URLSearchParams({
timestamp: timestamp,
});
const signature = createHmacSignature(params.toString());
// 서명을 요청 변수에 추가
params.append("signature", signature);
// API 키를 요청 헤더에 추가하고 웹소켓 연결
const ws = new WebSocket(`${wsUrl}?${params.toString()}`, [], {
headers: {
"X-KAPI-KEY": apiKey,
}
});
ws.on("open", () => {
console.log("connected!");
// 웹소켓 연결 후 메시지 구독 요청 전송
ws.send(`[{"method":"subscribe","type":"ticker","symbols":["btc_krw","eth_krw"]}]`);
ws.send(`[{"method":"subscribe","type":"myOrder","symbols":["btc_krw","eth_krw"]},{"method":"subscribe","type":"myTrade","symbols":["btc_krw","eth_krw"]}]`);
});
ws.on("error", (error) => {
console.error(error);
});
ws.on("message", (event) => {
const message = JSON.parse(event);
console.log(message);
});
ws.on("close", () => {
console.log("connection closed!");
});
웹소켓이 연결된 후에는 어떤 타입의 데이터를 구독하겠다는 요청을 보내야만 합니다. WebSocket API에서는 구독 요청 메시지를 JSON 형식으로 전송하고, method
, type
, symbols
를 각각 입력해야 합니다.
여러 개의 메시지를 한 번에 입력할 수 있으므로, 요청 메시지는 1개를 보낼 때에도 반드시 대괄호([])로 묶어서 보내야 합니다. (대소문자 구분에 유의해 주세요.)
[{"method":"subscribe","type":"ticker","symbols":["btc_krw","eth_krw"]}]
[{"method":"subscribe","type":"ticker","symbols":["btc_krw","eth_krw"]},[{"method":"subscribe","type":"orderbook","symbols":["btc_krw","eth_krw"]}]]
# 예시로 Node.js 환경에서 wscat을 사용합니다.
$ npm install -g wscat
$ wscat -c wss://ws-api.korbit.co.kr/v2
connected (press CTRL+C to quit)
# 웹소켓이 연결되면 데이터 구독 요청을 보냅니다.
> [{"method":"subscribe","type":"ticker","symbols":["btc_krw","eth_krw"]}]
< {"symbol":"btc_krw","timestamp":1730365099072,"type":"ticker","snapshot":true,"data":{"open":"100500000","high":"100651000","low":"100492000","close":"100650000","prevClose":"100497000","priceChange":"153000","priceChangePercent":"0.15","volume":"0.89102242","quoteVolume":"89632429.21566","bestAskPrice":"100651000","bestBidPrice":"100650000","lastTradedAt":1730356819663}}
< {"symbol":"eth_krw","timestamp":1730365099072,"type":"ticker","snapshot":true,"data":{"open":"4390000","high":"4390000","low":"4357000","close":"4357000","prevClose":"4456000","priceChange":"-99000","priceChangePercent":"-2.22","volume":"0.1702132","quoteVolume":"744416.83456","bestAskPrice":"4357000","bestBidPrice":"4324000","lastTradedAt":1730361789775}}
< {"symbol":"btc_krw","timestamp":1730365220489,"type":"ticker","data":{"open":"100501000","high":"100651000","low":"100501000","close":"100650000","prevClose":"100492000","priceChange":"158000","priceChangePercent":"0.16","volume":"0.81866504","quoteVolume":"82360867.25161","bestAskPrice":"100651000","bestBidPrice":"100650000","lastTradedAt":1730356819663}}
위 예시에서는 비트코인(btc_krw
)과 이더리움(eth_krw
) 거래쌍에 대해 현재가(ticker
) 정보를 받고 싶다는 구독 요청을 보내면, 가장 먼저 스냅샷 데이터가 수신되고 이후 실시간 데이터가 계속해서 수신됨을 알 수 있습니다. 여러 거래쌍에 관한 정보를 받고 싶다면 위 예시와 같이 여러 거래쌍을 대괄호([])로 감싼 후 콤마(,)로 구분해 입력합니다.
구독할 때에는 method
를 subscribe
로, 해당 타입의 데이터를 더 이상 받고 싶지 않다면 method
를 unsubscribe
로 해서 구독을 해제할 수 있습니다.
각 타입마다의 구독 요청 메시지 및 응답 예시는 아래를 참조해 주세요.
실시간 현재가 정보를 조회합니다.
고정 값 subscribe
또는 unsubscribe
입력
고정 값 ticker
입력
조회하고자 하는 거래쌍의 심볼을 입력합니다.
["btc_krw","eth_krw"]
고정 값 ticker
현재 서버 시간 (단위: Unix Timestamp (밀리초))
1700000000000
거래쌍
btc_krw
스냅샷 데이터 여부.
true
- 구독 요청 직후 최초로 전송되는 메시지로서 요청 당시의 최신 정보를 전송합니다.
false
또는 null
- 이벤트 발생에 따라 실시간으로 전송되는 메시지입니다.
최근 24시간 시가
361922.23
최근 24시간 고가
361922.23
최근 24시간 저가
361922.23
최근 24시간 종가
361922.23
직전 24시간 종가
261922.23
직전 종가 대비 가격 변화량. prevClose - close
으로 계산합니다.
261922.23
직전 종가 대비 가격 변화율(단위: %). 100 * (prevClose - close) / prevClose
으로 계산합니다.
10
최근 24시간 거래량(가상자산)
100
최근 24시간 거래대금(원화)
1000000000
매수 1호가
5000
매도 1호가
6000
마지막 체결 시각 (단위: Unix Timestamp (밀리초))
1700000000000
[{"method":"subscribe","type":"ticker","symbols":["btc_krw","eth_krw"]}]
{
"type": "ticker",
"timestamp": 1700000027754,
"symbol": "btc_krw",
"snapshot": true,
"data": {
"open": "94679000",
"high": "111162000",
"low": "93861000",
"close": "99027000",
"prevClose": "94679000",
"priceChange": "4348000",
"priceChangePercent": "4.59",
"volume": "147.94385655",
"quoteVolume": "14311735005.18033",
"bestAskPrice": "99027000",
"bestBidPrice": "99026000",
"lastTradedAt": 1700000010022
}
}
호가 정보를 조회합니다. 최대 30호가까지 조회 가능합니다.
고정 값 subscribe
또는 unsubscribe
입력
고정 값 orderbook
입력
조회하고자 하는 거래쌍의 심볼을 입력합니다.
["btc_krw","eth_krw"]
고정 값 orderbook
현재 서버 시간 (단위: Unix Timestamp (밀리초))
1700000000000
거래쌍
btc_krw
스냅샷 데이터 여부.
true
- 구독 요청 직후 최초로 전송되는 메시지로서 요청 당시의 최신 정보를 전송합니다.
false
또는 null
- 이벤트 발생에 따라 실시간으로 전송되는 메시지입니다.
호가 정보의 기준 시각 (단위: Unix Timestamp (밀리초))
1700000000000
매수 호가 정보 (호가 내림차순 정렬)
매수호가
250000
매수잔량
10
매도 호가 정보 (호가 오름차순 정렬)
매도호가
250000
매도잔량
10
[{"method":"subscribe","type":"orderbook","symbols":["btc_krw"]}]
{
"type": "orderbook",
"timestamp": 1700000006177,
"symbol": "btc_krw",
"snapshot": true,
"data": {
"timestamp": 1700000000234,
"asks": [
{
"price": "99131000",
"qty": "0.00456677"
},
{
"price": "99132000",
"qty": "0.00616665"
},
{
"price": "99133000",
"qty": "0.00808569"
}
],
"bids": [
{
"price": "99120000",
"qty": "0.00363422"
},
{
"price": "99119000",
"qty": "0.00475577"
},
{
"price": "99118000",
"qty": "0.00389054"
}
]
}
}
최근 체결 내역을 조회합니다.
고정 값 subscribe
또는 unsubscribe
입력
고정 값 trade
입력
조회하고자 하는 거래쌍의 심볼을 입력합니다.
["btc_krw","eth_krw"]
고정 값 trade
현재 서버 시간 (단위: Unix Timestamp (밀리초))
1700000000000
거래쌍
btc_krw
스냅샷 데이터 여부.
true
- 구독 요청 직후 최초로 전송되는 메시지로서 요청 당시의 최신 정보를 전송합니다.
false
또는 null
- 이벤트 발생에 따라 실시간으로 전송되는 메시지입니다.
체결 시각 (단위: Unix Timestamp (밀리초))
1700000000000
체결 가격
250000
체결량
10
매수 주문으로 인해 발생한 체결인지 여부
true
거래 체결 ID (각 거래쌍마다 생성된 개별 거래 체결 건의 ID)
1234
[{"method":"subscribe","type":"trade","symbols":["btc_krw"]}]
{
"symbol": "btc_krw",
"timestamp": 1700000005498,
"type": "trade",
"snapshot": true,
"data": [
{
"timestamp": 1700000001239,
"price": "98909000",
"qty": "0.00146702",
"isBuyerTaker": true,
"tradeId": 123456
}
]
}
주문 상태 변화를 실시간으로 조회합니다.
고정 값 subscribe
또는 unsubscribe
입력
고정 값 myOrder
입력
조회하고자 하는 거래쌍의 심볼을 입력합니다.
["btc_krw","eth_krw"]
고정 값 myOrder
현재 서버 시간 (단위: Unix Timestamp (밀리초))
1700000000000
거래쌍
btc_krw
스냅샷 데이터 여부.
true
- 구독 요청 직후 최초로 전송되는 메시지로서 요청 당시의 최신 정보를 전송합니다.
false
또는 null
- 이벤트 발생에 따라 실시간으로 전송되는 메시지입니다.
주문 ID
1234
주문 상태
pending
주문 접수 대기중. 잔고가 부족한 경우 주문이 실패해 expired
상태로 전환될 수 있습니다.open
전량 미체결filled
전량 체결canceled
전량 취소partiallyFilled
부분 체결partiallyFilledCanceled
부분 체결 후 잔량 취소expired
주문 접수 실패partiallyFilled
매수, 매도 구분
buy
매수sell
매도buy
지정가 주문의 주문 가격(주문호가).
시장가 주문은 주문 가격이 표시되지 않습니다.
5000
주문 잔량
10
체결량 (체결 수량)
10
[{"method":"subscribe","type":"myOrder","symbols":["btc_krw"]}]
{
"symbol": "btc_krw",
"timestamp": 1700000000000,
"type": "myOrder",
"data": [
{
"orderId": 123456,
"status": "partiallyFilled",
"side": "buy",
"price": "99017000",
"openQty": "0.00206864",
"filledQty": "0.53793136",
}
]
}
내 주문의 체결 내역을 실시간으로 조회힙니다.
고정 값 subscribe
또는 unsubscribe
입력
고정 값 myTrades
입력
조회하고자 하는 거래쌍의 심볼을 입력합니다.
["btc_krw","eth_krw"]
고정 값 myTrades
현재 서버 시간 (단위: Unix Timestamp (밀리초))
1700000000000
거래쌍
btc_krw
스냅샷 데이터 여부.
true
- 구독 요청 직후 최초로 전송되는 메시지로서 요청 당시의 최신 정보를 전송합니다.
false
또는 null
- 이벤트 발생에 따라 실시간으로 전송되는 메시지입니다.
거래 체결 ID (각 거래쌍마다 생성된 개별 거래 체결 건의 ID)
1234
원주문 ID
1234
매수, 매도 구분
buy
매수sell
매도buy
체결 단가
5000
체결 수량
10
테이커(Taker) 체결 여부(Taker=true, Maker=false)
true
[{"method":"subscribe","type":"myTrade","symbols":["btc_krw"]}]
{
"symbol": "btc_krw",
"timestamp": 1700000000000,
"type": "myTrade",
"data": [
{
"tradeId": 123456,
"orderId": 456789,
"side": "buy",
"price": "99051000",
"qty": "0.0013",
"isTaker": true
}
]
}