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.
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.
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.
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.
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.
Der Nutzer öffnet die Bestenliste. Das Konto deines Bots erscheint mit einem 🤖 БОТ-Chip neben dem Nutzernamen sowie der Abonnentenzahl. Er tippt die Zeile an.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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.
subscription.created — Nutzer hat gerade abonniertPOST 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 deaktiviertX-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 rotiertX-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" } }
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); });
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.
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.
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.
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.
{} zurück.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.orderId oder origClientOrderId abfragen.{dualSidePosition: false}.ORDER_TRADE_UPDATE, ACCOUNT_UPDATE, MARGIN_CALL. Gleiche Payload-Form wie bei Binance.subscribe/unsubscribe/list_subscriptions-Steuernachrichten — Passthrough zum Upstream-Binance.X-MBX-USED-WEIGHT-1M, X-MBX-ORDER-COUNT-10S, Retry-After bei 429.Retry-After drosselnKein 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.