Este roteiro percorre o fluxo inteiro em sandbox, sem depender de ninguém da nossa equipe: as rotas da tag Sandbox simulam as decisões de compliance e de análise de saque. Você só precisa de uma credencial bk_test_… (como pedir).
Prefere não escrever código? Use o testador no navegador ou a coleção Postman: os dois assinam por você.
0. Prepare o ambiente
export API_BASE_URL="https://backoffice.betfoguete.bet"
export OPERATOR_KEY="bk_test_…" # a sua chave de sandbox
export OPERATOR_SECRET="sk_…" # o secret (mostrado uma única vez)
Todos os exemplos abaixo usam o mesmo auxiliar de assinatura. Salve-o como sign.sh (o código em outras linguagens está em autenticação HMAC):
# uso: call METODO CAMINHO [CORPO] → assina, envia e imprime a resposta
call() {
local method="$1" path="$2" body="${3:-}" ts hash sig
ts=$(date +%s)
hash=$(printf '%s' "$body" | openssl dgst -sha256 -hex | sed 's/^.* //')
sig=$(printf '%s\n%s\n%s\n%s' "$method" "$path" "$ts" "$hash" \
| openssl dgst -sha256 -hmac "$OPERATOR_SECRET" -hex | sed 's/^.* //')
curl -sS -X "$method" "$API_BASE_URL$path" \
-H "X-Operator-Key: $OPERATOR_KEY" -H "X-Timestamp: $ts" -H "X-Signature: $sig" \
-H "Idempotency-Key: $(uuidgen)" -H "Content-Type: application/json" \
${body:+-d "$body"}
echo
}
1. Confirme a assinatura
call GET /api/v1/me
A resposta deve trazer "environment": "sandbox" e "isSandbox": true. Se receber INVALID_SIGNATURE, compare a sua implementação com o vetor de teste.
2. Cadastre um jogador
call POST /api/v1/players '{"externalId":"jogador-123","name":"Ana Souza","email":"ana@exemplo.com","cpf":"52998224725","birthDate":"1990-05-20"}'
Guarde o id devolvido (PLU-…) em PLAYER. O jogador nasce ativo, com KYC nao_iniciado.
3. KYC: envie o documento e simule a decisão
call POST /api/v1/players/$PLAYER/kyc/submissions '{"documentType":"RG","reference":"doc-001"}'
call POST /api/v1/sandbox/players/$PLAYER/kyc/decision '{"status":"aprovado"}'
Em produção a decisão é da equipe de compliance e chega pelo webhook kyc.status_changed.
4. Deposite
call POST /api/v1/players/$PLAYER/deposits '{"amount":"150.00","currency":"BRL","method":"PIX","externalReference":"psp-001"}'
call POST /api/v1/deposits/$DEPOSIT/confirm '{}'
call GET /api/v1/players/$PLAYER/wallet
O depósito nasce pending; ao confirmar, o valor é creditado e available passa a 150.00.
5. Abra um jogo
call GET /api/v1/games
call POST /api/v1/players/$PLAYER/game-sessions '{"gameId":"rocket-crash"}'
Devolve a gameUrl para abrir no navegador do jogador. Em sandbox é uma sessão de demonstração (saldo fictício).
6. Solicite e conclua um saque
call POST /api/v1/players/$PLAYER/withdrawals '{"amount":"50.00","currency":"BRL","method":"PIX","destination":"ana@exemplo.com"}'
call POST /api/v1/sandbox/withdrawals/$WITHDRAWAL/decision '{"decision":"approve"}'
call POST /api/v1/sandbox/withdrawals/$WITHDRAWAL/decision '{"decision":"pay"}'
call GET /api/v1/players/$PLAYER/wallet
O saque entra under_review, passa a approved e depois paid; só então o valor é debitado (available volta a 100.00).
7. Receba os eventos
Cada passo acima gera webhooks (deposit.confirmed, withdrawal.status_changed, …). Peça à equipe para configurar a sua URL HTTPS de sandbox e valide com POST /api/v1/webhooks/test — veja webhooks.
Próximos passos
- Sandbox: o que muda em relação à produção
- Homologação: o checklist para liberar as chaves de produção