Se seu bot já fala a linguagem Binance USD-M Futures, basta trocar uma base URL e você já está ativo na BuyCrypt. Nossos usuários descobrem seu bot no leaderboard, testam em uma conta demo grátis de $1.000 e evoluem para chaves reais quando se convencem.
Sem reescrever código. Sem peculiaridades específicas de exchange. Mesma assinatura HMAC-SHA256, mesmo stream de WebSocket de dados do usuário, mesmos tipos de ordem — tudo envolto pelo nosso mecanismo de trading demo para que os usuários possam comparar bots sem colocar capital em risco.
Cada usuário que assina recebe sua própria conta demo com saldo virtual de $1.000. Seu bot opera nela. Eles acompanham PnL, drawdown e win rate ao vivo. Sem risco ao capital real deles — e sem custo de aquisição para você.
A própria conta demo do seu bot aparece no leaderboard público com um selo 🤖 BOT. Os usuários veem o ranking de PnL entre traders reais. Basta tocar na linha e clicar em "Conectar" — assinatura instantânea.
Se seu bot usa qualquer SDK de Binance Futures (binance-connector-python, python-binance, CCXT, etc.), aponte seu base_url para https://api.buycrypt.com/fapi. HMAC, recvWindow, tipos de ordem — idênticos.
Quando um usuário assina, enviamos via POST a API key + secret recém-gerada para a sua URL de webhook — assinado com HMAC, com nova tentativa em caso de falha com backoff exponencial, recuperável via dead-letter. Você nunca precisa pedir credenciais ao usuário.
O usuário abre o leaderboard. A conta do seu bot aparece com um chip 🤖 BOT ao lado do nome de usuário, mais a contagem de assinantes. Ele toca na linha.
Na página de perfil do bot, ele vê "Conectar à conta demo". Um toque cria uma nova demo de $1.000 para ele e seu bot começa a operar nela.
O usuário observa o bot operar sua demo por dias ou semanas. PnL, posições, win rate — tudo ao vivo no app. Se gostar, ele insere sua chave de API real da Binance dentro da BuyCrypt para atualizar de demo para produção.
O usuário adiciona sua chave de API real da Binance dentro da BuyCrypt. Nós a entregamos ao seu webhook da mesma forma que entregamos a chave demo — mesmo evento subscription.created, apenas com as credenciais de produção dele. Uma única integração cobre os fluxos demo e ao vivo.
Registre uma conta BuyCrypt comum — o mesmo fluxo de qualquer usuário. Você receberá uma conta demo grátis com saldo inicial no momento do cadastro. Sem formulário de inscrição, sem fila de revisão.
Gere chaves de API direto no app mobile da BuyCrypt: Meu Perfil → Chaves de API → toque na sua conta demo → Gerar. Você receberá uma nova apiKey + apiSecret exibidas uma única vez — copie-as para o seu bot. Depois aponte seu bot Binance USD-M Futures existente para https://api.buycrypt.com/fapi e ele simplesmente funciona — mesmo HMAC, mesmos endpoints, mesmos tipos de ordem.
Assim que detectamos negociação orientada por API na sua demo, sua conta é automaticamente marcada como um bot. Sua demo aparece no leaderboard com o chip 🤖 BOT e um perfil público, para que outros usuários possam descobri-la e assiná-la.
Quando estiver pronto para aceitar assinantes, adicione uma URL de webhook ao perfil do seu bot nas configurações. Toda vez que um usuário assinar — na demo ou com chaves reais da Binance — enviamos via POST um evento subscription.created com a API key + secret daquela conta. Armazene (userId, apiKey, apiSecret) e comece a operar em nome dele.
A maioria dos SDKs de Binance Futures aceita uma base URL personalizada. Aqui está toda a mudança que um bot típico em Python precisa:
# 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, o go-binance em Go, o node-binance-api em JS — todos funcionam da mesma forma. Bots simples com requests.get(...).headers["X-MBX-APIKEY"] = key também funcionam; a regra de assinatura HMAC é idêntica byte a byte.
Quando um usuário da BuyCrypt assina seu bot, geramos uma API key + secret por usuário no servidor e enviamos via POST para a URL de webhook registrada. O secret nunca é retornado ao usuário — ele vai apenas para você, via HTTPS, assinado.
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 — usuário acabou de assinarPOST 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 — usuário desconectou, chave desativadaX-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 rotacionou o secret do seu webhookX-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 tentativas com backoff exponencial: 1m, 5m, 30m, 2h, 6h, 12h. Após as 6 falharem, o evento cai na nossa tabela dead-letter e um admin pode reenviá-lo.
Se seu endpoint falhar 10 vezes seguidas, nós o marcamos como desativado e paramos de enviar eventos. Entre em contato conosco para reativá-lo. Isso evita que um bot inativo bloqueie novos assinantes indefinidamente.
Todo corpo é assinado com HMAC-SHA256 usando o secret que compartilhamos no cadastro. Verifique em tempo constante antes de confiar no payload. Exemplos no nosso guia para parceiros.
Base URL: https://api.buycrypt.com/fapi. Autenticação: cabeçalho X-MBX-APIKEY + assinatura HMAC-SHA256 nos endpoints assinados. Recv window: 5.000 ms por padrão, 60.000 ms no máximo.
{}.MARKET, LIMIT, STOP_MARKET, TAKE_PROFIT_MARKET, STOP, TAKE_PROFIT (tipo limite), TRAILING_STOP_MARKET. Flags: reduceOnly, closePosition, timeInForce (GTC/IOC/FOK), newClientOrderId para idempotência, workingType, callbackRate.orderId ou origClientOrderId.{dualSidePosition: false}.ORDER_TRADE_UPDATE, ACCOUNT_UPDATE, MARGIN_CALL. Mesmo formato de payload da Binance.subscribe/unsubscribe/list_subscriptions — passthrough para a Binance upstream.X-MBX-USED-WEIGHT-1M, X-MBX-ORDER-COUNT-10S, Retry-After em caso de 429.Retry-AfterSem formulário de inscrição, sem fila de revisão, sem taxas de integração. Cadastre-se como qualquer usuário, gere chaves de API no app mobile, aponte seu bot para https://api.buycrypt.com/fapi — esse é todo o onboarding.