Conteúdo da documentação
Desenvolvedor / Referência pública da API

API da Plataforma Aberta de Jogos AG

V5.0.0

Integre os recursos da plataforma de jogos ao sistema existente por meio do catálogo, das sessões, dos callbacks de carteira única ou dos endpoints de carteira de transferência. Todos os endpoints da plataforma usam corpo JSON; os cabeçalhos comuns e as regras de assinatura se aplicam a cada solicitação.

Base URLhttps://{base-url}
Método da solicitaçãoPOST
Content-Typeapplication/json
Modelos de carteiraCarteira única / carteira de transferência
Referência pública, não um contrato completo de produção

Esta página publica o catálogo de endpoints, o método de assinatura, campos representativos e exemplos com dados fictícios para avaliação técnica. A URL base real, as credenciais, todas as restrições dos campos, a lista final de callbacks e a configuração de produção devem ser confirmadas pelo processo controlado de integração. Os exemplos não contêm credenciais utilizáveis; não envie dados reais de jogadores ou transações pelos canais públicos.

Mantenha as chaves apenas no servidor controlado

Separe as configurações de teste e produção. Nunca coloque a chave de assinatura no navegador, em pacotes do cliente, logs, chamados ou conversas. Os valores fictícios não servem para produção.

01

Exemplo mínimo de solicitação

O exemplo a seguir cria uma sessão de jogo. Antes de enviá-lo, calcule a assinatura a partir da string JSON final.

cURL
curl --request POST 'https://{base-url}/game/v5/game/url' \
  --header 'Content-Type: application/json' \
  --header 'X-MERCHANT-CODE: {merchant-code}' \
  --header 'X-TIMESTAMP: {timestamp}' \
  --header 'X-NONCE: {nonce}' \
  --header 'X-SIGN: {hmac-sha256-signature}' \
  --header 'X-CONTENT-PROCESSING-TYPE: {processing-type}' \
  --data-raw '{
    "reqTraceId": "trace-demo-001",
    "gameCode": "{game-code}",
    "playerId": "player-demo-001",
    "currencyCode": "{currency-code}",
    "language": "pt-BR",
    "terminalType": "PC",
    "returnUrl": "https://{merchant-host}/lobby",
    "ipAddress": "192.0.2.10"
  }'
02

Autenticação e assinatura

O tipo de assinatura é fixo como HmacSHA256, e os cabeçalhos comuns devem acompanhar cada solicitação.

Cabeçalhos comuns da solicitação

HeaderTipoObrigatórioDescrição
X-MERCHANT-CODEstringObrigatórioCódigo de comerciante atribuído à plataforma
X-TIMESTAMPstringObrigatórioTimestamp no momento da solicitação
X-NONCEstringObrigatórioString aleatória usada em cada solicitação
X-SIGNstringObrigatórioAssinatura da solicitação gerada com HmacSHA256
X-CONTENT-PROCESSING-TYPEstringObrigatórioTipo de processamento do conteúdo enviado conforme a configuração da integração

String de assinatura

  1. 1

    Serialize o corpo da solicitação como a string JSON final body.

  2. 2

    Concatene os campos exatamente na ordem abaixo, sem separadores.

  3. 3

    Use a chave de assinatura para executar HMAC-SHA256 e coloque o resultado em X-SIGN.

merchantCode + timestamp + nonce + signType + body
O corpo da solicitação deve ser idêntico byte a byte

O body usado na assinatura deve ser exatamente igual ao corpo realmente enviado. Reformatar o JSON, mudar a ordem dos campos ou os espaços antes do envio pode gerar C10004.

Node.js
import { createHmac } from "node:crypto";

const signType = "HmacSHA256";
const body = JSON.stringify(requestBody);
const signingText = merchantCode + timestamp + nonce + signType + body;

const signature = createHmac("sha256", secretKey)
  .update(signingText, "utf8")
  .digest("hex");
03

Resposta comum

