Como criar um link de pagamento Pix pela API da Hodle

Como criar um link de pagamento Pix pela API da Hodle

Equipe Hodle4 min de leitura

Para criar um link de pagamento Pix, publique um produto pela API e use o slug retornado para montar a URL do checkout hospedado. Seu cliente abre a página e paga o pedido em reais. A liquidação segue o ativo e a rede habilitados na sua conta.

O fluxo tem três registros diferentes: produto, pedido e cobrança. Criar o produto não significa que alguém pagou. O link pode receber mais de um pedido, enquanto cada pedido tem seu próprio identificador de acompanhamento.

Confira a habilitação antes de publicar

O contrato público de checkout documenta os endpoints do vendedor com chave de produção, checkout habilitado e pelo menos um trilho de liquidação disponível. A aprovação cadastral e as condições do parceiro continuam sendo pré-requisitos da operação real.

Não presuma que esse fluxo está disponível no sandbox só porque outro endpoint da API está. Os testes deste tutorial usam respostas HTTP sintéticas e não precisam de credenciais. A execução do script de criação abaixo, com chave real, publica um produto na sua conta de produção; ela não foi executada para produzir este tutorial.

Use Node.js 20 ou superior. Baixe requestHodle.mjs e createPaymentLink.mjs para a mesma pasta. Guarde HODLE_API_KEY no ambiente do servidor ou em um gerenciador de segredos.

1. Leia a configuração de recebimento

Antes de criar o produto, consulte GET /api/checkout/settings. O retorno informa a configuração efetiva e availableAssets. O servidor define a rede correspondente ao ativo permitido. Este tutorial apenas lê as configurações; não as altera.

Salve settings.mjs:

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

const apiKey = process.env.HODLE_API_KEY

if (!apiKey?.startsWith('hodle_live_')) {
  throw new Error('Configure a chave de produção da conta habilitada')
}

const result = await requestHodle({
  baseUrl: 'https://api.hodle.com.br',
  apiKey,
  path: '/api/checkout/settings',
})

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

console.log(result.payload.data.settings)

Execute node settings.mjs no seu ambiente autorizado e confirme a configuração antes de continuar. Um 403 pode indicar checkout desabilitado ou indisponibilidade de liquidação. Trocar o corpo do POST não concede acesso a um ativo não habilitado.

2. Publique o produto e guarde o resultado

Salve createLink.mjs. O preço abaixo é fictício e representa o valor do produto, não uma tarifa da Hodle:

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

const apiKey = process.env.HODLE_API_KEY

if (!apiKey?.startsWith('hodle_live_')) {
  throw new Error('Configure a chave de produção da conta habilitada')
}

const result = await createPaymentLink({
  baseUrl: 'https://api.hodle.com.br',
  apiKey,
  name: 'Aula individual',
  priceCents: 12500,
})

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

console.log({ productId: result.productId, slug: result.slug, url: result.url })

node createLink.mjs publica um produto de R$ 125,00. O helper chama POST /api/checkout/products com nome, preço em centavos, estoque ilimitado, solicitação de CPF/CNPJ e nota desabilitada. Não envia ativo, rede ou endereço de destino. Essas escolhas vêm da conta e do produto no servidor.

Na resposta 201, o produto está em data.product. Grave o id e o slug no seu catálogo antes de disponibilizar o link. A URL hospedada tem o formato:

https://checkout.hodle.com.br/pay/SLUG_RETORNADO_PELA_API

O cliente nunca precisa receber sua API key. Os endpoints autenticados de catálogo e configuração pertencem ao seu backend, mesmo quando o site de venda é uma aplicação de página única.

3. Entenda quando o Pix é criado

Na página hospedada, o comprador informa os dados solicitados e cria um pedido. Uma interface própria pode usar POST /api/public/checkout/orders com slug, quantity, payerEmail, payerTaxId e, quando aplicável, payerNote. O exemplo de produto exige documento do pagador; não remova esse campo de um pedido baseado nele.

A resposta de criação do pedido inclui data.order.trackId, brCode, totalCents, expiresAt e status. Esses campos pertencem ao pedido, não à resposta de criação do produto. Guarde o trackId para consultar GET /api/public/checkout/orders/:trackId.

Estado do pedidoComo tratar na interface
PENDINGExiba o QR ou Pix copia e cola e acompanhe a cobrança.
PAIDA consulta confirma o pagamento segundo o contrato do checkout.
FAILEDMostre a falha e recupere o estado antes de iniciar outra tentativa.
EXPIREDEncerre a cobrança exibida; não reaproveite um QR expirado.

O navegador pode exibir esses estados, mas o backend da sua loja também deve consultar a API antes de liberar uma entrega. Uma mensagem enviada pelo próprio navegador não é comprovação de pagamento. Leia o estado correspondente ao pedido original e confira o valor esperado.

Os endpoints públicos rejeitam campos como preço, ativo, rede, vendedor e destino. Não tente usá-los para mudar a liquidação: permitir essa mudança no lado do pagador redirecionaria o resultado de uma venda.

4. Recupere erros sem publicar produtos duplicados

O cliente disponibilizado não repete POST automaticamente. O contrato de criação de produto não publica um header genérico de idempotência. Se a conexão cair, consulte a lista de produtos da sua conta e investigue a publicação antes de repetir a chamada. Uma busca pelo nome pode ser ambígua; mantenha uma operação de publicação pendente no seu banco e evite duas tentativas concorrentes para o mesmo item do catálogo.

Para pausar um link, o contrato disponibiliza PATCH /api/checkout/products/:productId com status: 'PAUSED'. Produtos pausados ou esgotados têm comportamento próprio no fluxo público. Uma resposta 429 exige controle de frequência; ela não deve disparar uma sequência de novas criações de pedido.

O que o teste comprova

O teste local de createPaymentLink.mjs verifica o caminho da API, o corpo enviado, a leitura de data.product e a URL produzida. Usa uma resposta 201 simulada, sem chave real e sem publicação de produto. Ele também verifica que ativo e rede não são enviados no POST. Não é uma venda de cliente nem uma medição de conversão.

No repositório do site, execute node --test scripts/tests/pixExamples.test.mjs. Para acompanhar as vendas depois da integração, veja conciliação Pix por API. Para definir se seu produto precisa de checkout hospedado ou de depósito programático, compare link de pagamento Pix e API Pix stablecoin.

Perguntas frequentes

Criar o produto já cria uma cobrança Pix?
Não. O produto fornece o link de pagamento. A cobrança nasce quando um pedido é criado no checkout, com a quantidade e os dados do pagador.
Posso escolher USDT ou uma rede no POST do produto?
Não. O ativo e a rede vêm das configurações efetivas do checkout da conta. O POST de produto não aceita esses campos como forma de sobrescrever a liquidação.
A API key aparece no link enviado ao cliente?
Não. A criação do produto é autenticada no servidor. O link hospedado e os endpoints públicos do pagador não recebem a chave de API do vendedor.

Mais da Hodle

Ver todos os artigos