Crédito disponível para abrir sessões de jogo.
- Saldo dos jogadores
- —
- Jogadores
- 0
Resumo da sua conta
Crédito disponível para abrir sessões de jogo.
últimos 14 dias
— no período
| Dia | Sessões |
|---|
Últimas ações registradas na sua conta
| Quando | Ação | Detalhe |
|---|
Crédito disponível para distribuir entre os jogadores.
Disponível apenas para administradores — um agente não pode creditar a própria conta.
| Quando | Tipo | Jogador | Valor | Saldo após | Referência |
|---|
O saldo acompanha as partidas: ao abrir uma sessão, o jogo carrega este valor e o devolve atualizado a cada rodada.
| Código | Nome | Moeda | Saldo | Status | Transferir |
|---|
Use-o para conferir o cabeçalho X-Webhook-Signature,
que é o HMAC-SHA256 do corpo recebido. Ele não será exibido de novo.
Enviamos eventos por POST em JSON. O endereço precisa usar HTTPS — sem TLS, o corpo e a assinatura trafegariam em claro.
Cada evento leva um eventId no corpo e no cabeçalho
X-Webhook-Id. Como reenviamos após falha, use-o para
descartar repetições. As tentativas se afastam progressivamente:
30s, 2min, 10min, 1h e 6h.
| Criado | Evento | Identificador | Status | Tentativas | Detalhe |
|---|
Catálogo
O RTP só pode ser ajustado nos jogos cujo motor já o utiliza. Os demais mostram o valor oficial do fabricante como referência.
A capa é cadastrada pelo administrador e vale para toda a
instalação: ela sai no catálogo público, em coverUrl,
para todos os operadores integrados. Clique na miniatura para
enviar um arquivo — PNG, JPEG, WebP ou GIF, até
512 KB.
| Capa | Jogo | Provedora | Oficial | RTP (%) | Ativo |
|---|
Apenas as sessões criadas com as suas credenciais.
| Jogo | Jogador | Moeda | Modo | Criada |
|---|
Ela não será exibida novamente — o servidor guarda apenas o resumo.
Use no cabeçalho Authorization: Bearer … ao criar sessões.
| Nome | Prefixo | Criada | Último uso |
|---|
Guia oficial com o fluxo necessário para operar os jogos em produção.
Gerado em —
A integração usa uma API HTTPS com corpo em JSON. Sua aplicação
consulta o catálogo, cria uma sessão real para o jogador e abre a
launchUrl devolvida. Toda comunicação específica com
os jogos é resolvida pela plataforma.
agk_…. Ela aparece uma única vez.
GET /api/v1/games para montar seu catálogo.
Use exatamente os identificadores devolvidos pela API.
POST /api/v1/sessions em modo real e abra a
launchUrl em um iframe ou em uma nova aba.
Endereço base de todas as chamadas:
{{origem}}
Em produção, use HTTPS em todas as pontas e mantenha a chave da
API e o token da carteira somente no servidor. As respostas de
erro trazem error e, quando necessário,
message.
Toda rota /api/v1 que envolve sessão ou jogador exige a
chave no cabeçalho Authorization. O catálogo é público.
Authorization: Bearer agk_sua_chave_aqui
Content-Type: application/json
A chave identifica sua conta e limita o acesso às próprias sessões e transações. Revogá-la em Credenciais interrompe imediatamente as integrações que a utilizam.
Confere a credencial sem criar sessão. Útil no seu deploy.
curl -H "Authorization: Bearer agk_sua_chave_aqui" \
{{origem}}/api/v1/auth/me
{
"authenticated": true,
"type": "agent-api-key",
"agent": {
"id": 2,
"code": "operadora-x",
"name": "Operadora X",
"role": "agent",
"status": "active"
}
}
Use esta rota pública para montar e atualizar seu lobby. Cada jogo traz os identificadores que devem ser enviados ao criar a sessão; sua integração não precisa conhecer regras específicas da origem.
Resposta de um jogo:
{
"provider": "codigo_do_catalogo",
"gameId": 12345,
"code": "codigo_do_jogo",
"name": "Nome do jogo",
"currency": "BRL",
"languages": ["pt-BR"],
"enabled": true,
"coverUrl": "{{origem}}/game-covers/codigo_do_catalogo/12345?v=9f2c…"
}
provider, gameId, currency
e languages devem ser usados como recebidos. Exiba
coverUrl diretamente no lobby e mantenha apenas jogos
com enabled: true disponíveis para abertura.
| Jogo | provider | gameId | Situação |
|---|
POST /api/v1/sessions —
requer a chave. Responde 201 com a URL de lançamento.
curl -X POST {{origem}}/api/v1/sessions \
-H "Authorization: Bearer agk_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{
"provider": "codigo_do_catalogo",
"gameId": 12345,
"playerId": "usuario-123",
"currency": "BRL",
"language": "pt-BR",
"mode": "real",
"returnUrl": "https://seu-site.com/lobby",
"wallet": {
"mode": "seamless",
"baseUrl": "https://seu-site.com/api/wallet/",
"token": "segredo-exclusivo-da-carteira"
}
}'
| Campo | Tipo | Descrição |
|---|---|---|
provider obrigatório |
string | Identificador opaco recebido em GET /api/v1/games. |
gameId obrigatório |
inteiro | Identificador recebido no catálogo junto com provider. |
playerId obrigatório |
string (até 128) | Identificador único do jogador no seu sistema. O mesmo valor será enviado nas chamadas da carteira. |
currency |
string | Precisa ser a moeda do jogo. Padrão: a do catálogo. |
language |
string | Precisa constar em languages. Padrão: a primeira. |
mode |
string | Em produção, envie sempre real. |
expiresInSeconds |
inteiro | Validade da sessão em segundos. Opcional; padrão 3600. |
returnUrl |
URL | URL HTTPS para onde o jogador retorna ao sair. |
wallet |
objeto |
Configuração seamless da sua carteira. É
obrigatória para sessões reais.
|
201{
"sessionToken": "0hV4v0Nn…",
"game": { "provider": "codigo_do_catalogo", "gameId": 12345, "name": "Nome do jogo" },
"playerId": "usuario-123",
"mode": "real",
"launchUrl": "{{origem}}/play/0hV4v0Nn…?mode=real&lang=pt-BR",
"expiresAt": "2026-08-10T21:00:00+00:00",
"walletMode": "seamless"
}
Abra a launchUrl exatamente como recebida, em um
iframe ou redirecionamento. A plataforma escolhe e
prepara o cliente correto do jogo; sua aplicação não monta URLs
externas nem envia parâmetros específicos de provedora.
<iframe src="LAUNCH_URL" allow="autoplay; fullscreen"
allowfullscreen width="100%" height="720"></iframe>
O fluxo é único para todos os jogos publicados. Sua aplicação trabalha apenas com o catálogo, a sessão e a carteira; a plataforma cuida da comunicação necessária para abrir e manter cada jogo funcionando.
playerId e a carteira seamless.
POST {baseUrl}balance. Se a carteira não responder
corretamente, o jogo não é aberto com um saldo incorreto.
launchUrl. Durante a partida,
apostas chamam bet, prêmios chamam win
e correções chamam rollback.
transactionId único. Sua
carteira devolve o saldo atualizado e trata repetições de forma
idempotente.
returnUrl. Sessões e
transações podem ser consultadas pelas rotas oficiais para
acompanhamento e conciliação.
Nunca abra endereços externos, reutilize tokens ou altere a
launchUrl. Para todos os jogos, use somente a URL
devolvida por POST /api/v1/sessions.
Devolve os dados da sessão. O segredo da carteira nunca é exposto —
apenas mode e baseUrl.
Extrato das chamadas de carteira daquela sessão, para conciliação.
limit vai de 1 a 500 (padrão 100).
As duas rotas exigem a chave e só enxergam sessões da sua própria conta.
Em produção, o saldo permanece no seu sistema. A plataforma consulta e movimenta sua carteira seamless em tempo real durante toda a sessão.
{
"provider": "codigo_do_catalogo",
"gameId": 12345,
"playerId": "usuario-123",
"mode": "real",
"wallet": {
"mode": "seamless",
"baseUrl": "https://seu-site.com/api/wallet/",
"token": "segredo-do-operador"
}
}
A baseUrl precisa ser HTTPS. O token é
enviado em Authorization: Bearer em cada chamada e
deve ser validado antes de qualquer movimentação.
| Rota | Quando | Campos além dos comuns |
|---|---|---|
POST {baseUrl}balance |
Ao abrir o jogo e ao sincronizar | — |
POST {baseUrl}bet |
Débito da aposta | transactionId, roundId, amount |
POST {baseUrl}win |
Crédito do prêmio | transactionId, roundId, amount |
POST {baseUrl}rollback |
Rodada desfeita | transactionId, originalTransactionId, roundId |
Campos comuns a todas: sessionToken,
playerId, provider, gameId e
currency.
POST https://seu-site.com/api/wallet/bet
Authorization: Bearer segredo-do-operador
{
"sessionToken": "0hV4v0Nn…",
"playerId": "usuario-123",
"provider": "codigo_do_catalogo",
"gameId": 12345,
"currency": "BRL",
"transactionId": "b7f1…",
"roundId": 4821,
"amount": 0.20
}
{ "success": true, "balance": 999.80 }
balance é obrigatório e é o saldo depois da
operação. Para recusar, responda
{"success": false, "code": "insufficient_funds", "message": "…"}
— a rodada é cancelada com essa mensagem. Um HTTP 5xx é tratado
como indisponibilidade temporária e pode ser repetido.
Cada transactionId é gravado e reenviado de forma
idempotente: se o mesmo chegar duas vezes, devolva o resultado da
primeira em vez de debitar de novo.
Configure a URL em Integração → Webhook. Enviamos
POST em JSON e guardamos a fila de entrega, com
reenvios em 30s, 2min, 10min, 1h e 6h.
Content-Type: application/json
X-Webhook-Event: session.created
X-Webhook-Id: 5f3c9a…
X-Webhook-Signature: sha256=9d2b…
{
"eventId": "5f3c9a…",
"event": "session.created",
"agentCode": "operadora-x",
"sentAt": "2026-08-10T20:31:00+00:00",
"data": { }
}
| Evento | Quando | data |
|---|---|---|
session.created |
Sessão de jogo criada com a sua chave |
sessionToken, playerCode,
provider, gameId,
gameCode, currency,
mode, balance
|
player.balance |
Saldo do jogador mudou durante a partida |
playerCode, sessionToken,
previousBalance, balance,
amount, kind
(bet ou win)
|
X-Webhook-Signature é o HMAC-SHA256 do corpo
exato que chegou, com o segredo do webhook.
Calcule sobre os bytes crus, antes de qualquer parse — reserializar
o JSON muda a assinatura.
// Node.js / Express
const bruto = req.body; // Buffer, via express.raw()
const esperado = "sha256=" + require("crypto")
.createHmac("sha256", SEGREDO_WEBHOOK)
.update(bruto)
.digest("hex");
const recebido = req.get("X-Webhook-Signature") || "";
if (!crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(recebido))) {
return res.sendStatus(401);
}
// PHP
$bruto = file_get_contents('php://input');
$esperado = 'sha256=' . hash_hmac('sha256', $bruto, SEGREDO_WEBHOOK);
if (!hash_equals($esperado, $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '')) {
http_response_code(401);
exit;
}
Responda 2xx assim que receber e processe depois.
Como reenviamos após falha, o mesmo eventId pode
chegar duas vezes — guarde-o e descarte repetições.
{ "error": "seamless_wallet_required",
"message": "Sessões real exigem wallet.mode=seamless" }
| HTTP | error | Causa |
|---|---|---|
| 400 | invalid_request |
provider, gameId ou playerId ausente. |
| 400 | invalid_player_id |
Código vazio ou com mais de 128 caracteres. |
| 400 | unsupported_currency |
Moeda diferente da que o jogo opera. |
| 400 | unsupported_language |
Idioma fora de languages. |
| 400 | unsupported_mode |
Para esta integração de produção, envie real. |
| 400 | seamless_wallet_required |
Sessão real sem wallet.mode=seamless. |
| 400 | invalid_wallet_url |
baseUrl ausente ou sem HTTPS. |
| 401 | invalid_api_key |
Chave ausente, revogada ou de conta suspensa. |
| 403 | player_blocked |
Jogador bloqueado em Jogadores. |
| 404 | provider_not_found |
provider não corresponde a um item disponível no catálogo. |
| 404 | game_not_found |
Jogo inexistente ou desativado. |
| 404 | session_not_found |
Token inválido, expirado ou de outro agente. |
Respostas HTTP 5xx indicam indisponibilidade
temporária. Registre a resposta e repita com espera progressiva,
sem alterar o payload nem criar várias sessões em paralelo.
agk_… fica só no seu servidor — nunca no
navegador nem em aplicativo distribuído.2xx
rápido, guardando o eventId contra repetições.transactionId de forma
idempotente e devolve sempre balance.expiresInSeconds curto o bastante para a sua
operação.Alterações globais na página inicial pública.
Visualização responsiva da página real.
A troca encerra todas as sessões abertas do painel, inclusive esta.
| Quando | Agente | Ação | Detalhe | Origem |
|---|
| Código | Nome | Papel | Status | Último acesso |
|---|