Інтеграція бота з API Bitget
Bitget надає REST та WebSocket API для spot, futures та copy-trading. Ключова особливість: активний фокус на copy trading — у них є спеціальний API для trader profiles та управління followers.
Аутентифікація Bitget
Bitget використовує HMAC-SHA256 з timestamp + method + path + body:
import hmac
import hashlib
import base64
import time
import json
import httpx
class BitgetClient:
BASE_URL = "https://api.bitget.com"
def __init__(self, api_key: str, secret_key: str, passphrase: str):
self.api_key = api_key
self.secret_key = secret_key
self.passphrase = passphrase # Bitget вимагає passphrase на відміну від Bybit
def _sign(self, timestamp: str, method: str, path: str, body: str = "") -> str:
prehash = timestamp + method.upper() + path + body
signature = hmac.new(
self.secret_key.encode('utf-8'),
prehash.encode('utf-8'),
hashlib.sha256
).digest()
return base64.b64encode(signature).decode()
def _get_headers(self, method: str, path: str, body: str = "") -> dict:
timestamp = str(int(time.time() * 1000))
return {
"ACCESS-KEY": self.api_key,
"ACCESS-SIGN": self._sign(timestamp, method, path, body),
"ACCESS-TIMESTAMP": timestamp,
"ACCESS-PASSPHRASE": self.passphrase,
"Content-Type": "application/json",
"locale": "en-US"
}
Базові торговельні операції
async def place_spot_order(
self,
symbol: str, # 'BTCUSDT_SPBL'
side: str, # 'buy' або 'sell'
order_type: str, # 'limit' або 'market'
size: str, # кількість
price: str = None
) -> dict:
path = "/api/spot/v1/trade/orders"
payload = {
"symbol": symbol,
"side": side,
"orderType": order_type,
"force": "normal", # GTC
"size": size
}
if price:
payload["price"] = price
body = json.dumps(payload)
headers = self._get_headers("POST", path, body)
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.BASE_URL}{path}",
content=body,
headers=headers
)
return response.json()
async def get_account_info(self) -> dict:
path = "/api/spot/v1/account/assets"
headers = self._get_headers("GET", path)
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.BASE_URL}{path}",
headers=headers
)
return response.json()
Futures API (Mix)
Bitget називає futures API "Mix". Для USDT-M perpetuals:
async def place_futures_order(
self,
symbol: str, # 'BTCUSDT_UMCBL'
side: str, # 'open_long', 'open_short', 'close_long', 'close_short'
order_type: str, # 'limit' або 'market'
size: str, # кількість контрактів
price: str = None,
margin_mode: str = 'crossed' # 'crossed' або 'fixed'
) -> dict:
path = "/api/mix/v1/order/placeOrder"
payload = {
"symbol": symbol,
"marginCoin": "USDT",
"size": size,
"side": side,
"orderType": order_type,
"marginMode": margin_mode
}
if price:
payload["price"] = price
body = json.dumps(payload)
headers = self._get_headers("POST", path, body)
async with httpx.AsyncClient() as client:
response = await client.post(f"{self.BASE_URL}{path}", content=body, headers=headers)
return response.json()
WebSocket підписки
class BitgetWebSocket:
WS_URL = "wss://ws.bitget.com/spot/v1/stream"
async def subscribe_ticker(self, symbols: list[str]):
async with websockets.connect(self.WS_URL) as ws:
sub_args = [{"instType": "sp", "channel": "ticker", "instId": s} for s in symbols]
await ws.send(json.dumps({"op": "subscribe", "args": sub_args}))
# Keepalive ping кожні 30 секунд
async def ping():
while True:
await asyncio.sleep(30)
await ws.send("ping")
asyncio.create_task(ping())
async for message in ws:
if message == "pong":
continue
data = json.loads(message)
if "data" in data:
await self.on_ticker(data)
Символи та формати
Bitget використовує нестандартні формати символів:
| Тип | Формат | Приклад |
|---|---|---|
| Spot | {BASE}{QUOTE}_SPBL |
BTCUSDT_SPBL |
| USDT-M Futures | {BASE}{QUOTE}_UMCBL |
BTCUSDT_UMCBL |
| Inverse Futures | {BASE}USD_DMCBL |
BTCUSD_DMCBL |
Ця особливість — перше з чим ви стикаєтесь при інтеграції. Bitget sandbox доступна за https://api-sandbox.bitget.com — ідентичний production API з тестовими коштами.
Документація: bitget.com/api-doc. Офіційний Python SDK: pip install pybitget. Для production рекомендуємо офіційний SDK як wrapper — він уже обробляє підпис та базову логіку повторних спроб.







