// Referência da API

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 centavos2990 quer dizer R$ 29,90. Isso evita erro de arredondamento com casas decimais.

BASE https://payments.rtsystems.app/v1
O dinheiro é seu, direto. O RT Payments não segura seu saldo. A liquidação acontece na sua própria conta PushinPay, e nossa comissão é descontada no mesmo movimento. Não existe saque, prazo de repasse nem dinheiro parado com terceiro.

Como funciona

Você conecta sua conta PushinPay no painel. É pra ela que o dinheiro vai.
Gera uma chave de API e guarda no servidor do seu sistema.
Chama POST /v1/pix quando o cliente for pagar. Volta o QR na hora.
Mostra o QR pro cliente, ou manda ele pro checkout_url que já vem pronto.
Recebe o webhook assim que o PIX cair e libera o produto no seu sistema.

Autenticação

Toda chamada leva sua chave no header Authorization, no formato Bearer:

Authorization: Bearer rtp_live_sua_chave_aqui
Sua chave é a sua conta. Use ela só no servidor. Nunca coloque em JavaScript de página, app mobile ou repositório público — quem tiver a chave consegue gerar cobrança no seu nome. Se vazar, revogue no painel: leva um clique e mata na hora.

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:

CustoQuem cobraComo 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 no CPF e o prazo de 2027

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

POST/v1/pix

Gera uma cobrança PIX e devolve o QR Code pronto pra mostrar.

Parâmetros

CampoTipoDescrição
amount obrigatóriointeiroValor em centavos. 2990 = R$ 29,90.
descriptionstringO que o cliente está comprando. Até 200 caracteres.
external_idstringSeu identificador do pedido. Também serve de chave de idempotência — ver abaixo.
expires_ininteiroMinutos até o QR expirar. De 5 a 1440. Padrão: 30.
customer.namestringNome do pagador.
customer.emailstringE-mail do pagador.
customer.phonestringTelefone do pagador.
customer.documentstringCPF 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.

Idempotência pelo external_id Se você mandar o mesmo 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

GET/v1/pix/{id}

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"
Não fique em loop consultando. Use o webhook pra saber do pagamento. A consulta serve pra conferir um caso específico ou como reserva. Ficar batendo aqui de segundo em segundo derruba você no limite de requisições.

Listar cobranças

GET/v1/pix
QueryTipoDescrição
statusstringpaid, pending, expired ou all.
external_idstringFiltra pelo seu identificador.
limitinteiroAté 100. Padrão 25.
offsetinteiroPra 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

GET/v1/me

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

GET/v1/balance

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

EventoQuando dispara
payment.paidO PIX foi confirmado e o dinheiro caiu na sua conta.
payment.testVocê 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

HeaderConteúdo
X-RTPay-SignatureAssinatura HMAC. Ver abaixo.
X-RTPay-EventNome do evento.
X-RTPay-DeliveryId único desta entrega.
X-RTPay-AttemptNú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.

Trate o evento como podendo repetir. A mesma notificação pode chegar mais de uma vez (timeout na sua ponta, reenvio manual). Antes de liberar o produto, confira se você já processou aquele 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.

Use o corpo bruto, não o JSON reserializado. Se você fizer JSON.stringify(req.body), os bytes mudam e a assinatura nunca vai bater. Pegue o corpo exatamente como chegou.

Status de uma cobrança

StatusSignificado
pendingGerada, esperando o cliente pagar.
paidPago e confirmado. Pode liberar o produto.
expiredPassou do prazo sem pagamento. Gere outra.
canceledCancelada antes de ser paga.
refundedFoi 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."
  }
}
HTTPcodeO que fazer
401sem_credencialFaltou o header Authorization.
401chave_invalidaChave errada, revogada ou conta inativa.
422dados_invalidosAlgum campo está fora do formato. Veja issues.
422valor_muito_baixoAumente o amount.
422valor_muito_altoReduza o amount.
429limite_excedidoEspere e tente de novo, com espera crescente.
502falha_no_gatewayO gateway não respondeu. Pode tentar de novo.

Limites

LimiteValor
Criação de cobrança12 por minuto, por IP
Demais chamadas120 por minuto, por IP
Chaves de API ativas5 por conta
Validade padrão do QR30 minutos (configurável de 5 a 1440)
Tentativas de webhook6, 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