BuyCrypt
Untuk pengembang bot

Hubungkan bot trading Anda. API Binance yang sama.

Jika bot Anda sudah mendukung Binance USD-M Futures, cukup ganti satu base URL dan Anda langsung live di BuyCrypt. Pengguna kami menemukan bot Anda di leaderboard, mencobanya di akun demo gratis $1,000, lalu naik ke API key asli begitu mereka yakin.

Tanpa perlu menulis ulang kode. Tanpa keanehan khusus exchange. Signing HMAC-SHA256 yang sama, WebSocket user-data stream yang sama, tipe order yang sama — semuanya dibungkus di atas demo trading engine kami sehingga pengguna bisa membandingkan bot tanpa mempertaruhkan modal riil.

Kenapa BuyCrypt

Distribusi demo-first untuk bot trading

Demo gratis $1,000 per pengguna

Setiap pengguna yang subscribe mendapat akun demo sendiri dengan saldo virtual $1,000. Bot Anda yang mentradingkannya. Mereka memantau PnL, drawdown, dan win rate secara live. Tanpa risiko terhadap modal riil mereka — dan tanpa biaya akuisisi bagi Anda.

Eksposur di leaderboard

Akun demo bot Anda sendiri muncul di leaderboard publik dengan badge 🤖 БОТ. Pengguna melihat peringkat PnL di antara trader sungguhan. Tap barisnya, tekan "Hubungkan" — subscription langsung aktif.

Tanpa perlu menulis ulang kode

Jika bot Anda menggunakan SDK Binance Futures apa pun (binance-connector-python, python-binance, CCXT, dll.), arahkan base_url-nya ke https://api.buycrypt.com/fapi. HMAC, recvWindow, tipe order — identik.

API key dikirim via webhook

Saat pengguna subscribe, kami mengirim (POST) API key + secret yang baru dibuat ke webhook URL Anda — ditandatangani HMAC, diulang otomatis jika gagal dengan exponential backoff, dan bisa dipulihkan lewat dead-letter. Anda tidak pernah perlu meminta kredensial dari pengguna.

Alur pengguna

Bagaimana pengguna menemukan dan subscribe ke bot Anda

1

Temukan

Pengguna membuka leaderboard. Akun bot Anda muncul dengan chip 🤖 БОТ di samping username, plus jumlah subscriber. Mereka tap barisnya.

2

Coba di demo

Di halaman profil bot, mereka melihat "Hubungkan ke akun demo". Satu tap membuat akun demo baru $1,000 untuk mereka, dan bot Anda langsung mulai trading di akun tersebut.

3

Pantau + putuskan

Pengguna memantau bot mentradingkan akun demo mereka selama beberapa hari atau minggu. PnL, posisi, win rate — semuanya live di aplikasi. Jika mereka suka, mereka memasukkan API key Binance asli mereka di BuyCrypt untuk upgrade dari demo ke produksi.

4

Naik level

Pengguna menambahkan API key Binance asli mereka di BuyCrypt. Kami mengirimkannya ke webhook Anda dengan cara yang sama seperti saat mengirim key demo — event subscription.created yang sama, hanya dengan kredensial produksi mereka. Satu integrasi mencakup alur demo maupun live.

Onboarding developer

Cara menambahkan bot Anda ke BuyCrypt

1

Daftar

Daftarkan akun BuyCrypt biasa — alurnya sama seperti pengguna lain. Anda akan langsung diberi akun demo gratis dengan saldo awal begitu mendaftar. Tanpa formulir aplikasi, tanpa antrean review.

2

Trading di akun demo via API

Generate API key langsung di aplikasi mobile BuyCrypt: My Profile → API keys → tap akun demo Anda → Generate. Anda akan mendapat apiKey + apiSecret baru yang ditampilkan sekali — salin ke bot Anda. Lalu arahkan bot Binance USD-M Futures yang sudah Anda miliki ke https://api.buycrypt.com/fapi dan langsung berfungsi — HMAC sama, endpoint sama, tipe order sama.

3

Otomatis ditandai sebagai bot

Begitu kami mendeteksi trading yang dijalankan via API di akun demo Anda, akun Anda otomatis ditandai sebagai bot. Demo Anda akan muncul di leaderboard dengan chip 🤖 БОТ dan profil publik, sehingga pengguna lain bisa menemukan dan subscribe ke bot Anda.

4

(Opsional) Terima subscriber via webhook

