BuyCrypt
Für Bot-Entwickler

Verbinde deinen Trading-Bot. Dieselbe Binance-API.

Wenn dein Bot bereits Binance USD-M Futures spricht, tausche nur eine Basis-URL aus und er läuft auf BuyCrypt. Unsere Nutzer entdecken deinen Bot in der Bestenliste, testen ihn kostenlos mit einem $1.000-Demokonto und wechseln zu echten Keys, sobald sie überzeugt sind.

Kein Code-Rewrite. Keine börsenspezifischen Eigenheiten. Dieselbe HMAC-SHA256-Signierung, derselbe WebSocket-User-Data-Stream, dieselben Ordertypen — verpackt über unsere Demo-Trading-Engine, damit Nutzer Bots vergleichen können, ohne Kapital zu riskieren.

Warum BuyCrypt

Demo-first-Distribution für Trading-Bots

Kostenloses $1.000-Demokonto pro Nutzer

Jeder abonnierende Nutzer erhält ein eigenes Demokonto mit $1.000 virtuellem Guthaben. Dein Bot handelt damit. Sie beobachten live PnL, Drawdown, Win-Rate. Kein Risiko für ihr echtes Kapital — und keine Akquisekosten für dich.

Sichtbarkeit in der Bestenliste

Das Demokonto deines Bots erscheint in der öffentlichen Bestenliste mit einem 🤖 БОТ-Badge. Nutzer sehen das PnL-Ranking neben echten Tradern. Antippen, auf „Connect“ tippen — sofortiges Abo.

Kein Code-Rewrite

Wenn dein Bot ein beliebiges Binance-Futures-SDK nutzt (binance-connector-python, python-binance, CCXT usw.), richte dessen base_url auf https://api.buycrypt.com/fapi. HMAC, recvWindow, Ordertypen — identisch.

Per Webhook zugestellte Keys

Wenn sich ein Nutzer anmeldet, senden wir den frisch erzeugten API-Key + Secret per POST an deine Webhook-URL — HMAC-signiert, bei Fehlern mit exponentiellem Backoff wiederholt, per Dead-Letter wiederherstellbar. Du musst den Nutzer nie nach Zugangsdaten fragen.

Nutzer-Journey

Wie Nutzer deinen Bot entdecken und abonnieren

1

Entdecken

Der Nutzer öffnet die Bestenliste. Das Konto deines Bots erscheint mit einem 🤖 БОТ-Chip neben dem Nutzernamen sowie der Abonnentenzahl. Er tippt die Zeile an.

2

Demo testen

Auf der Profilseite des Bots sieht er „Mit Demokonto verbinden“. Ein Tap erstellt ein neues $1.000-Demokonto, und dein Bot beginnt darauf zu handeln.

3

Beobachten + entscheiden

Der Nutzer beobachtet, wie der Bot Tage oder Wochen lang mit seinem Demokonto handelt. PnL, Positionen, Win-Rate — alles live in der App. Gefällt es ihm, gibt er seinen echten Binance-API-Key in BuyCrypt ein, um von Demo auf Produktion zu upgraden.

4

Aufsteigen

Der Nutzer fügt seinen echten Binance-API-Key in BuyCrypt hinzu. Wir liefern ihn an deinen Webhook auf demselben Weg wie den Demo-Key — dasselbe subscription.created-Event, nur mit seinen Produktions-Zugangsdaten. Eine Integration deckt beide Flows ab — Demo und Live.

Entwickler-Onboarding

So fügst du deinen Bot BuyCrypt hinzu

1

Registrieren

Registriere ein reguläres BuyCrypt-Konto — derselbe Ablauf wie für jeden Nutzer. Du erhältst sofort bei der Anmeldung ein kostenloses Demokonto mit Startguthaben. Kein Bewerbungsformular, keine Prüf-Warteschlange.

2

Deine Demo per API handeln

Erzeuge API-Keys direkt in der BuyCrypt-Mobile-App: Mein Profil → API-Keys → Demokonto antippen → Generieren. Du erhältst einen frischen apiKey + apiSecret, einmalig angezeigt — kopiere sie in deinen Bot. Richte dann deinen bestehenden Binance-USD-M-Futures-Bot auf https://api.buycrypt.com/fapi — es funktioniert einfach, mit gleichem HMAC, gleichen Endpunkten, gleichen Ordertypen.

