NAV

개요

해당 문서는 한빗코 가상자산 거래소의 REST API 사용법을 설명합니다.

REST API는 Public API와 Private API로 나누어져 있습니다.

Base URL: https://api.hanbitco.com

클라이언트

한빗코 가상자산 거래소의 공식 REST API 클라이언트 라이브러리입니다.

지원 언어

요청 제한

초당 요청 수를 제한합니다.

공개 API - 1초에 최대 10개의 요청이 가능합니다.

개인 API - 1초에 최대 10개의 요청이 가능합니다.

인증

개인 API의 항목들을 사용하기 위해선 HMAC 인증이 필요합니다.

아래 사용법을 읽으면 올바른 Request를 위해 몇 가지 작업들이 필요하기 때문에 HMAC 인증이 복잡하다고 느끼실 수 있습니다. 각각 필요한 작업의 목적에 대해 생각하며 진행하면 더 간단하게 할 수 있습니다.

HMAC을 사용하는 목적

HMAC 인증의 목적은 Request의 데이터 위조를 방지하기 위함입니다. 해커는 항상 모든 Request 데이터를 위조할 수 있습니다.

Request가 서버에 도달하기 전에 요청 데이터가 위조되면 원하지 않는 작업이 수행 될 수 있습니다.

HMAC 인증을 사용하면 클라이언트가 암호화 되지 않은 Request 데이터와 함께 암호화 된 Request 데이터를 보내게 됩니다. 그리고 받은 두 개의 데이터로 Request 데이터의 위조 여부를 판단하게 됩니다.

HMAC Request의 주요 구성 요소 및 절차

Header에는 세 개의 키 (API-KEY, Signature, Nonce) 가 포함되어야 합니다.

  1. API-KEY는 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY 입니다.

  2. Signature는 암호화된 데이터 체인입니다. 데이터 체인은 다음과 같이 구성됩니다. original_text = "{nonce}\n{method}\n{origin}\n{path_with_query_string}\n{body}"
    original_textSignature를 만드는 방법은 다음과 같습니다.

    1. original_text를 SHA512로 암호화된 Secret Key로 서명 합니다.
    2. 서명 된 텍스트를 base64 형태로 변환합니다.
  3. Nonce는 단일 요청을 식별하기 위한 랜덤한 문자열 입니다. Nonce는 재사용이 불가합니다. 이전에 사용 된 Nonce값으로 다시 Request를 보내면 요청이 거부됩니다.

Body가 없는 엔드포인트에서의 예제

Signature 만드는 법

API_KEY = 'd780cc60a5365c8aa24609ecf2c0b29177022c72708ec630'
SECRET_KEY = '5923592971dfb68a2a94187baa6ce04c996d93cd23aa5d50'

key = base64.b64decode(SECRET_KEY)

nonce = '1617603961.303046'

method = 'GET'

origin = 'api.hanbitco.com'

path_with_query_string = '/v1/accounts/'

original_text = f'{nonce}\n{method}\n{origin}\n{path_with_query_string}'
"""
1617603961.303046
GET
api.hanbitco.com
/v1/accounts/
"""
signed_text = hmac.new(key, original_text.encode('utf-8'), hashlib.sha512)
signature = base64.b64encode(signed_text.digest()).decode('utf-8')
# signature
# POhxzUEDRStUfA3S6BqAEox8bdzFYn86kno3uJsY7lv4it0CLpYO0GVaOndCvQZ1MINIE+WeLKR9XDMO3yF/IA==

만든 Signature로 데이터 전송


url = 'https://api.hanbitco.com/v1/orders/'

headers = {
    'API-KEY': 'd780cc60a5365c8aa24609ecf2c0b29177022c72708ec630',
    'Signature': 'POhxzUEDRStUfA3S6BqAEox8bdzFYn86kno3uJsY7lv4it0CLpYO0GVaOndCvQZ1MINIE+WeLKR9XDMO3yF/IA==',
    'Nonce': '1617603961.303046'
}

response = requests.get(url, headers=headers)

print(response.status_code, response.text)

HTTP Request

POST /v1/accounts/

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Query Params)

이름 타입 설명 기타
symbols string 심볼들 (쉼표로 여러개 지정 가능) Optional (symbols가 없으면 전체 자산이 반환된다)

Body가 있는 엔드포인트에서의 예제

Signature 만드는 법

API_KEY = 'd780cc60a5365c8aa24609ecf2c0b29177022c72708ec630'
SECRET_KEY = '5923592971dfb68a2a94187baa6ce04c996d93cd23aa5d50'

