只讀權限
API 不會替你下單,也不會接觸你的 Binance 憑證。
即時與補漏
SSE 收即時事件,REST events 用 after_event_id 補漏。
雙格式
bot 格式給程式交易,agent 格式給 AI Agent 讀取。
Authentication
API key 需要先在帳戶頁申請,等待管理員審核為 active。
每個 request 都帶 Bearer token。Key 只會顯示一次;如果遺失,請撤銷後重新申請。
Authorization: Bearer ls_live_xxxxxxxxxxxxxxxxx也支援 `X-Lunai-Api-Key` header,但建議優先使用 Authorization。
Endpoints
所有 v1 API 都是 read-only,且只會回傳你有訂閱權限的幣種。
GET https://selene.lunai.club/api/v1/me
GET https://selene.lunai.club/api/v1/subscriptions
GET https://selene.lunai.club/api/v1/signals/latest?limit=50&format=bot
GET https://selene.lunai.club/api/v1/signals/open?format=bot
GET https://selene.lunai.club/api/v1/signals/{signal_id}?format=agent
GET https://selene.lunai.club/api/v1/events?after_event_id={last_event_id}&format=bot
GET https://selene.lunai.club/api/v1/stream?format=botTrading Bot Format
適合完全由程式規則構建的本地自動交易工具。
使用 `event_id` 當作冪等鍵。你的 bot 每次處理事件前先檢查本地是否已處理過同一個 `event_id`,就能避免重複下單或重複撤單。
{
"schema_version": "v1",
"format": "trading_bot",
"event_id": "4b9c...",
"signal_id": "9d2a...",
"event_type": "new",
"status": "waiting",
"symbol": "TAO/USDT:USDT",
"binance_symbol": "TAOUSDT",
"timeframe": "1h",
"side": "long",
"entry": 253.344,
"tp": 259.64715,
"sl": 250.29048,
"tp_distance_pct": 2.488,
"sl_distance_pct": 1.205,
"rr": 2.065,
"event_time": "2026-06-14T15:00:00+00:00"
}AI Agent Format
適合讓 LLM / Agent 讀懂訊號目的與下一步行動。
GET /api/v1/events?format=agent
{
"schema_version": "v1-agent",
"format": "ai_agent",
"intent": "new_signal",
"action_hint": "prepare_or_place_entry_order",
"summary": "TAOUSDT LONG signal is waiting for entry...",
"dedupe_key": "4b9c...",
"canonical_signal": {
"binance_symbol": "TAOUSDT",
"side": "long",
"entry": 253.344,
"tp": 259.64715,
"sl": 250.29048
},
"risk_notes": ["Use event_id as the idempotency key..."]
}SSE 即時串流
適合長時間運行的 bot。斷線後請用 /events 補漏。
curl -N \
-H "Authorization: Bearer $LUNAI_API_KEY" \
"https://selene.lunai.club/api/v1/stream?format=bot"Python 範例
輪詢 events 是最穩的第一版接法。
import os
import requests
BASE = "https://selene.lunai.club"
KEY = os.environ["LUNAI_API_KEY"]
headers = {"Authorization": f"Bearer {KEY}"}
last_event_id = None
while True:
params = {"format": "bot", "limit": 100}
if last_event_id:
params["after_event_id"] = last_event_id
data = requests.get(f"{BASE}/api/v1/events", headers=headers, params=params, timeout=20).json()
for event in data["items"]:
# 1. check event["event_id"] in your local processed table
# 2. place / cancel / mark order according to event["event_type"]
print(event["event_type"], event["binance_symbol"], event["side"])
last_event_id = event["event_id"]Node.js 範例
適合放進自己的 worker 或交易服務。
const base = "https://selene.lunai.club";
const headers = { Authorization: `Bearer ${process.env.LUNAI_API_KEY}` };
const res = await fetch(`${base}/api/v1/signals/open?format=bot`, { headers });
const data = await res.json();
for (const signal of data.items) {
console.log(signal.binance_symbol, signal.event_type, signal.entry, signal.tp, signal.sl);
}訊號生命週期
請讓你的 bot 明確處理每一種 event_type。
new
等待進場,可掛 entry / TP / SL
entry
策略確認進場
tp
止盈結案
sl
止損結案
cancel
未進場前取消,應撤掉掛單
錯誤碼
API key 與會員權限會同時檢查。
401 Missing API key / Invalid API key
403 API key is not active / Member access is not active
404 Signal not found / Symbol is not available for this API key
422 Query or payload validation error