Referência da API
Transferência interna
Move saldo para qualquer outra conta iHubGames, sem passar por PSP. A liquidação é imediata: os dois lançamentos acontecem na mesma transação de banco, então ou os dois entram ou nenhum entra.
Quem recebe não precisa de nada; quem ENVIA precisa do módulo de transferência interna habilitado na conta. Sem ele a rota responde 403.
A taxa é cobrada por cima: a origem é debitada em amount + fee e o destino recebe o amount cheio. A taxa vem da configuração da sua conta (transferFee).
Origem e destino precisam estar na mesma moeda. Esta rota não converte nada — transferir entre moedas diferentes é recusado com 400. Conversão entre moedas é operação de liquidação, feita pelo nosso time.
Escopo: createInternalTransfer, desligado por padrão. Como toda rota que move dinheiro, use junto da allowlist de IPs.
/internal-transfersamount Duas requisições idênticas (mesma origem, destino, valor e taxa) dentro de 10 segundos são tratadas como a MESMA transferência: a segunda devolve o registro da primeira e não move saldo de novo. Isso protege contra retry de rede e duplo POST. Passados os 10 segundos, uma repetição idêntica é uma transferência nova — é uma operação legítima e não deve ser bloqueada.Autenticação
HTTP Basic Auth. Envie sua secret key no header:
Authorization: Basic {base64(secret:SUA_SECRET_KEY)}Parâmetros
toAccountNumbernumberobrigatórioNúmero da conta de destino. Qualquer conta ativa da plataforma.
Exemplo: 10062
amountnumberobrigatórioValor a transferir, em centavos. A taxa é somada por cima.
Exemplo: 150000
descriptionstringopcionalNota livre, gravada nos dois lançamentos do extrato. Máximo de 140 caracteres.
Exemplo: repasse mensal
Respostas
Transferência concluída. O saldo já está disponível no destino.
{
"id": "3d9a...",
"status": "COMPLETED",
"amount": 150000,
"fee": 250,
"total": 150250,
"currency": "BRL",
"description": "repasse mensal",
"completedAt": "2026-09-07T14:22:10.482Z",
"to": {
"accountNumber": 10062,
"name": "MINHA EMPRESA FILIAL",
"document": "489***30"
}
}Valor inválido, saldo insuficiente (incluindo a taxa), moedas diferentes ou destino inativo.
{
"status": 400,
"message": "Origem (BRL) e destino (MXN) estão em moedas diferentes."
}Transferência interna não habilitada na conta, ou conta bloqueada para saída de saldo.
{
"status": 403,
"message": "Transferência interna não está habilitada para esta conta."
}Exemplos
curl -X POST "https://api.ihubplay.com/internal-transfers" \
-H "Authorization: Basic $(echo -n "secret:$SECRET_KEY" | base64)" \
-H "Content-Type: application/json" \
-d '{
"toAccountNumber": 10062,
"amount": 150000,
"description": "repasse mensal"
}'const secret = process.env.IHUBGAMES_SECRET_KEY!;
const token = Buffer.from(`secret:${secret}`).toString("base64");
const res = await fetch("https://api.ihubplay.com/internal-transfers", {
method: "POST",
headers: {
Authorization: `Basic ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
toAccountNumber: 10062,
amount: 150_000, // R$ 1.500,00 em centavos
description: "repasse mensal",
}),
});
const transfer = await res.json();
// transfer.total = amount + fee, o que saiu da conta de origem