Pagaleve In-Store API
Documentação técnica para integração de Parcelamento via Pix em lojas físicas (PDV).
O que é esta integração?
A integração In-Store permite que estabelecimentos físicos ofereçam Parcelamento via Pix no caixa. O lojista identifica o cliente pelo CPF, envia os termos de aceite via WhatsApp e exibe um QR Code Pix para pagamento da 1ª parcela. As demais parcelas são cobradas automaticamente pela Pagaleve.
Telas que compõem o fluxo no PDV
| Etapa | Endpoint principal | Objetivo |
|---|---|---|
| 1. Autenticação | POST /v1/authentication | Obter Bearer Token (JWT) para autorizar as chamadas |
| 2. Análise de crédito | POST /v1/machine-integration/checkouts | Coletar CPF e verificar elegibilidade ao Parcelamento via Pix |
| 2.1 Análise de crédito (multi oferta) | POST /v1/machine-integration/generate-plan-from-simulation | Quando há mais de uma simulação retornada no passo 2 |
| 3. Envio dos termos | POST /v1/machine-integration/send-terms | Enviar termos de aceite via WhatsApp ao cliente |
| 4. Pagamento (QR Code) | GET /v1/checkouts/{id} | Consultar o checkout para acompanhar aceite, autorização ou conclusão |
| 5. Sucesso | Webhook / GET /v1/checkouts/{id} | Confirmar state = AUTHORIZED/COMPLETED |
| 6. Criar Pagamento | POST /v1/payments | Criar a autorização ou captura do pagamento usando o checkout autorizado |
Pré-requisitos
O que você precisa ter antes de iniciar a integração.
Conta e credenciais
É necessário ter uma conta aprovada na Pagaleve. Após aprovação, você receberá:
| Variável | Descrição | Uso |
|---|---|---|
| API_KEY | Chave pública do lojista | Campo username no login |
| API_SECRET | Chave secreta do lojista | Campo password no login |
| BEARER_TOKEN | JWT gerado pela autenticação | Header Authorization em todas as chamadas |
Checklist inicial
- Conta aprovada na Pagaleve
- API Key e API Secret em mãos
- URL de webhook HTTPS configurada
- Ambiente sandbox ativo para testes
- Acesso ao simulador de pagamento Pagaleve
Fluxo completo
Visão sequencial de todas as etapas, da identificação do cliente à confirmação do pagamento Parcelamento via Pix.
Diagrama de sequência
Interação completa entre PDV, Pagaleve e Cliente (WhatsApp) ao longo do fluxo In-Store.
sequenceDiagram
autonumber
participant PDV as PDV (Lojista)
participant PAG as Pagaleve API
participant CLI as Cliente (WhatsApp)
PDV->>PAG: POST /v1/authentication
PAG-->>PDV: 201 Created (Bearer Token)
Note over PDV,PAG: Tela 1 — Identificação
PDV->>PAG: POST /v1/machine-integration/checkouts
(individual_id, order_amount, provider)
PAG-->>PDV: 200 OK (checkout + simulações)
opt Passo 2.1 — Análise de crédito (multi oferta)
PDV->>PAG: POST /v1/machine-integration/generate-plan-from-simulation
PAG-->>PDV: 200 OK (plano escolhido)
end
Note over PDV,PAG: Tela 2 — Aprovação (envio dos termos)
PDV->>PAG: POST /v1/machine-integration/send-terms
(checkout_id, merchant_id, phone_number)
PAG-->>PDV: 200 OK
PAG->>CLI: Envia termos de aceite via WhatsApp
CLI-->>PAG: Aceita ou recusa os termos (SIM / NÃO)
PAG->>PDV: Webhook: {action: "terms", accepted: true|false, id}
loop Polling a cada 5s (fallback) — até confirmar aceite
PDV->>PAG: GET /v1/checkouts/{checkout_id}
PAG-->>PDV: 200 OK (state/aceite)
end
Note over PDV,PAG: Passo 4 — Pagamento (QR Code)
PDV->>PAG: GET /v1/checkouts/{checkout_id}
PAG-->>PDV: 200 OK (checkout atualizado)
CLI->>PAG: Paga 1ª parcela via Pix
alt Finalização do pagamento via Webhook (recomendado)
PAG->>PDV: Webhook: state = AUTHORIZED / COMPLETED
else Finalização do pagamento via Polling (fallback)
PDV->>PAG: GET /v1/checkouts/{checkout_id}
(mínimo 5s)
PAG-->>PDV: state = AUTHORIZED / COMPLETED
end
Note over PDV: Tela 4 — Sucesso (pedido finalizado)
PDV->>PAG: POST /v1/payments
(checkout_id, amount, currency, intent)
PAG-->>PDV: 201 Created (pagamento criado)
Fluxo passo a passo
1
Autenticação — obter Bearer Token (JWT)
POST /v1/authentication
- Primeira chamada do fluxo para autenticar o PDV na API Pagaleve.
- Retorna o token Bearer usado nos endpoints seguintes.
2
Análise de crédito — CPF + valor do pedido
POST /v1/machine-integration/checkouts
- Cria o checkout In-Store e valida a elegibilidade do cliente.
- O checkout_id retornado deve ser usado nos próximos passos.
2.1
Análise de crédito (multi oferta)
POST /v1/machine-integration/generate-plan-from-simulation
- Usado quando simulations[] retorna múltiplas ofertas de parcelamento para o cliente.
- Ao selecionar uma oferta, envie checkout_id, customer_id e simulation_id para gerar o plano definitivo.
3
Envio dos termos
POST /v1/machine-integration/send-terms
- Envia os termos e condições para o telefone do cliente.
- O cliente deve responder SIM no WhatsApp para autorizar o parcelamento.
- Ao receber a resposta do cliente, a Pagaleve dispara o webhook de aceite de termos (action: "terms") para a webhook_url informada.
- Como fallback, use polling em GET /v1/checkouts/{checkout_id} a cada 5 segundos até confirmar o aceite.
4
Pagamento (QR Code)
GET /v1/checkouts/{id}
- Consulta o checkout informado pelo id.
- Use para acompanhar o estado do checkout e confirmar quando ele estiver AUTHORIZED ou COMPLETED.
5
Sucesso
Webhook / GET /v1/checkouts/{checkout_id}
- Exibir sucesso quando o polling retornar state === "AUTHORIZED" ou state === "COMPLETED".
- Use polling com intervalo mínimo de 5 segundos quando o parceiro não consumir webhooks.
- As demais parcelas são cobradas automaticamente via WhatsApp pela Pagaleve.
6
Criar Pagamento
POST /v1/payments
- Cria a autorização ou captura do pagamento para o checkout informado.
- Use Idempotency-Key em retentativas para evitar duplicidade.
Fluxo com CPF prévio
Variação do fluxo In-Store para quando o PDV já possui CPF e telefone do cliente antes da tela de métodos de pagamento. A análise de crédito é feita antecipadamente e o Pagaleve já aparece na lista de métodos com as propostas de Parcelamento via Pix daquele cliente.
Quando usar cada fluxo
| Cenário | Fluxo | Como funciona |
|---|---|---|
| PDV não tem CPF/telefone do cliente | Fluxo A (Fluxo completo) | O cliente escolhe Pagaleve na tela de métodos, o PDV coleta o CPF e só então roda a análise de crédito. |
| PDV já tem CPF e telefone do cliente | Fluxo B (este) | O checkout/análise de crédito acontece antes de exibir os métodos de pagamento. O Pagaleve é exibido já com as propostas de parcelas aprovadas. |
Diagrama de sequência
Análise de crédito antecipada e exibição das propostas na própria tela de métodos de pagamento do PDV.
sequenceDiagram
autonumber
participant PDV as PDV (Lojista)
participant PAG as Pagaleve API
participant CLI as Cliente (WhatsApp)
Note over PDV: PDV já possui CPF e telefone do cliente
PDV->>PAG: POST /v1/authentication
PAG-->>PDV: 201 Created (Bearer Token)
Note over PDV,PAG: Antes de exibir os métodos de pagamento
PDV->>PAG: POST /v1/machine-integration/checkouts
(individual_id, order_amount, webhook_url)
PAG-->>PDV: 200 OK (checkout_id + simulations[])
alt Cliente elegível
PDV->>PDV: Exibe Pagaleve na tela de métodos
com as propostas de Parcelamento via Pix
else Não elegível
PDV->>PDV: Não exibe Pagaleve na tela de métodos
end
Note over PDV: Cliente seleciona Pagaleve e escolhe a proposta
opt Mais de uma simulação retornada
PDV->>PAG: POST /v1/machine-integration/generate-plan-from-simulation
(checkout_id, customer_id, simulation_id)
PAG-->>PDV: 200 OK (plano escolhido)
end
PDV->>PAG: POST /v1/machine-integration/send-terms
(checkout_id, merchant_id, phone_number)
PAG-->>PDV: 200 OK
PAG->>CLI: Envia termos de aceite via WhatsApp
CLI-->>PAG: Aceita ou recusa os termos (SIM / NÃO)
PAG->>PDV: Webhook: {action: "terms", accepted: true|false, id}
loop Polling a cada 5s (fallback) — até confirmar aceite
PDV->>PAG: GET /v1/checkouts/{checkout_id}
PAG-->>PDV: 200 OK (state/aceite)
end
PDV->>PAG: GET /v1/checkouts/{checkout_id}
PAG-->>PDV: 200 OK (QR Code Pix da 1ª parcela)
CLI->>PAG: Paga 1ª parcela via Pix
alt Webhook (recomendado)
PAG->>PDV: state = AUTHORIZED / COMPLETED
else Polling (fallback, mínimo 5s)
PDV->>PAG: GET /v1/checkouts/{checkout_id}
PAG-->>PDV: state = AUTHORIZED / COMPLETED
end
Note over PDV: Tela de Sucesso (pedido finalizado)
PDV->>PAG: POST /v1/payments
(checkout_id, amount, currency, intent)
PAG-->>PDV: 201 Created (pagamento criado)
Fluxo passo a passo
1
Autenticação — obter Bearer Token (JWT)
POST /v1/authentication
- Executado normalmente pelo PDV antes de qualquer chamada.
- Pode ser feito na abertura do caixa/sessão, já que ocorre antes da tela de métodos.
2
Análise de crédito antecipada — antes da tela de métodos
POST /v1/machine-integration/checkouts
- Como o PDV já tem individual_id (CPF) e telefone, o checkout é criado antes de exibir os métodos de pagamento.
- Envie a webhook_url do parceiro, igual ao Fluxo A.
- A resposta traz checkout_id e o array simulations[] com as propostas de parcelas daquele cliente.
- Se o cliente não for elegível, o PDV simplesmente não exibe o Pagaleve na tela de métodos.
3
Tela de métodos de pagamento — Pagaleve já com as propostas
Sem chamada de API
- O PDV monta o card do Pagaleve usando os dados já retornados em simulations[] (número de parcelas, valor da parcela e valor total).
- O cliente escolhe o Pagaleve e a proposta desejada diretamente nessa tela — sem digitar CPF novamente.
- Atenção ao tempo de expiração do checkout: se o cliente demorar, refaça o passo 2.
3.1
Confirmar a proposta escolhida (multi oferta)
POST /v1/machine-integration/generate-plan-from-simulation
- Necessário quando simulations[] retornou mais de uma oferta.
- Envie checkout_id, customer_id e o simulation_id da proposta selecionada pelo cliente.
4
Envio dos termos — após escolher o Pagaleve
POST /v1/machine-integration/send-terms
- Os termos só são disparados depois que o cliente seleciona o Pagaleve na tela de métodos.
- O cliente deve responder SIM no WhatsApp — o aceite é obrigatório.
- A Pagaleve dispara o webhook de aceite de termos (action: "terms") assim que o cliente aceita ou recusa.
- Fallback: acompanhe o aceite por polling em GET /v1/checkouts/{checkout_id} a cada 5 segundos.
5
Pagamento (QR Code)
GET /v1/checkouts/{id}
- Após o aceite, consulte o checkout para obter o QR Code Pix da 1ª parcela.
- Mantenha o polling de 5 segundos até o estado mudar.
6
Sucesso
Webhook / GET /v1/checkouts/{checkout_id}
- Exiba a tela de sucesso quando state === "AUTHORIZED" ou state === "COMPLETED".
- As demais parcelas são cobradas automaticamente via WhatsApp pela Pagaleve.
7
Criar Pagamento
POST /v1/payments
- Cria a autorização ou captura do pagamento para o checkout autorizado.
- Use Idempotency-Key em retentativas para evitar duplicidade.
Passo 1 — Autenticação
Autentica a aplicação parceira e retorna o token Bearer usado nas próximas chamadas.
Endpoint no padrão da documentação pública da Pagaleve. Envie as credenciais fornecidas pela Pagaleve no corpo da requisição.
| Campo | Tipo | Req. | Descrição |
|---|---|---|---|
| username | string | Sim | E-mail ou API key fornecida pela Pagaleve para acesso à API |
| password | string | Sim | Senha ou API Secret fornecida pela Pagaleve para acesso à API |
Respostas possíveis
Passo 2 — Análise de crédito
Cria o checkout In-Store coletando o CPF do cliente e os dados do pedido para verificar elegibilidade ao Parcelamento via Pix.
Coleta CPF, telefone, referência e valor do pedido. Ao clicar em Verificar Elegibilidade, o PDV chama o endpoint para criar o checkout e validar a aprovação do cliente.
| Campo | Tipo | Req. | Descrição |
|---|---|---|---|
| individual_id | string | Sim | CPF do cliente (somente dígitos) |
| phone_number | string | Sim | Telefone celular do cliente com DDD (somente dígitos, ex: 11999998888) |
| order_amount | integer | Sim | Valor do pedido em centavos (R$ 250,00 = 25000) |
| order_reference | string | Sim | Referência interna do pedido |
| provider | string | Sim | Provedor de integração (ex: VTEX, INTERNAL_INVITE) |
| webhook_url | string (URL) | Sim | Endpoint HTTPS do lojista onde a Pagaleve enviará as notificações de status do checkout (pagamento aprovado, expirado, cancelado, etc.). |
Respostas possíveis
Passo 2.1 — Análise de crédito (multi oferta)
Quando o passo 2 retorna múltiplas simulações, o cliente escolhe uma oferta de parcelamento e este endpoint gera o plano definitivo.
Cada card de oferta é montado a partir de um item do array simulations[] retornado no endpoint de Análise de crédito.
📦 Como montar a tela de Multi-Oferta
Os dados vêm do array simulations retornado na resposta do endpoint de criação de checkout In-Store (POST /v1/machine-integration/checkouts). Cada item em simulations[] representa uma oferta de parcelamento disponível para o cliente.
| Campo | Descrição |
|---|---|
| id | Identificador da simulação usado na confirmação. |
| number_of_installments | Quantidade de parcelas. |
| rate | Taxa de juros mensal. Quando for 0, a oferta é sem juros. |
| amount | Valor total a pagar, com juros quando houver. |
| order_amount | Valor original do pedido. |
| current_installment.amount | Valor da 1ª parcela exibida como “Pague agora”. |
| installments[] | Detalhamento de todas as parcelas. |
| iof | Valor do IOF quando há juros. |
Ao selecionar uma oferta, chame este endpoint com checkout_id, customer_id, e simulation_id.
Passo 3 — Envio dos termos
Envia os termos de aceite ao celular do cliente via WhatsApp/SMS. O cliente precisa responder "SIM" para autorizar o parcelamento.
O PDV exibe a confirmação da aprovação e o telefone do cliente. Ao clicar em Enviar Compra para Usuário, a Pagaleve dispara os termos via WhatsApp; em seguida, o PDV deve iniciar o polling a cada 5 segundos até o cliente responder SIM e autorizar o parcelamento.
Disparado ao clicar em "Enviar Compra para Usuário" na tela de Aprovação.
| Campo | Tipo | Req. | Descrição |
|---|---|---|---|
| checkout_id | string | Sim | ID do checkout criado no passo 2 |
| merchant_id | string | Sim | ID do merchant (vem da resposta do checkout) |
| phone_number | string | Sim | Telefone com prefixo internacional (ex: +5511999999999) |
Como identificar que o cliente aceitou os termos?
Existem duas formas: (1) Webhook de aceite de termos — a Pagaleve envia um POST para a webhook_url assim que o cliente aceita ou recusa; (2) Polling em GET /v1/checkouts/{checkout_id} a cada 5 segundos, como fallback.
Execute a consulta a cada 5 segundos até identificar que os termos foram aceitos e o fluxo pode avançar para o QR Code.
Passo 4 — Pagamento (QR Code)
Consulta os dados de um checkout pelo ID para acompanhar o estado do fluxo.
O PDV renderiza o QR Code Pix e o código copia-e-cola retornados pelo checkout de pagamento. Os dados da tela vêm do pedido, do cliente e do plano confirmado nos passos anteriores.
Endpoint no padrão da documentação pública de consulta de checkout. Use para consultar o checkout informado e acompanhar estados como aceite, autorização ou conclusão.
| Header | Tipo | Req. | Descrição |
|---|---|---|---|
| Authorization | string | Sim | Token de autorização Bearer |
| Subsidiary-Id | string | Não | Para uma holding consultar dados de uma subsidiária, esse campo deve ser preenchido com o ID da subsidiária. |
| Parâmetro | Tipo | Req. | Descrição |
|---|---|---|---|
| id | string | Sim | ID do checkout consultado. |
Respostas possíveis
Acompanhamento do pagamento
A finalização deve ocorrer preferencialmente via Webhook, informado em webhook_url. O polling em GET /v1/checkouts/{checkout_id} deve ser usado apenas como fallback e nunca com intervalo inferior a 5 segundos.
Simulação de pagamento (sandbox)
Cole o código Pix copiado da Tela 3 e clique em Simular Pagamento. Em sucesso, o webhook confirma o pagamento e o PDV avança para a Tela 4 — Sucesso.
Passo 5 — Sucesso
Exibida quando o polling confirma state = AUTHORIZED ou state = COMPLETED.
📦 Como montar a tela de Sucesso
Detalhes de integração para parceiros.
Quando exibir?
Exiba esta tela quando o polling de GET /v1/checkouts/{checkout_id} retornar state === "AUTHORIZED" ou state === "COMPLETED".
Tela final exibida quando o pagamento da 1ª parcela é confirmado. O valor total e a quantidade de parcelas são lidos de checkout.order.amount e checkout.ccb_terms_and_condition.numberOfInstallments.
Dados exibidos
| Campo | Caminho na resposta | Uso |
|---|---|---|
| Valor total | checkout.order.amount | Valor total da compra (em centavos) |
| Número de parcelas | checkout.ccb_terms_and_condition.numberOfInstallments | Quantidade de parcelas do plano |
Passo 6 — Criar Pagamento
Cria a autorização ou captura do pagamento a partir do checkout autorizado.
Use este endpoint para criar o pagamento informando o pedido, valor, moeda e intenção da operação.
| Header | Tipo | Req. | Descrição |
|---|---|---|---|
| Authorization | string | Sim | Token de autorização Bearer. |
| Idempotency-Key | string | Não | Chave para segurança em retentativas, evitando executar a mesma operação duas vezes. |
| Subsidiary-Id | string | Não | Para holdings consultarem dados de uma subsidiária, informe o ID da subsidiária. |
| Campo | Tipo | Req. | Descrição |
|---|---|---|---|
| amount | number | Sim | Valor em centavos. Deve ser maior ou igual a 1. |
| checkout_id | string | Sim | ID do pedido. |
| currency | string | Sim | Moeda utilizada. Valores permitidos: BRL ou USD. |
| intent | string | Sim | AUTH para autorização com captura posterior, ou CAPTURE para autorizar e capturar automaticamente. |
| reference | string | Não | ID de referência utilizado na raiz do checkout. |
Respostas possíveis
Passo 6.1 — Reembolsar Pagamento Capturado
Reembolsa total ou parcialmente um pagamento já capturado. Suporta múltiplos reembolsos até o valor total capturado.
Use este endpoint para reembolsar um pagamento capturado. Podem ser feitos reembolsos totais, parciais ou múltiplos, respeitando o valor total já capturado.
| Header | Tipo | Req. | Descrição |
|---|---|---|---|
| Authorization | string | Sim | Token Bearer. |
| Idempotency-Key | string | Não | Evita reprocessar a mesma operação em retentativas. |
| Subsidiary-Id | string | Não | Obrigatório apenas quando uma holding consulta em nome de uma subsidiária. |
| Parâmetro | Tipo | Req. | Descrição |
|---|---|---|---|
| id | string | Sim | ID do pagamento capturado que será reembolsado. |
| Campo | Tipo | Req. | Descrição |
|---|---|---|---|
| amount | number | Sim | Valor a reembolsar, em centavos. |
| description | string | Não | Observações sobre o reembolso. |
| reference | string | Não | ID do reembolso vindo do lojista. |
| reason | string (enum) | Não | DUPLICATE, FRAUDULENT ou REQUESTED_BY_CUSTOMER. |
Respostas possíveis
Passo 7 — Listar Subsidiárias
Lista as subsidiárias associadas à holding autenticada.
Use este endpoint para listar todas as subsidiárias vinculadas à holding autenticada, com filtros opcionais de período e paginação.
| Header | Tipo | Req. | Descrição |
|---|---|---|---|
| Authorization | string | Sim | Token Bearer. |
| Parâmetro | Tipo | Req. | Descrição |
|---|---|---|---|
| page | integer | Não | Número de página para iniciar (>= 0). |
| size | integer | Não | Número máximo de itens a serem retornados (limitado em 200). |
| start_date | string | Não | Data inicial no formato ISO (UTC-0). |
| end_date | string | Não | Data final no formato ISO (UTC-0). |
| timezone | string | Não | Timezone usado para o filtro de datas. |
Respostas possíveis
Webhook — Aceite de termos
Disparado pela Pagaleve assim que o cliente aceita ou recusa os termos e condições enviados via WhatsApp.
Direção: Pagaleve → servidor do lojista. A URL é a informada no campo webhook_url durante a análise de crédito (POST /v1/machine-integration/checkouts). Este evento substitui a necessidade de polling para identificar o aceite — o polling em GET /v1/checkouts/{checkout_id} a cada 5 segundos permanece disponível como fallback.
| Campo | Tipo | Descrição |
|---|---|---|
| action | string | Sempre "terms" — identifica o evento de aceite de termos. |
| accepted | boolean | true quando o cliente aceita os termos; false quando recusa. |
| id | string | checkout_id ao qual o aceite se refere. |
Como tratar
Mapeamento técnico
Todos os endpoints em ordem, com dependências e obrigatoriedade.
| # | Etapa | Método | Endpoint | Depende de | Req. |
|---|---|---|---|---|---|
| 1 | Autenticação | POST | /v1/authentication | — | Sim |
| 2 | Análise de crédito | POST | /v1/machine-integration/checkouts | Token #1 | Sim |
| 2.1 | Análise de crédito (multi oferta) | POST | /v1/machine-integration/generate-plan-from-simulation | checkout_id #2 | Condicional |
| 3 | Envio dos termos | POST | /v1/machine-integration/send-terms | checkout_id + merchant_id | Sim |
| 3.1 | Aceite dos termos — webhook action: "terms" (polling a cada 5s como fallback) | GET | /v1/checkouts/{checkout_id} | send-terms #3 | Sim |
| 4 | Pagamento (QR Code) | GET | /v1/checkouts/{id} | Aceite #3.1 | Sim |
| 5 | Sucesso | — | inbound lojista (webhook_url) | Config no #4 | Preferencial |
| 5b | Polling de fallback | GET | /v1/checkouts/{checkout_id} | checkout #4 | Fallback |
| 6 | Criar Pagamento | POST | /v1/payments | checkout autorizado #5 | Sim |
Ambientes & URLs
URL base oficial dos endpoints Pagaleve. Sempre use sandbox para desenvolvimento e testes.
API Pagaleve
Exemplo de URL completa
HTTP status codes
Webhook
Notificações assíncronas enviadas pela Pagaleve à URL informada em webhook_url no checkout de pagamento.
Eventos disponíveis
| Evento | Quando |
|---|---|
| CHECKOUT_AUTHORIZED | 1ª parcela paga via Pix (state = AUTHORIZED) |
| CHECKOUT_COMPLETED | Fluxo concluído (state = COMPLETED) |
| CHECKOUT_CANCELLED | Cancelado pelo lojista ou cliente |
| CHECKOUT_EXPIRED | QR Code expirou sem pagamento |
Checklist go-live
Itens obrigatórios antes de ativar em produção.
- Credenciais de produção (API_KEY / API_SECRET) configuradas em variáveis de ambiente
- Webhook HTTPS configurado e enviado em webhook_url no checkout de pagamento
- Renovação automática do Bearer Token antes dos 60 min
- Idempotency-Key único (UUID v4) por chamada de /checkouts
- Tratamento dos estados: CREATED, PENDING, AUTHORIZED, COMPLETED, CANCELLED, EXPIRED
- Tela de multi-oferta implementada para resposta com múltiplas simulações
- Webhook de aceite de termos (action: "terms") recebido e tratado, com polling a cada 5s como fallback
- Tratamento de DecisionPreApproveException (cliente não aprovado)
- Telefone do cliente formatado com prefixo +55 antes do send-terms
- QR Code Pix renderizado a partir de qr_code.code com botão "copia e cola"
- Logs de todas as chamadas para auditoria
- Testes no sandbox usando "Simular Pagamento" das configurações