Raw .md Launch App

Developer Guide v2.0

Last updated: 2026-06-24 ยท BitUP Server v20+ ยท Swagger API โ†’

๐Ÿ“‘ Table of Contents

  1. Quick Start
  2. Architecture
  3. API Reference
  4. Strategy Registration
  5. Sending Signals
  6. Risk Controls
  7. Points & Billing
  8. Exchange Support
  9. Full Example
  10. Error Codes

1. Quick Start

You are the Developer, not the User

RoleWhat you do
You (Developer)Run strategy engine โ†’ analyze market โ†’ send trade signals
BitUP PlatformValidate signals โ†’ risk check โ†’ deduct points โ†’ execute trades
UsersSubscribe to your strategy โ†’ provide exchange API keys โ†’ auto copy-trade

3-Step Integration

Step 1: Register strategy on BitUP โ†’ get developerApiKey

Step 2: Users subscribe to your strategy โ†’ bind exchange API keys

Step 3: Your engine sends POST /api/v1/strategy/signal โ†’ BitUP executes trades

2. Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              Your Strategy Engine (Python/Node/Go)      โ”‚
โ”‚                                                       โ”‚
โ”‚  Market Data โ”€โ”€โ–ถ Strategy Logic โ”€โ”€โ–ถ POST /strategy/signalโ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ”‚ HTTPS + Bearer Token
                       โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  BitUP Platform (Java)                 โ”‚
โ”‚                                                      โ”‚
โ”‚  โ‘  Verify API Key โ†’ โ‘ก Find user binding               โ”‚
โ”‚  โ†’ โ‘ข Decrypt exchange key โ†’ โ‘ฃ Risk check              โ”‚
โ”‚  โ†’ โ‘ค Deduct points โ†’ โ‘ฅ Execute trade โ†’ โ‘ฆ Record order โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                              โ”‚
       โ–ผ                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ User A Binanceโ”‚  โ”‚ User B OKX   โ”‚  โ”‚ User C Hyper โ”‚