O resultado de negócio é retornado em code no corpo da resposta; não use apenas o status HTTP para determinar o resultado de uma transação.

CampoTipoDescrição
codestringCódigo do resultado de negócio
msgstringMensagem do resultado
successbooleanIndicador de sucesso no exemplo de resposta
dataobjectDados retornados pelo endpoint
200 · JSON
{
  "code": "C10000",
  "msg": "Request succeeded",
  "success": true,
  "data": {}
}
04

Catálogo e endpoints típicos

Selecione o grupo de endpoints que corresponde à arquitetura da carteira do comerciante. Todos os endpoints da plataforma usam POST.

Catálogo de jogos e sessões

POST/game/v5/providers

Consultar fornecedores de jogos

POST/game/v5/categories

Consultar categorias de jogos

POST/game/v5/games

Consultar jogos com paginação

POST/game/v5/game/url

Criar uma sessão de jogo para o jogador e obter a URL de início

POST/game/v5/player/force/logout

Encerrar à força a sessão de jogo do jogador

Callbacks da carteira única

POST{MERCHANT-URL}/wallet/balance

Consultar o saldo da carteira do jogador

POST{MERCHANT-URL}/player/info

Consultar dados do jogador

POST{MERCHANT-URL}/wallet/bet

Receber notificação de aposta

POST{MERCHANT-URL}/wallet/win

Receber notificação de liquidação ou de aposta e liquidação

POST{MERCHANT-URL}/wallet/cancel

Receber notificação de cancelamento do pedido

Carteira de transferência

POST/game/v5/cash/deposit

Transferir saldo para a carteira de jogo do jogador

POST/game/v5/cash/withdraw

Retirar saldo da carteira de jogo do jogador

POST/game/v5/cash/balance

Consultar o saldo da carteira de jogo do jogador

POST/game/v5/cash/transaction

Consultar transações da carteira com paginação

POST/game/v5/cash/force/withdraw/all

Retirar à força todo o saldo da carteira de jogo do jogador

Registros e comerciante

POST/game/v5/game/record

Consultar registros dos jogos com paginação

POST/game/v5/merchant/info

Consultar a configuração atual do comerciante e os dados da carteira

Escopo dos callbacks de carteira única

A necessidade de o comerciante implementar /wallet/bete /wallet/cancel depende da configuração real da integração e do acordo técnico final. Confirme a lista de callbacks antes dos testes de integração.

POST/game/v5/game/urlCriar sessão de jogo

Cria uma sessão de jogo para o jogador informado e retorna uma URL para iniciar o jogo.

Autenticação: cabeçalhos comuns da solicitaçãoContent-Type: application/json

Campos da solicitação

CampoTipoObrigatórioDescrição
reqTraceIdstringObrigatórioIdentificador único da solicitação; não pode ser reutilizado
gameCodestringObrigatórioCódigo do jogo
playerIdstringObrigatórioIdentificador único do jogador no sistema do comerciante
currencyCodestringObrigatórioCódigo da moeda da carteira
languagestringObrigatórioIdioma da interface do jogo
terminalTypestringOpcionalTipo de terminal: PHONE ou PC; o padrão é PHONE
returnUrlstringOpcionalURL de retorno após o jogador sair do jogo
ipAddressstringObrigatórioEndereço IPv4 ou IPv6 do jogador
subMerchantCodestringOpcionalCódigo do subcomerciante; não pode conter sublinhado
nickNamestringOpcionalApelido do jogador
avatarUrlstringOpcionalURL do avatar do jogador
Solicitação
                          {
  "reqTraceId": "trace-demo-001",
  "gameCode": "{game-code}",
  "playerId": "player-demo-001",
  "currencyCode": "{currency-code}",
  "language": "pt-BR",
  "terminalType": "PC",
  "returnUrl": "https://{merchant-host}/lobby",
  "ipAddress": "192.0.2.10"
}
                        
