バイナンス現物API(Spot API)入門の最短ルートは、APIキーとシークレットキーを準備した後、まず /api/v3/ping で接続を確認し、次に /api/v3/time でサーバー時刻を同期、最後に /api/v3/account(署名が必要なエンドポイント)で残高を取得して権限を確認することです。全行程は約 10分 で完了し、最初の注文まで到達できます。本記事では、各ステップの curl と Python の完全なサンプルコードを提供します。すべてのエンドポイントは https://api.binance.com の実際に運用されているアドレスを使用しています。APIキーをまだ準備していない方は、まず バイナンス公式サイト で KYC(本人確認)を完了させてください。アカウントをお持ちでない方は こちらから無料登録 いただけます。
一、Spot API のエンドポイント階層
バイナンス現物(Spot)REST API は、認証レベル に応じて以下の3つに分類されます:
| カテゴリ | エンドポイント例 | 署名要否 | ヘッダー要件 | 代表的な機能 |
|---|---|---|---|---|
| NONE | /api/v3/ping, /api/v3/time | 不要 | なし | サーバー時刻、システムステータス |
| MARKET_DATA | /api/v3/depth, /api/v3/klines | 不要 | なし | 相場、板情報、K線(ローソク足) |
| USER_DATA | /api/v3/account, /api/v3/order | 必要 | X-MBX-APIKEY + signature | 残高確認、注文照会 |
| TRADE | /api/v3/order (POST) | 必要 | X-MBX-APIKEY + signature | 新規注文 |
| USER_STREAM | /api/v3/userDataStream | APIキーのみ | X-MBX-APIKEY | WebSocket listenKey |
認証が必要なエンドポイント では、クエリパラメータの末尾に signature=<HMAC-SHA256 署名> を付与し、リクエストヘッダーに X-MBX-APIKEY を含める必要があります。
二、環境準備と接続テスト
1. 依存ライブラリのインストール
# Python 3.8以上
pip install requests python-dotenv
# または公式 SDK を使用
pip install python-binance
2. ベースURLの選択
バイナンス現物APIには5つのエンドポイントが提供されています。コード内では api.binance.com を優先し、失敗時に api-gcp.binance.com へフォールバックすることを推奨します:
ENDPOINTS = [
"https://api.binance.com", # デフォルト
"https://api-gcp.binance.com", # Google Cloud 経由
"https://api1.binance.com",
"https://api2.binance.com",
"https://api3.binance.com",
]
3. 最初の疎通確認:ping
curl -X GET "https://api.binance.com/api/v3/ping"
# {} が返ってくれば接続成功
4. サーバー時刻の同期
curl -X GET "https://api.binance.com/api/v3/time"
# {"serverTime":1713027384562}
ローカル時刻と serverTime の差が 1000ms を超えると、認証が必要なエンドポイントでエラー -1021 が発生します。自動売買サーバーでは必ず NTP 同期を有効にしてください。
三、口座残高の確認(署名が必要なエンドポイント)
以下は、署名、リトライ、タイムスタンプのオフセット処理を実装した Python のサンプルコードです:
import hmac, hashlib, time, requests
from urllib.parse import urlencode
API_KEY = "YOUR_API_KEY"
SECRET_KEY = "YOUR_SECRET_KEY"
BASE_URL = "https://api.binance.com"
def _sign(params: dict) -> dict:
params["timestamp"] = int(time.time() * 1000)
params["recvWindow"] = 5000
query = urlencode(params)
params["signature"] = hmac.new(
SECRET_KEY.encode(),
query.encode(),
hashlib.sha256
).hexdigest()
return params
def _request(method: str, path: str, params: dict = None, signed: bool = False):
params = params or {}
headers = {"X-MBX-APIKEY": API_KEY} if signed else {}
if signed:
params = _sign(params)
url = f"{BASE_URL}{path}"
r = requests.request(method, url, params=params, headers=headers, timeout=10)
r.raise_for_status()
return r.json()
def get_account():
return _request("GET", "/api/v3/account", signed=True)
# 呼び出し例
balances = get_account()["balances"]
non_zero = [b for b in balances if float(b["free"]) > 0]
for b in non_zero:
print(f"{b['asset']}: {b['free']} (ロック中 {b['locked']})")
レスポンスの例:
{
"makerCommission": 10,
"takerCommission": 10,
"canTrade": true,
"canWithdraw": true,
"canDeposit": true,
"accountType": "SPOT",
"balances": [
{"asset": "BTC", "free": "0.00123456", "locked": "0.00000000"},
{"asset": "USDT", "free": "128.45", "locked": "0.00"}
]
}
四、相場情報とK線の取得(公開エンドポイント)
相場情報のエンドポイントは署名が不要ですが、レート制限(ウェイト)があります:
def get_price(symbol: str) -> float:
r = _request("GET", "/api/v3/ticker/price", {"symbol": symbol})
return float(r["price"])
def get_depth(symbol: str, limit: int = 20) -> dict:
return _request("GET", "/api/v3/depth", {"symbol": symbol, "limit": limit})
def get_klines(symbol: str, interval: str = "1h", limit: int = 500):
return _request("GET", "/api/v3/klines", {
"symbol": symbol,
"interval": interval, # 1m, 5m, 15m, 1h, 4h, 1d
"limit": limit
})
print(get_price("BTCUSDT")) # 68420.12
パフォーマンスのヒント:単一の価格を確認する場合は /ticker/price(ウェイト1)を使用し、全ペアを確認する場合はループを回さず /ticker/24hr(ウェイト40)を使用することでウェイトを大幅に節約できます。
五、注文とキャンセル(TRADE エンドポイント)
現物注文のエンドポイントは POST /api/v3/order です。注文タイプ(type)によって必須パラメータが異なります:
1. 指値注文(LIMIT)
def place_limit_order(symbol: str, side: str, quantity: float, price: float):
return _request("POST", "/api/v3/order", {
"symbol": symbol,
"side": side, # BUY または SELL
"type": "LIMIT",
"timeInForce": "GTC", # GTC / IOC / FOK
"quantity": quantity,
"price": price,
}, signed=True)
order = place_limit_order("BTCUSDT", "BUY", 0.001, 60000.00)
print(order["orderId"], order["status"])
2. 成行注文(MARKET)
成行注文は 数量(quantity) または 合計金額(quoteOrderQty) で指定できます:
# BTC の数量を指定して購入(USDT が消費されます)
_request("POST", "/api/v3/order", {
"symbol": "BTCUSDT",
"side": "BUY",
"type": "MARKET",
"quantity": 0.001
}, signed=True)
# USDT の金額を指定して購入(滑り込み対策として一般的)
_request("POST", "/api/v3/order", {
"symbol": "BTCUSDT",
"side": "BUY",
"type": "MARKET",
"quoteOrderQty": 100 # 100 USDT 分の BTC を購入
}, signed=True)
3. 注文ステータスの照会
def get_order(symbol: str, order_id: int):
return _request("GET", "/api/v3/order", {
"symbol": symbol,
"orderId": order_id
}, signed=True)
status = get_order("BTCUSDT", 12345678)
# status["status"] は NEW / PARTIALLY_FILLED / FILLED / CANCELED / REJECTED など
4. キャンセル
def cancel_order(symbol: str, order_id: int):
return _request("DELETE", "/api/v3/order", {
"symbol": symbol,
"orderId": order_id
}, signed=True)
cancel_order("BTCUSDT", 12345678)
六、テストネットの活用(リスクなしでの検証)
バイナンスは独立した現物テストネット(Spot Testnet)を提供しており、無料でテストコインを受け取れます:
# テストネット設定
BASE_URL = "https://testnet.binance.vision"
# APIキーは testnet.binance.vision で別途登録が必要
テストネットでの注文、キャンセル、残高確認はメインネットの動作を完全にシミュレートしますが、価格は実際の市場とは同期していません。新しいコードは必ずテストネットで24時間以上稼働させてからメインネットに切り替えることを推奨します。
七、よくある質問 FAQ
Q1: 注文時に filter failure: LOT_SIZE というエラーが出ます。
A: 数量がその通貨ペアの stepSize(最小ステップ)に合っていません。例えば BTCUSDT の stepSize が 0.00001 の場合、0.000005 という数量は指定できません。/api/v3/exchangeInfo で各ペアの LOT_SIZE / MIN_NOTIONAL / PRICE_FILTER 規則を確認し、適切な四捨五入を行ってください。
Q2: 全オープンオーダーを一括キャンセルできますか?
A: はい。DELETE /api/v3/openOrders?symbol=BTCUSDT を呼び出すことで、その通貨ペアの未約定注文をすべてキャンセルできます(ウェイト1)。ただし、全通貨ペアを跨いだ一括キャンセルはできません。
Q3: 大量注文を一括で行うには?
A: 現物APIには標準のバッチ注文エンドポイントはありません。POST /api/v3/order を並列で呼び出す必要がありますが、10秒間に100注文まで という制限に注意してください(先物には最大5件まで一括注文できる /fapi/v1/batchOrders があります)。
Q4: SIDE と type でどのような注文戦略が可能ですか?
A: 主要なタイプとして LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT, TAKE_PROFIT, TAKE_PROFIT_LIMIT, LIMIT_MAKER があります。逆指値注文などでは stopPrice の指定が必要です。
Q5: 注文履歴が500件までしか返りません。
A: /api/v3/allOrders はデフォルトで500件を返します。startTime/endTime/fromId パラメータを使用してページネーションを行うことで、過去の全履歴を取得できます。頻繁なデータ取得が必要な場合は、WebSocket の userDataStream を使用してリアルタイムで注文変化を購読することを推奨します。
先物(Futures)API に関する詳細は、カテゴリナビ の「API連携」カテゴリから完全なリストをご覧ください。