Saat Anda siap menerima subscriber, tambahkan webhook URL ke profil bot Anda di pengaturan. Setiap kali pengguna subscribe — baik dengan demo maupun key Binance asli — kami mengirim (POST) event subscription.created berisi API key + secret untuk akun pengguna tersebut. Simpan (userId, apiKey, apiSecret) dan mulai trading atas nama mereka.

Drop-in

Bot Binance Futures Anda yang sudah ada, tinggal pakai ulang

Sebagian besar SDK Binance Futures menerima base URL kustom. Berikut seluruh perubahan yang dibutuhkan bot Python pada umumnya:

# before — trading on real Binance
from binance.um_futures import UMFutures
client = UMFutures(key=API_KEY, secret=API_SECRET)

# after — trading on a BuyCrypt user's demo
from binance.um_futures import UMFutures
client = UMFutures(
    key=API_KEY,
    secret=API_SECRET,
    base_url="https://api.buycrypt.com/fapi",   # <- the only line that changes
)

# everything below is identical to your existing code
client.new_order(symbol="BTCUSDT", side="BUY", type="MARKET", quantity=0.01)
client.account()
client.cancel_open_orders(symbol="BTCUSDT")

CCXT, python-binance, go-binance milik Go, node-binance-api milik JS — semuanya bekerja dengan cara yang sama. Bot polos dengan requests.get(...).headers["X-MBX-APIKEY"] = key juga berfungsi; aturan signing HMAC identik byte demi byte.

Webhook

Bagaimana kami mengirim API key ke sistem Anda

Saat pengguna BuyCrypt subscribe ke bot Anda, kami membuat API key + secret per pengguna di sisi server dan mengirimkannya (POST) ke webhook URL yang terdaftar. Secret tidak pernah dikembalikan ke pengguna — hanya dikirim ke Anda, melalui HTTPS, dengan tanda tangan (signed).

TL;DR: sign up → tap «Generate API key» on your demo → generate a webhook secret → run one Python script → admin approves. ~5 minutes.

Step 1 — Sign up

Open buycrypt.com/terminal (or the mobile app). Sign in via Google or phone. A $1,000 USDT demo account is created automatically — that's the sandbox your bot will trade on.

Step 2 — Generate your trading API key (in the app)

In the app: Profile → API Keys → tap your demo account → «Bot API keys» → Generate. A dialog shows the apiKey + apiSecret once — copy both, you can't recover the secret afterwards.

# what you'll save
API_KEY    = "3fc370a4ac94b9aa756e2a97842dc04c"
API_SECRET = "3WJ86kV_VQzLWaED3hSRlY9R6wQHh_f3UEZ_q-CrwRU"

Same shape as Binance — your existing USD-M Futures bot library reads it as a regular Binance key with base URL https://api.buycrypt.com/fapi.

Step 3 — Generate your webhook signing secret

A second secret, separate from API_SECRET. We use it to sign the events we POST to your webhook URL — so you can verify the request really came from us. You generate it on your side; we encrypt-store it but never reveal back:

# any of these works — pick one. Save the output.
$ openssl rand -hex 32                          # macOS / Linux
$ python3 -c "import secrets; print(secrets.token_hex(32))"   # cross-platform

# sample output
8a31c2f4d5e6789abc01234567890def8a31c2f4d5e6789abc01234567890def

Step 4 — Register the bot (one signed POST)

Drop your three secrets into one signed POST. Save this as register_bot.py and run it once. Works on any OS with Python 3.10+ and pip install requests:

import hmac, hashlib, time, urllib.parse, requests

# ─── fill these in from steps 2 and 3 ─────────────────────
API_KEY        = "3fc370a4ac94b9aa756e2a97842dc04c"
API_SECRET     = "3WJ86kV_VQzLWaED3hSRlY9R6wQHh_f3UEZ_q-CrwRU"
WEBHOOK_SECRET = "8a31c2f4d5e6789abc01234567890def8a31c2f4d5e6789abc01234567890def"

SLUG         = "alpha-trader"                                # lowercase, [a-z0-9-], unique
DISPLAY_NAME = "Alpha Trader"                                # shown to users in the bot list
WEBHOOK_URL  = "https://your-bot.example.com/buycrypt/hook"   # MUST be HTTPS, public
# ──────────────────────────────────────────────────────────