Resposta
                          {
  "code": "C10000",
  "msg": "Request succeeded",
  "success": true,
  "data": {
    "gameCode": "{game-code}",
    "playerId": "player-demo-001",
    "gameUrl": "https://{game-launch-host}/session/{token}",
    "expireTime": "2026-08-08T10:30:00Z"
  }
}
                        

Dados da resposta

CampoTipoRetornadoDescrição
data.gameCodestringObrigatórioCódigo do jogo
data.playerIdstringObrigatórioIdentificador do jogador
data.gameUrlstringObrigatórioURL de início do jogo
data.expireTimestringOpcionalHorário de expiração da sessão

POST{MERCHANT-URL}/wallet/winCallback de liquidação da carteira

No modelo de carteira única, a plataforma envia à carteira do comerciante uma notificação de prêmio ou de aposta e liquidação. O comerciante deve processar a transação de forma idempotente e devolver o saldo resultante na resposta.

Direção: plataforma → comercianteTipo: win / bet_win

Campos da solicitação

CampoTipoObrigatórioDescrição
reqTraceIdstringObrigatórioIdentificador único da solicitação
playerIdstringObrigatórioIdentificador único do jogador no sistema do comerciante
currencyCodestringObrigatórioCódigo da moeda da carteira
gameCodestringObrigatórioCódigo do jogo
transactionIdstringObrigatórioIdentificador único da transação na plataforma
roundIdstringObrigatórioIdentificador único da rodada do jogo
betIdstringObrigatórioIdentificador da aposta relacionada
betAmountstringObrigatórioValor apostado nesta transação
winAmountstringObrigatórioValor pago nesta transação
isFreebooleanObrigatórioIndica se o registro foi gerado por uma partida grátis
isEndbooleanObrigatórioIndica se a rodada atual do jogo terminou
betTimestringObrigatórioHorário da aposta
settledTimestringObrigatórioHorário da liquidação
typestringObrigatórioTipo da notificação: win ou bet_win
Solicitação de callback
                          {
  "reqTraceId": "trace-demo-002",
  "playerId": "player-demo-001",
  "currencyCode": "{currency-code}",
  "gameCode": "{game-code}",
  "transactionId": "txn-demo-002",
  "roundId": "round-demo-001",
  "betId": "bet-demo-001",
  "betAmount": "10.00",
  "winAmount": "18.50",
  "isFree": false,
  "isEnd": true,
  "betTime": "2026-08-08T10:00:00Z",
  "settledTime": "2026-08-08T10:00:08Z",
  "type": "bet_win"
}
                        
Resposta do comerciante
                          {
  "code": "C10000",
  "msg": "Request succeeded",
  "success": true,
  "data": {
    "merchantBetId": "merchant-bet-demo-001",
    "balance": "108.50"
  }
}
                        

POST/game/v5/cash/depositTransferir saldo para a carteira de jogo

No modelo de carteira de transferência, transfere o valor informado do sistema do comerciante para a carteira de jogo do jogador.

Modelo de carteira: carteira de transferênciaChave da transação: merchantTransactionId

Campos da solicitação

CampoTipoObrigatórioDescrição
reqTraceIdstringObrigatórioIdentificador único usado para rastrear a solicitação
playerIdstringObrigatórioIdentificador único do jogador no sistema do comerciante
currencyCodestringObrigatórioCódigo da moeda da carteira
amountstringObrigatórioValor da transferência
merchantTransactionIdstringObrigatórioIdentificador único da transação do comerciante, usado na conciliação
Solicitação
                          {
  "reqTraceId": "trace-demo-003",
  "playerId": "player-demo-001",
  "currencyCode": "{currency-code}",
  "amount": "100.00",
  "merchantTransactionId": "merchant-txn-demo-001"
}
                        
Resposta
                          {
  "code": "C10000",
  "msg": "Request succeeded",
  "success": true,
  "data": {
    "balance": "100.00"
  }
}
                        
Conciliação de transações

Gere um merchantTransactionId único para cada transferência e guarde a solicitação e o resultado de negócio para conciliar o status final pelo endpoint de consulta de transações.