key = base64.b64decode(SECRET_KEY)

nonce = '1617603961.303046'

method = 'POST'

origin = 'api.hanbitco.com'

path_with_query_string = '/v1/orders/'

data = [{
    "trading_pair": "ETH-BTC",
    "side": "BUY",
    "order_type": "LIMIT",
    "volume": 0.1,
    "price": 0.0352
}]

body = json.dumps(data)

original_text = f'{nonce}\n{method}\n{origin}\n{path_with_query_string}\n{body}'
"""
1617603961.303046
POST
api.hanbitco.com
/v1/orders/
[{"trading_pair": "ETH-BTC", "side": "BUY", "order_type": "LIMIT", "volume": 0.1, "price": 0.0352}]
"""
signed_text = hmac.new(key, original_text.encode('utf-8'), hashlib.sha512)
signature = base64.b64encode(signed_text.digest()).decode('utf-8')
# signature
# egcQd01sk1HI0A4J8nXsUGmn/qPZ08EWXP8VPXaBlFKJAstYYM3ZsSEkxMWB0agwylfMy6iPToV6cB2EwLJrDQ==

만든 Signature로 데이터 전송


url = 'https://api.hanbitco.com/v1/orders/'

headers = { 'API-KEY': 'd780cc60a5365c8aa24609ecf2c0b29177022c72708ec630', 'Signature': 'egcQd01sk1HI0A4J8nXsUGmn/qPZ08EWXP8VPXaBlFKJAstYYM3ZsSEkxMWB0agwylfMy6iPToV6cB2EwLJrDQ==', 'Nonce': '1617603961.303046' }

response = requests.post(url, headers=headers, json=data)

print(response.status_code, response.text)

HTTP Request

POST /v1/orders/

Header

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Body, List)

order_type이 LIMIT일 때, volume와 price가 필수입니다.

이름 타입 설명 기타
trading_pair string 거래쌍의 이름 Required
side string 거래 종류 (BUY, SELL) Required
volume decimal 거래량 (수량) Required
price decimal 주문 기준 가격 Required
order_type string 주문 종류 (LIMIT) Required
post_only bool true일 경우 오더북에 주문 전량이 체결 없이 place될 경우에만 유효합니다. 주문을 넣었는데 조금이라도 체결되는 상황인 경우 주문은 전량 자동으로 취소됩니다. Optional
nickname string 주문에 대한 표기 (특정 주문에 대해 메모 하고 싶은 것을 적어둘 수 있음) Optional

공개 API

GET 티커 조회

import requests

url = "https://api.hanbitco.com/v1/ticker/"

response = requests.get(url)

print(response)

var url = "https://api.hanbitco.com/v1/ticker/";

var requestOptions = { method: 'GET' }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

모든 거래쌍을 가져옵니다. trading_pair_name으로 필터링 할 수 있습니다.

HTTP Request

GET https://api.hanbitco.com/v1/ticker/

Request (Query Params)

이름 타입 설명 기타
trading_pair_name string 특정 거래쌍으로 필터링 합니다. Optional

Response (Body, List)

이름 타입 설명
uuid string UUID
name string 거래쌍 (ETH-BTC)
base_symbol string Base Symbol
base_english_name string Base의 영문 이름
base_korean_name string Base의 국문 이름
quote_symbol string Quote Symbol
quote_english_name string Quote의 영문 이름
quote_korean_name string Quote의 국문 이름
minimum_order_amount string 최소 거래 가능량
open_price decimal 시가
high_price decimal 고가
low_price decimal 저가
close_price decimal 종가 또는 상장가
change string 24시간 기준 가격 변화
change_price decimal 가격 변화액의 절대값
change_rate decimal 가격 변화율의 절대값
signed_change_price decimal 부호가 있는 변화액
signed_change_rate decimal 부호가 있는 변화율
trade_volume decimal 가장 최근 거래량
acc_trade_value_24h decimal 24시간 누적 거래대금 (거래량 * 거래가격)
acc_trade_volume_24h decimal 24시간 누적 거래량
is_visible string 활성화 여부
division string 거래소 화면 내의 탭에서 어떤 마켓인지 구분

GET 오더북 조회

import requests

url = "https://api.hanbitco.com/v1/orderbook/"

params = { "trading_pair_name": "ETH-BTC" }

response = requests.get(url)

print(response)

var url = "https://api.hanbitco.com/v1/orderbook/";

