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
- Guarde
agentTokenesecretKeyno seu servidor. - Cadastre a URL HTTPS da sua carteira.
- Busque
GET /api/v2/cataloge monte uma seção por provedor. - No clique, o seu servidor chama
POST /api/v2/game_launche coloca alaunch_urlnum iframe. - 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_KEYOs 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"}Catálogo por categoria
A categoria é o provider. A resposta já vem na mesma ordem do catálogo: PG Soft, Pragmatic Play e os demais, cada um com os seus jogos.
GET https://apigamesbrasil.online/api/v2/catalog
X-AGB-Agent: SEU_AGENT_TOKEN
X-AGB-Secret: SUA_SECRET_KEYPara uma categoria só, use ?provider=PGSOFT. Os códigos são PGSOFT, PRAGMATIC, CPGAMES, TADA, POPOK, G759, WG, AVIATOR e MINES.
{
"status": true,
"categories": [
{
"provider": "PGSOFT",
"name": "PG Soft",
"games": [
{
"name": "Bikini Paradise",
"type": "slots",
"launch_id": "PGSOFT:bikini-paradise",
"game_code": "bikini-paradise",
"cover_url": "https://apigamesbrasil.online/public/demo-covers/pgsoft-bikini-paradise.webp",
"has_cover": true,
"available": true
}
]
}
]
}cover_url é a imagem final. Use direto na tag img. launch_id é o identificador que abre o jogo, no formato PROVEDOR:CODIGO. type vale slots ou crash. O catálogo só inclui jogo liberado.
const resposta = await fetch("https://apigamesbrasil.online/api/v2/catalog", {
headers: {
"X-AGB-Agent": process.env.AGB_AGENT_TOKEN,
"X-AGB-Secret": process.env.AGB_SECRET_KEY
}
});
const catalogo = await resposta.json();
for (const categoria of catalogo.categories) {
// categoria.name = "PG Soft"
for (const jogo of categoria.games) {
// jogo.name, jogo.cover_url, jogo.launch_id
}
}CP Games




G759




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_SHA256A 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.401na 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: olaunch_idnão está liberado.422 RESERVED_USER_CODE:user_codecomeçou comdemo_.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.