POST/game/v5/game/recordConsultar registros dos jogos

Consulta com paginação os registros de apostas e prêmios do jogador em um intervalo de tempo.

Campos da solicitação

CampoTipoObrigatórioDescrição
reqTraceIdstringObrigatórioIdentificador único da solicitação
pageNumintegerObrigatórioNúmero da página
pageSizeintegerObrigatórioRegistros por página
reqData.startTimestringObrigatórioInício do intervalo da consulta
reqData.endTimestringObrigatórioFim do intervalo da consulta
sortstringOpcionalOrdem de classificação
Solicitação
                          {
  "reqTraceId": "trace-demo-004",
  "pageNum": 1,
  "pageSize": 50,
  "reqData": {
    "startTime": "2026-08-08T00:00:00Z",
    "endTime": "2026-08-08T23:59:59Z"
  },
  "sort": "DESC"
}
                        
Resposta
                          {
  "code": "C10000",
  "msg": "Request succeeded",
  "success": true,
  "data": {
    "gameRecordList": [{
      "orderNo": "order-demo-001",
      "playerId": "player-demo-001",
      "betAmount": "10.00",
      "winAmount": "18.50",
      "betTime": "2026-08-08T10:00:00Z",
      "winTime": "2026-08-08T10:00:08Z",
      "gameCode": "{game-code}",
      "currencyCode": "{currency-code}",
      "roundId": "round-demo-001"
    }]
  }
}
                        
05

Dúvidas técnicas

Dúvidas frequentes nos testes de integração sobre assinatura, carteiras, idempotência, timeouts e consultas de sessão.

Como a API da AG gera a assinatura da solicitação?

Serialize o corpo final da solicitação como body e concatene merchantCode + timestamp + nonce + signType + body, nessa ordem e sem separadores. signType é fixo como HmacSHA256. Calcule HMAC-SHA256 com a chave de assinatura e coloque o resultado em X-SIGN. O body usado na assinatura deve ser exatamente igual ao conteúdo enviado.

Ver o exemplo de autenticação e assinatura

Por que C10004 é retornado?

C10004 indica falha na validação da assinatura. Primeiro, verifique o código do comerciante, timestamp, nonce, chave de assinatura e o tipo fixo HmacSHA256. Depois, confirme que o middleware não serializou novamente a string JSON assinada, não mudou a ordem dos campos nem os espaços. Guarde reqTraceId e o horário da solicitação para diagnóstico, mas nunca registre a chave de assinatura.

Ver a lista completa de códigos de erro

Qual é a diferença entre carteira única e carteira de transferência?

No modelo de carteira única, o comerciante mantém o saldo do jogador, e a plataforma colabora com a carteira do comerciante por callbacks de saldo, aposta e liquidação. No modelo de transferência, o comerciante chama endpoints como /game/v5/cash/deposit e /game/v5/cash/withdraw para mover saldo entre seu sistema e a carteira de jogo do jogador. O modelo usado depende da configuração da integração e não deve ser misturado no mesmo fluxo de transação.

Ver o catálogo de endpoints de carteira

Como tratar callbacks de carteira repetidos?

O comerciante deve usar transactionId como base de idempotência das transações de callback. Quando a mesma transação chegar novamente, devolva o resultado e o saldo já confirmados; não debite nem credite outra vez. Guarde a solicitação, o resultado de negócio e o saldo final para conciliação. A necessidade de /wallet/bet e /wallet/cancel continua sujeita à lista final de callbacks do comerciante.

Ver o callback de liquidação da carteira

Uma transferência pode ser repetida diretamente após timeout?

Não crie uma nova transação nem repita a transferência enquanto o resultado for desconhecido. Primeiro, use o merchantTransactionId original para chamar /game/v5/cash/transaction e consultar o resultado; depois, decida se deve reenviar conforme o acordo técnico final. Isso evita lançamentos duplicados quando a primeira solicitação teve sucesso, mas a resposta se perdeu na rede.