params = {
    "slug":            SLUG,
    "displayName":     DISPLAY_NAME,
    "webhookUrl":      WEBHOOK_URL,
    "webhookSecret":   WEBHOOK_SECRET,
    "defaultLeverage": 10,
    "timestamp":       int(time.time() * 1000),
}
qs  = urllib.parse.urlencode(params)
sig = hmac.new(API_SECRET.encode(), qs.encode(), hashlib.sha256).hexdigest()

r = requests.post(
    "https://api.buycrypt.com/fapi/v1/bot/profiles",
    headers={
        "X-MBX-APIKEY":   API_KEY,
        "Content-Type":  "application/x-www-form-urlencoded",
    },
    data=qs + f"&signature={sig}",
)
print(r.status_code, r.json())

Notice no demoKeyPairId — your API_KEY already points to the demo it was generated for. Need to register against a different demo? Generate a separate API key for it (step 2 again).

Expected output:

201 {
  "botId": 42,
  "slug": "alpha-trader",
  "status": "PENDING_REVIEW",
  "webhookUrl": "https://your-bot.example.com/buycrypt/hook",
  "webhookStatus": "ACTIVE",
  "webhookSecretAutoGenerated": false
}

Common errors:

{"code":-2010, "msg":"Slug already in use."}                # pick another slug
{"code":-1102, "msg":"webhookSecret must be at least 32..."}  # too short — use 32+ chars
{"code":-1022, "msg":"Signature for this request is not valid."}  # API_SECRET wrong, or params order changed after signing
{"code":-1003, "msg":"Bot registration rate limit: 1 per hour..."}  # wait it out

Step 5 — Wait for approve, then receive events

Bot lands in PENDING_REVIEW. Our admin sees your request immediately and approves it. To check status anytime:

import hmac, hashlib, time, urllib.parse, requests

API_KEY    = "3fc370a4..."
API_SECRET = "3WJ86kV..."

qs  = urllib.parse.urlencode({"timestamp": int(time.time() * 1000)})
sig = hmac.new(API_SECRET.encode(), qs.encode(), hashlib.sha256).hexdigest()
r = requests.get(
    f"https://api.buycrypt.com/fapi/v1/bot/profiles?{qs}&signature={sig}",
    headers={"X-MBX-APIKEY": API_KEY},
)
print(r.json())   # [{"botId":42, "status":"ACTIVE", ...}] when approved

Once "status":"ACTIVE": every time a user subscribes we POST to your webhookUrl with the per-subscriber API key your bot will trade with. The events shape and a copy-paste signature-verification snippet are right below this section.

Lost your webhook secret? Pick a new one and rotate (same signing pattern as registration):

params = {
    "webhookSecret": NEW_SECRET,                     # or omit to get backend-generated
    "timestamp": int(time.time() * 1000),
}
qs  = urllib.parse.urlencode(params)
sig = hmac.new(API_SECRET.encode(), qs.encode(), hashlib.sha256).hexdigest()
requests.post(
    "https://api.buycrypt.com/fapi/v1/bot/profiles/42/webhook/rotate-secret",
    headers={"X-MBX-APIKEY": API_KEY,
             "Content-Type": "application/x-www-form-urlencoded"},
    data=qs + f"&signature={sig}",
)

Old secret invalid the second the new one saves. Rate limit: 10 rotations/hour per bot.

Webhook event shapes (what we POST to you)

subscription.created — pengguna baru saja subscribe

POST https://your-bot.example.com/buycrypt/hook
Content-Type: application/json
User-Agent:               BuyCrypt-Webhook/1.0
X-BuyCrypt-Event:         subscription.created
X-BuyCrypt-Delivery-Id:   7f3b2e8c-a4d1-4f12-93b8-0c1e9f8d2a4b   # dedup key — store + reject duplicates
X-BuyCrypt-Timestamp:     1745605200123   # ms epoch when payload was built
X-BuyCrypt-Signature:     5e8c2d…         # hex(HMAC-SHA256(webhookSecret, ts + "." + body))

{
  "event":        "subscription.created",
  "deliveryId":   "7f3b2e8c-a4d1-4f12-93b8-0c1e9f8d2a4b",
  "timestamp":    1745605200123,
  "data": {
    "subscriptionId":   42,
    "botProfileId":     7,
    "subscriberHandle": "user_fb_uid_a",
    "apiKey":           "3fc370a4ac94b9aa756e2a97842dc04c",
    "apiSecret":        "3WJ86kV_VQzLWaED3hSRlY9R6wQHh_f3UEZ_q-CrwRU",
    "demoKeyPairId":    9001,
    "initialBalance":   "1000.00000000",
    "permissions":      "READ_TRADE",
    "ipWhitelist":      "",
    "createdAt":        "2026-04-25T18:00:00Z"
  }
}