var params = new URLSearchParams({ trading_pair_name: "ETH-BTC" });

var requestOptions = { method: 'GET' }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

해당 Trading Pair의 오더북을 가져옵니다.

HTTP Request

GET https://api.hanbitco.com/v1/orderbook/

Request (Query Params)

이름 타입 설명 기타
trading_pair_name string 특정 거래쌍으로 필터링 합니다. Required

Response

이름 타입 설명
buys orders 매수 주문들을 가져옵니다. (list)
sells orders 매도 주문들을 가져옵니다. (list)

Response (order)

이름 타입 설명
price decimal 호가
volume decimal 해당 호가의 주문 갯수

GET 체결 내역 조회

import requests

url = "https://api.hanbitco.com/v1/trades/"

response = requests.get(url)

print(response)

var url = "https://api.hanbitco.com/v1/trades/";

var requestOptions = { method: 'GET', }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

모든 체결 내역을 페이지네이션으로 조회합니다. trading_pair_name으로 필터링 할 수 있습니다.

HTTP Request

GET https://api.hanbitco.com/v1/trades/

Request (Query Params)

이름 타입 설명 기타
trading_pair_name string 특정 거래쌍으로 필터링 합니다. Optional

Response

이름 타입 설명
next string 다음 페이지
previous string 이전 페이지
results trades 실제 데이터 (list)

Response (trade)

이름 타입 설명
uuid string UUID
volume decimal 거래량
price decimal 거래 기준 가격
side string 거래 종류 (매수, 매도)
trading_pair_name string 거래쌍의 이름
created timestamp 거래 생성 시간

개인 API

GET 주문 조회

import requests

url = "https://api.hanbitco.com/v1/orders/"

headers = { "API-KEY": "API-KEY", "Signature": "Signature", "Nonce": "Nonce" }

response = requests.get(url, headers=headers)

print(response)

var url = "https://api.hanbitco.com/v1/orders/";

var headers = { "API-KEY": "API-KEY", Signature: "Signature", Nonce: "Signature", }

var requestOptions = { method: 'GET', headers: headers }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

유저의 모든 주문 정보를 불러옵니다.

HTTP Request

GET https://api.hanbitco.com/v1/orders/

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Query Params)

이름 타입 설명 기타
state string 특정 주문 상태로 필터링 합니다. (WAIT, DONE, CANCEL) Optional
trading_pair_name string 특정 거래쌍으로 필터링 합니다. Optional

Response

이름 타입 설명
next string 다음 페이지
previous string 이전 페이지
results orders 실제 데이터 (list)

Response (order)

이름 타입 설명
uuid string UUID
trading_pair_name string 거래쌍의 이름
side string 거래 종류 (BUY, SELL)
volume decimal 거래량
price decimal 주문 기준 가격
amount decimal Quote 기준의 금액 (volume * price)
volume_filled decimal 체결된 거래량
volume_remaining decimal 잔여 거래량
order_status string 주문의 현재 진행 상태 (PENDING, PLACED, PARTIALLY_FILLED, FILLED, CANCELLED, REJECTED)
order_type string 주문 종류 (LIMIT)
created timestamp 주문 생성 시간
post_only bool true일 경우 오더북에 주문 전량이 체결 없이 place될 경우에만 유효합니다. 주문을 넣었는데 조금이라도 체결되는 상황인 경우 주문은 전량 자동으로 취소됩니다.
nickname string 주문에 대한 표기 (특정 주문에 대해 메모 하고 싶은 것을 적어둘 수 있음)
ip string 주문 제출 IP 주소

GET 단일 주문 조회

import requests

url = "https://api.hanbitco.com/v1/orders/{order_uuid}/"

headers = { "API-KEY": "API-KEY", "Signature": "Signature", "Nonce": "Nonce" }

response = requests.get(url, headers=headers)

print(response)

var url = "https://api.hanbitco.com/v1/orders/{order_uuid}/";

var headers = { "API-KEY": "API-KEY", Signature: "Signature", Nonce: "Signature", }

var requestOptions = { method: 'GET', headers: headers }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

특정 id의 주문 정보를 가져옵니다.

HTTP Request

GET https://api.hanbitco.com/v1/orders/{order_uuid}/

Header

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Path)

이름 타입 설명 기타
order_uuid string 주문 UUID Required

Response