Ver o exemplo de transferência para a carteira de jogo

Para que servem reqTraceId e merchantTransactionId?

reqTraceId é o identificador único de rastreamento de cada solicitação. Ele associa logs e ajuda a diagnosticar uma chamada; deve ser gerado e registrado por solicitação, inclusive em novas tentativas. merchantTransactionId é o identificador único da transação no sistema do comerciante, usado para conciliar transferências, consultar resultados e evitar o processamento repetido da mesma transação de negócio. Os dois têm finalidades diferentes e não se substituem.

Como criar uma sessão de jogo para o jogador?

Obtenha um gameCode disponível no catálogo, prepare o identificador do jogador, a moeda, o idioma e o endereço IP e chame /game/v5/game/url com os cabeçalhos comuns. Uma resposta bem-sucedida retorna gameUrl e pode retornar expireTime; o cliente deve abrir a URL enquanto a sessão estiver válida.

Ver como criar uma sessão de jogo

Como consultar os registros de jogos do jogador?

Chame /game/v5/game/record com pageNum, pageSize e o intervalo reqData.startTime e reqData.endTime; informe sort quando necessário. Leia em gameRecordList os registros de pedido, jogador, valor apostado, prêmio, código do jogo e rodada e continue a consulta por página.

Ver o endpoint de registros dos jogos
06

Códigos de erro

Registre reqTraceId, o código de erro de negócio e o horário da solicitação para ajudar a diagnosticar problemas rapidamente.

CódigoMensagemAção recomendada
C10000Request succeededSolicitação concluída com sucesso
C10001Base service exceptionExceção no serviço de base
C10002Request parameter errorVerifique os campos e tipos de dados
C10003Invalid request headerVerifique os cinco cabeçalhos comuns
C10004Signature errorVerifique a ordem da assinatura, a chave e o corpo original da solicitação
C20001Merchant code absentVerifique o código do comerciante
G10001Game service exceptionExceção no serviço de jogos
G20001Player ID emptyInforme playerId
G20002Game ID absentVerifique o código do jogo
G20003Game offlineO jogo está off-line ou indisponível
G30001Game user session expiredCrie uma nova sessão de jogo
G30002Merchant balance insufficientO saldo do comerciante é insuficiente
G30003Player balance insufficientO saldo do jogador é insuficiente
G40001Third-party service exceptionExceção em serviço de terceiros
07

Verificações da integração

Confirme estes controles no protocolo final do projeto e teste-os antes de mudar para produção. Esta página pública não afirma que o servidor já os tenha ativado.

  • Solicitações rastreáveis e logs mínimos: gere um reqTraceId único para cada chamada. Guarde apenas horário, código de resultado e identificadores mascarados necessários ao diagnóstico; não registre chaves, assinaturas completas, tokens, dados do jogador nem a carga completa da transação.

  • Assinaturas reproduzíveis: a entrada da assinatura corresponde exatamente à string JSON enviada, e os testes cobrem C10004.

  • Regras antirreplay explícitas: confirme a tolerância do timestamp, a unicidade do nonce e a rejeição de solicitações repetidas; teste valores expirados, reutilizados e concorrentes.

  • Autorização e limites de recursos explícitos: valide por comerciante o acesso a endpoints, carteiras e dados e confirme limites de frequência, concorrência, paginação e valor de transação, além dos alertas.

  • Transações idempotentes: elimine duplicidades em notificações e transferências pelo identificador da transação, evitando lançamentos duplicados em solicitações repetidas.

  • Resultados conciliáveis: em caso de timeout ou exceção de rede, consulte o resultado da transação antes de decidir se deve tentar novamente.

  • Valores em ponto fixo: não use números binários de ponto flutuante para saldos, valores de aposta ou prêmios.

API da Plataforma Aberta de Jogos AG · V5.0.0

Referência técnica pública · a integração de produção segue o protocolo final do projeto