API Games Brasil

DOCUMENTAÇÃO

Puxe o catálogo para o seu site

Uma chamada devolve os provedores, um abaixo do outro. Dentro de cada provedor vêm o nome do jogo, o tipo e a imagem pronta para usar. O jogador abre o jogo no seu site. A aposta e o prêmio voltam para a carteira que você cadastrar.

Visão geral

  1. Guarde agentToken e secretKey no seu servidor.
  2. Cadastre a URL HTTPS da sua carteira.
  3. Busque GET /api/v2/catalog e monte uma seção por provedor.
  4. No clique, o seu servidor chama POST /api/v2/game_launch e coloca a launch_url num iframe.
  5. Quando o jogador aposta ou ganha, a API chama a sua carteira com o webhook assinado.

Credenciais

Cada integrador recebe um par de chaves. Elas só podem sair do seu backend. Não coloque essas chaves no navegador, no aplicativo do jogador nem no HTML da página.

X-AGB-Agent: SEU_AGENT_TOKEN
X-AGB-Secret: SUA_SECRET_KEY

Os mesmos valores também são aceitos no corpo ou na query como agentToken e secretKey. O cabeçalho é o caminho recomendado.

Antes de abrir jogos, registre a carteira. A URL precisa ser HTTPS.

PUT https://apigamesbrasil.online/api/v2/agent
Content-Type: application/json
X-AGB-Agent: SEU_AGENT_TOKEN
X-AGB-Secret: SUA_SECRET_KEY

{"wallet_url":"https://seusite.com/api/games/wallet"}

Abrir um jogo

O clique fica no seu site. Quem chama a API é o seu servidor, com o launch_id escolhido no catálogo e o código do jogador na sua base.

POST https://apigamesbrasil.online/api/v2/game_launch
Content-Type: application/json
X-AGB-Agent: SEU_AGENT_TOKEN
X-AGB-Secret: SUA_SECRET_KEY

{
  "launch_id": "PGSOFT:bikini-paradise",
  "user_code": "jogador-42",
  "user_balance": 100.00,
  "lang": "pt",
  "currency": "BRL"
}
{
  "status": true,
  "msg": "SUCCESS",
  "launch_url": "https://...",
  "provider": "PGSOFT",
  "name": "Bikini Paradise",
  "user_code": "jogador-42",
  "user_balance": 100
}

Coloque launch_url no iframe. user_code é o identificador do jogador no seu sistema e não pode começar com demo_. user_balance é o saldo no momento de abrir. Durante a partida, o saldo vivo é o da sua carteira.

Webhook assinado

Cada consulta de saldo e cada jogada chega em POST na wallet_url, na hora. A partida espera a sua resposta, no máximo 8 segundos, e usa o saldo que você devolver. Não há fila nem atualização atrasada.

Toda chamada traz a assinatura da API Games Brasil. Recuse timestamp com mais de 5 minutos e assinatura diferente. Uma chamada antiga não pode mexer no saldo de novo.

X-AGB-Agent: SEU_AGENT_TOKEN
X-AGB-Timestamp: 1710000000
X-AGB-Signature: v1=HMAC_SHA256

A assinatura é v1= mais o HMAC-SHA256 de timestamp + "." + corpo cru, usando a secretKey. Compare com hash_equals. O corpo é o JSON exatamente como chegou, sem reformatar.

<?php
$secret = "SUA_SECRET_KEY";
$timestamp = $_SERVER["HTTP_X_AGB_TIMESTAMP"] ?? "";
$body = file_get_contents("php://input");
$expected = "v1=" . hash_hmac("sha256", $timestamp . "." . $body, $secret);
$given = $_SERVER["HTTP_X_AGB_SIGNATURE"] ?? "";
$fresh = ctype_digit($timestamp) && abs(time() - (int) $timestamp) <= 300;
if (!$fresh || $given === "" || !hash_equals($expected, $given)) {
    http_response_code(401);
    exit;
}
$payload = json_decode($body, true);

if ($payload["method"] === "signature_test") {
    echo json_encode(["status" => true, "balance" => 0]);
    exit;
}

$user = $payload["user_code"];

if ($payload["method"] === "user_balance") {
    echo json_encode(["status" => true, "balance" => saldo_do_jogador($user)]);
    exit;
}

$slot = $payload["slot"];
$txn = $slot["txn_id"];
if (transacao_ja_aplicada($txn)) {
    echo json_encode(["status" => true, "balance" => saldo_do_jogador($user)]);
    exit;
}
$saldo = saldo_do_jogador($user);
if ($saldo < (float) $slot["bet"]) {
    echo json_encode(["status" => false, "msg" => "INSUFFICIENT_USER_FUNDS", "balance" => $saldo]);
    exit;
}
$saldo = round($saldo - (float) $slot["bet"] + (float) $slot["win"], 2);
gravar_transacao($txn, $user, $saldo);
echo json_encode(["status" => true, "balance" => $saldo]);

Consulta de saldo:

{
  "method": "user_balance",
  "agent_code": "seu-agente",
  "user_code": "jogador-42",
  "provider_code": "PGSOFT",
  "game_code": "bikini-paradise"
}

Jogada. bet é o valor debitado e win é o valor creditado. Aplique os dois e devolva o saldo novo. O mesmo txn_id não pode mudar o saldo duas vezes.

{
  "method": "game_callback",
  "agent_code": "seu-agente",
  "user_code": "jogador-42",
  "provider_code": "PGSOFT",
  "slot": {
    "bet": 0.50,
    "win": 0,
    "txn_id": "rodada-unica",
    "round_id": "rodada-1",
    "game_code": "bikini-paradise"
  }
}

Resposta de sucesso: {"status": true, "balance": 99.50}. Se o jogador não existe, responda INVALID_USER. Se o saldo não cobre a aposta, responda INSUFFICIENT_USER_FUNDS e não altere o saldo. O mesmo txn_id responde o saldo atual e não debita outra vez.

Para testar a conexão sem abrir jogo, chame POST https://apigamesbrasil.online/api/v2/wallet/test com os cabeçalhos X-AGB-Agent e X-AGB-Secret. A API envia method: signature_test assinado. Responda {"status": true, "balance": 0} sem alterar jogador. Se a URL e a assinatura estiverem certas, a resposta é WALLET_SIGNATURE_OK.

Erros

  • 401 INVALID_CREDENTIALS: token ou secret ausente ou inválido.
  • 401 na carteira: assinatura inválida ou timestamp fora da janela de 5 minutos.
  • WALLET_SIGNATURE_OK: o teste do webhook assinado passou.
  • 422 INVALID_WALLET_URL: a carteira não é HTTPS.
  • 422 INVALID_LAUNCH_REQUEST: faltou jogo, jogador ou saldo.
  • 422 GAME_NOT_FOUND: o launch_id não está liberado.
  • 422 RESERVED_USER_CODE: user_code começou com demo_.
  • 503: o provedor não conseguiu abrir a sessão naquele momento.

OpenAPI

O contrato para Postman, Insomnia ou gerador de cliente fica em https://apigamesbrasil.online/openapi.json. O servidor publicado nesse arquivo é a origem pública, e os caminhos começam em /api/v2.