이름 타입 설명
uuid string UUID
trading_pair_name string 거래쌍의 이름
side string 거래 종류 (BUY, SELL)
volume decimal 거래량
price decimal 주문 기준 가격
amount decimal Quote 기준의 금액 (volume * price)
volume_filled decimal 체결된 거래량
volume_remaining decimal 잔여 거래량
order_status string 주문의 현재 진행 상태 (PENDING, PLACED, PARTIALLY_FILLED, FILLED, CANCELLED, REJECTED)
order_type string 주문 종류 (LIMIT)
created timestamp 주문 생성 시간
post_only bool true일 경우 오더북에 주문 전량이 체결 없이 place될 경우에만 유효합니다. 주문을 넣었는데 조금이라도 체결되는 상황인 경우 주문은 전량 자동으로 취소됩니다.
nickname string 주문에 대한 표기 (특정 주문에 대해 메모 하고 싶은 것을 적어둘 수 있음)
ip string 주문 제출 IP 주소
trades trades 거래 데이터 (list)

Response (trade)

이름 타입 설명
uuid string UUID
volume decimal 거래량
price decimal 거래 기준 가격
side string 거래 종류 (매수, 매도)
trading_pair_name string 거래쌍의 이름
created timestamp 거래 생성 시간

POST 주문하기

import requests

url = "https://api.hanbitco.com/v1/orders/"

headers = { "API-KEY": "API-KEY", "Signature": "Signature", "Nonce": "Nonce" }

data = [{ "trading_pair": "ETH-BTC", "side": "BUY", "volume": 11, "price": 4000000, "order_type": "LIMIT" }, { "trading_pair": "ETH-BTC", "side": "BUY", "volume": 11, "price": 14000000, "order_type": "LIMIT" }]

response = requests.post(url, headers=headers, json=data)

print(response)

var url = "https://api.hanbitco.com/v1/orders/";

var headers = { "API-KEY": "API-KEY", Signature: "Signature", Nonce: "Signature", } var data = [{ trading_pair: "ETH-BTC", side: "BUY", volume: 11, price: 4000000, order_type: "LIMIT" }, { trading_pair: "ETH-BTC", side: "BUY", volume: 11, price: 14000000, order_type: "LIMIT" }] var requestOptions = { method: 'POST', headers: headers, data: JSON.stringify(data); }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(json); });

특정 거래쌍의 주문을 제출합니다.

HTTP Request

POST https://api.hanbitco.com/v1/orders/

Header

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Body, List)

order_type이 LIMIT일 때, volume와 price가 필수입니다.

이름 타입 설명 기타
trading_pair string 거래쌍의 이름 Required
side string 거래 종류 (BUY, SELL) Required
volume decimal 거래량 (수량) Required
price decimal 주문 기준 가격 Required
order_type string 주문 종류 (LIMIT) Required
post_only bool true일 경우 오더북에 주문 전량이 체결 없이 place될 경우에만 유효합니다. 주문을 넣었는데 조금이라도 체결되는 상황인 경우 주문은 전량 자동으로 취소됩니다. Optional
nickname string 주문에 대한 표기 (특정 주문에 대해 메모 하고 싶은 것을 적어둘 수 있음) Optional

Response (Body, List)

이름 타입 설명
uuid string UUID
trading_pair_name string 거래쌍의 이름
side string 거래 종류 (BUY, SELL)
volume decimal 거래량
price decimal 주문 기준 가격
amount decimal Quote 기준의 금액 (volume * price)
volume_filled decimal 체결된 거래량
volume_remaining decimal 잔여 거래량
order_status string 주문의 현재 진행 상태 (PENDING, PLACED, PARTIALLY_FILLED, FILLED, CANCELLED, REJECTED)
order_type string 주문 종류 (LIMIT)
created timestamp 주문 생성 시간
post_only bool true일 경우 오더북에 주문 전량이 체결 없이 place될 경우에만 유효합니다. 주문을 넣었는데 조금이라도 체결되는 상황인 경우 주문은 전량 자동으로 취소됩니다.
nickname string 주문에 대한 표기 (특정 주문에 대해 메모 하고 싶은 것을 적어둘 수 있음)
ip string 주문 제출 IP 주소

DELETE 단일 주문 취소

import requests

url = "https://api.hanbitco.com/v1/orders/{order_uuid}/"

headers = { "API-KEY": "API-KEY", "Signature": "Signature", "Nonce": "Nonce" }

response = requests.delete(url, headers=headers)

print(response)

var url = "https://api.hanbitco.com/v1/orders/{order_uuid}/";

var headers = { "API-KEY": "API-KEY", Signature: "Signature", Nonce: "Signature", }