โ”‚ (User's own key)โ”‚  โ”‚ (User's own key)โ”‚  โ”‚ (User's own key)โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Key design: You never touch any user's exchange API keys. You only send signals like "User X buy BTC", and the platform executes with that user's own keys.

3. API Reference

ItemValue
Base URL (prod)https://bitup.ai/api/v1
AuthAuthorization: Bearer <developerApiKey>
Content-Typeapplication/json

3.1 Send Trade Signal

POST /api/v1/strategy/signal

Request Body

FieldTypeReqDescription
user_idLongYESTarget user ID
symbolStringYESTrading pair, e.g. BTCUSDT
actionStringYESBUY long / SELL close
quantityBigDecimalYESOrder quantity (base asset)
signal_idStringYESUnique signal ID, use UUID
order_typeStringNOMARKET (default) / LIMIT
priceBigDecimalNORequired for LIMIT orders
leverageIntegerNOLeverage, default 1
take_profitBigDecimalNOTake profit price
stop_lossBigDecimalNOStop loss price

Example

POST /api/v1/strategy/signal
Authorization: Bearer sk-your-api-key

{
    "user_id": 26,
    "symbol": "BTCUSDT",
    "action": "BUY",
    "quantity": 0.01,
    "signal_id": "550e8400-e29b-41d4-a716-446655440000",
    "order_type": "MARKET",
    "stop_loss": 61000
}

Success Response (200)

{
    "code": 200,
    "message": "success",
    "data": {
        "status": "ACCEPTED",
        "exchange_order_id": "binance-order-12345",
        "order_status": "FILLED",
        "points_before": 1500,
        "points_after": 1499,
        "signal_id": 42
    }
}

3.2 Query My Strategies

GET /api/v1/developer/strategies

3.3 Signal Status

StatusMeaning
ACCEPTEDSignal received, executing
PENDINGWaiting for exchange response
FILLEDOrder fully filled
REJECTEDRejected by risk check

4. Strategy Registration

4.1 Via Web UI

Login โ†’ Developer Center โ†’ Register Strategy โ†’ Submit for review โ†’ Get developerApiKey

4.2 Strategy Categories

Codeไธญๆ–‡Description
TREND_FOLLOWING่ถ‹ๅŠฟ่ทŸ่ธชFollow the trend, buy high sell higher
MEAN_REVERSIONๅ‡ๅ€ผๅ›žๅฝ’Price reverts to mean after deviation
MOMENTUMๅŠจ้‡็ญ–็•ฅStrong gets stronger, weak gets weaker
GRID็ฝ‘ๆ ผไบคๆ˜“Buy low sell high within range
ARBITRAGEๅฅ—ๅˆฉ็ญ–็•ฅCross-exchange / funding rate arbitrage
ML_AIๆœบๅ™จๅญฆไน AI model prediction
MULTI_FACTORๅคšๅ› ๅญMulti-indicator scoring
CUSTOM่‡ชๅฎšไน‰Other custom strategies

5. Sending Signals

5.1 Signal Flow

Your Engine              BitUP Platform
    โ”‚                        โ”‚
    โ”‚ โ‘  POST /strategy/signalโ”‚
    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚
    โ”‚                        โ”‚ โ‘ก Verify API Key
    โ”‚                        โ”‚ โ‘ข Find user binding
    โ”‚                        โ”‚ โ‘ฃ Risk check
    โ”‚                        โ”‚ โ‘ค Deduct 1 point
    โ”‚                        โ”‚ โ‘ฅ Execute trade
    โ”‚ โ‘ฆ Return result        โ”‚
    โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
    โ”‚ {status: "ACCEPTED"}   โ”‚

5.2 Signal Deduplication

signal_id is globally unique. Duplicate IDs are rejected:

{ "code": 4004, "message": "ไฟกๅทID้‡ๅค" }

5.3 Python Client

import requests, uuid

class BitUPClient:
    def __init__(self, api_key, base_url="https://bitup.ai/api/v1"):
        self.api_key = api_key
        self.base_url = base_url

    def send_signal(self, user_id, symbol, action, quantity, **kwargs):
        payload = {
            "user_id": user_id, "symbol": symbol,
            "action": action, "quantity": quantity,
            "signal_id": str(uuid.uuid4()),
            "order_type": kwargs.get("order_type", "MARKET"),
            "leverage": kwargs.get("leverage", 1),
        }
        if "stop_loss" in kwargs: payload["stop_loss"] = kwargs["stop_loss"]
        if "take_profit" in kwargs: payload["take_profit"] = kwargs["take_profit"]

        resp = requests.post(
            f"{self.base_url}/strategy/signal",
            headers={"Authorization": f"Bearer {self.api_key}"},
            json=payload
        )
        return resp.json()

    def broadcast(self, user_ids, symbol, action, quantity, **kwargs):
        """Send same signal to multiple users"""
        return [{"user_id": uid, "result": self.send_signal(uid, symbol, action, quantity, **kwargs)}
                for uid in user_ids]

# Usage
client = BitUPClient("sk-your-api-key")
result = client.send_signal(26, "BTCUSDT", "BUY", 0.01, stop_loss=61000)
print(result["data"]["status"])  # "ACCEPTED"

5.4 Node.js Client

import crypto from 'crypto';

class BitUPClient {
    constructor(apiKey, baseUrl = 'https://bitup.ai/api/v1') {
        this.apiKey = apiKey; this.baseUrl = baseUrl;
    }

    async sendSignal({ userId, symbol, action, quantity, orderType = 'MARKET', stopLoss, takeProfit, leverage = 1 }) {
        const payload = {
            user_id: userId, symbol, action, quantity,
            signal_id: crypto.randomUUID(), order_type: orderType, leverage,
            ...(stopLoss && { stop_loss: stopLoss }),
            ...(takeProfit && { take_profit: takeProfit }),
        };
        const resp = await fetch(`${this.baseUrl}/strategy/signal`, {
            method: 'POST',
            headers: { Authorization: `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' },
            body: JSON.stringify(payload),
        });
        return resp.json();
    }
}

6. Risk Controls

CheckRuleRejection Status
Daily Loss LimitCumulative daily PnL โ‰ค user limitREJECTED
Position LimitSingle symbol position โ‰ค user limitREJECTED
Leverage LimitSignal leverage โ‰ค strategy maxREJECTED
Strategy StatusStrategy ACTIVE, binding RUNNINGREJECTED
API Key ValidityUser's exchange key workingREJECTED
Points BalanceUser points โ‰ฅ 1REJECTED

7. Points & Billing

User subscribes โ†’ spends subscriptionPoints (e.g. 500 points)
         โ†“
Each signal executes โ†’ deducts 1 point
         โ†“
Points go to strategy developer
         โ†“
Developer can withdraw points as USDT (min 50 USDT)

8. Exchange Support

ExchangeCodeTypeSymbol Format
BinanceBINANCESpotBTCUSDT
OKXOKXSpotBTC-USDT
HyperLiquidHYPERLIQUIDPerpetualBTC
MT5MT5Forex/Gold/OilXAUUSD, US30

API Key Permissions Required

ExchangeRequired
BinanceEnable Spot Trading, DISABLE Withdrawal
OKXEnable Trading, DISABLE Withdrawal
HyperLiquidEnable Trading

9. Full Example: SMA Crossover Strategy

"""
BTC Dual Moving Average Strategy
- Short MA crosses above Long MA โ†’ BUY
- Short MA crosses below Long MA โ†’ SELL
"""
import time, uuid, requests
from collections import deque

API_KEY = "sk-your-api-key"
BASE = "https://bitup.ai/api/v1"
USERS = [26, 30, 40]  # Subscribed user IDs

class SMACrossover:
    def __init__(self, symbol="BTCUSDT", short=5, long=20):
        self.symbol = symbol
        self.short, self.long = short, long
        self.prices = deque(maxlen=long + 1)
        self.positions = {}  # user_id โ†’ has_position

    def update(self, price): self.prices.append(price)

    def should_buy(self):
        if len(self.prices) < self.long: return False
        s1 = sum(list(self.prices)[-self.short:]) / self.short
        l1 = sum(list(self.prices)[-self.long:]) / self.long
        s0 = sum(list(self.prices)[-self.short-1:-1]) / self.short
        l0 = sum(list(self.prices)[-self.long-1:-1]) / self.long
        return s0 <= l0 and s1 > l1  # Golden cross

    def should_sell(self):
        if len(self.prices) < self.long: return False
        s1 = sum(list(self.prices)[-self.short:]) / self.short
        l1 = sum(list(self.prices)[-self.long:]) / self.long
        s0 = sum(list(self.prices)[-self.short-1:-1]) / self.short
        l0 = sum(list(self.prices)[-self.long-1:-1]) / self.long
        return s0 >= l0 and s1 < l1  # Death cross

    def send(self, uid, action, qty=0.01):
        r = requests.post(f"{BASE}/strategy/signal",
            headers={"Authorization": f"Bearer {API_KEY}"},
            json={"user_id": uid, "symbol": self.symbol,
                  "action": action, "quantity": qty,
                  "signal_id": str(uuid.uuid4())})
        data = r.json()
        ok = data["code"] == 200
        print(f"{'โœ…' if ok else 'โŒ'} User {uid} {action} โ†’ {data.get('message','')}")
        if ok: self.positions[uid] = (action == "BUY")

    def run(self):
        while True:
            price = self.get_price()  # TODO: real API
            self.update(price)
            if self.should_buy():
                for uid in USERS:
                    if not self.positions.get(uid): self.send(uid, "BUY")
            elif self.should_sell():
                for uid in USERS:
                    if self.positions.get(uid): self.send(uid, "SELL")
            time.sleep(60)

    def get_price(self): return 65000.0  # Replace with API

if __name__ == "__main__":
    SMACrossover().run()

10. Error Codes

CodeMessageAction
200Success-
401Invalid API KeyCheck developerApiKey
4003Strategy API Key invalidCheck strategy status
4004Duplicate signal IDGenerate new UUID
2001User points insufficientSignal rejected, no deduction
5001Daily loss limit reachedWait for next day
5002Position limit exceededReduce quantity
4001Strategy not foundCheck review status
4002Strategy not activeWait for approval