3

Automatisch als Bot markiert

Sobald wir API-gesteuerten Handel auf deinem Demokonto erkennen, wird dein Konto automatisch als Bot markiert. Deine Demo erscheint in der Bestenliste mit dem 🤖 БОТ-Chip und einem öffentlichen Profil, damit andere Nutzer ihn entdecken und abonnieren können.

4

(Optional) Abonnenten per Webhook annehmen

Wenn du bereit bist, Abonnenten anzunehmen, füge in den Einstellungen eine Webhook-URL zu deinem Bot-Profil hinzu. Jedes Mal, wenn ein Nutzer abonniert — ob mit Demo oder echten Binance-Keys — senden wir per POST ein subscription.created-Event mit dem API-Key + Secret für das Konto dieses Nutzers. Speichere (userId, apiKey, apiSecret) und beginne, in seinem Namen zu handeln.

Drop-in

Dein bestehender Binance-Futures-Bot, wiederverwendet

Die meisten Binance-Futures-SDKs akzeptieren eine benutzerdefinierte Basis-URL. Das ist die gesamte Änderung, die ein typischer Python-Bot braucht:

# 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, Gos go-binance, JS node-binance-api — alle funktionieren gleich. Einfache requests.get(...).headers["X-MBX-APIKEY"] = key-Bots funktionieren ebenfalls; die HMAC-Signierungsregel ist byte-identisch.

Webhook

So liefern wir API-Keys an dein System

Wenn ein BuyCrypt-Nutzer deinen Bot abonniert, erzeugen wir serverseitig einen API-Key + Secret pro Nutzer und senden diese per POST an deine registrierte Webhook-URL. Das Secret wird dem Nutzer nie angezeigt — es geht ausschließlich an dich, per HTTPS, signiert.

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 — Nutzer hat gerade abonniert

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 — Nutzer getrennt, Key deaktiviert

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 hat dein Webhook-Secret rotiert

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);
});

Wiederholungsrichtlinie

6 Versuche mit exponentiellem Backoff: 1 Min, 5 Min, 30 Min, 2 Std, 6 Std, 12 Std. Scheitern alle 6, landet das Event in unserer Dead-Letter-Tabelle, und ein Admin kann es erneut zustellen.

Automatische Deaktivierung

Schlägt dein Endpunkt 10 Mal in Folge fehl, markieren wir ihn als deaktiviert und stoppen den Versand von Events. Kontaktiere uns zur Reaktivierung. Das verhindert, dass ein toter Bot neue Abonnenten dauerhaft blockiert.

Signaturprüfung

Jeder Body ist HMAC-SHA256-signiert mit dem Secret, das wir bei der Registrierung geteilt haben. Prüfe es in konstanter Zeit, bevor du dem Payload vertraust. Beispiele in unserem Partner-Guide.

API-Umfang

Jede Binance-USD-M-Futures-Methode, die wir unterstützen

Basis-URL: https://api.buycrypt.com/fapi. Auth: X-MBX-APIKEY-Header + HMAC-SHA256-Signatur bei signierten Endpunkten. Recv Window: Standard 5.000 ms, max. 60.000 ms.

Öffentliche Marktdaten (keine Auth)

GET
/v1/ping
Health-Check. Gibt {} zurück.
GET
/v1/time
Serverzeit in ms — synchronisiere deine Uhr, um recvWindow-Fehlanpassungen zu vermeiden.
GET
/v1/exchangeInfo
Symbole, Filter, Präzision, Leverage-Stufen.
GET
/v1/ticker/price · /ticker/24hr · /ticker/bookTicker
Letzter Handelspreis · 24h-Statistiken · bester Bid/Ask.
GET
/v1/depth?symbol=&limit=
Orderbuch-Snapshot (limit ∈ {5,10,20,50,100,500,1000}).
GET
/v1/klines
OHLCV-Candlesticks für jedes Intervall (1m, 5m, 1h, 4h, 1d).
GET
/v1/markPrice · /v1/fundingRate · /v1/premiumIndex
Mark-Preis für Liquidations-Berechnung · Funding-Historie · Premium-Index.
GET
/v1/trades · /v1/aggTrades
Aktuelle Trades und aggregierte Trades.

Konto & Positionen (signiert)

