Como integrar a API Pix com Node.js: cobrança e consulta

Como integrar a API Pix com Node.js: cobrança e consulta

Equipe Hodle4 min de leitura

Uma integração Pix precisa saber criar a cobrança, recuperar seu estado e lidar com uma resposta que não chegou. Neste tutorial, você executa esse caminho com Node.js e a API Pix da Hodle. O exemplo é específico: um depósito em reais que entrega USDC. Ele não representa todas as modalidades de cobrança Pix.

O código usa fetch nativo, sem SDK ou dependência adicional. Os arquivos publicados ao longo do texto são os mesmos exercitados pelos testes locais do site. Os testes substituem a resposta HTTP; eles verificam o cliente, não movimentam dinheiro nem comprovam a disponibilidade da sua conta.

1. Prepare o ambiente de teste

Use Node.js 20 ou superior, uma chave hodle_test_ e um endereço EVM de uma carteira de teste sob seu controle. Crie a chave de sandbox no painel e mantenha-a no servidor. Não coloque a credencial em um componente React, aplicativo distribuído ou repositório.

O host de teste é https://sandbox-api.hodle.com.br. Os exemplos dos endpoints usam Authorization: Bearer para autenticação. O host, o tipo de chave e a conta precisam pertencer ao mesmo ambiente.

No sandbox, o Pix de entrada é simulado e o BR Code não pode ser pago em um banco. A entrega usa tokens de teste em Base Sepolia. Produção exige uma chave de produção, verificação cadastral aprovada e o ativo e a operação habilitados na conta. Consulte as condições atuais no guia de sandbox.

2. Baixe o cliente e crie uma cobrança

Salve os três arquivos na mesma pasta:

Defina HODLE_API_KEY no gerenciador de segredos ou no ambiente do processo. Defina HODLE_TEST_ADDRESS com seu endereço de teste e ORDER_ID com um identificador persistido para esse pedido. O mesmo pedido deve continuar com o mesmo identificador durante a investigação de uma falha.

Crie create.mjs:

import { createPixDeposit } from './createPixDeposit.mjs'

const apiKey = process.env.HODLE_API_KEY
const address = process.env.HODLE_TEST_ADDRESS
const externalId = process.env.ORDER_ID

if (!apiKey?.startsWith('hodle_test_') || !address || !externalId) {
  throw new Error('Configure HODLE_API_KEY, HODLE_TEST_ADDRESS e ORDER_ID')
}

const result = await createPixDeposit({
  baseUrl: 'https://sandbox-api.hodle.com.br',
  apiKey,
  address,
  externalId,
  valueCents: 2500,
})

if (!result.success) {
  throw new Error(`${result.error} (HTTP ${result.status})`)
}

console.log({ externalId: result.externalId, qrCode: result.qrCode })

Execute node create.mjs. Aqui, 2500 representa R$ 25,00. O módulo envia POST /api/deposit/asset com value, address, asset: 'USDC', network: 'base' e externalId. A resposta de criação tem externalId e qrCode na raiz do JSON; ela não tem o mesmo formato da consulta.

O helper envia a requisição uma vez. Ele não acrescenta um header de idempotência inventado nem repete um POST depois de timeout. Grave o identificador antes do envio e guarde a resposta no registro do pedido.

3. Consulte o pagamento e a entrega separadamente

Com as mesmas variáveis de ambiente, salve status.mjs:

import { getPixDeposit } from './getPixDeposit.mjs'

const apiKey = process.env.HODLE_API_KEY
const externalId = process.env.ORDER_ID

if (!apiKey?.startsWith('hodle_test_') || !externalId) {
  throw new Error('Configure uma chave de sandbox e ORDER_ID')
}

const result = await getPixDeposit({
  baseUrl: 'https://sandbox-api.hodle.com.br',
  apiKey,
  externalId,
})

if (!result.success) {
  throw new Error(`${result.error} (HTTP ${result.status})`)
}

console.log({ status: result.data.status, transactionHash: result.data.transactionHash })

Execute node status.mjs. A leitura usa GET /api/deposit/asset/:externalId e retorna os campos em data. O exemplo atende a conta principal. Quando o depósito é criado com subAccountId, a consulta também precisa desse parâmetro; não use o helper sem adaptá-lo para esse escopo.

EstadoDecisão da aplicação
PENDINGA cobrança ainda aguarda pagamento.
FIAT_PAID ou PROCESSINGO Pix entrou, mas a entrega do ativo ainda precisa ser acompanhada.
COMPLETEDA entrega terminou; registre o comprovante disponível.
FAILEDInvestigue a falha de entrega; não presuma que o estorno aconteceu.
REFUNDEDReconcilie o estorno confirmado com o pedido.
EXPIREDA cobrança expirou.

Para avançar o depósito no sandbox, siga a simulação autenticada descrita no guia oficial. Não tente pagar o QR de teste. O exemplo acima não dispara a simulação automaticamente e não troca o host por produção.

4. Trate o resultado incerto sem criar uma segunda compra

Uma conexão pode cair depois de a API aceitar o pedido. Nessa situação, consulte o externalId original antes de criar outro depósito. A documentação também prevê conflito 409 para identificador já existente. Trate-o como motivo para recuperar o pedido, não para escolher outro identificador e repetir a cobrança.

Se a consulta retornar 404, confirme chave, ambiente e eventual subconta. Um 404 isolado não prova que uma requisição ainda em processamento nunca será concluída. Seu sistema deve manter a operação em investigação e limitar tentativas.

Para cobranças pagas por terceiros, há outra condição: o depósito pode restringir o pagador ao titular da conta. A habilitação de recebimento de terceiros depende da configuração da conta. Enviar um CPF no corpo não concede essa capacidade. O contrato de depósito detalha esse limite.

Do primeiro teste à integração do produto

Antes de usar o cliente em uma operação real, persista pedidos e estados, proteja segredos e implemente o recebimento de webhooks com deduplicação. Depois, feche a recuperação de eventos perdidos com conciliação por API.

A API Pix stablecoin reúne os casos em que Pix e ativos digitais participam do mesmo fluxo. Para uma venda por página hospedada, use o tutorial de link de pagamento.

Perguntas frequentes

O exemplo recebe Pix e mantém o saldo em reais?
Não. Ele usa o endpoint de depósito da Hodle: o Pix financia a entrega de USDC na rede configurada. Para conhecer outros fluxos, consulte a página API Pix e as condições da sua conta.
O QR Code do sandbox pode ser pago no banco?
Não. O sandbox devolve um BR Code impagável. A simulação de liquidação segue o procedimento autenticado da documentação e usa ativos de teste, sem Pix real.
Devo gerar outro externalId se a requisição der timeout?
Não imediatamente. O timeout não informa se a API criou o depósito. Consulte o externalId original e reconcilie o resultado antes de decidir por uma nova operação.

Mais da Hodle

Ver todos os artigos