subscription.deleted — pengguna terputus, key dinonaktifkan

X-BuyCrypt-Event: subscription.disconnected

{
  "event":      "subscription.disconnected",
  "deliveryId": "…",
  "timestamp":  …,
  "data": {
    "subscriptionId":  42,
    "botProfileId":    7,
    "apiKey":          "3fc370a4…",
    "reason":          "USER_UNSUBSCRIBED",
    "disconnectedAt":  "2026-04-25T18:30:00Z"
  }
}

secret.regenerated — admin merotasi secret webhook Anda

X-BuyCrypt-Event: secret.regenerated

{
  "event":      "secret.regenerated",
  "deliveryId": "…",
  "timestamp":  …,
  "data": {
    "subscriptionId":       42,
    "apiKey":               "3fc370a4…",
    "newApiSecret":         "new_plaintext_keep_old_valid_24h",
    "oldSecretValidUntil":  "2026-04-26T18:00:00Z"
  }
}

Verify the signature (constant-time)

Use the raw request body bytes — DO NOT parse JSON first and re-serialize, you'll lose key order and signatures will diverge. Always compare in constant time.

# Python (FastAPI / Flask)
import hmac, hashlib, time

WEBHOOK_SECRET = "whsec_aGVsbG8gd29ybGQ_..."   # whsec_…43 chars

def verify(headers, body_bytes):
    sig = headers["X-BuyCrypt-Signature"]
    ts  = int(headers["X-BuyCrypt-Timestamp"])

    # anti-replay: reject if too old
    if abs(time.time() * 1000 - ts) > 5 * 60 * 1000:
        return False

    payload = f"{ts}.".encode() + body_bytes
    expected = hmac.new(WEBHOOK_SECRET.encode(), payload, hashlib.sha256).hexdigest()

    return hmac.compare_digest(expected, sig)
// Node.js / Express — read RAW body, not parsed JSON
const crypto = require('crypto');
const SECRET = 'whsec_aGVsbG8gd29ybGQ_...';

app.post('/buycrypt/hook',
  express.raw({ type: 'application/json' }),   // raw, not json()!
  (req, res) => {
    const sig = req.headers['x-buycrypt-signature'];
    const ts  = parseInt(req.headers['x-buycrypt-timestamp'], 10);

    if (Math.abs(Date.now() - ts) > 5 * 60 * 1000) return res.status(401).end();

    const expected = crypto.createHmac('sha256', SECRET)
      .update(`${ts}.`).update(req.body).digest('hex');

    if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig))) {
      return res.status(401).end();
    }
    // req.body is a Buffer here — JSON.parse(req.body.toString('utf8'))
    res.sendStatus(200);
});

Kebijakan retry

6 kali percobaan dengan exponential backoff: 1m, 5m, 30m, 2h, 6h, 12h. Setelah keenamnya gagal, event akan masuk ke tabel dead-letter kami dan admin bisa memutarnya ulang.

Nonaktif otomatis

Jika endpoint Anda gagal 10 kali berturut-turut, kami menandainya nonaktif dan berhenti mengirim event. Hubungi kami untuk mengaktifkannya kembali. Ini mencegah bot yang mati memblokir subscriber baru tanpa batas waktu.

Verifikasi signature

Setiap body ditandatangani HMAC-SHA256 dengan secret yang kami bagikan saat registrasi. Verifikasi dalam constant time sebelum mempercayai payload. Contoh tersedia di partner guide kami.

Cakupan API

Semua method Binance USD-M Futures yang kami dukung

Base URL: https://api.buycrypt.com/fapi. Auth: header X-MBX-APIKEY + signature HMAC-SHA256 pada endpoint yang di-sign. Recv window: default 5,000 ms, maksimum 60,000 ms.

Data pasar publik (tanpa auth)

GET
/v1/ping
Health check. Mengembalikan {}.
GET
/v1/time
Waktu server dalam ms — sinkronkan jam Anda untuk menghindari ketidakcocokan recvWindow.
GET
/v1/exchangeInfo
Simbol, filter, presisi, tingkatan leverage.
GET
/v1/ticker/price · /ticker/24hr · /ticker/bookTicker
Harga trade terakhir · statistik 24h · bid/ask terbaik.
GET
/v1/depth?symbol=&limit=
Snapshot order-book (limit ∈ {5,10,20,50,100,500,1000}).
GET
/v1/klines
Candlestick OHLCV untuk interval apa pun (1m, 5m, 1h, 4h, 1d).
GET
/v1/markPrice · /v1/fundingRate · /v1/premiumIndex
Mark price untuk kalkulasi likuidasi · riwayat funding · premium index.
GET
/v1/trades · /v1/aggTrades
Trade terbaru dan trade agregat.

