| 항목 | 값 |
|---|---|
| 엔드포인트 | POST /v1/withdraws/coin |
| 기본 URL | https://api.bithumb.com |
| 인증 방식 | JWT (HS256) |
| Content-Type | application/json |
{
"currency": "USDT", // 출금할 화폐 코드
"net_type": "TRX", // 출금 네트워크
"amount": 3, // 출금 수량
"address": "TW123aADADA7yKCVA73nLMYQcQKRwSaf7cK", // 출금 주소
"exchange_name": "upbit", // 출금 거래소명
"receiver_type": "personal", // 수취인 타입 (personal/corporation)
"receiver_ko_name": "임현성", // 수취인 한글명 ⭐
"receiver_en_name": "IM HYEONSEONG" // 수취인 영문명 ⭐
}
⚠️ 중요: receiver_ko_name은 한글 그대로 사용해야 합니다! receiver_ko_name과 receiver_en_name은 시 띄어쓰기 관계 없이 출금 가능합니다.
payload = {
'access_key': api_key,
'nonce': str(uuid.uuid4()),
'timestamp': round(time.time() * 1000),
'query_hash': query_hash, # 출금 API만 필요
'query_hash_alg': 'SHA512' # 출금 API만 필요
}
# Raw 문자열 방식
requestBody = dict(**params)
query_parts = []
for key, value in requestBody.items():
query_parts.append(f"{key}={value}")
raw_query = "&".join(query_parts)
query = raw_query.encode('utf-8')
hash = hashlib.sha512()
hash.update(query)
query_hash = hash.hexdigest()
# URL 인코딩 방식 (공식 문서)
from urllib.parse import urlencode
query = urlencode(requestBody).encode()
# ❌ 한글이 %EC%9E%84... 로 변환됨
# ❌ 띄어쓰기가 + 로 변환됨
🚨 핵심 발견: 빗썸 API는 공식 문서와 달리 한글과 띄어쓰기를 URL 인코딩하면 안 됩니다!
| 구분 | 공식 문서 방식 | 실제 작동 방식 |
|---|---|---|
| 방식 | urlencode() 사용 |
Raw 문자열 직접 생성 |
| 한글 처리 | %EC%9E%84%ED%98%84%EC%84%B1 |
임현성 (원본 유지) |
| 띄어쓰기 | IM+HYEONSEONG |
IM HYEONSEONG (원본 유지) |
| 결과 | ❌ invalid_query_payload | ✅ 201 Success |
💡 핵심 포인트:
receiver_ko_name=임현성&receiver_en_name=IM HYEONSEONG
형태로 Raw 문자열을 만들어야 성공합니다!
# 헤더 설정
headers = {
'Authorization': f'Bearer {jwt_token}',
'Content-Type': 'application/json'
}
# 요청 데이터 (JSON 형태)
json_data = json.dumps(requestBody)
# POST 요청 전송
response = await client.post(
'https://api.bithumb.com/v1/withdraws/coin',
headers=headers,
data=json_data
)
{
"type": "withdraw",
"uuid": "2511231977",
"currency": "USDT",
"net_type": "TRX",
"state": "processing",
"created_at": "2025-08-07T03:24:31+09:00",
"amount": "3.000000",
"fee": "0.000000",
"krw_amount": "4176"
}
| 에러 | 원인 | 해결책 |
|---|---|---|
invalid_query_payload
|
한글/띄어쓰기 URL 인코딩 | Raw 문자열 방식 사용 |
request_fail수취인 정보 누락 |
수취인 정보 미포함 |
receiver_ko_name,receiver_en_name 추가
|
jwt_verification
|
잘못된 JWT 토큰 | API Key/Secret Key 확인 |
NotAllowIP
|
IP 미등록 | 빗썸에서 IP 화이트리스트 등록 |
🔧 디버깅 팁:
로그에서 Raw Query String과 JSON Data를 비교해보세요.
한글과 띄어쓰기가 동일하게 처리되어야 성공합니다!
urlencode() 대신 직접 문자열 조합
임현성 → 변환하지 않고 그대로
IM HYEONSEONG → + 변환 안 함