BuyCrypt
Para desenvolvedores de bots

Conecte seu bot de trading. A mesma API da Binance.

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.

Por que a BuyCrypt

Distribuição demo-first para bots de trading

Demo grátis de $1.000 por usuário

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ê.

Exposição no leaderboard

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.

Zero reescrita de código

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.

Chaves entregues via webhook

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.

Jornada do usuário

Como os usuários descobrem e assinam seu bot

1

Descobrir

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.

2

Testar na demo

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.

3

Observar e decidir

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.

4

Evoluir

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.

Onboarding do desenvolvedor

Como adicionar seu bot à BuyCrypt

1

Cadastre-se

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.

2

Opere sua demo via API

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.

3

Marcado como bot automaticamente

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.

4

(Opcional) Aceite assinantes via webhook

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.

Drop-in

Seu bot de Binance Futures existente, reutilizado

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.

Webhook

Como entregamos as chaves de API ao seu sistema

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.

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 — usuário acabou de assinar

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 — usuário desconectou, chave desativada

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 rotacionou o secret do seu webhook

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

Política de nova tentativa

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.

Desativação automática

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.

Verificação de assinatura

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.

Superfície da API

Todos os métodos de Binance USD-M Futures que suportamos

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.

Dados públicos de mercado (sem autenticação)

GET
/v1/ping
Verificação de saúde. Retorna {}.
GET
/v1/time
Horário do servidor em ms — sincronize seu relógio para evitar incompatibilidades de recvWindow.
GET
/v1/exchangeInfo
Símbolos, filtros, precisão, faixas de alavancagem.
GET
/v1/ticker/price · /ticker/24hr · /ticker/bookTicker
Último preço negociado · estatísticas de 24h · melhor bid/ask.
GET
/v1/depth?symbol=&limit=
Snapshot do order book (limit ∈ {5,10,20,50,100,500,1000}).
GET
/v1/klines
Candlesticks OHLCV para qualquer intervalo (1m, 5m, 1h, 4h, 1d).
GET
/v1/markPrice · /v1/fundingRate · /v1/premiumIndex
Preço de marca para cálculo de liquidação · histórico de funding · índice premium.
GET
/v1/trades · /v1/aggTrades
Negociações recentes e negociações agregadas.

Conta & posições (assinado)

GET
/v1/account · /v2/account · /v3/account
Snapshot completo da conta — saldos, margem total, por ativo, posições atuais. As três versões de caminho retornam o mesmo payload (compatibilidade Binance).
GET
/v2/balance · /v3/balance
Saldo da carteira por ativo. Emitimos apenas USDT.
GET
/v2/positionRisk · /v3/positionRisk
Posições ativas com preço de marca, preço de entrada, PnL não realizado, preço de liquidação.
GET
/v1/userTrades · /v1/income · /v1/commissionRate · /v1/leverageBracket
Histórico de negociações · receita realizada · taxa de comissão por símbolo · faixas de alavancagem.

Trading (assinado)

POST
/v1/order
Envia uma ordem. Suporta 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.
GET
/v1/order
Consulta uma única ordem por orderId ou origClientOrderId.
DELETE
/v1/order
Cancela uma única ordem.
DELETE
/v1/allOpenOrders?symbol=X
Cancela todas as ordens abertas de um símbolo em uma única chamada.
GET
/v1/openOrders
Todas as ordens atualmente ativas (não preenchidas, não canceladas).
GET
/v1/allOrders
Histórico de ordens. As últimas 500 por padrão.
POST
/v1/leverage · /v1/marginType · /v1/positionMargin
Define alavancagem (1×–125×) · ISOLATED/CROSS · reforço de margem isolada.
GET
/v1/positionSide/dual
Flag de modo hedge. Por enquanto somos apenas one-way — retorna {dualSidePosition: false}.

WebSocket de dados do usuário (privado)

POST
/v1/listenKey
Cria uma listenKey de 60 min. Use-a para autenticar o handshake do WS.
PUT
/v1/listenKey
Estende o contrato da listenKey por mais 60 min. Chame a cada < 60 min para manter o stream ativo.
DELETE
/v1/listenKey
Fecha a listenKey ao encerrar.
WS
wss://api.buycrypt.com/fapi/ws/<listenKey>
Envia eventos de ordens, saldo, posições: ORDER_TRADE_UPDATE, ACCOUNT_UPDATE, MARGIN_CALL. Mesmo formato de payload da Binance.

WebSocket de dados de mercado (público)

WS
wss://api.buycrypt.com/fapi/stream?streams=btcusdt@trade/btcusdt@kline_1m
Assinatura multi-stream. Suporta mensagens de controle subscribe/unsubscribe/list_subscriptions — passthrough para a Binance upstream.
Limites & erros

Limites de taxa e códigos de erro

Buckets por chave de API

  • Peso: 2.400 / minuto
  • Envio de ordens: 300 / 10 segundos
  • Leituras assinadas: 1.200 / minuto
  • Cabeçalhos em toda resposta: X-MBX-USED-WEIGHT-1M, X-MBX-ORDER-COUNT-10S, Retry-After em caso de 429.

Códigos de erro comuns

  • -1003 Muitas requisições — recue conforme Retry-After
  • -1021 Timestamp fora do recvWindow
  • -1022 Assinatura inválida
  • -1102 Parâmetro obrigatório não enviado
  • -1116 Tipo de ordem inválido
  • -2010 Ordem rejeitada (saldo insuficiente, etc.)
  • -2011 Ordem desconhecida
  • -2014 Formato de chave de API inválido
  • -2015 Chave de API, IP ou permissões inválidas
  • -2019 Margem insuficiente

Pronto para conectar seu bot?

Sem 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.