var requestOptions = { method: 'DELETE', headers: headers }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

특정 id의 주문을 취소합니다.

HTTP Request

DELETE https://api.hanbitco.com/v1/orders/{order_uuid}/

Header

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Path)

이름 타입 설명 기타
order_uuid string 주문 UUID Required

Response

이름 타입 설명
uuid string UUID
trading_pair_name string 거래쌍의 이름
side string 거래 종류 (BUY, SELL)
volume decimal 거래량
price decimal 주문 기준 가격
amount decimal Quote 기준의 금액 (volume * price)
volume_filled decimal 체결된 거래량
volume_remaining decimal 잔여 거래량
order_status string 주문의 현재 진행 상태 (PENDING, PLACED, PARTIALLY_FILLED, FILLED, CANCELLED, REJECTED)
order_type string 주문 종류 (LIMIT)
created timestamp 주문 생성 시간
post_only bool true일 경우 오더북에 주문 전량이 체결 없이 place될 경우에만 유효합니다. 주문을 넣었는데 조금이라도 체결되는 상황인 경우 주문은 전량 자동으로 취소됩니다.
nickname string 주문에 대한 표기 (특정 주문에 대해 메모 하고 싶은 것을 적어둘 수 있음)
ip string 주문 제출 IP 주소

DELETE 모든 주문 취소

import requests

url = "https://api.hanbitco.com/v1/orders/cancel_all/"

headers = { "API-KEY": "API-KEY", "Signature": "Signature", "Nonce": "Nonce" }

response = requests.delete(url, headers=headers)

print(response)

var url = "https://api.hanbitco.com/v1/orders/cancel_all/";

var headers = { "API-KEY": "API-KEY", Signature: "Signature", Nonce: "Signature", }

var requestOptions = { method: 'DELETE', headers: headers }

fetch(url, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(JSON.stringify(json)); });

모든 주문을 취소합니다.

HTTP Request

DELETE https://api.hanbitco.com/api/v1/orders/cancel_all/

Header

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Response

HTTP 204

GET 모든 잔고 조회

import requests

url = "https://api.hanbitco.com/v1/accounts/"

headers = { "API-KEY": "API-KEY", "Signature": "Signature", "Nonce": "Nonce" }

params = { "symbols": "BTC,ETH" }

response = requests.get(url, params=params, headers=headers)

print(response)

var url = "https://api.hanbitco.com/v1/accounts/";

var headers = { "API-KEY": "API-KEY", Signature: "Signature", Nonce: "Signature", } var params = new URLSearchParams({ symbols: 'BTC,ETH' }); var requestOptions = { method: 'GET', headers: headers }

fetch(url + params, requestOptions) .then((response) => { return response.json(); }) .then((json) => { console.log(json); });

유저가 보유하고 있는 모든 자산의 잔고 상태를 조회합니다.

HTTP Request

GET https://api.hanbitco.com/v1/accounts/

이름 설명
API-KEY 거래소 웹 사이트에서 raw format 형태로 발급받은 API-KEY
Signature Signature 값
Nonce Nonce 값

Request (Query Params)

이름 타입 설명 기타
symbols string 심볼들 (쉼표로 여러개 지정 가능) Optional (symbols가 없으면 전체 자산이 반환된다)

Response (Body, List)

이름 타입 설명
uuid string UUID
symbol string 심볼
english_name string 영문 이름
korean_name string 국문 이름
attention_english string 입출금 페이지에서 추가로 안내할 내용 (영문)
attention_korean string 입출금 페이지에서 추가로 안내할 내용 (국문)
liquid decimal 사용할 수 있는 잔고
balance decimal 총 잔고
pending_order_amount decimal 주문 대기 수량
pending_withdrawal_amount decimal 출금 대기 수량
staking_amount decimal 스테이킹 중인 수량
avg_buy_price decimal 매수 평균가
is_avg_buy_price_modified bool 매수 평균가 수정 여부
min_deposit_amount decimal 최소 입금 수량
min_withdrawal_amount decimal 최소 출금 수량
withdrawal_fee decimal 출금 수수료
required_confirmations integer 컨펌 수
decimal integer 블록체인 상에서 기준이 되는 소수점의 수
is_depositable bool 입금 활성화 여부
is_withdrawable bool 출금 활성화 여부
is_visible bool 거래소 웹사이트에서 노출 여부
is_active bool 지원/미지원 여부
has_memo bool 주소체계 메모 여부