Upbit Client Official Reference
Upbit OPEN API Client 사용법과 설명에 대한 문서입니다.
Referance
- GitHub Repository
- GitHub Repository for Python Package
- Author: uJhin
-
Author Email:
ujhin942@gmail.com
- Official OPEN API
-
Official Support:
open-api@upbit.com
Donate
Change Logs
2023
2023-05-22
Update Upbit OPEN API
- Upbit OPEN API Version 1.3.4 업데이트 반영
- Upbit Client released: v1.3.4.0
- EXCHANGE API 변경사항 및 신규 API 추가
- 입출금 관련 API 호출 시
net_type
파라미터 추가 - 네트워크 타입(
net_type
) 이란?- 디지털 자산 입출금에 활용되는 블록체인 네트워크를 뜻하며, 디지털 자산의 종류에 따라 활용되는 네트워크(체인)이 다를 수 있습니다.
- 출금 허용 주소 리스트 조회
- 해당 업데이트 내역은 Pull Request #56을 참고 해주시길 바랍니다.
- 해당 API에 대한 세부적인 내용을 알고 싶다면 공지사항을 참고 해주세요.
- 입출금 관련 API 호출 시
2022
2022-07-12
Update Upbit OPEN API
- Upbit OPEN API Version 1.3.2 업데이트 반영
- QUOTATION API 파라미터 조회 시 예외가 발생하는 이슈사항 수정 및 반영
2022-06-07
Upbit Client released: v1.3.1.1
- PyJWT Version Update v2.4.0
- 자세한 내용은 여기를 참고해주시기 바랍니다.
2022-03-01
Upbit OPEN API 인증 방식 테스트 완료
2022-02-06
Upbit Client Released: v1.3.1.0
- Update Upbit OPEN API Version 1.3.1
- Upbit OPEN API 변경사항 안내를 참고하세요.
- 2022년 3월부터 인증방식 중 JWT 서명방식 지원 사항이 변경될 수 있기 때문에 3월 이후 인증절차 알고리즘이 변경될 수 있습니다.
2022-01-14
Upbit Client Released: v1.2.2.4
- Python Websocket Package 버전을 Release 하면서 v10.1 버전으로 반영
- Websocket Client 예제 코드 수정
- 성능 개편 및 소스 코드 리팩토링
2021
2021-12-06
Upbit Client Released: v1.2.2.2
- RestSharp 버전 업데이트: v105.1.0 -> 106.11.8-alpha.0.13
- Python urllib3 Package 버전 업데이트: v1.26.4 -> v1.26.5
- 그 외 원활한 형상관리를 위해 GitHub Repository에 Dependabot alerts와 CodeQL(Code scanning alerts) Action을 추가하였습니다.
2021-12-01
Update Client Released: v1.2.2.1
- Upbit OPEN API 버전 1.2.2 업데이트 반영
- Python Websocket Package 버전 업데이트: v8.1 -> v10.1
- 아래와 같은 이유 때문에 기존의 Python websocket 패키지 버전을 업데이트 했음을 참고하시기 바랍니다. 전체 코드상에는 지장이 없습니다.
- Python Websocket Package Issues: The aaugustin websockets library before 9.1 for Python has an Observable Timing Discrepancy on servers when HTTP Basic Authentication is enabled with basic_auth_protocol_factory(credentials=...). An attacker may be able to guess a password via a timing attack.
- UpbitWebSocket 클래스에
ping
메소드 추가 - Websocket의 응답 형식에서
deprecated
된 필드들이 삭제됩니다. - Websocket Ticker(현재가) 응답의
trade_status
,market_state_for_ios
필드 제거 - 자세한 사항은 여기를 통해 확인 바랍니다.
2021-04-01
Update Client Released: v1.2.0.4
__init__.py
Docstring 추가authentication.py
소스 코드 리팩토링
2021-03-19
Update Client Released: v1.2.0.3
- Upbit OPEN API 버전 1.2.0 업데이트 반영: Order 섹션의
전체 주문 조회
항목을 참고하세요. authentication.py
JWT 서명 알고리즘 방식 중 array 타입 파라미터 요청 시 발생하는 버그 픽스- 모든 JSON 결과값에
response
키와 값을 추가하였습니다. UpbitClient (Upbit Client 사용하기) 섹션을 참고하세요. - 에러 및 예외 처리 방식 변경: 더 이상
raise
를 통해 예외를 발생시키지 않습니다. 모든 결과는 json 형식의result
키 값을 통해 에러 메시지를 확인할 수 있도록 변경하였습니다. 자세한 사항은 Errors 섹션을 참고하세요.
2021-03-04
Update Client Released: v1.1.7.6
models.py
내부 클래스들의 Docstring 파라미터 타입 수정- 약간의 성능 개선
- 그 외 전체적인 소스 코드 리팩토링
2021-02-26
Update Client Released: v1.1.7.5
UpbitWebSocket
클래스 파라미터 오타 수정:ping_inverval
->ping_interval
UpbitWebSocket
클래스 기능 추가:socket.connect
섹션 참고- 이전보다 원활한 패키지 버전 관리를 위해
pkginfo.py
모듈로 분리 - 그 외 부분적인 소스 코드 리팩토링
2021-02-23
Update Client Released: v1.1.7.3
- 전체적인 소스 코드 리팩토링
2021-02-20
Update Client Released: v1.1.7.0
- Upbit OPEN API 버전 1.1.7 업데이트 반영
2021-02-13
Update Client Released: v1.1.6.30
- 부분적인 소스 코드 리팩토링
- 성능 소폭 개선
2021-02-05
Update Client Released: v1.1.6.29
models.py
소스 코드 리팩토링: 구조 변경- 잘못된 요청을 보낼 시 하위 코드에서
HTTPError
예외를 발생하도록 수정 - WebSocket Payload Generate 부분 추가 (WebSocket 항목 참고)
2021-01-27
Update Client Released: v1.1.6.25
- 웹 소켓(Web Socket) 연결 끊김 문제 해결
- UpbitWebSocket 클래스에 ping 관리를 위한
ping_interval
및ping_timeout
파라미터 추가
2021-01-26
Update Client Released: v1.1.6.23
- 모든
response
에 요청 제한 수가 출력되도록 수정 - 웹 소켓(Web Socket) 클라이언트 모듈 추가
UpbitWebSocket
항목 참고- 그 외 전체적인 소스 코드 리팩토링
2021-01-22
Update Upbit OPEN API
- Upbit OPEN API가 업데이트 됨에 따라 아래와 같이 변경되었습니다.
- 주문 리스트 조회 (GET /v1/orders):
kind
요청 파라미터 제거 - 변경 결과:
normal
(일반 주문),watch
(예약 주문) 동시 조회
2021-01-18
Upbit Client Released: v1.1.6.16
- 유틸리티 모듈
utils.py
추가 - 주문 가능한 가격 유닛을 검증하는 기능 추가
validate_price
함수 참고
2021-01-15
Upbit Client Released: v1.1.6.15
- 남은 요청 수 확인 기능 추가
- 본 문서의
remaining_request
파트 참고
2021-01-12
Upbit Client Released: v1.1.6.14
setup.py
소스 코드 리팩토링- Python Upbit Client 저장소 생성 후 분기
2021-01-10
Upbit Client Released: v1.1.6.12
QUOTATION API
관련 쿼리 파싱 부분 소스 코드 리팩토링PyPI
버전 체크 기능 추가
2021-01-08
Upbit Client Released: v1.1.6.10
uuids
및txids
쿼리 파싱 추가 구현 및 배포identifiers
쿼리 파싱 추가 구현 및 배포
2021-01-07
Upbit Client Released: v1.1.6.8
- Upbit OPEN API 버전이 1.1.6로 업데이트 되어 최신 버전에 맞춰 구현 및 배포
Intro (개요)
What is This?
Upbit(업비트) Cryptocurrency Exchange Open API Client of Multi-Programming Language Support
Upbit Client(업비트 클라이언트)는 Upbit(업비트) OPEN API에 접근할 수 있는 인터페이스를 제공합니다.
Support
Powered By
Install (설치)
Command
$ pip install upbit-client
$ git clone https://github.com/uJhin/upbit-client.git
$ git clone https://github.com/uJhin/python-upbit-client.git
설치는 git
커맨드를 사용하여 다음과 같이 진행합니다.
git clone https://github.com/uJhin/upbit-client.git
Python 패키지는 아래와 같이 진행합니다.
git clone https://github.com/uJhin/python-upbit-client.git
혹은 pip
커맨드를 사용하여 다음과 같이 진행합니다.
pip install upbit-client
UpbitClient (Upbit 클라이언트 사용하기)
클라이언트 객체 생성
Code Example
from upbit.client import Upbit
access_key = "발급받은 액세스 키"
secret_key = "발급받은 시크릿 키"
client = Upbit(access_key, secret_key)
print(client)
Result
UpbitClient(https://api.upbit.com)
UpbitClient(access_key=None, secret_key=None, **kwargs)
Parameter | Description |
---|---|
access_key | 발급받은 액세스 키 |
secret_key | 발급받은 시크릿 키 |
spec_uri | Swagger Mapping JSON Path |
config | Swagger Client Configuration |
결과
모든 요청에 대한 결과는 JSON 포맷으로 반환됩니다.
남은 요청 제한 시간에 대한 remaining_request
와 응답 결과 result
의 키(key) 값을 가집니다.
요청 제한에 대한 부분은 Remaining Requests (요청 수 제한)
섹션에서 다룹니다.
Parameter | Description |
---|---|
response | 요청에 대한 응답 객체 |
response.url | 요청 URL |
response.headers | 요청 헤더값 |
response.status_code | HTTP 응답 코드 |
response.reason | 응답 메시지 |
response.text | 요청에 대한 결과(UTF-8 Text 포맷) |
response.content | 요청에 대한 결과(Byte string 포맷) |
response.ok | HTTP 상태 코드의 200 OK 여부 |
remaining_request | 남은 요청 제한 시간 |
result | 요청에 대한 결과(JSON 포맷) |
참고사항
1. REST API 요청 시 오류가 발생합니다.
API 요청 처리 중 오류가 발생한 경우 HTTP 응답 body에 에러 코드가 함께 반환됩니다. 주요 에러 코드는 본 문서의 에러코드 항목에서 확인하실 수 있습니다.
만약 위 문서에서 확인되지 않는 오류가 발생하는 경우, 해당 에러 코드를 포함하여 업비트 측에 문의주시기 바랍니다.
2. IP 주소를 허용했으나 오류가 발생합니다.
로컬 네트워크에서 확인되는 IP 주소와 실제 통신에 사용하는 IP 주소가 다른 경우가 있습니다.
- 로컬 PC를 이용하시는 경우: 구글 등의 검색엔진에서 "what is my ip" 혹은 "내 IP 주소" 등을 검색하시어 나오는 외부 IP 주소
- 서버를 이용하시는 경우: 서버의 외부망 통신에 사용하는 IP 주소
위 주소를 허용 목록에 등록하신 후 다시 시도 부탁드립니다.
3. 유동 IP 환경에서 이용하고 싶습니다.
주문하기 및 출금하기 API를 이용하시기 위해서는 허용 IP를 필수적으로 입력해주셔야합니다.
Authentication (인증)
Request Example
{
"access_key": "발급 받은 acccess key (필수)",
"nonce": "무작위의 UUID 문자열 (필수)",
"query_hash": "해싱된 query string (파라미터가 있을 경우 필수)",
"query_hash_alg": "query_hash를 생성하는 데에 사용한 알고리즘 (기본값 : SHA512)"
}
Upbit OPEN API는 기본적으로 REST API 요청시, 발급받은 access key와 secret key로 토큰을 생성하여 Authorization 헤더를 통해 전송합니다. 토큰은 JWT 형식을 따릅니다.
서명 방식은 HS256 을 권장하며, 서명에 사용할 secret은 발급받은 secret key를 사용합니다. Payload의 구성은 예제와 같습니다.
인증방식에 대한 세부적인 코드를 확인하고 싶으시면 여기를 참고해주시기 바랍니다.
Remaining Requests (요청 수 제한)
남은 요청 수 확인하기
Example Code
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.APIKey.APIKey_info()
print(resp)
Result Example
{
"remaining_request": {
"group": "default",
"min": "899",
"sec": "29"
},
"result": ...
}
UpbitClient 사용 시 모든 결과는 json
포맷으로 반환되며, remaining_request
키값을 가집니다.
결과
Parameter | Description |
---|---|
group | 요청에 대한 API Namespace Group (Operation Code) |
min | 분(minutes)당 남은 요청 횟수 |
sec | 초(seconds)당 남은 요청 횟수 |
상세 설명
1. EXCHANGE API
주문
초당 8회
, 분당 200회
주문 외 API
초당 30회
, 분당 900회
Exchange API 추가 안내 사항
- 본 기준은 개별 Open API Key에 대한 요청 수 제한 기준 입니다.
- 본 기준 내의 요청의 경우에도 하나의 계정으로 여러 개의 Open API Key를 이용하여 요청할 경우, 업비트 전체 서비스의 안정적인 제공을 위하여 요청 수 제한이 발생할 수 있습니다.
- 서비스 및 서버 상황 등에 따라 상기 요청 수가 일시적으로 보장되지 않을 수 있습니다.
- 사용 가능한 잔여 요청 수는 하단의 잔여 요청 수 확인 방법을 참고하시어 확인하실 수 있습니다.
- (업데이트) 주문 API와 주문 외 API 요청 수 제한은 별도로 계산 됩니다.
2. QUOTATION API
웹 소켓(Websocket) 연결 요청 수 제한
초당 5회
, 분당 100회
REST API 요청 수 제한
분당 600회
, 초당 10회
(종목, 캔들, 체결, 티커, 호가별)
[Quotation API 추가 안내 사항]
- Quotation API의 요청 수 제한은 IP 주소를 기준으로 합니다.
- 향후 안정적인 서비스 제공을 위하여 API 요청 수는 추가적인 조정이 이루어질 수 있습니다. 요청 수 조정 필요 시 별도 공지를 통해 안내드리겠습니다. (Upbit 공식 사이트 공지사항 바로가기)
- 초당 제한 조건과 분당 제한 조건 중 하나의 조건이라도 요청 수를 초과할 경우 요청 수 제한 적용 됩니다.
- 요청 수 제한 조건에 적용되는 시간 조건은 첫 요청 시간을 기준으로하며, 일정 시간 이후 초기화됩니다. (실패한 요청은 요청 횟수에 포함되지 않습니다.)
- 다수의 REST API 요청이 필요하신 경우, WebSocket을 통한 수신 부탁드립니다.
[Exchange API 잔여 요청 수 확인 방법]
- 업비트 Open API 서비스는 원활한 사용 환경을 위해 초당 / 분당 요청 수를 제한하고 있습니다.
- Open API 호출 시 남아있는 요청 수는
Remaining-Req
응답 해더를 통해 확인 가능합니다.
Remaining-Req: group=default; min=1799; sec=29
위와 같은 포멧의 응답 해더를 수신했다면, default
라는 그룹에 대하여 해당 초에 29개의 요청, 남은 1분간 1799개의 요청이 가능하다는 것을 의미합니다.
주문하기 Open API의 경우,
Remaining-Req: group=order; min=59; sec=4
위와 같은 응답이 올 수 있으며, 이는 order
라는 그룹에 대해 해당 초에 4번, 남은 1분은 59번의 주문 요청이 가능하다는 것을 의미합니다.
APIKey (API 키)
APIKey_info (API 키 리스트 조회)
API 키 목록 및 만료 일자를 조회합니다.
- Open API를 사용하기 위해선 사용기능 선택과 사용하실 IP 주소를 반드시 입력해야 Open API Key 발급이 가능합니다. Key 발급과 관리는 해당 페이지에서 가능합니다.
- Open API Key 발급 당시 입력한 IP 주소로만 접속해야 Open API 사용이 가능하며, Key당 최대 5개까지 등록할 수 있습니다.
- Open API Key는 계정당 10개 까지 발급이 가능합니다.
- 한 계정에서 여러 API 키를 사용하시는 경우 각 키마다 독립적으로 요청 횟수가 측정됩니다.
- Secret key는 최초 1회에 한해 발급되며 추가로 확인하실 수 없으니, 발급받으신 Secret key는 반드시 안전한 곳에 별도로 보관하여 주시기 바랍니다.
- Open API Key 토큰의 유효 기간은 1년이며 연장은 불가합니다. 유효 기간 만료 후 Open API Key를 삭제하여 추가로 발급받아 주시기 바랍니다.
- Open API Key 발급, 수정 및 삭제 시에는 2채널 추가 인증이 필요하며, 필요한 기능의 변경 발생 시에는 Open API Key 관리에서 해당 Key를 삭제하신 뒤 다시 등록해 주시기 바랍니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.APIKey.APIKey_info()
print(resp['result'])
Response Example
[
{
"access_key" : "xxxxxxxxxxxxxxxxxxxxxxxx",
"expire_at" : "2021-03-09T12:39:39.000Z"
},
{
"access_key" : "xxxxxxxxxxxxxxxxxxxxxxxx",
"expire_at" : "2021-03-09T12:39:39.000Z"
}
]
Method
GET /v1/api_keys
Operation Code
APIKey.APIKey_info
요청 (Request)
No Parameters
응답 (Response)
Parameter | Description |
---|---|
access_key | 발급받은 키 |
expire_at | 유효 기간 |
Account (계좌)
Account_info (전체 계좌 조회)
내가 보유한 자산 리스트를 보여줍니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Account.Account_info()
print(resp['result'])
Response Example
[
{
"currency": "BTC",
"balance": "0.00048",
"locked": "0.0",
"avg_buy_price": "20870000",
"avg_buy_price_modified": false,
"unit_currency": "KRW"
},
{
"currency": "KRW",
"balance": "0.34202414",
"locked": "4999.99999922",
"avg_buy_price": "0",
"avg_buy_price_modified": true,
"unit_currency": "KRW"
},
{
"currency": "ETH",
"balance": "0.00935861",
"locked": "0.0",
"avg_buy_price": "1068000",
"avg_buy_price_modified": false,
"unit_currency": "KRW"
}
]
Method
GET /v1/accounts
Operation Code
Account.Account_info
요청 (Request)
No Parameters
응답 (Response)
Parameter | Description |
---|---|
currency | 화폐를 의미하는 영문 대문자 코드 |
balance | 주문가능 금액/수량 |
locked | 주문 중 묶여있는 금액/수량 |
avg_buy_price | 매수평균가 |
avg_buy_price_modified | 매수평균가 수정 여부 |
unit_currency | 평단가 기준 화폐 |
Account_wallet (입출금 현황)
입출금 현황 및 블록 상태를 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Account.Account_wallet()
print(resp['result'])
Response Example
[
{
"currency": "BTC",
"net_type": "BTC",
"wallet_state": "working",
"block_state": "normal",
"block_height": 665013,
"block_updated_at": "2021-01-07T19:44:40.005+00:00",
"block_elapsed_minutes": 14
},
{
"currency": "POWR",
"net_type": "POWR",
"wallet_state": "working",
"block_state": "normal",
"block_height": 11609520,
"block_updated_at": "2021-01-07T19:54:27.007+00:00",
"block_elapsed_minutes": 5
},
{
"currency": "ETH",
"net_type": "ETH",
"wallet_state": "working",
"block_state": "normal",
"block_height": 11609520,
"block_updated_at": "2021-01-07T19:54:25.242+00:00",
"block_elapsed_minutes": 5
},
{
"currency": "ETC",
"net_type": "ETC",
"wallet_state": "working",
"block_state": "normal",
"block_height": 11947575,
"block_updated_at": "2021-01-07T19:54:38.171+00:00",
"block_elapsed_minutes": 4
},
...
]
Method
GET /v1/status/wallet
Operation Code
Account.Account_wallet
요청 (Request)
No Parameters
응답 (Response)
Parameter | Description |
---|---|
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 입출금 네트워크 |
wallet_state |
입출금 상태
|
block_state |
블록 상태
|
block_height | 블록 높이 |
block_updated_at | 블록 갱신 시각 |
Market (마켓)
Market_info_all (마켓 코드 조회)
업비트에서 거래 가능한 마켓 목록을 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Market.Market_info_all()
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"korean_name": "비트코인",
"english_name": "Bitcoin"
},
{
"market": "KRW-ETH",
"korean_name": "이더리움",
"english_name": "Ethereum"
},
{
"market": "BTC-ETH",
"korean_name": "이더리움",
"english_name": "Ethereum"
},
{
"market": "BTC-LTC",
"korean_name": "라이트코인",
"english_name": "Litecoin"
},
{
"market": "BTC-XRP",
"korean_name": "리플",
"english_name": "Ripple"
},
...
]
Method
GET /v1/market/all
Operation Code
Market.Market_info_all
요청 (Request)
Parameter | Description |
---|---|
isDetails | 유의종목 필드과 같은 상세 정보 노출 여부 (선택 파라미터, 기본 값: false) |
응답 (Response)
Parameter | Description |
---|---|
market | 업비트에서 제공중인 시장 정보 |
korean_name | 거래 대상 암호화폐 한글명 |
english_name | 거래 대상 암호화폐 영문명 |
market_warning | 유의 종목 여부; (NONE : 해당 사항 없음, CAUTION : 투자 유의) |
Order (주문)
Order_orderbook (오더북; Orderbook)
현재 시세 호가 정보를 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Order.Order_orderbook(
markets=['KRW-BTC', 'KRW-ETH']
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"timestamp": 1610070624000,
"total_ask_size": 7.71050069,
"total_bid_size": 3.33182914,
"orderbook_units": [
{
"ask_price": 43973000.0,
"bid_price": 43952000.0,
"ask_size": 0.00166408,
"bid_size": 0.03190123
},
{
"ask_price": 43974000.0,
"bid_price": 43951000.0,
"ask_size": 1.22621878,
"bid_size": 0.00451153
},
{
"ask_price": 43984000.0,
"bid_price": 43933000.0,
"ask_size": 0.05844488,
"bid_size": 0.5
},
{
"ask_price": 43985000.0,
"bid_price": 43920000.0,
"ask_size": 1.24634891,
"bid_size": 1.04638941
},
...
]
},
{
"market": "KRW-ETH",
"timestamp": 1610070624062,
"total_ask_size": 292.1165831,
"total_bid_size": 368.94615831,
"orderbook_units": [
{
"ask_price": 1347000.0,
"bid_price": 1346000.0,
"ask_size": 13.27655932,
"bid_size": 24.64993035
},
{
"ask_price": 1347500.0,
"bid_price": 1345500.0,
"ask_size": 16.63316797,
"bid_size": 0.10945805
},
{
"ask_price": 1348000.0,
"bid_price": 1345000.0,
"ask_size": 12.27655416,
"bid_size": 10.15483109
},
{
"ask_price": 1348500.0,
"bid_price": 1344500.0,
"ask_size": 27.44579387,
"bid_size": 21.77733151
},
...
]
}
]
Method
GET /v1/orderbook
Operation Code
Order.Order_orderbook
요청 (Request)
Parameters | Description |
---|---|
markets * | 마켓 코드 목록 (ex. KRW-BTC, KRW-ETH) |
응답 (Response)
Parameters | Description |
---|---|
market | 마켓 코드 |
timestamp | 호가 생성 시각 |
total_ask_size | 호가 매도 총 잔량 |
total_bid_size | 호가 매수 총량 |
orderbook_units | 호가 |
orderbook_units.ask_price | 매도호가 |
orderbook_units.bid_price | 매수호가 |
orderbook_units.ask_size | 매도 잔량 |
orderbook_units.bid_size | 매수 잔량 |
Order_chance (주문 가능 정보)
마켓별 주문 가능 정보를 확인합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Order.Order_chance(
market='KRW-BTC'
)
print(resp['result'])
Response Example
{
"bid_fee": "0.0005",
"ask_fee": "0.0005",
"maker_bid_fee": "0.0005",
"maker_ask_fee": "0.0005",
"market": {
"id": "KRW-BTC",
"name": "BTC/KRW",
"order_types": [
"limit"
],
"order_sides": [
"ask",
"bid"
],
"bid": {
"currency": "KRW",
"price_unit": null,
"min_total": 5000
},
"ask": {
"currency": "BTC",
"price_unit": null,
"min_total": 5000
},
"max_total": "1000000000.0",
"state": "active"
},
"bid_account": {
"currency": "KRW",
"balance": "0.34202414",
"locked": "4999.99999922",
"avg_buy_price": "0",
"avg_buy_price_modified": true,
"unit_currency": "KRW"
},
"ask_account": {
"currency": "BTC",
"balance": "0.00048",
"locked": "0.0",
"avg_buy_price": "20870000",
"avg_buy_price_modified": false,
"unit_currency": "KRW"
}
}
Method
GET /v1/orders/chance
Operation Code
Order.Order_chance
요청 (Request)
Parameters | Description |
---|---|
market * | 마켓 ID |
응답 (Response)
Parameters | Description |
---|---|
bid_fee | 매수 수수료 비율 |
ask_fee | 매도 수수료 비율 |
maker_bid_fee | 매수 시 메이커 수수료 비율 |
maker_ask_fee | 매도 시 메이커 수수료 비율 |
market | 마켓에 대한 정보 |
market.id | 마켓 ID |
market.name | 마켓 이름 |
market.order_types | 지원 주문 방식 |
market.order_sides | 지원 주문 종류 |
market.bid | 매수 시 제약사항 |
market.bid.currency | 화폐를 의미하는 영문 대문자 코드 |
market.bid.price_unit | 주문금액 단위 |
market.bid.min_total | 최소 매도/매수 금액 |
market.ask | 매도 시 제약사항 |
market.ask.currency | 화폐를 의미하는 영문 대문자 코드 |
market.ask.price_unit | 주문금액 단위 |
market.ask.min_total | 최소 매도/매수 금액 |
market.max_total | 최대 매도/매수 금액 |
market.max_total | 최대 매도/매수 금액 |
market.state | 마켓 운영 상태 |
bid_account | 매수 시 사용하는 화폐의 계좌 상태 |
bid_account.currency | 화폐를 의미하는 영문 대문자 코드 |
bid_account.balance | 주문가능 금액/수량 |
bid_account.locked | 주문 중 묶여있는 금액/수량 |
bid_account.avg_buy_price | 매수평균가 |
bid_account.avg_buy_price_modified | 매수평균가 수정 여부 |
bid_account.unit_currency | 평단가 기준 화폐 |
ask_account | 매도 시 사용하는 화폐의 계좌 상태 |
ask_account.currency | 화폐를 의미하는 영문 대문자 코드 |
ask_account.balance | 주문가능 금액/수량 |
ask_account.locked | 주문 중 묶여있는 금액/수량 |
ask_account.avg_buy_price | 매수평균가 |
ask_account.avg_buy_price_modified | 매수평균가 수정 여부 |
ask_account.unit_currency | 평단가 기준 화폐 |
Order_info (개별 주문 조회)
주문 UUID 를 통해 개별 주문건을 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Order.Order_info(
uuid='9ca023a5-851b-4fec-9f0a-48cd83c2eaae'
)
print(resp['result'])
Response Example
{
"uuid": "9ca023a5-851b-4fec-9f0a-48cd83c2eaae",
"side": "ask",
"ord_type": "limit",
"price": "4280000.0",
"state": "done",
"market": "KRW-BTC",
"created_at": "2019-01-04T13:48:09+09:00",
"volume": "1.0",
"remaining_volume": "0.0",
"reserved_fee": "0.0",
"remaining_fee": "0.0",
"paid_fee": "2140.0",
"locked": "0.0",
"executed_volume": "1.0",
"trades_count": 1,
"trades": [
{
"market": "KRW-BTC",
"uuid": "9e8f8eba-7050-4837-8969-cfc272cbe083",
"price": "4280000.0",
"volume": "1.0",
"funds": "4280000.0",
"side": "ask"
}
]
}
Method
GET /v1/order
Operation Code
Order.Order_info
요청 (Request)
Parameter | Description |
---|---|
uuid | 주문 UUID |
identifier | 조회용 사용자 지정 값 |
응답 (Response)
Parameter | Description |
---|---|
uuid | 주문의 고유 아이디 |
side | 주문 종류 |
ord_type | 주문 방식 |
price | 주문 당시 화폐 가격 |
state | 주문 상태 |
market | 마켓의 유일키 |
created_at | 주문 생성 시간 |
volume | 사용자가 입력한 주문 양 |
remaining_volume | 체결 후 남은 주문 양 |
reserved_fee | 수수료로 예약된 비용 |
remaining_fee | 남은 수수료 |
paid_fee | 사용된 수수료 |
locked | 거래에 사용중인 비용 |
executed_volume | 체결된 양 |
trade_count | 해당 주문에 걸린 체결 수 |
trades | 체결 |
trades.market | 마켓의 유일 키 |
trades.uuid | 체결의 고유 아이디 |
trades.price | 체결 가격 |
trades.volume | 체결 양 |
trades.funds | 체결된 총 가격 |
trades.side | 체결 종류 |
trades.created_at | 체결 시각 |
Order_info_all (주문 리스트 조회)
주문 리스트를 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Order.Order_info_all()
print(resp['result'])
Response Example
[
{
"uuid": "9ca023a5-851b-4fec-9f0a-48cd83c2eaae",
"side": "ask",
"ord_type": "limit",
"price": 4280000,
"state": "done",
"market": "KRW-BTC",
"created_at": {},
"volume": 1,
"remaining_volume": 0,
"reserved_fee": 0,
"remaining_fee": 0,
"paid_fee": 2140,
"locked": 0,
"executed_volume": 1,
"trades_count": 1
},
...
]
Method
GET /v1/orders
Operation Code
Order.Order_info_all
요청 (Request)
Parameter | Description |
---|---|
market | 마켓 ID |
uuids | 주문 UUID의 목록 |
identifiers | 주문 identifier의 목록 |
state |
주문 상태
|
states |
주문 상태의 목록
* 미체결 주문(wait, watch)과 완료 주문(done, cancel)은 혼합하여 조회하실 수 없습니다. |
page | 페이지 수 (default: 1) |
limit | 요청 개수 (default: 100) |
order_by |
정렬 방식
|
응답 (Response)
Parameter | Description |
---|---|
uuid | 주문의 고유 아이디 |
side | 주문 종류 |
ord_type | 주문 방식 |
price | 주문 당시 화폐 가격 |
state | 주문 상태 |
market | 마켓의 유일키 |
created_at | 주문 생성 시간 |
volume | 사용자가 입력한 주문 양 |
remaining_volume | 체결 후 남은 주문 양 |
reserved_fee | 수수료로 예약된 비용 |
remaining_fee | 남은 수수료 |
paid_fee | 사용된 수수료 |
locked | 거래에 사용중인 비용 |
executed_volume | 체결된 양 |
trade_count | 해당 주문에 걸린 체결 수 |
Order_new (주문하기)
새로운 주문 요청을 합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Order.Order_new(
market='KRW-BTC',
side='bid',
volume='0.01',
price='100.0',
ord_type='limit'
)
print(resp['result'])
Response Example
{
"uuid":"cdd92199-2897-4e14-9448-f923320408ad",
"side":"bid",
"ord_type":"limit",
"price":"100.0",
"avg_price":"0.0",
"state":"wait",
"market":"KRW-BTC",
"created_at":"2018-04-10T15:42:23+09:00",
"volume":"0.01",
"remaining_volume":"0.01",
"reserved_fee":"0.0015",
"remaining_fee":"0.0015",
"paid_fee":"0.0",
"locked":"1.0015",
"executed_volume":"0.0",
"trades_count":0
}
Method
POST /v1/orders
Operation Code
Order.Order_new
요청 (Request)
Parameter | Description |
---|---|
market * | 마켓 ID (필수) |
side * |
주문 종류 (필수)
|
volume * | 주문량 (지정가, 시장가 매도 시 필수) |
price * |
주문 가격. (지정가, 시장가 매수 시 필수)
ex) KRW-BTC 마켓에서 1BTC당 1,000 KRW로 거래할 경우, 값은 1000 이 된다. ex) KRW-BTC 마켓에서 1BTC당 매도 1호가가 500 KRW 인 경우, 시장가 매수 시 값을 1000으로 세팅하면 2BTC가 매수된다. (수수료가 존재하거나 매도 1호가의 수량에 따라 상이할 수 있음) |
ord_type * |
주문 유형 (필수)
|
identifier | 주문 조회용 사용자 지정값 (선택) |
응답 (Response)
Parameter | Description |
---|---|
uuid | 주문의 고유 아이디 |
side | 주문 종류 |
ord_type | 주문 방식 |
price | 주문 당시 화폐 가격 |
avg_price | 체결 가격의 평균가 |
state | 주문 상태 |
market | 마켓의 유일키 |
created_at | 주문 생성 시간 |
volume | 사용자가 입력한 주문 양 |
remaining_volume | 체결 후 남은 주문 양 |
reserved_fee | 수수료로 예약된 비용 |
remaining_fee | 남은 수수료 |
paid_fee | 사용된 수수료 |
locked | 거래에 사용중인 비용 |
executed_volume | 체결된 양 |
trade_count | 해당 주문에 걸린 체결 수 |
거래 관련 질문
1. 업비트 앱/웹에서 표시되는 거래내역과 API의 응답이 다릅니다.
업비트 웹/앱에서 표시되는 거래내역은 체결 목록이며, Open API에서 확인하실 수 있는 내용은 주문 목록입니다. 하나의 주문에 여러 개의 체결이 발생할 수 있으므로 두 내용은 다를 수 있습니다.
체결 목록을 확인하기 위해서는 주문 조회 API 응답의 trades
필드를 통해 확인하실 수 있습니다.
2. 주문 리스트 조회 API에서 시장가 주문이 조회되지 않습니다.
시장가 매수 주문은 체결 후 주문 상태가 cancel
, done
두 경우 모두 발생할 수 있습니다.
시장가로 체결이 일어난 후 주문 잔량이 발생하는 경우, 남은 잔량이 반환되며 cancel
처리됩니다.
대부분의 경우 소수점 아래 8자리까지 나누어 떨어지지 않는 미미한 금액이 주문 잔량으로 발생하게 됩니다.
만일 주문 잔량 없이 딱 맞아떨어지게 체결이 발생한 경우에는 주문 상태가 done
이 됩니다.
이처럼 소수점 아래 자릿수가 나누어 떨어지지 않는 시장가 매수 경우에는 소액의 잔량이 발생하여, 해당 잔량은 계좌로 반환되고 주문은 취소 처리됩니다. 시장가 매도 주문의 경우 수량을 통해 요청이 이루어지므로 나눗셈 연산이 없어 잔량이 발생하지 않습니다.
또한 주문 리스트 조회 API에는 states
필드가 있어, 여러 상태를 동시에 조회할 수 있는 점 참고 부탁드립니다.
3. 시장가 주문 요청에 실패합니다.
시장가 주문의 경우 매수/매도할 가격을 명시하지 않으므로, price
혹은 volume
중 하나의 값만 존재해야합니다.
자세한 내용은 위의 주문하기 문서를 다시 참고 부탁드립니다.
4. 주문하기 요청 횟수 제한이 남아있는데 오류가 발생합니다.
해당 현상은 주문 요청이 일시적으로 폭증하는 상황에 주문 안정화 시스템이 동작할 때 발생합니다.
주문 안정화 시스템은 Open API 및 업비트 앱/웹 여부와 무관하게 시스템 전체에 적용됩니다. 때문에 API 요청 수 제한이 남아있더라도 안정화 시스템 동작 중에는 주문 요청에 실패할 수 있습니다.
해당 오류가 발생하는 경우 수 초 후 다시 주문 요청 부탁드립니다.
Order_cancel (주문 취소 접수)
주문 UUID를 통해 해당 주문에 대한 취소 접수를 합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Order.Order_cancel(
uuid='cdd92199-2897-4e14-9448-f923320408ad'
)
print(resp['result'])
Response Example
{
"uuid":"cdd92199-2897-4e14-9448-f923320408ad",
"side":"bid",
"ord_type":"limit",
"price":"100.0",
"state":"wait",
"market":"KRW-BTC",
"created_at":"2018-04-10T15:42:23+09:00",
"volume":"0.01",
"remaining_volume":"0.01",
"reserved_fee":"0.0015",
"remaining_fee":"0.0015",
"paid_fee":"0.0",
"locked":"1.0015",
"executed_volume":"0.0",
"trades_count":0
}
Method
DELETE /v1/order
Operation Code
Order.Order_cancel
요청 (Request)
Parameter | Description |
---|---|
uuid | 주문 UUID |
identifier | 조회용 사용자 지정 값 |
응답 (Response)
Parameter | Description |
---|---|
uuid | 주문의 고유 아이디 |
side | 주문 종류 |
ord_type | 주문 방식 |
price | 주문 당시 화폐 가격 |
state | 주문 상태 |
market | 마켓의 유일키 |
created_at | 주문 생성 시간 |
volume | 사용자가 입력한 주문 양 |
remaining_volume | 체결 후 남은 주문 양 |
reserved_fee | 수수료로 예약된 비용 |
remaining_fee | 남은 수수료 |
paid_fee | 사용된 수수료 |
locked | 거래에 사용중인 비용 |
executed_volume | 체결된 양 |
trade_count | 해당 주문에 걸린 체결 수 |
Deposit (입금)
Deposit_info_all (입금 리스트 조회)
입금 리스트 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Deposit.Deposit_info_all()
print(resp['result'])
Response Example
[
{
"type": "deposit",
"uuid": "20c84493-6e70-4e54-83ce-90915a19d110",
"currency": "KRW",
"net_type": "KRW",
"txid": "BKD-2021-01-07-82a877188ce61d7b4b3c709dad",
"state": "ACCEPTED",
"created_at": "2021-01-07T11:59:31+09:00",
"done_at": "2021-01-07T12:00:12+09:00",
"amount": "5000.0",
"fee": "0.0",
"transaction_type": "default"
},
{
"type": "deposit",
"uuid": "7b34ea4d-fb46-4da1-9172-8dd42b8814f5",
"currency": "KRW",
"net_type": "KRW",
"txid": "BKD-2021-01-06-fd2ba0cc92670c72fba22f78d0",
"state": "ACCEPTED",
"created_at": "2021-01-06T20:42:41+09:00",
"done_at": "2021-01-06T20:43:15+09:00",
"amount": "10000.0",
"fee": "0.0",
"transaction_type": "default"
},
...
]
Method
GET /v1/deposits
Operation Code
Deposit.Deposit_info_all
요청 (Request)
Parameter | Description |
---|---|
currency | Currency 코드 |
state |
입금 상태
|
uuids | 입금 UUID의 목록 |
txids | 입금 TXID의 목록 |
limit | 개수 제한 (default: 100, limit: 100) |
page | 페이지 수 (default: 1) |
order_by |
정렬 방식
|
응답 (Response)
Parameter | Description |
---|---|
type | 입출금 종류 |
uuid | 입금에 대한 고유 아이디 |
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 입금 네트워크 |
txid | 입금의 트랜잭션 아이디 |
state | 입금 상태 |
created_at | 입금 생성 시간 |
done_at | 입금 완료 시간 |
amount | 입금 수량 |
fee | 입금 수수료 |
transaction_type |
입금 유형
|
Deposit_info (개별 입금 조회)
개별 입금 내역을 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Deposit.Deposit_info(
uuid='20c84493-6e70-4e54-83ce-90915a19d110'
)
print(resp['result'])
Response Example
{
"type": "deposit",
"uuid": "20c84493-6e70-4e54-83ce-90915a19d110",
"currency": "KRW",
"net_type": "KRW",
"txid": "BKD-2021-01-07-82a877188ce61d7b4b3c709dad",
"state": "ACCEPTED",
"created_at": "2021-01-07T11:59:31+09:00",
"done_at": "2021-01-07T12:00:12+09:00",
"amount": "5000.0",
"fee": "0.0",
"transaction_type": "default"
}
Method
GET /v1/deposit
Operation Code
Deposit.Deposit_info
요청 (Request)
Parameter | Description |
---|---|
uuid | 입금 UUID |
txid | 입금 TXID |
currency | Currency 코드 |
응답 (Response)
Parameter | Description |
---|---|
type | 입출금 종류 |
uuid | 입금에 대한 고유 아이디 |
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 입금 네트워크 |
txid | 입금의 트랜잭션 아이디 |
state | 입금 상태 |
created_at | 입금 생성 시간 |
done_at | 입금 완료 시간 |
amount | 입금 수량 |
fee | 입금 수수료 |
transaction_type |
입금 유형
|
Deposit_coin_addresses (전체 입금 주소 조회)
내가 보유한 자산 리스트를 보여줍니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Deposit.Deposit_coin_addresses()
print(resp['result'])
Response Example
[
{
"currency": "BTC",
"net_type": "BTC",
"deposit_address": "3NVw2seiTQddGQwc1apqudKxuTqebpyL3s",
"secondary_address": null
},
{
"currency": "ETH",
"net_type": "ETH",
"deposit_address": "0x60dd373f59862d9df776596889b997e24bee42eb",
"secondary_address": null
},
{
"currency": "EOS",
"net_type": "EOS",
"deposit_address": "eosupbitsusr",
"secondary_address": "516252ca-0993-454d-bd8b-6bc9db2d4c25"
},
{
"currency": "XRP",
"net_type": "XRP",
"deposit_address": "raQwCVAJVqjrVm1Nj5SFRcX8i22BhdC9WA",
"secondary_address": "22325934"
},
...
]
Method
GET /v1/deposits/coin_addresses
Operation Code
Deposit.Deposit_coin_addresses
요청 (Request)
No Parameters
응답 (Response)
Parameter | Description |
---|---|
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 입금 네트워크 |
deposit_address | 입금 주소 |
secondary_address | 2차 입금 주소 |
Deposit_coin_address (개별 입금 주소 조회)
내가 보유한 개별 자산 내역을 보여줍니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Deposit.Deposit_coin_address(
currency='BTC',
net_type='BTC'
)
print(resp['result'])
Response Example
{
"currency": "BTC",
"net_type": "BTC",
"deposit_address": "3NVw2seiTQddGQwc1apqudKxuTqebpyL3s",
"secondary_address": null
}
Method
GET /v1/deposits/coin_address
Operation Code
Deposit.Deposit_coin_address
요청 (Request)
Parameter | Description |
---|---|
currency * | 화폐를 의미하는 영문 대문자 코드 |
net_type * | 입금 네트워크 |
응답 (Response)
Parameter | Description |
---|---|
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 입금 네트워크 |
deposit_address | 입금 주소 |
secondary_address | 2차 입금 주소 |
Deposit_generate_coin_address (입금 주소 생성 요청)
입금 주소 생성을 요청합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Deposit.Deposit_generate_coin_address(
currency='SNT',
net_type='SNT'
)
print(resp['result'])
Response1 Example: 201 Created
{
"success": true,
"message": "SNT 입금주소를 생성중입니다."
}
Response2 Example: 200 OK
{
"currency": "SNT",
"net_type": "SNT",
"deposit_address": "0x72012d8af69263a509af8cd522374fc65c454539",
"secondary_address": null
}
Method
POST /v1/deposits/generate_coin_address
Operation Code
Deposit.Deposit_generate_coin_address
요청 (Request)
Parameter | Description |
---|---|
currency * | 화폐를 의미하는 영문 대문자 코드 |
net_type * | 입금 네트워크 |
응답 (Response1)
Parameter | Description |
---|---|
success | 요청 성공 여부 |
message | 요청 결과에 대한 메세지 |
응답 (Response2)
Parameter | Description |
---|---|
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 입금 네트워크 |
deposit_address | 입금 주소 |
secondary_address | 2차 입금 주소 |
Withdraw (출금)
Withdraw_info_all (출금 리스트 조회)
출금 리스트 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Withdraw.Withdraw_info_all()
print(resp['result'])
Response Example
[
{
"type": "withdraw",
"uuid": "35a4f1dc-1db5-4d6b-89b5-7ec137875956",
"currency": "XRP",
"net_type": "XRP",
"txid": "98c15999f0bdc4ae0e8a-ed35868bb0c204fe6ec29e4058a3451e-88636d1040f4baddf943274ce37cf9cc",
"state": "DONE",
"created_at": "2019-02-28T15:17:51+09:00",
"done_at": "2019-02-28T15:22:12+09:00",
"amount": 1,
"fee": 0,
"transaction_type": "default"
},
...
]
Method
GET /v1/withdraws
Operation Code
Withdraw.Withdraw_info_all
요청 (Request)
Parameter | Description |
---|---|
currency | Currency 코드 |
state |
출금 상태
|
uuids | 출금 UUID의 목록 |
txids | 출금 TXID의 목록 |
limit | 개수 제한 (default: 100, limit: 100) |
page | 페이지 수 (default: 1) |
order_by |
정렬 방식
|
응답 (Response)
Parameter | Description |
---|---|
type | 입출금 종류 |
uuid | 출금에 대한 고유 아이디 |
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 출금 네트워크 |
currency | 화폐를 의미하는 영문 대문자 코드 |
txid | 출금의 트랜잭션 아이디 |
state | 출금 상태 |
created_at | 출금 생성 시간 |
done_at | 출금 완료 시간 |
amount | 출금 금액/수량 |
fee | 출금 수수료 |
transaction_type |
출금 유형
|
Withdraw_info (개별 출금 조회)
출금 UUID를 통해 개별 출금 정보를 조회합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Withdraw.Withdraw_info(
uuid='35a4f1dc-1db5-4d6b-89b5-7ec137875956'
)
print(resp['result'])
Response Example
{
"type": "withdraw",
"uuid": "35a4f1dc-1db5-4d6b-89b5-7ec137875956",
"currency": "XRP",
"net_type": "XRP",
"txid": "98c15999f0bdc4ae0e8a-ed35868bb0c204fe6ec29e4058a3451e-88636d1040f4baddf943274ce37cf9cc",
"state": "DONE",
"created_at": "2019-02-28T15:17:51+09:00",
"done_at": "2019-02-28T15:22:12+09:00",
"amount": 1,
"fee": 0,
"transaction_type": "default"
}
Method
GET /v1/withdraw
Operation Code
Withdraw.Withdraw_info
요청 (Request)
Parameter | Description |
---|---|
uuid | 출금 UUID |
txid | 출금 TXID |
currency | Currency 코드 |
응답 (Response)
Parameter | Description |
---|---|
type | 입출금 종류 |
uuid | 출금에 대한 고유 아이디 |
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 출금 네트워크 |
currency | 화폐를 의미하는 영문 대문자 코드 |
txid | 출금의 트랜잭션 아이디 |
state | 출금 상태 |
created_at | 출금 생성 시간 |
done_at | 출금 완료 시간 |
amount | 출금 수량 |
fee | 출금 수수료 |
transaction_type |
출금 유형
|
Withdraw_chance (출금 가능 정보)
해당 통화의 가능한 출금 정보를 확인합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Withdraw.Withdraw_chance(
currency='BTC',
net_type='BTC'
)
print(resp['result'])
Response Example
{
"member_level": {
"security_level": 4,
"fee_level": 0,
"email_verified": true,
"identity_auth_verified": true,
"bank_account_verified": true,
"kakao_pay_auth_verified": true,
"locked": false,
"wallet_locked": false
},
"currency": {
"code": "BTC",
"withdraw_fee": "0.0009",
"is_coin": true,
"wallet_state": "working",
"wallet_support": [
"deposit",
"withdraw"
]
},
"account": {
"currency": "BTC",
"balance": "0.00048",
"locked": "0.0",
"avg_buy_price": "20870000",
"avg_buy_price_modified": false,
"unit_currency": "KRW"
},
"withdraw_limit": {
"currency": "BTC",
"onetime": "50.0",
"daily": null,
"remaining_daily": "0.0",
"remaining_daily_fiat": "1000000000.0",
"fiat_currency": "KRW",
"minimum": "0.001",
"fixed": 8,
"can_withdraw": true,
"remaining_daily_krw": "1000000000.0"
}
}
Method
GET /v1/withdraws/chance
Operation Code
Withdraw.Withdraw_chance
요청 (Request)
Parameter | Description |
---|---|
currency * | 화폐를 의미하는 영문 대문자 코드 |
net_type * | 출금 네트워크 |
응답 (Response)
Parameter | Description |
---|---|
member_level | 사용자의 보안 등급 정보 |
member_level.security_level | 사용자의 보안 등급 |
member_level.fee_level | 사용자의 수수료 등급 |
member_level.email_verified | 사용자의 이메일 인증 여부 |
member_level.identity_auth_verified | 사용자의 실명 인증 여부 |
member_level.bank_account_verified | 사용자의 계좌 인증 여부 |
member_level.kakao_pay_auth_verified | 사용자의 카카오페이 인증 여부 |
member_level.locked | 사용자의 계정 보호 상태 |
member_level.wallet_locked | 사용자의 출금 보호 상태 |
currency | 화폐 정보 |
currency.code | 화폐를 의미하는 영문 대문자 코드 |
currency.withdraw_fee | 해당 화폐의 출금 수수료 |
currency.is_coin | 화폐의 코인 여부 |
currency.wallet_state | 해당 화폐의 지갑 상태 |
currency.wallet_support | 해당 화폐가 지원하는 입출금 정보 |
account | 사용자의 계좌 정보 |
account.currency | 화폐를 의미하는 영문 대문자 코드 |
account.balance | 주문 가능 금액/수량 |
account.locked | 주문 중 묶여있는 금액/수량 |
account.avg_buy_price | 매수 평균가 |
account.avg_buy_price_modified | 매수 평균가 수정 여부 |
account.unit_currency | 평단가 기준 화폐 |
withdraw_limit | 출금 제약 정보 |
withdraw_limit.currency | 화폐를 의미하는 영문 대문자 코드 |
withdraw_limit.minimum | 출금 최소 금액/수량 |
withdraw_limit.onetime | 1회 출금 한도 |
withdraw_limit.daily | 1일 출금 한도 |
withdraw_limit.remaining_daily | 1일 잔여 출금 한도 |
withdraw_limit.remaining_daily_krw | 통합 1일 잔여 출금 한도 |
withdraw_limit.fixed | 출금 금액/수량 소수점 자리 수 |
withdraw_limit.can_withdraw | 출금 지원 여부 |
Withdraw_coin (디지털 자산 출금 하기)
디지털 자산 출금을 요청합니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Withdraw.Withdraw_coin(
currency='BTC',
net_type='BTC',
amount='0.01',
address='3NVw2seiTQddGQwc1apqudKxuTqebpyL3s'
)
print(resp['result'])
Response Example
{
"type": "withdraw",
"uuid": "9f432943-54e0-40b7-825f-b6fec8b42b79",
"currency": "BTC",
"net_type": "BTC",
"txid": "ebe6937b-130e-4066-8ac6-4b0e67f28adc",
"state": "processing",
"created_at": "2018-04-13T11:24:01+09:00",
"done_at": null,
"amount": "0.01",
"fee": "0.0",
"krw_amount": "80420.0",
"transaction_type": "default"
}
Method
POST /v1/withdraws/coin
Operation Code
Withdraw.Withdraw_coin
요청 (Request)
Parameter | Description |
---|---|
currency * | Currency 코드 |
net_type * | 출금 네트워크 |
amount * | 출금 수량 |
address * | 출금 가능 주소에 등록된 출금 주소 |
secondary_address | 2차 출금 주소 (필요한 코인에 한해서) |
transaction_type |
출금 유형
|
응답 (Response)
Parameter | Description |
---|---|
type | 입출금 종류 |
uuid | 출금에 대한 고유 아이디 |
currency | 화폐를 의미하는 영문 대문자 코드 |
net_type | 출금 네트워크 |
txid | 출금의 트랜잭션 아이디 |
state | 출금 상태 |
created_at | 출금 생성 시간 |
done_at | 출금 완료 시간 |
amount | 출금 수량 |
fee | 출금 수수료 |
krw_amount | 원화 환산 가격 |
transaction_type |
출금 유형
|
Withdraw_krw (원화 출금 하기)
원화 출금 요청을 합니다. 등록된 출금 계좌로 출금됩니다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Withdraw.Withdraw_krw(
amount='10000'
)
print(resp['result'])
Response Example
{
"type": "withdraw",
"uuid": "35a4f1dc-1db5-4d6b-89b5-7ec137875956",
"currency": "KRW",
"txid": "98c15999f0bdc4ae0e8a-ed35868bb0c204fe6ec29e4058a3451e-88636d1040f4baddf943274ce37cf9cc",
"state": "DONE",
"created_at": "2019-02-28T15:17:51+09:00",
"done_at": "2019-02-28T15:22:12+09:00",
"amount": 1,
"fee": 0,
"transaction_type": "default"
}
Method
POST /v1/withdraws/krw
Operation Code
Withdraw.Withdraw_krw
요청 (Request)
Parameter | Description |
---|---|
amount * | 출금액 (출금 원화 수량) |
two_factor_type |
2차 인증 수단 (기본값: kakao_pay )
|
응답 (Response)
Parameter | Description |
---|---|
type | 입출금 종류 |
uuid | 출금에 대한 고유 아이디 |
currency | 화폐를 의미하는 영문 대문자 코드 |
txid | 출금의 트랜잭션 아이디 |
state | 출금 상태 |
created_at | 출금 생성 시간 |
done_at | 출금 완료 시간 |
amount | 출금 수량 |
fee | 출금 수수료 |
transaction_type |
출금 유형
|
Withdraw_coin_addresses (출금 허용 주소 리스트 조회)
등록된 출금 허용 주소 목록을 조회한다.
Request Example
from upbit.client import Upbit
access_key = "Your Access Key"
secret_key = "Your Secret Key"
client = Upbit(access_key, secret_key)
resp = client.Withdraw.Withdraw_coin_addresses()
print(resp['result'])
Response Example
{
"currency": "BTC",
"net_type": "BTC",
"withdraw_address": "3NVw2seiTQddGQwc1apqudKxuTqebpyL3s",
"secondary_address": null
}
Method
POST /v1/withdraws/coin_addresses
Operation Code
Withdraw.Withdraw_coin_addresses
요청 (Request)
No Parameters
응답 (Response)
Parameter | Description |
---|---|
currency | 출금 화폐 |
net_type | 출금 네트워크 |
withdraw_address | 출금 주소 |
secondary_address | 2차 출금 주소 (필요한 디지털 자산에 한해서) |
Candle (시세 캔들; 봉)
Candle_minutes (분; Minute 캔들)
분(Miniute) 단위로 시세 캔들을 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Candle.Candle_minutes(
unit=1,
market='KRW-BTC'
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"candle_date_time_utc": "2021-01-08T17:05:00",
"candle_date_time_kst": "2021-01-09T02:05:00",
"opening_price": 47550000.0,
"high_price": 47563000.0,
"low_price": 47550000.0,
"trade_price": 47551000.0,
"timestamp": 1610125540014,
"candle_acc_trade_price": 44005459.60087,
"candle_acc_trade_volume": 0.92535793,
"unit": 1
},
...
]
Method
GET /v1/candles/minutes/{unit}
Operation Code
Candle.Candle_minutes
요청 (Request)
Parameter | Description |
---|---|
unit * | 분 단위 (가능한 값: 1, 3, 5, 15, 10, 30, 60, 240) |
market * | 마켓 코드 (ex. KRW-BTC, BTC-BCC) |
to | 마지막 캔들 시각 (exclusive). 포맷 : yyyy-MM-dd'T'HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss . 비워서 요청시 가장 최근 캔들 |
count | 캔들 개수 (최대 200개까지 요청 가능) |
응답 (Response)
Parameter | Description |
---|---|
market | 마켓명 |
candle_date_time_utc | 캔들 기준 시각(UTC 기준) |
candle_date_time_kst | 캔들 기준 시각(KST 기준) |
opening_price | 시가 |
high_price | 고가 |
low_price | 저가 |
trade_price | 종가 |
timestamp | 해당 캔들에서 마지막 틱이 저장된 시각 |
candle_acc_trade_price | 누적 거래 금액 |
candle_acc_trade_volume | 누적 거래량 |
unit | 분 단위 (유닛) |
Candle_days (일; Day 캔들)
일(Day) 단위로 시세 캔들을 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Candle.Candle_days(
market='KRW-BTC'
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"candle_date_time_utc": "2021-01-08T00:00:00",
"candle_date_time_kst": "2021-01-08T09:00:00",
"opening_price": 44698000.0,
"high_price": 48550000.0,
"low_price": 42271000.0,
"trade_price": 47544000.0,
"timestamp": 1610126678593,
"candle_acc_trade_price": 868607517589.245,
"candle_acc_trade_volume": 18953.44414088,
"prev_closing_price": 44698000.0,
"change_price": 2846000.0,
"change_rate": 0.0636717527
},
...
]
Method
GET /v1/candles/days
Operation Code
Candle.Candle_days
요청 (Request)
Parameter | Description |
---|---|
market * | 마켓 코드 (ex. KRW-BTC, BTC-BCC) |
to | 마지막 캔들 시각 (exclusive). 포맷 : yyyy-MM-dd'T'HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss . 비워서 요청시 가장 최근 캔들 |
convertingPriceUnit | 종가 환산 화폐 단위 (생략 가능, KRW로 명시할 시 원화 환산 가격을 반환.) |
응답 (Response)
Parameter | Description |
---|---|
market | 마켓명 |
candle_date_time_utc | 캔들 기준 시각(UTC 기준) |
candle_date_time_kst | 캔들 기준 시각(KST 기준) |
opening_price | 시가 |
high_price | 고가 |
low_price | 저가 |
trade_price | 종가 |
timestamp | 해당 캔들에서 마지막 틱이 저장된 시각 |
candle_acc_trade_price | 누적 거래 금액 |
candle_acc_trade_volume | 누적 거래량 |
prev_closing_price | 전일 종가(UTC 0시 기준) |
change_price | 전일 종가 대비 변화 금액 |
change_rate | 전일 종가 대비 변화량 |
converted_trade_price | 종가 환산 화폐 단위로 환산된 가격(요청에 convertingPriceUnit 파라미터 없을 시 해당 필드 포함되지 않음.) |
Candle_weeks (주; Week 캔들)
주(Week) 단위로 시세 캔들을 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Candle.Candle_weeks(
market='KRW-BTC'
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"candle_date_time_utc": "2021-01-04T00:00:00",
"candle_date_time_kst": "2021-01-04T09:00:00",
"opening_price": 37537000.0,
"high_price": 48550000.0,
"low_price": 33000000.0,
"trade_price": 47617000.0,
"timestamp": 1610126559879,
"candle_acc_trade_price": 3531977900551.1753,
"candle_acc_trade_volume": 88370.43948385,
"first_day_of_period": "2021-01-04"
},
...
]
Method
GET /v1/candles/weeks
Operation Code
Candle.Candle_weeks
요청 (Request)
Parameter | Description |
---|---|
market * | 마켓 코드 (ex. KRW-BTC, BTC-BCC) |
to | 마지막 캔들 시각 (exclusive). 포맷 : yyyy-MM-dd'T'HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss . 비워서 요청시 가장 최근 캔들 |
count | 캔들 개수 (최대 200개까지 요청 가능) |
응답 (Response)
Parameter | Description |
---|---|
market | 마켓명 |
candle_date_time_utc | 캔들 기준 시각(UTC 기준) |
candle_date_time_kst | 캔들 기준 시각(KST 기준) |
opening_price | 시가 |
high_price | 고가 |
low_price | 저가 |
trade_price | 종가 |
timestamp | 해당 캔들에서 마지막 틱이 저장된 시각 |
candle_acc_trade_price | 누적 거래 금액 |
candle_acc_trade_volume | 누적 거래량 |
first_day_of_period | 캔들 기간의 가장 첫 날 |
Candle_month (월; Month 캔들)
월(Month) 단위로 시세 캔들을 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Candle.Candle_month(
market='KRW-BTC'
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"candle_date_time_utc": "2021-01-01T00:00:00",
"candle_date_time_kst": "2021-01-01T09:00:00",
"opening_price": 32037000.0,
"high_price": 48550000.0,
"low_price": 31800000.0,
"trade_price": 47609000.0,
"timestamp": 1610126792251,
"candle_acc_trade_price": 5279753367606.828,
"candle_acc_trade_volume": 136975.61257404,
"first_day_of_period": "2021-01-01"
},
...
]
Method
GET /v1/candles/months
Operation Code
Candle.Candle_month
요청 (Request)
Parameter | Description |
---|---|
market * | 마켓 코드 (ex. KRW-BTC, BTC-BCC) |
to | 마지막 캔들 시각 (exclusive). 포맷 : yyyy-MM-dd'T'HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss . 비워서 요청시 가장 최근 캔들 |
count | 캔들 개수 (최대 200개까지 요청 가능) |
응답 (Response)
Parameter | Description |
---|---|
market | 마켓명 |
candle_date_time_utc | 캔들 기준 시각(UTC 기준) |
candle_date_time_kst | 캔들 기준 시각(KST 기준) |
opening_price | 시가 |
high_price | 고가 |
low_price | 저가 |
trade_price | 종가 |
timestamp | 해당 캔들에서 마지막 틱이 저장된 시각 |
candle_acc_trade_price | 누적 거래 금액 |
candle_acc_trade_volume | 누적 거래량 |
first_day_of_period | 캔들 기간의 가장 첫 날 |
Trade (거래; 시세 체결)
Trade_ticks (최근 체결 내역)
최근 체결 내역을 조회합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Trade.Trade_ticks(
market='KRW-BTC'
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"trade_date_utc": "2021-01-08",
"trade_time_utc": "17:44:15",
"timestamp": 1610127855000,
"trade_price": 47560000.0,
"trade_volume": 0.47572963,
"prev_closing_price": 44698000.0,
"change_price": 2862000.0,
"ask_bid": "ASK",
"sequential_id": 1610127855000000
},
...
]
Method
GET /v1/trades/ticks
Operation Code
Trade.Trade_ticks
요청 (Request)
Parameter | Description |
---|---|
market * | 마켓 코드 (ex. KRW-BTC, BTC-BCC) |
to | 마지막 캔들 시각 (exclusive). 포맷 : yyyy-MM-dd'T'HH:mm:ssXXX or yyyy-MM-dd HH:mm:ss . 비워서 요청시 가장 최근 캔들 |
count | 캔들 개수 (최대 200개까지 요청 가능) |
cursor | 페이지네이션 커서 (sequentialId ) |
daysAgo | 최근 체결 날짜 기준 7일 이내의 이전 데이터 조회 가능. 비워서 요청 시 가장 최근 체결 날짜 반환. (범위: 1 ~ 7) |
응답 (Response)
Parameter | Description |
---|---|
trade_date_utc | 체결 일자(UTC 기준) |
trade_time_utc | 체결 시각(UTC 기준) |
timestamp | 체결 타임스탬프 |
trade_price | 체결 가격 |
trade_volume | 체결량 |
prev_closing_price | 전일 종가 |
change_price | 변화량 |
ask_bid | 매도/매수 |
sequential_id | 체결 번호 (Unique) |
Trade_ticker (시세 Ticker 조회 - 현재가 정보)
요청 당시 종목의 스냅샷을 반환합니다.
Request Example
from upbit.client import Upbit
client = Upbit()
resp = client.Trade.Trade_ticker(
markets='KRW-BTC, KRW-ETH'
)
print(resp['result'])
Response Example
[
{
"market": "KRW-BTC",
"trade_date": "20210108",
"trade_time": "174621",
"trade_date_kst": "20210109",
"trade_time_kst": "024621",
"trade_timestamp": 1610127981000,
"opening_price": 44698000.0,
"high_price": 48550000.0,
"low_price": 42271000.0,
"trade_price": 47577000.0,
"prev_closing_price": 44698000.0,
"change": "RISE",
"change_price": 2879000.0,
"change_rate": 0.0644100407,
"signed_change_price": 2879000.0,
"signed_change_rate": 0.0644100407,
"trade_volume": 0.00033988,
"acc_trade_price": 861919074055.3187,
"acc_trade_price_24h": 1082457070848.9071,
"acc_trade_volume": 18804.39719428,
"acc_trade_volume_24h": 23822.32449006,
"highest_52_week_price": 48550000.0,
"highest_52_week_date": "2021-01-08",
"lowest_52_week_price": 5489000.0,
"lowest_52_week_date": "2020-03-13",
"timestamp": 1610127981564
},
{
"market": "KRW-ETH",
"trade_date": "20210108",
"trade_time": "174619",
"trade_date_kst": "20210109",
"trade_time_kst": "024619",
"trade_timestamp": 1610127979000,
"opening_price": 1388000.0,
"high_price": 1485000.0,
"low_price": 1233500.0,
"trade_price": 1410000.0,
"prev_closing_price": 1388000.0,
"change": "RISE",
"change_price": 22000.0,
"change_rate": 0.0158501441,
"signed_change_price": 22000.0,
"signed_change_rate": 0.0158501441,
"trade_volume": 0.22966312,
"acc_trade_price": 581867851790.185,
"acc_trade_price_24h": 717996348913.0636,
"acc_trade_volume": 422799.52433396,
"acc_trade_volume_24h": 521320.18764923,
"highest_52_week_price": 1485000.0,
"highest_52_week_date": "2021-01-08",
"lowest_52_week_price": 124350.0,
"lowest_52_week_date": "2020-03-13",
"timestamp": 1610127979352
}
]
Method
GET /v1/ticker
Operation Code
Trade.Trade_ticker
요청 (Request)
Parameter | Description |
---|---|
markets * | 반점으로 구분되는 마켓 코드 (ex. KRW-BTC, BTC-BCC) |
응답 (Response)
Parameter | Description |
---|---|
market | 종목 구분 코드 |
trade_date | 최근 거래 일자(UTC) |
trade_time | 최근 거래 시각(UTC) |
trade_date_kst | 최근 거래 일자(KST) |
trade_time_kst | 최근 거래 시각(KST) |
opening_price | 시가 |
high_price | 고가 |
low_price | 저가 |
trade_price | 종가 |
prev_closing_price | 전일 종가 |
change | EVEN : 보합, RISE : 상승, FALL : 하락 |
change_price | 변화액의 절대값 |
change_rate | 변화율의 절대값 |
signed_change_price | 부호가 있는 변화액 |
signed_change_rate | 부호가 있는 변화율 |
trade_volume | 가장 최근 거래량 |
acc_trade_price | 누적 거래대금 (UTC 0시 기준) |
acc_trade_price_24h | 24시간 누적 거래대금 |
acc_trade_volume | 누적 거래량 (UTC 0시 기준) |
acc_trade_volume_24h | 24시간 누적 거래량 |
highest_52_week_price | 52주 신고가 |
highest_52_week_date | 52주 신고가 달성일 |
lowest_52_week_price | 52주 신저가 |
lowest_52_week_date | 52주 신저가 달성일 |
timestamp | 타임스탬프 |
시세 관련 질문
1. 차트 보조지표를 계산하고 싶습니다.
업비트 차트의 보조지표들은 Chartiq
, Tradingview
에서 제공하고 있으니 해당 사이트들을 참고하시길 바랍니다.
2. UBCI 지표를 API를 통해 수신하고 싶습니다.
UBCI API는 업비트 측에서 Open API로 제공하고 있지 않습니다. 업비트 공지사항을 통해 확인하시기 바랍니다.
3. 매수, 매도 (bid/ask) 결정 기준이 궁금합니다.
결정 기준은 아래와 같습니다.
- 매도 호가에 누군가 매수를 하면 체결은 매수(BID) 타입
- 매수 호가에 누군가 매도를 하면 체결은 매도(ASK) 타입
making/taking
관점에서 보면 taking
의 주문 타입으로 결정이 됩니다.
4. 체결강도를 API를 통해 수신하고 싶습니다.
현재 업비트는 API를 통해 체결강도를 따로 제공해드리고 있지는 않습니다.
다만 websocket
의 체결 데이터 수신을 통해 체결강도를 계산하실 수 있습니다.
체결강도는 UTC 0시(KST 9시)부터의 매수누적체결량 / 매도누적체결량 * 100 으로 계산됩니다. 해당 계산식은 향후 서비스 운영 중 다른 형태로 별도의 고지 없이 변경될 수 있음을 참고 부탁드리겠습니다.
5. USDT 마켓의 원화 환산가격를 알고 싶습니다.
USDT 마켓의 원화 환산가격은 업비트 자체 마켓 시세를 통하여 계산됩니다.
- KRW-USDT = KRW-BTC / USDT-BTC
WebSocket (웹 소켓)
개요
1. 시세 정보
WebSocket을 이용하여 수신할 수 있는 정보는 다음과 같습니다.
- 현재가 (스냅샷, 실시간 정보 제공)
- 체결 (스냅샷, 실시간 정보 제공)
- 호가 (스냅샷, 실시간 정보 제공)
각각의 정보는 스냅샷
과 실시간 데이터
로 나뉘며 요청 방법에 따라 수신할 수 있는 데이터가 달라집니다.
스냅샷
정보란 요청 당시의 상태를 의미합니다.
실시간
정보란 요청 정보가 스트림 형태로 지속적으로 제공되는 것을 의미합니다.
WebSocket을 이용하여 스냅샷 정보나 실시간 정보를 요청할 수 있으며 둘 중 하나의 정보만을 요청할 수도 있습니다.
자세한 요청 방법은 2. 요청 포맷
섹션과 UpbitWebSocket
섹션에서 다룹니다.
2. 요청 형식
연결이 성공적으로 이루어졌다면 웹소켓 서버에 여러가지 요청을 할 수 있습니다. 요청은 JSON Object를 이용하며 응답 또한 JSON Object 입니다.
요청은 크게 [{ticket field}, {type field}, {format field}]
로 나누어지며 각각의 필드는 다음 구성요소로 이루어져 있습니다.
Ticket Field
일반적으로 용도를 식별하기 위해 ticket
이라는 필드값이 필요합니다.
이 값은 시세를 수신하는 대상을 식별하며 되도록 유니크한 값을 사용하도록 권장합니다. (UUID 등)
필드 명 | 내용 | 타입 | 필요 여부 |
---|---|---|---|
ticket | 식별값 | String | O |
Type Field
수신하고 싶은 시세 정보를 나열하는 필드입니다.
isOnlySnapshot
, isOnlyRealtime
필드는 생략 가능하며 모두 생략시 스냅샷과 실시간 데이터 모두를 수신합니다.
하나의 요청에 {type field}
는 여러개를 명시할 수 있습니다.
필드명 | 내용 | 타입 | 필요 여부 |
---|---|---|---|
type | 수신할 시세 타입 (현재가: ticker , 체결: trade , 호가: orderbook ) |
String | O |
codes | 수신할 시세 종목 정보 (주의: codes 필드에 명시되는 종목들은 대문자로 요청해야 합니다.) | List | O |
isOnlySnapshot | 시세 스냅샷만 제공 | Boolean | X |
isOnlyRealtime | 실시간 시세만 제공 | Boolean | X |
Format Field
마지막으로 포맷 정보입니다. Simple
로 지정될 경우 응답의 필드명이 모두 간소화됩니다.
트래픽 부담이 클 때 사용하는 방법입니다.
필드명 | 내용 | 타입 | 필요 여부 |
---|---|---|---|
format | 포맷 (SIMPLE : 간소화된 필드명, DEFAULT : 기본값(생략 가능) |
String | X (기본: Default ) |
UpbitWebSocket
고성능 네트워크 및 웹 서버 비동기(async) 프레임워크 기반의 동시성 코드 작성을 위한 업비트 웹 소켓 클래스를 생성합니다.
자세한 사항은 파이썬 표준 라이브러리 asyncio
패키지를 참고해주세요.
Example Code
from upbit.websocket import UpbitWebSocket
sock = UpbitWebSocket()
print(sock)
async with sock as conn:
# Do something
pass
Result Example
UpbitWebSocket(wss://api.upbit.com/websocket/v1)
UpbitWebSocket(uri=WEBSOCKET_URI, ping_interval=None, ping_timeout=None)
Parameter | Description |
---|---|
uri | 웹 소켓에 연결할 URI. (기본값: wss://api.upbit.com/websocket/v1 ) |
ping_interval | ping 간격 제한 (기본값: None ) |
ping_timeout | ping 시간 초과 제한 (기본값: None ) |
socket.Connection
Property
웹 소켓에 연결하기 위해 생성된 Connection 객체입니다.
위의 예제와 동일한 결과를 가집니다.
Example Code
from upbit.websocket import UpbitWebSocket
sock = UpbitWebSocket()
connection = sock.Connection
async with connection as conn:
# Do Something
pass
socket.connect
Method
URI에 연결을 시도하고 Connection 객체를 재생성합니다.
UpbitWebSocket
클래스의 __init__
메소드 호출 시 자동으로 호출됩니다.
Example Code
from upbit.websocket import UpbitWebSocket
sock = UpbitWebSocket()
sock.connect(
ping_interval=20,
ping_timeout=20
)
async with sock as conn:
# Do Something
pass
socket.connect(ping_interval=None, ping_timeout=None)
Parameter | Description |
---|---|
ping_interval | ping 간격 제한 (기본값: None ) |
ping_timeout | ping 시간 초과 제한 (기본값: None ) |
conn.send
웹 소켓에 데이터를 수신합니다.
Example Code
from upbit.websocket import UpbitWebSocket
sock = UpbitWebSocket()
async with sock as conn:
await conn.send('PING')
conn.send(message)
Parameter | Description |
---|---|
message * | 서버에 수신할 데이터 |
conn.recv
서버로부터 전달받은 바이트 스트림(bytes stream) 데이터를 받습니다.
예외를 발생시키는 경우는 아래와 같습니다.
- ConnectionClosed:
Connection
객체가Close
상태가 되었을 경우 - RuntimeError: 두 가지 코루틴이 동시에
recv
를 호출하는 경우
Example Code
import re
import json
from upbit.websocket import UpbitWebSocket
sock = UpbitWebSocket()
async with sock as conn:
await conn.send('PING')
data = await conn.recv()
pattern = re.compile('{"\S+":"\S+"}')
search = pattern.search(data.decode('utf8'))
result = json.loads(search.group())
print(result)
Result
{"status": "UP"}
conn.recv()
No Parameters
UpbitWebSocket.generate_type_field (Type Field Generate)
staticmethod
웹 소켓 수신에 필요한 payload의 type field 데이터를 generate 합니다.
요청 형식에 대한 사항은 위의 2. 요청 형식
섹션을 참고해주세요.
Example Code
from upbit.websocket import UpbitWebSocket
currencies = ['KRW-BTC', 'KRW-ETH']
type_field = UpbitWebSocket.generate_type_field(
type="trade",
codes=currencies
)
print(type_field)
Result
{
"type": "trade",
"codes": ["KRW-BTC", "KRW-ETH"]
}
UpbitWebSocket.generate_type_field(type, codes, isOnlySnapshot=None, isOnlyRealtime=None)
staticmethod
Parameter | Description |
---|---|
type * | 수신할 시세 타입 (현재가: ticker , 체결: trade , 호가: orderbook ) |
codes * | 수신할 시세 종목 정보 (ex. ['KRW-BTC', 'KRW-ETH'] ) |
isOnlySnapshot | 시세 스냅샷만 제공 여부 (True , False ) |
isOnlyRealtime | 실시간 시세만 제공 여부 (True , False ) |
UpbitWebSocket.generate_orderbook_codes (Orderbook Codes Generate)
staticmethod
type
파라미터가 orderbook
일 경우에 필요한 codes
파라미터를 요청 형식에 맞춰 generate 합니다.
Example Code
from upbit.websocket import UpbitWebSocket
currencies = ['KRW-BTC', 'KRW-ETH']
counts = [5, 5]
codes = UpbitWebSocket.generate_orderbook_codes(
currencies=currencies,
counts=counts
)
print(codes)
Result
["KRW-BTC.5", "KRW-ETH.5"]
UpbitWebSocket.generate_orderbook_codes(currencies, counts=None)
Parameter | Description |
---|---|
currencies * | 수신할 시세 종목들 |
counts | 수신할 각 시세 종목에 대한 개수 |
UpbitWebSocket.generate_payload (Payload Generate)
staticmethod
웹 소켓 수신에 필요한 payload 데이터를 json 포맷 형식의 문자열로 generate 합니다.
Example Code
from upbit.websocket import UpbitWebSocket
codes = ['KRW-BTC', 'KRW-ETH', 'KRW-BCH', 'KRW-XRP']
counts = [1 for _ in range(len(codes))]
ord_codes = UpbitWebSocket.generate_orderbook_codes(
currencies=codes,
counts=counts
)
trade = UpbitWebSocket.generate_type_field(
type='trade',
codes=codes
)
orderbook = UpbitWebSocket.generate_type_field(
type='orderbook',
codes=ord_codes
)
type_fields = [trade, orderbook]
payload = UpbitWebSocket.generate_payload(
type_fields=type_fields,
format='SIMPLE'
)
print(payload)
Result
[
{
"ticket": "43552c23-6596-478d-8f71-b8289779a996"
},
{
"type": "trade",
"codes": ["KRW-BTC", "KRW-ETH", "KRW-BCH", "KRW-XRP"]
},
{
"type": "orderbook",
"codes": ["KRW-BTC.1", "KRW-ETH.1", "KRW-BCH.1", "KRW-XRP.1"]
},
{
"format": "SIMPLE"
}
]
UpbitWebSocket.generate_payload(type_fields, ticket=None, format='DEFAULT')
Parameter | Description |
---|---|
type_fields * | Type Fields |
ticket | 식별값 (기본값은 uuid4 형식으로 생성) |
format | 포맷, SIMPLE : 간소화된 필드명, DEFAULT : 기본 포맷 (생략 가능) |
웹 소켓으로 시세 정보 요청하기
웹 소켓을 통해 시세 정보를 요청합니다.
Example Code
import json
import asyncio
from upbit.websocket import UpbitWebSocket
# Definition async function
async def ticker(sock, payload):
async with sock as conn:
await conn.send(payload)
while True:
recv = await conn.recv()
data = recv.decode('utf8')
result = json.loads(data)
print(result)
sock = UpbitWebSocket()
currencies = ['KRW-BTC', 'KRW-ETH']
type_field = sock.generate_type_field(
type='ticker',
codes=currencies
)
payload = sock.generate_payload(
type_fields=[type_field]
)
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete( ticker(sock, payload) )
Result
{
"type": "ticker",
"code": "KRW-BTC",
"opening_price": 36408000.0,
"high_price": 38161000.0,
"low_price": 35907000.0,
"trade_price": 36784000.0,
"prev_closing_price": 36408000.0,
"acc_trade_price": 466420626861.1874,
"change": "RISE",
"change_price": 376000.0,
"signed_change_price": 376000.0,
"change_rate": 0.0103274006,
"signed_change_rate": 0.0103274006,
"ask_bid": "BID",
"trade_volume": 0.004996,
"acc_trade_volume": 12633.27063535,
"trade_date": "20210201",
"trade_time": "192943",
"trade_timestamp": 1612207783000,
"acc_ask_volume": 6355.28646728,
"acc_bid_volume": 6277.98416807,
"highest_52_week_price": 48550000.0,
"highest_52_week_date": "2021-01-08",
"lowest_52_week_price": 5489000.0,
"lowest_52_week_date": "2020-03-13",
"trade_status": null,
"market_state": "ACTIVE",
"market_state_for_ios": null,
"is_trading_suspended": false,
"delisting_date": null,
"market_warning": "NONE",
"timestamp": 1612207783496,
"acc_trade_price_24h": 503390500539.5724,
"acc_trade_volume_24h": 13650.71883738,
"stream_type": "SNAPSHOT"
},
{
"type": "ticker",
"code": "KRW-ETH",
"opening_price": 1444000.0,
"high_price": 1509500.0,
"low_price": 1413000.0,
"trade_price": 1444000.0,
"prev_closing_price": 1444000.0,
"acc_trade_price": 331846956832.1946,
"change": "EVEN",
"change_price": 0.0,
"signed_change_price": 0.0,
"change_rate": 0,
"signed_change_rate": 0,
"ask_bid": "ASK",
"trade_volume": 1.0,
"acc_trade_volume": 229202.315562,
"trade_date": "20210201",
"trade_time": "192925",
"trade_timestamp": 1612207765000,
"acc_ask_volume": 126760.03539062,
"acc_bid_volume": 102442.28017138,
"highest_52_week_price": 1626000.0,
"highest_52_week_date": "2021-01-25",
"lowest_52_week_price": 124350.0,
"lowest_52_week_date": "2020-03-13",
"trade_status": null,
"market_state": "ACTIVE",
"market_state_for_ios": null,
"is_trading_suspended": false,
"delisting_date": null,
"market_warning": "NONE",
"timestamp": 1612207765752,
"acc_trade_price_24h": 354570292652.8257,
"acc_trade_volume_24h": 244893.27187195,
"stream_type": "SNAPSHOT"
},
...
Request Parameters
Parameter | Description |
---|---|
payload | 포맷에 맞춰진 요청 데이터 |
Response
현재가(Ticker) 응답
필드명 | 축약형 (format: SIMPLE) | 내용 | 타입 | 값 |
---|---|---|---|---|
type | ty | 타입 | String | ticker : 현재가 |
code | cd | 마켓 코드 (ex. KRW-BTC) | String | - |
opening_price | op | 시가 | Double | - |
high_price | hp | 고가 | Double | - |
low_price | lp | 저가 | Double | - |
trade_price | tp | 현재가 | Double | - |
prev_closing_price | pcp | 전일 종가 | Double | |
change | c | 전일 대비 | String | RISE : 상승, EVEN : 보합, FALL : 하락 |
change_price | cp | 부호 없는 전일 대비 값 | Double | - |
signed_change_price | scp | 전일 대비 값 | Double | - |
change_rate | cr | 부호 없는 전일 대비 등락율 | Double | - |
signed_change_rate | scr | 전일 대비 등락율 | Double | - |
trade_volume | tv | 가장 최근 거래량 | Double | - |
acc_trade_volume | atv | 누적 거래량(UTC 0시 기준) | Double | - |
acc_trade_volume_24h | atv24h | 24시간 누적 거래량 | Double | - |
acc_trade_price | atp | 누적 거래대금(UTC 0시 기준) | Double | - |
acc_trade_price_24h | atp24h | 24시간 누적 거래대금 | Double | - |
trade_date | tdt | 최근 거래 일자(UTC) | String | yyyyMMdd |
trade_time | ttm | 최근 거래 시각(UTC) | String | HHmmss |
trade_timestamp | ttms | 체결 타임스탬프 (milliseconds) | Long | - |
ask_bid | ab | 매수/매도 구분 | String | ASK : 매도, BID : 매수 |
acc_ask_volume | aav | 누적 매도량 | Double | - |
acc_bid_volume | abv | 누적 매수량 | Double | - |
highest_52_week_price | h52wp | 52주 최고가 | Double | - |
highest_52_week_date | h52wdt | 52주 최고가 달성일 | String | yyyy-MM-dd |
lowest_52_week_price | l52wp | 52주 최저가 | Double | - |
lowest_52_week_date | l52wdt | 52주 최저가 달성일 | String | yyyy-MM-dd |
trade_status | ts | 거래상태 *deprecated | String | - |
market_state | ms | 거래상태 | String | PREVIEW : 입금지원, ACTIVE : 거래지원가능, DELISTED : 거래지원종료 |
market_state_for_ios | msfi | 거래 상태 *deprecated | String | - |
is_trading_suspended | its | 거래 정지 여부 | Boolean | - |
delisting_date | dd | 상장폐지일 | Date | - |
market_warning | mw | 유의 종목 여부 | String | NONE : 해당없음, CAUTION : 투자유의 |
timestamp | tms | 타임스탬프 (milliseconds) | Long | - |
stream_type | st | 스트림 타입 | String | SNAPSHOT : 스냅샷, REALTIME : 실시간 |
체결(Trade) 응답
필드명 | 축약형 (format: SIMPLE) | 내용 | 타입 | 값 |
---|---|---|---|---|
type | ty | 타입 | String | trade : 체결 |
code | cd | 마켓 코드 (ex. KRW-BTC) | String | - |
trade_price | tp | 체결 가격 | Double | - |
trade_volume | tv | 체결량 | Double | - |
ask_bid | ab | 매수/매도 구분 | String | ASK : 매도, BID : 매수 |
prev_closing_price | pcp | 전일 종가 | Double | - |
change | c | 전일 대비 | String | RISE : 상승, EVEN : 보합, FALL : 하락 |
change_price | cp | 부호 없는 전일 대비 값 | Double | - |
trade_date | td | 체결 일자(UTC 기준) | String | yyyy-MM-dd |
trade_time | ttm | 체결 시각(UTC 기준) | String | HH:mm:ss |
trade_timestamp | ttms | 체결 타임스탬프 (millisecond) | Long | - |
timestamp | tms | 타임스탬프 (millisecond) | Long | - |
sequential_id | sid | 체결 번호 (Unique) | Long | - |
stream_type | st | 스트림 타입 | String | SNAPSHOT : 스냅샷, REALTIME : 실시간 |
호가(Orderbook) 응답
필드명 | 축약형 (format: SIMPLE) | 내용 | 타입 | 값 |
---|---|---|---|---|
type | ty | 타입 | String | orderbook : 호가 |
code | cd | 마켓 코드 (ex. KRW-BTC) | String | - |
total_ask_size | tas | 호가 매도 총 잔량 | Double | - |
total_bid_size | tbs | 호가 매수 총 잔량 | Double | - |
orderbook_units | obu | 호가 | List of Objects | - |
ask_price | ap | 매도 호가 | Double | - |
bid_price | bp | 매수 호가 | Double | - |
ask_size | as | 매도 잔량 | Double | - |
bid_size | bs | 매수 잔량 | Double | - |
timestamp | tms | 타임스탬프 (millisecond) | Long | - |
Connection 관리 및 기타
Example Code
from upbit.websocket import UpbitWebSocket
sock = UpbitWebSocket()
pong = await sock.ping()
print(pong)
Result
{ "status": "UP" }
PING/PONG
업비트 OpenAPI WebSocket 서버는 2019년 3월 27일부터 안정적인 커넥션 관리와 유지를 위해 WebSocket PING/PONG Frame을 지원합니다. (참고 문서 : https://tools.ietf.org/html/rfc6455#section-5.5.2 )
Client to Server PING
- 서버에서는 기본적으로 아무런 데이터도 수/발신 되지 않은 채 약 120초가 경과하면 Idle Timeout으로 WebSocket Connection을 종료합니다.
- 이를 방지하기 위해 클라이언트에서 서버로 PING 메시지를 보내서 Connection을 유지하고, WebSocket 서버의 상태와 WebSocket Connection Status를 파악할 수 있습니다.
- 현재 업비트 OpenAPI WebSocket 서버에서는 PING Frame 수신 대응 준비가 되어있는 상황이며, 클라이언트에서 간단한 구현으로 PING 요청/PONG 응답(PING에 대한 응답 Frame)을 통해 서버의 상태를 파악할 수 있습니다.
WebSocket Compression
업비트 OpenAPI WebSocket 서버에서는 더 빠른 데이터 전송을 위해 WebSocket Compression을 제공하고 있습니다. (참고 문서 : https://tools.ietf.org/html/rfc7692 )
- WebSocket Compression을 지원하는 WebSocket 클라이언트 에서는, 각 클라이언트 별로 정해진 옵션을 활성화 하면 Compression 된 상태로 통신이 지속됩니다. 사용자의 코드 레벨에는 decompressed 상태의 raw data가 제공되기 때문에 사용자는 설정 옵션 활성화 외에 다른 대응 코드를 작성할 필요가 없습니다.
- WebSocket Compression을 지원하지 않는 WebSocket 클라이언트 에서는 해당 기능을 사용할 수 없으며, Raw JSON 형태의 데이터를 주고받게 됩니다. 해당 기능을 사용하기 위해서는 WebSocket Client 교체가 필요합니다.
Utils (유틸리티 모듈)
Validator
validate_price(price) 원화 마켓 주문 가격 단위
Example Code
from upbit.utils import Validator
price = 20007
valid = Validator.validate_price(price)
print(valid)
Result Example
20000.0
원화 마켓은 호가 별 주문 가격의 단위가 다릅니다. 아래 표를 참고하여 해당 단위로 주문하여 주세요.
최소 호가 (이상) | 최대 호가 (미만) | 주문 가격 단위 (원) |
---|---|---|
2,000,000 | - | 1,000 |
1,000,000 | 2,000,000 | 500 |
500,000 | 1,000,000 | 100 |
100,000 | 500,000 | 50 |
10,000 | 100,000 | 10 |
1,000 | 10,000 | 5 |
100 | 1,000 | 1 |
10 | 100 | 0.1 |
0 | 10 | 0.01 |
예를 들어, 호가가 20,000원
일 경우 19,950원
, 20,000원
, 20,050원
으로 주문을 넣을 수 있으며,
20,007원
, 20,105원
등의 가격으로는 주문이 불가능 합니다.
validate_price(price)
staticmethod
가격에 대한 값을 가격 단위에 맞춰 반환합니다.
Parameter | Description |
---|---|
price * | 가격 |
result
Parameter | Description |
---|---|
validated_price | 가격 단위에 맞춰진 가격 |
Errors
Response Example
{
"error": {
"message": "<오류에 대한 설명>",
"name": "<오류 코드>"
}
}
API 요청값이 유효하지 않거나 처리 중 오류가 발생한 경우, 다음과 같은 형태의 JSON body가 리턴됩니다.
에러 메시지 목록은 다음과 같습니다.
400 Bad Request
400 에러는 주로 파라미터 요청 값이 잘못된 경우가 많습니다. 본 문서를 참고하여 올바른 파라미터를 확인해주세요.
Error Code | Description |
---|---|
create_ask_error
create_bid_error |
주문 요청 정보가 올바르지 않습니다.
파라미터 값이 올바른지 확인해주세요. 특히, 시장가 주문임에도 가격을 입력하여 오류가 발생하는 경우가 많습니다. 주문하기 파라미터를 참고하세요. |
insufficient_funds_ask
insufficient_funds_bid |
매수/매도 가능 잔고가 부족합니다. |
under_min_total_ask
under_min_total_bid |
주문 요청 금액이 최소주문금액 미만입니다. |
withdraw_address_not_registerd |
허용되지 않은 출금 주소입니다.
허용 목록에 등록된 주소로만 출금이 가능합니다. |
validation_error |
잘못된 API 요청입니다.
누락된 파라미터가 없는지 확인해주세요. |
401 Unauthorized
401 Unauthorized 오류는 대부분 JWT 서명이 올바르게 되지 않았을 때 발생합니다.
Error Code | Description |
---|---|
invalid_query_payload |
JWT 헤더의 페이로드가 올바르지 않습니다.
서명에 사용한 페이로드 값을 확인해주세요. |
jwt_verification |
JWT 헤더 검증에 실패했습니다.
토큰이 올바르게 생성, 서명되었는지 확인해주세요. |
expired_access_key | API 키가 만료되었습니다. |
nonce_used |
이미 요청한 nonce값이 다시 사용되었습니다.
JWT 헤더 페이로드의 nonce 값은 매번 새로운 값을 사용해야합니다. |
no_authorization_i_p | 허용되지 않은 IP 주소입니다. |
out_of_scope | 허용되지 않은 기능입니다. |