Guia de QR Code Dinâmico
Guia de QR Code Dinâmico
Este guia explica como gerar cobranças PIX utilizando QR Codes dinâmicos.
Visão Geral
O QR Code Dinâmico permite criar cobranças únicas com valor definido, data de expiração e informações do pagador. É ideal para:
- E-commerce - Pagamentos de pedidos
- Faturamento - Faturas e boletos
- Serviços - Pagamento por serviços prestados
Para um código reutilizável, que aceita vários pagamentos e não expira — placa no balcão, doação, mensalidade —, veja o Guia de QR Code Estático.
Fluxo de Integração
Passo 1: Criar uma Cobrança (QR Code Dinâmico)
Request
Parâmetros do Body
Headers Importantes
Resposta de Sucesso (201 Created)
Sem envelope data
A resposta é um objeto plano (top-level). Não há envelope data nem
os campos statusCode/title/message. O código copia-e-cola está em
emv (não data.payload) e a chave em pixKey (não data.chave).
Passo 2: Exibir o QR Code
Usando PIX Copia e Cola
Exiba o campo emv para o cliente copiar:
Você pode gerar uma imagem de QR code a partir da string emv usando qualquer biblioteca de QR code (ex.: qrcode.js, python-qrcode).
Passo 3: Consultar Status da Cobrança
Consulte o status de uma cobrança pelo seu identifier:
O escopo qrcode.manage cobre criar, cancelar e consultar o QR: uma
credencial dedicada a cobranças enxerga se o QR foi pago sem precisar do escopo
de consulta geral (read), que dá acesso a saldo e extrato. Ver o
Guia de Autenticação.
Request
Status Possíveis
O status é retornado em MAIÚSCULAS (canônico). Uma devolução de PIX
não muda o status do QR para “refunded” — o QR permanece PAID e a
devolução é acompanhada pela transação/extrato.
Exemplos de Resposta por Status
Ativa (aguardando pagamento)
Paga (pagamento confirmado)
Após uma devolução
Uma devolução de PIX (POST /v1/accounts/{accountId}/pix/out/refund) não
muda o status do QR para “refunded” — o QR permanece PAID. A devolução é uma
transação separada; acompanhe-a pelo extrato (GET .../statement) ou pelo
lookup de pagamento (GET .../pix/payments/lookup). O lookup de QR não
retorna campos de devolução.
Expirada (cobrança expirou)
Referência de Campos
Endpoint de Lookup
A busca é feita por identifier (alias retrocompat: txid):
O lookup é resolvido em tempo real no parceiro e retorna o objeto plano do
QR (status, valor, emv e — quando pago — payer/payee/endToEndId). Este
endpoint não aceita busca por qrcodeId/endToEndId e não retorna
dados de transação/fees/refunds.
Passo 4: Receber Webhook de Pagamento
Quando o cliente pagar, você receberá um webhook qrcode.paid no envelope
canônico (id, type, occurredAt, schemaVersion, data):
Configure webhooks via POST /v1/webhooks com o tipo de evento qrcode.paid. Veja o Guia de Webhooks.
Passo 5: Cancelar uma Cobrança (Opcional)
Cancele uma cobrança pendente antes de ser paga:
Resposta (200 OK):
Passo 6: Métricas de QR Codes (opcional)
Não há endpoint de listagem de QR codes — a consulta é sempre por
identifier (lookup). Para métricas agregadas por dia (gerados/pagos/
devolvidos/valor), use:
Exemplo Completo: Integração E-commerce
Boas Práticas
- Use Idempotency Key - Sempre envie um identificador único por cobrança para evitar duplicatas
- Defina uma expiração adequada - 30 minutos para checkout, 24h para faturas
- Configure webhooks - Não dependa apenas de polling; use eventos
qrcode.paid - Todos os valores em BRL - Use no máximo 2 casas decimais (ex.:
150.75para R$150,75) - Trate a expiração - Notifique o cliente quando a cobrança expirar
- Armazene o identifier - Use-o para consultar status e conciliar pagamentos
Erros Comuns
Os erros vêm no formato { "errorCode": "...", "message": "..." }:
Exemplo:
Próximos Passos
- Guia de Cash Out - Fazer transferências PIX
- Guia de Devolução - Devolver pagamentos recebidos
- Webhooks - Configurar notificações