Akun & posisi (signed)

GET
/v1/account · /v2/account · /v3/account
Snapshot akun lengkap — saldo, total margin, per-aset, posisi saat ini. Ketiga versi path mengembalikan payload yang sama (kompatibel Binance).
GET
/v2/balance · /v3/balance
Saldo wallet per-aset. Kami hanya mengeluarkan USDT.
GET
/v2/positionRisk · /v3/positionRisk
Posisi aktif dengan mark price, entry price, PnL belum terealisasi, dan harga likuidasi.
GET
/v1/userTrades · /v1/income · /v1/commissionRate · /v1/leverageBracket
Riwayat trade · income terealisasi · fee rate per-simbol · tingkatan leverage.

Trading (signed)

POST
/v1/order
Memasang order. Mendukung MARKET, LIMIT, STOP_MARKET, TAKE_PROFIT_MARKET, STOP, TAKE_PROFIT (varian limit), TRAILING_STOP_MARKET. Flag: reduceOnly, closePosition, timeInForce (GTC/IOC/FOK), newClientOrderId untuk idempotency, workingType, callbackRate.
GET
/v1/order
Query satu order berdasarkan orderId atau origClientOrderId.
DELETE
/v1/order
Membatalkan satu order.
DELETE
/v1/allOpenOrders?symbol=X
Membatalkan semua order terbuka pada satu simbol dalam satu panggilan.
GET
/v1/openOrders
Semua order yang sedang aktif (belum terisi, belum dibatalkan).
GET
/v1/allOrders
Riwayat order. Default menampilkan 500 terbaru.
POST
/v1/leverage · /v1/marginType · /v1/positionMargin
Mengatur leverage (1×–125×) · ISOLATED/CROSS · top up margin isolated.
GET
/v1/positionSide/dual
Flag hedge-mode. Untuk saat ini kami hanya mendukung one-way — mengembalikan {dualSidePosition: false}.

WebSocket user-data (private)

POST
/v1/listenKey
Membuat listenKey 60 menit. Gunakan untuk autentikasi handshake WS.
PUT
/v1/listenKey
Memperpanjang masa berlaku listenKey 60 menit lagi. Panggil setiap < 60 menit agar stream tetap aktif.
DELETE
/v1/listenKey
Menutup listenKey saat mematikan koneksi.
WS
wss://api.buycrypt.com/fapi/ws/<listenKey>
Push event untuk order, saldo, posisi: ORDER_TRADE_UPDATE, ACCOUNT_UPDATE, MARGIN_CALL. Bentuk payload sama seperti Binance.

WebSocket market-data (public)

WS
wss://api.buycrypt.com/fapi/stream?streams=btcusdt@trade/btcusdt@kline_1m
Subscription multi-stream. Mendukung pesan kontrol subscribe/unsubscribe/list_subscriptions — diteruskan langsung ke Binance upstream.
Limit & error

Rate limit dan kode error

Bucket per API-key

  • Weight: 2,400 / menit
  • Penempatan order: 300 / 10 detik
  • Signed read: 1,200 / menit
  • Header di setiap respons: X-MBX-USED-WEIGHT-1M, X-MBX-ORDER-COUNT-10S, Retry-After saat 429.

Kode error umum

  • -1003 Terlalu banyak request — mundur (back off) via Retry-After
  • -1021 Timestamp di luar recvWindow
  • -1022 Signature tidak valid
  • -1102 Parameter wajib tidak dikirim
  • -1116 Tipe order tidak valid
  • -2010 Order ditolak (saldo tidak cukup, dll.)
  • -2011 Order tidak dikenal
  • -2014 Format API-key tidak valid
  • -2015 API-key, IP, atau izin tidak valid
  • -2019 Margin tidak cukup

Siap menghubungkan bot Anda?

Tanpa formulir aplikasi, tanpa antrean review, tanpa biaya integrasi. Daftar seperti pengguna biasa, generate API key di aplikasi mobile, arahkan bot Anda ke https://api.buycrypt.com/fapi — itu saja seluruh proses onboarding-nya.