API de pagamentos: o que é, como funciona e como construir uma integração confiável
Da primeira cobrança ao webhook de confirmação: entenda os componentes de uma API de pagamentos, os erros mais comuns de integração e as práticas de arquitetura que ajudam a evitar duplicidade, indisponibilidade e perda de receita.
Para o cliente, pagar significa tocar em um botão e aguardar alguns segundos. Para o time de tecnologia, esse clique pode iniciar uma cadeia com validação de dados, autenticação, tokenização, criação de uma intenção, comunicação com provedores externos, processamento assíncrono, atualização de pedido, envio de webhook, conciliação e tratamento de exceções. Uma API de pagamentos existe para transformar essa cadeia em uma interface previsível para o software da empresa.
A qualidade da integração não aparece apenas quando tudo funciona. Ela aparece quando a conexão cai depois do envio da cobrança, quando um webhook chega duplicado, quando o parceiro responde depois do timeout, quando o cliente aperta “Pagar” duas vezes, quando uma transação muda de estado horas depois ou quando um incidente obriga a reconstruir o histórico de um pagamento. É nesses cenários que uma API bem desenhada deixa de ser conveniência e se torna infraestrutura crítica.
Este guia apresenta os princípios para construir uma integração de pagamentos resiliente: modelagem de estados, idempotência, webhooks, retries, autenticação, logs, filas, sandbox, versionamento, segurança e conciliação. O objetivo não é ensinar uma linguagem específica, e sim mostrar uma arquitetura que continue correta quando o mundo real foge do caminho feliz.
O que é uma API de pagamentos?
API é uma interface que permite a comunicação estruturada entre sistemas. Em pagamentos, ela permite que um e-commerce, aplicativo, marketplace, ERP, plataforma SaaS ou outro software crie cobranças, envie dados, consulte estados, faça estornos, tokenize credenciais, gere Pix ou boleto e receba eventos sem depender de uma operação manual.
Uma API moderna costuma utilizar HTTP e representar recursos por URLs e objetos estruturados, frequentemente em JSON. Embora “API REST” seja um termo usado de forma ampla, a qualidade da integração depende menos do rótulo e mais da clareza do contrato: quais endpoints existem, quais campos são obrigatórios, quais estados são possíveis, quais códigos de erro podem ocorrer e como o cliente deve se recuperar.
Em pagamentos, a API também é uma fronteira de segurança. Ela recebe comandos que podem movimentar dinheiro ou alterar o estado de uma transação. Por isso, autenticação, autorização, validação, segregação de credenciais, limitação de recursos e auditoria não são detalhes opcionais.
Uma cobrança não deveria ser apenas um POST
É comum começar uma integração com algo como POST /payments. Isso cria a sensação de que o pagamento é um comando instantâneo: você manda os dados e recebe “approved” ou “denied”. Na prática, a transação possui um ciclo de vida.
Um cartão pode passar por criação, autorização, captura, cancelamento, estorno, disputa e chargeback. Pix pode ser criado, aguardado, pago, expirado ou devolvido. Boleto pode ser emitido, registrado, pago ou baixado. Cada meio possui estados próprios e eventos que não necessariamente acontecem dentro da mesma requisição.
Por isso, uma integração robusta modela o pagamento como recurso persistente, com identificador estável, histórico de estados e referências de negócio. O pedido do e-commerce pode possuir um order_id; a intenção financeira, um payment_id; tentativas individuais, IDs próprios. Separar esses conceitos evita confusão quando um pedido possui mais de uma tentativa.
Defina uma máquina de estados antes de programar
Antes de escrever código, desenhe os estados possíveis. Um modelo simplificado poderia incluir created, processing, authorized, paid, failed, canceled, refunded e disputed. Mas não copie essa lista cegamente: adapte ao contrato do provedor e ao seu modelo.
O principal é estabelecer quais transições são válidas. Um pagamento refunded pode voltar a paid? Em geral, não como o mesmo evento. Um processing pode virar failed ou paid. Um authorized pode ser capturado ou cancelado. Se a aplicação aceita qualquer estado sobrescrevendo o anterior, um webhook atrasado pode corromper o pedido.
Use regras de precedência e histórico imutável de eventos. O estado atual é uma projeção do histórico, não o único registro. Isso facilita auditoria e reconciliação.
Idempotência: a proteção contra cobrança duplicada
Idempotência é um dos conceitos mais importantes em integração financeira. O RFC 9110 define um método como idempotente quando múltiplas requisições idênticas têm o mesmo efeito pretendido que uma única requisição. Métodos como PUT e DELETE são idempotentes por definição semântica; POST, em geral, não é.
Como criação de pagamento costuma usar POST, muitas APIs implementam uma chave de idempotência na camada de aplicação. O cliente gera um identificador único para aquela intenção. Se a mesma solicitação precisar ser reenviada após timeout, o servidor reconhece a chave e devolve o resultado do processamento original em vez de criar outra cobrança.
A chave deve representar a intenção financeira, não cada pacote HTTP. Se o usuário tenta pagar novamente com outro cartão após uma recusa legítima, isso pode ser uma nova tentativa com identificador próprio. Se a aplicação repete a mesma requisição porque perdeu a resposta, deve reutilizar a chave original.
Idempotência também precisa existir internamente. Filas podem entregar uma mensagem mais de uma vez. Webhooks podem ser duplicados. Jobs podem reiniciar depois de falhar. O sistema deve ser capaz de processar novamente sem produzir efeito indevido.
Timeout não significa que a cobrança falhou
Esse é um dos erros mais perigosos. A aplicação envia a cobrança, o processador recebe e autoriza, mas a conexão cai antes que a resposta chegue. Do ponto de vista do cliente, houve timeout. Do ponto de vista financeiro, a transação foi aprovada.
Se o código interpreta timeout como “falhou” e cria outra transação, o cliente pode ser cobrado duas vezes. A resposta correta é tratar o estado como desconhecido até reconciliação. Consulte o pagamento pela referência idempotente ou aguarde o evento assíncrono antes de decidir por uma nova autorização.
Essa distinção deve aparecer na UX. Em vez de mostrar “pagamento recusado” quando você não sabe, mostre uma mensagem de processamento e continue verificando. A honestidade de estado é parte da segurança financeira.
Webhook: o canal assíncrono da operação
Webhook é uma notificação enviada pelo provedor para uma URL do cliente quando um evento ocorre. Em pagamentos, ele é usado para informar mudanças como Pix pago, estorno concluído, chargeback aberto, autorização atualizada ou outro evento que não depende de a interface do usuário continuar aberta.
Nunca presuma que o webhook chegará uma única vez. O padrão seguro é at-least-once delivery: o emissor pode repetir uma notificação se não receber confirmação. Portanto, cada evento deve possuir identificador e o consumidor precisa ser idempotente.
Também não presuma ordem perfeita. Um evento mais antigo pode chegar depois de um mais novo por retries ou filas. A aplicação deve usar timestamp, versão, sequência quando disponível e regras de transição para não retroceder o estado indevidamente.
Como receber webhooks com segurança
Primeiro, valide a autenticidade. Muitos provedores utilizam assinatura HMAC ou mecanismo equivalente. A aplicação recalcula a assinatura com um segredo compartilhado e rejeita mensagens inválidas. Não confie apenas no IP de origem, porque infraestrutura pode mudar e IP allowlist não substitui autenticação criptográfica.
Segundo, responda rapidamente. O endpoint de webhook não deve executar toda a lógica de negócio antes de retornar HTTP 2xx. Valide o essencial, persista a mensagem e coloque o processamento em fila. Isso reduz timeout e retries desnecessários.
Terceiro, registre o evento bruto com cuidado para não armazenar dados sensíveis indevidos. Guarde ID, tipo, horário, referência e metadados necessários à auditoria. Tenha ferramenta de replay para eventos que falharam internamente.
Quarto, monitore taxa de erro do webhook. Um endpoint que retorna 500 silenciosamente por horas pode deixar pedidos sem atualização mesmo que o processamento financeiro esteja normal.
Síncrono versus assíncrono
Nem tudo precisa acontecer dentro da requisição do cliente. A autorização do cartão normalmente exige resposta rápida para o checkout, mas geração de nota fiscal, envio de e-mail, CRM, atualização analítica e conciliação podem ser assíncronos.
A regra prática é manter no caminho síncrono apenas o que é necessário para decidir a experiência imediata. Cada dependência adicional aumenta latência e chance de falha. Se o pagamento depende de consultar cinco bancos de dados internos e três APIs não financeiras antes de ir ao processador, a empresa está somando risco sem necessidade.
Filas desacoplam tarefas. Porém, elas introduzem consistência eventual. O time precisa aceitar que alguns sistemas serão atualizados segundos depois e desenhar estados compatíveis.
Retries: quando repetir e quando parar
Retry é útil para erros transitórios: conexão, DNS, 502, 503 ou outro cenário definido pelo contrato. Mas repetir automaticamente todo erro pode amplificar incidentes. Se o parceiro está indisponível, milhares de workers fazendo retry imediato criam uma tempestade.
Use exponential backoff com jitter quando adequado. Limite tentativas. Adote circuit breaker para impedir novas chamadas a um serviço claramente degradado. Diferencie erro técnico de erro de negócio. Uma recusa do emissor não é um 503 e não deve ser tratada da mesma forma.
Em operações de criação financeira, combine retry com idempotência. Sem isso, recuperação de rede vira risco de duplicidade.
Padronize erros internamente
Provedores diferentes possuem códigos diferentes. Se cada controller da aplicação conhece os detalhes de cada adquirente, o domínio fica acoplado à infraestrutura. Crie uma taxonomia interna: issuer_decline, invalid_data, risk_block, authentication_failed, provider_timeout, provider_unavailable, duplicate, unknown.
Mantenha também o código original para diagnóstico. A aplicação pode tomar decisões com a categoria normalizada e o time de pagamentos consulta o detalhe bruto quando necessário.
Evite usar texto de mensagem como regra. Frases mudam com tradução e versão. Utilize campos estruturados.
Autenticação e autorização da API
Chaves de API devem ser tratadas como credenciais de produção, não como strings copiadas para planilhas. Separe sandbox e produção. Restrinja permissões quando o provedor suportar escopos. Rotacione segredos. Nunca exponha uma chave secreta em JavaScript executado no navegador.
A OWASP API Security Top 10 destaca riscos como Broken Object Level Authorization, Broken Authentication, Unrestricted Resource Consumption, Security Misconfiguration e Unsafe Consumption of APIs. Em pagamentos, esses riscos têm impacto direto. Um endpoint que permite consultar transação de outro seller por trocar um ID é uma falha grave de autorização.
A aplicação deve verificar propriedade e permissão em cada recurso. Rate limiting protege disponibilidade e abuso. Logs de acesso ajudam investigação. Segredos devem ficar em cofre ou mecanismo adequado, não no repositório.
PCI DSS e escopo de dados de cartão
O PCI DSS estabelece requisitos para entidades que armazenam, processam ou transmitem dados de titulares de cartão ou podem impactar a segurança do ambiente desses dados. A versão 4.0.1 é a referência atual publicada pelo PCI Security Standards Council.
A arquitetura da integração influencia o escopo. Se os dados do cartão passam pelos servidores da empresa, a exposição é diferente de um modelo em que campos sensíveis são enviados diretamente a um prestador por componentes seguros. O PCI SSC possui critérios específicos para diferentes modelos de e-commerce e questionários de autoavaliação, e a elegibilidade deve ser confirmada para cada implementação.
Não escolha um desenho apenas para “reduzir PCI” sem entender segurança real. Um script de terceiros comprometido na página de pagamento pode capturar dados antes da tokenização. O PCI DSS 4.x reforça controles relacionados a scripts de página de pagamento e detecção de alterações em contextos aplicáveis.
Tokenização
Tokenização permite que a aplicação trabalhe com um identificador em vez do número real do cartão em várias situações. Isso facilita compra recorrente e one-click e reduz a propagação de dados sensíveis.
Mas tokens possuem domínio. Alguns são válidos apenas dentro do provedor que os emitiu. Outros podem representar tokens de rede ou arquiteturas diferentes. Antes de assumir portabilidade, pergunte: quem é dono do vault? o token funciona em quais rotas? como ocorre migração? qual é o ciclo de vida? como cartões reemitidos são tratados?
A resposta impacta arquitetura de longo prazo.
Pix por API: estado assíncrono é natural
No Pix, a aplicação cria uma cobrança e recebe informações para pagamento, como QR Code e copia e cola. O cliente paga em seu banco e a liquidação ocorre pelo sistema de pagamentos instantâneos. O Banco Central informa que o Pix transfere recursos em poucos segundos e opera 24 horas por dia, sete dias por semana.
Para o e-commerce, não basta criar a cobrança. É preciso receber a confirmação, associá-la ao pedido e impedir fulfillment duplicado. Webhook é fundamental, mas uma rotina de reconciliação deve existir como segunda linha de defesa.
A cobrança também possui expiração e identificadores. Não reutilize indiscriminadamente uma cobrança entre pedidos diferentes. Modele o Pix como recurso financeiro próprio.
APIs de marketplace e split
Marketplaces adicionam outra dimensão: recebedores, sellers, regras de divisão, taxas, responsabilidades e liquidação. O sistema precisa preservar a relação entre pedido comercial, transação financeira e recebedores.
Nunca implemente split apenas como cálculo visual. As regras de pagamento e liquidação dependem do produto contratado e do modelo regulatório. O Banco Central possui definições específicas para credenciadores e subcredenciadores, e determinadas estruturas de marketplace podem ou não se enquadrar em papéis de pagamento conforme o fluxo efetivo.
A API deve refletir o contrato real: quem recebe, quem paga, quem retém taxa e qual participante é responsável por cada etapa.
Observabilidade: o que medir
Comece por disponibilidade por endpoint. Depois latência p50, p95 e p99. Meça erros 4xx e 5xx separadamente. Acompanhe timeouts, taxa de webhook entregue, backlog de fila e tempo de processamento.
Para pagamentos, conecte métricas técnicas a métricas de negócio: aprovação, falha técnica, conversão, valor processado, chargeback e estorno. Um deploy que reduz latência mas aumenta erro de validação não é sucesso.
Use correlation IDs. Uma transação deve ser rastreável do checkout ao worker e ao webhook. Logs estruturados permitem pesquisar por payment_id, order_id, seller_id e provider_reference sem depender de texto solto.
Logging sem vazar dados sensíveis
Nunca registre PAN completo, CVV ou segredos. Mas “não logar nada” também é inviável. Defina uma política de observabilidade que registre IDs, estados, tempos, códigos normalizados e metadados não sensíveis.
Máscaras devem ser aplicadas antes do log. Ferramentas de APM e error tracking também precisam ser configuradas para não capturar payloads sensíveis automaticamente. Revise sampling e retenção.
LGPD e políticas de privacidade também precisam ser consideradas para dados pessoais não financeiros.
Sandbox: teste o caminho infeliz
Um sandbox útil deve permitir simular aprovação, recusa, timeout, autenticação, estorno e eventos assíncronos. Mesmo quando o provedor não oferece todos os cenários, a equipe pode criar mocks internos.
O maior erro é testar apenas 200 OK. Crie uma suíte de integração que cubra duplicidade, webhook fora de ordem, webhook repetido, indisponibilidade, resposta lenta, payload inválido e perda de conexão depois do envio.
Automatize testes contratuais. Se uma versão da API mudar um campo obrigatório, sua pipeline deve descobrir antes da produção.
Versionamento e depreciação
APIs financeiras precisam evoluir sem quebrar integrações. O provedor deve documentar versão, mudanças incompatíveis e janela de migração. O cliente, por sua vez, deve saber qual versão usa e evitar depender de comportamento não documentado.
Leia changelogs. Teste novas versões em sandbox. Mantenha um inventário de endpoints e SDKs. A OWASP destaca “Improper Inventory Management” como risco de APIs: versões antigas esquecidas podem permanecer expostas e sem manutenção.
Arquitetura interna: crie uma camada de domínio de pagamentos
Evite espalhar chamadas do provedor por controllers, jobs e modelos. Crie uma interface interna de pagamento. Seu domínio conhece operações como authorize, capture, refund, getStatus. Adaptadores traduzem isso para cada fornecedor.
Esse padrão reduz lock-in e facilita multiadquirência. Também torna testes mais simples. Quando um parceiro muda, a empresa altera o adaptador em vez de dezenas de telas.
A camada deve preservar códigos originais e permitir recursos específicos quando necessário, sem transformar a abstração em denominador comum pobre.
Multi-provider e roteamento
Se a empresa utiliza mais de um provedor, a decisão de rota precisa ocorrer antes da chamada e ser auditável. Considere elegibilidade, bandeira, seller, produto, saúde do parceiro, custo e métricas históricas.
Armazene selected_provider e motivo. Se houver fallback depois de falha técnica, registre que é uma nova tentativa e preserve idempotência dentro de cada rota. Cuidado para não autorizar em duas rotas simultaneamente.
Uma arquitetura de orquestração é poderosa, mas adiciona complexidade de conciliação. A fonte de verdade continua sendo o histórico financeiro de cada tentativa.
Reconciliação é a rede de segurança
Mesmo com API e webhook perfeitos, crie reconciliação. Consulte periodicamente transações e compare com sua base. Para cartões, concilie autorização, captura, estorno e liquidação conforme os arquivos e relatórios disponíveis. Para Pix, compare cobranças e liquidações.
Sistemas distribuídos falham. Reconciliação existe para detectar o que o fluxo online perdeu. Sem ela, um webhook ausente pode deixar um pedido errado indefinidamente.
Checklist de integração antes de entrar em produção
- IDs internos e externos definidos.
- Chave de idempotência implementada.
- Máquina de estados documentada.
- Timeout e retry definidos por tipo de operação.
- Webhook autenticado e idempotente.
- Fila para processamento assíncrono.
- Logs sem dados sensíveis.
- Métricas e alertas configurados.
- Teste de aprovação, recusa, duplicidade e timeout.
- Estorno/cancelamento testados.
- Rotina de reconciliação criada.
- Gestão de segredos e rotação definida.
- Escopo PCI revisado.
- Plano de rollback.
- Runbook de incidentes e contatos do provedor.
Como a IOPAY pode ajudar
Uma API de pagamentos deve esconder complexidade sem esconder informação. Empresas precisam de integração simples para o caminho normal e profundidade operacional para investigar exceções, acompanhar eventos e evoluir meios e rotas.
A IOPAY pode ser avaliada como camada de integração para negócios que desejam centralizar pagamentos em uma API e estruturar uma arquitetura preparada para cartão, Pix e outros fluxos digitais. O desenho ideal depende do volume, requisitos de segurança, modelo de negócio e sistemas que precisam ser integrados.
Está planejando uma nova integração ou quer reduzir a complexidade da arquitetura atual? Converse com a equipe IOPAY e desenhe o fluxo técnico antes de migrar produção.
FAQ - API de pagamentos
API de pagamentos é a mesma coisa que gateway?
Não necessariamente. Gateway é uma camada de infraestrutura de pagamento que normalmente expõe APIs, mas uma API é apenas a interface de comunicação. Provedores com papéis diferentes também podem disponibilizar APIs.
O que é idempotência?
É a propriedade de permitir repetições controladas sem produzir o mesmo efeito financeiro várias vezes. Em APIs de criação de pagamento, normalmente é implementada com uma chave única da intenção.
Preciso usar webhook?
Para fluxos que podem mudar de estado depois da resposta síncrona, sim, webhook é altamente recomendado. Mesmo assim, mantenha reconciliação periódica como segunda linha de defesa.
Posso repetir uma cobrança após timeout?
Não imediatamente sem verificar o estado. O primeiro pedido pode ter sido processado. Use idempotência e consulta de status.
Como proteger a chave da API?
Armazene em gerenciador de segredos ou mecanismo equivalente, limite acesso, separe ambientes, faça rotação e nunca exponha chave secreta no frontend.
Uma API de pagamentos precisa ser PCI DSS?
A aplicabilidade depende do papel e do escopo. Se a entidade armazena, processa, transmite dados de cartão ou pode impactar a segurança do ambiente, requisitos PCI DSS podem se aplicar. Consulte o PCI SSC e um especialista para seu caso.
Webhooks podem chegar duplicados?
Sim. Sua implementação deve assumir duplicidade e, idealmente, eventos fora de ordem. Use IDs de evento e processamento idempotente.
Qual é a melhor arquitetura para alta escala?
Não existe uma única. Em geral, caminhos síncronos enxutos, filas para tarefas secundárias, idempotência, observabilidade, reconciliação e isolamento de dependências ajudam. A capacidade deve ser testada com o perfil real de carga.
Referências
- RFC 9110 - HTTP Semantics: https://www.rfc-editor.org/rfc/rfc9110.html
- OWASP - API Security Top 10: https://owasp.org/API-Security/
- OWASP Top 10:2025: https://owasp.org/Top10/2025/
- PCI Security Standards Council - PCI DSS: https://www.pcisecuritystandards.org/pt/standards/pci-dss/
- PCI SSC - FAQ sobre e-commerce e SAQ A: https://www.pcisecuritystandards.org/faqs/1588/
- Banco Central do Brasil - Sobre o Pix: https://www.bcb.gov.br/estabilidadefinanceira/pix-sobre
- Banco Central do Brasil - Sistema de Pagamentos Instantâneos: https://www.bcb.gov.br/estabilidadefinanceira/sistemapagamentosinstantaneos
- Banco Central do Brasil - Arranjos de Pagamento: https://www.bcb.gov.br/estabilidadefinanceira/arranjospagamento/
- Banco Central do Brasil - FAQ de Liquidação Centralizada: https://www.bcb.gov.br/estabilidadefinanceira/faq-liquidacao-centralizada