GET
/v1/account · /v2/account · /v3/account
Vollständiger Konto-Snapshot — Guthaben, Gesamt-Margin, pro Asset, aktuelle Positionen. Alle drei Pfad-Versionen liefern denselben Payload (Binance-kompatibel).
GET
/v2/balance · /v3/balance
Wallet-Guthaben pro Asset. Wir liefern ausschließlich USDT.
GET
/v2/positionRisk · /v3/positionRisk
Aktive Positionen mit Mark-Preis, Einstiegspreis, unrealisiertem PnL, Liquidationspreis.
GET
/v1/userTrades · /v1/income · /v1/commissionRate · /v1/leverageBracket
Trade-Historie · realisiertes Einkommen · Gebührensatz pro Symbol · Leverage-Stufen.

Trading (signiert)

POST
/v1/order
Eine Order platzieren. Unterstützt MARKET, LIMIT, STOP_MARKET, TAKE_PROFIT_MARKET, STOP, TAKE_PROFIT (Limit-Variante), TRAILING_STOP_MARKET. Flags: reduceOnly, closePosition, timeInForce (GTC/IOC/FOK), newClientOrderId für Idempotenz, workingType, callbackRate.
GET
/v1/order
Eine einzelne Order per orderId oder origClientOrderId abfragen.
DELETE
/v1/order
Eine einzelne Order stornieren.
DELETE
/v1/allOpenOrders?symbol=X
Alle offenen Orders eines Symbols mit einem Aufruf stornieren.
GET
/v1/openOrders
Alle aktuell aktiven (nicht ausgeführten, nicht stornierten) Orders.
GET
/v1/allOrders
Order-Historie. Standardmäßig die letzten 500.
POST
/v1/leverage · /v1/marginType · /v1/positionMargin
Leverage festlegen (1×–125×) · ISOLATED/CROSS · isolierte Margin aufstocken.
GET
/v1/positionSide/dual
Hedge-Mode-Flag. Wir unterstützen aktuell nur One-Way — liefert {dualSidePosition: false}.

User-Data-WebSocket (privat)

POST
/v1/listenKey
Erzeugt einen 60-Minuten-listenKey. Damit authentifizierst du den WS-Handshake.
PUT
/v1/listenKey
Verlängert die listenKey-Lease um weitere 60 Minuten. Rufe sie alle < 60 Minuten auf, um den Stream am Leben zu halten.
DELETE
/v1/listenKey
Schließt den listenKey beim Herunterfahren.
WS
wss://api.buycrypt.com/fapi/ws/<listenKey>
Push-Events für Orders, Guthaben, Positionen: ORDER_TRADE_UPDATE, ACCOUNT_UPDATE, MARGIN_CALL. Gleiche Payload-Form wie bei Binance.

Market-Data-WebSocket (öffentlich)

WS
wss://api.buycrypt.com/fapi/stream?streams=btcusdt@trade/btcusdt@kline_1m
Multi-Stream-Abonnement. Unterstützt subscribe/unsubscribe/list_subscriptions-Steuernachrichten — Passthrough zum Upstream-Binance.
Limits & Fehler

Rate-Limits und Fehlercodes

Buckets pro API-Key

  • Weight: 2.400 / Minute
  • Orderplatzierung: 300 / 10 Sekunden
  • Signierte Reads: 1.200 / Minute
  • Header bei jeder Antwort: X-MBX-USED-WEIGHT-1M, X-MBX-ORDER-COUNT-10S, Retry-After bei 429.

Häufige Fehlercodes

  • -1003 Zu viele Anfragen — mit Retry-After drosseln
  • -1021 Zeitstempel außerhalb des recvWindow
  • -1022 Ungültige Signatur
  • -1102 Pflichtparameter nicht gesendet
  • -1116 Ungültiger Ordertyp
  • -2010 Order abgelehnt (unzureichendes Guthaben usw.)
  • -2011 Unbekannte Order
  • -2014 API-Key-Format ungültig
  • -2015 Ungültiger API-Key, IP oder Berechtigungen
  • -2019 Margin unzureichend

Bereit, deinen Bot anzubinden?

Kein Bewerbungsformular, keine Prüf-Warteschlange, keine Integrationsgebühren. Melde dich wie jeder Nutzer an, erzeuge API-Keys in der mobilen App, richte deinen Bot auf https://api.buycrypt.com/fapi — das ist das gesamte Onboarding.