Receba por PIX
em 3 linhas de código
Uma chamada gera o QR Code. O cliente paga. O dinheiro cai direto na sua conta — não passa pela nossa. Avisamos seu sistema por webhook no mesmo segundo.
Introdução
A API do RT Payments gera cobranças PIX pra você usar em site, bot de Telegram, app, checkout próprio — o que for. Você chama um endpoint e recebe o QR Code e o código copia-e-cola prontos.
Toda requisição usa JSON sobre HTTPS. Valores em dinheiro são sempre
inteiros em centavos — 2990 quer dizer R$ 29,90.
Isso evita erro de arredondamento com casas decimais.
Como funciona
POST /v1/pix quando o cliente for pagar. Volta o QR na hora.checkout_url que já vem pronto.Autenticação
Toda chamada leva sua chave no header Authorization,
no formato Bearer:
Authorization: Bearer rtp_live_sua_chave_aqui
Você pode ter até 5 chaves ativas ao mesmo tempo — útil pra separar ambientes ou sistemas.
Taxas e comissão
Em cada venda aprovada existem dois custos, e eles são diferentes:
| Custo | Quem cobra | Como funciona |
|---|---|---|
| Taxa do PIX | PushinPay | Cobrada pela PushinPay na sua conta, pelo serviço de processar a transação. Não tem vínculo com o RT Payments: não é receita nossa, não passa por nós e quem define o valor são eles. A tabela oficial fica dentro da conta da PushinPay. |
| Comissão | RT Payments | Percentual + valor fixo por venda aprovada, descontado automaticamente na liquidação. Está no seu painel, em Conta. |
Não tem mensalidade, taxa de adesão nem cobrança sobre cobrança gerada que não foi paga.
Se o cliente não pagar, você não paga nada. A resposta da API já traz
commission e net_amount pra você
saber exatamente quanto vai receber — net_amount já é o valor
descontada a nossa comissão.
Conta aberta no CPF na PushinPay funciona normalmente hoje. A partir de 1º de janeiro de 2027, porém, quem exerce atividade econômica como pessoa física passa a precisar de CNPJ (MEI resolve) e a emitir documento fiscal, pela regulamentação da CBS. Some a isso as Resoluções BCB nº 519 e 520 (nov/2025), que ampliaram as hipóteses de encerramento compulsório de conta, com adequação das instituições até dezembro de 2027. Resumo informativo, não é consultoria contábil — confirme sua situação com um contador.
Criar cobrança
Gera uma cobrança PIX e devolve o QR Code pronto pra mostrar.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| amount obrigatório | inteiro | Valor em centavos. 2990 = R$ 29,90. |
| description | string | O que o cliente está comprando. Até 200 caracteres. |
| external_id | string | Seu identificador do pedido. Também serve de chave de idempotência — ver abaixo. |
| expires_in | inteiro | Minutos até o QR expirar. De 5 a 1440. Padrão: 30. |
| customer.name | string | Nome do pagador. |
| customer.email | string | E-mail do pagador. |
| customer.phone | string | Telefone do pagador. |
| customer.document | string | CPF ou CNPJ, só dígitos. |
Exemplo
Resposta
{
"id": "a3f1c92b8e447d20b1c5e0aa",
"status": "pending",
"amount": 2990,
"commission": 85,
"net_amount": 2905,
"description": "Plano mensal",
"external_id": "pedido-1234",
"qr_code": "00020101021226810014br.gov.bcb.pix...",
"qr_code_base64": "iVBORw0KGgoAAAANSUhEUg...",
"qr_code_image": "https://payments.rtsystems.app/qr/a3f1c92b8e447d20b1c5e0aa.png",
"checkout_url": "https://payments.rtsystems.app/t/a3f1c92b8e447d20b1c5e0aa",
"created_at": "2026-09-01T14:22:10.442Z",
"expires_at": "2026-09-01T14:52:10.442Z"
}
Você tem três jeitos de mostrar isso pro cliente: renderizar o
qr_code como QR na sua página, usar a imagem pronta de
qr_code_image, ou simplesmente mandar ele pro
checkout_url.
external_id de novo e a cobrança anterior
ainda estiver pendente ou paga, devolvemos a mesma cobrança em vez de criar
outra — com "idempotent": true na resposta e status HTTP 200.
Isso protege contra cobrança duplicada quando sua requisição dá timeout e o seu código repete.
Consultar cobrança
Devolve a situação atual. Se ainda estiver pendente, conferimos no gateway antes de responder — o status vem sempre fresco.
curl https://payments.rtsystems.app/v1/pix/a3f1c92b8e447d20b1c5e0aa \ -H "Authorization: Bearer rtp_live_sua_chave_aqui"
Listar cobranças
| Query | Tipo | Descrição |
|---|---|---|
| status | string | paid, pending, expired ou all. |
| external_id | string | Filtra pelo seu identificador. |
| limit | inteiro | Até 100. Padrão 25. |
| offset | inteiro | Pra paginar. |
curl "https://payments.rtsystems.app/v1/pix?status=paid&limit=50" \ -H "Authorization: Bearer rtp_live_sua_chave_aqui"
Checkout pronto
Se você não quiser desenhar tela de pagamento, use o checkout_url
que vem em toda cobrança. É uma página hospedada por nós, responsiva, com QR Code,
botão de copiar, contador de expiração e confirmação automática quando o PIX cai.
// Depois de criar a cobrança, é só redirecionar: res.redirect(pix.checkout_url);
A página se atualiza sozinha quando o pagamento entra — o cliente vê o comprovante sem precisar recarregar nada.
Dados da conta
Confirma que a chave é válida e mostra sua configuração atual. Bom pra testar a integração.
{
"id": "AYZVZR",
"name": "Loja do Kawan",
"email": "voce@email.com",
"status": "active",
"commission": { "percent": 1.5, "fixed": 40, "mode": "split" },
"gateway": { "provider": "pushinpay", "account_id": "A0FE...0BB9", "status": "connected" },
"webhook_url": "https://seusite.com/webhook/rtpay",
"stats": { "approved_count": 128, "approved_amount": 964500 }
}Saldo
Consulta o saldo da sua conta no gateway. Valores em centavos.
{ "available": 45320, "total": 51200, "blocked": 5880, "currency": "BRL" }Webhooks
Cadastre uma URL no painel e mandamos um POST nela quando
o pagamento for aprovado. É assim que seu sistema fica sabendo — sem ficar consultando.
Eventos
| Evento | Quando dispara |
|---|---|
| payment.paid | O PIX foi confirmado e o dinheiro caiu na sua conta. |
| payment.test | Você apertou "Disparar teste" no painel. |
Corpo enviado
{
"event": "payment.paid",
"created_at": "2026-09-01T14:31:02.180Z",
"data": {
"id": "a3f1c92b8e447d20b1c5e0aa",
"status": "paid",
"amount": 2990,
"commission": 85,
"net_amount": 2905,
"external_id": "pedido-1234",
"payer_name": "Joao da Silva",
"end_to_end_id": "E1234567820260901143100abcdef123",
"paid_at": "2026-09-01T14:31:01.000Z",
"created_at": "2026-09-01T14:22:10.442Z"
}
}Headers
| Header | Conteúdo |
|---|---|
| X-RTPay-Signature | Assinatura HMAC. Ver abaixo. |
| X-RTPay-Event | Nome do evento. |
| X-RTPay-Delivery | Id único desta entrega. |
| X-RTPay-Attempt | Número da tentativa. |
Reentrega
Responda HTTP 2xx pra confirmar. Se não responder, tentamos de novo até 6 vezes com espera crescente: 30 segundos, 2 minutos, 5, 15, 1 hora e 3 horas. Depois disso a entrega fica marcada como falha, e você pode reenviar manualmente no painel.
data.id. Isso evita entregar duas vezes.
Validar a assinatura
Sem validar, qualquer um que descobrir sua URL consegue fingir um pagamento aprovado. Sempre valide.
O header vem assim: X-RTPay-Signature: t=1756742100,v1=9f86d081....
Você recalcula o HMAC SHA-256 de t + "." + corpo_bruto usando
o segredo do webhook (está no painel) e compara com o v1.
JSON.stringify(req.body), os bytes mudam e a
assinatura nunca vai bater. Pegue o corpo exatamente como chegou.
Status de uma cobrança
| Status | Significado |
|---|---|
| pending | Gerada, esperando o cliente pagar. |
| paid | Pago e confirmado. Pode liberar o produto. |
| expired | Passou do prazo sem pagamento. Gere outra. |
| canceled | Cancelada antes de ser paga. |
| refunded | Foi devolvida depois de paga. |
Erros
Erro sempre volta no mesmo formato, com o HTTP correspondente:
{
"error": {
"code": "valor_muito_baixo",
"message": "O valor mínimo é 100 centavos."
}
}| HTTP | code | O que fazer |
|---|---|---|
| 401 | sem_credencial | Faltou o header Authorization. |
| 401 | chave_invalida | Chave errada, revogada ou conta inativa. |
| 422 | dados_invalidos | Algum campo está fora do formato. Veja issues. |
| 422 | valor_muito_baixo | Aumente o amount. |
| 422 | valor_muito_alto | Reduza o amount. |
| 429 | limite_excedido | Espere e tente de novo, com espera crescente. |
| 502 | falha_no_gateway | O gateway não respondeu. Pode tentar de novo. |
Limites
| Limite | Valor |
|---|---|
| Criação de cobrança | 12 por minuto, por IP |
| Demais chamadas | 120 por minuto, por IP |
| Chaves de API ativas | 5 por conta |
| Validade padrão do QR | 30 minutos (configurável de 5 a 1440) |
| Tentativas de webhook | 6, com espera crescente |
Passou do limite? Volta HTTP 429. Espere e tente de novo dobrando o intervalo a cada falha. Se seu volume for maior que isso, fala com a gente que ajustamos.
Pronto pra integrar?
Cria a conta, conecta sua PushinPay e pega sua chave. Leva dois minutos.
Criar conta grátis