O que a Caratuva faz nesta superfície
- Aceita um payment intent do seu servidor.
- Retorna uma URL hospedada de pagamento que você encaminha ao comprador.
- Faz onboarding do comprador via KYC (obrigatório — sem caminho para pular).
- Coleta o pagamento, executa transferência internacional + câmbio, e repassa o BRL via PIX para o destino cadastrado do vendedor.
- Notifica seu ERP via webhooks assinados a cada mudança de estado.
Passo 1 — Emitir uma chave de API
Entre no painel e crie uma chavepk_test_ para desenvolvimento, mais uma pk_live_ para produção. Guarde as duas no cofre. O segredo aparece exatamente uma vez na criação.
Veja Chaves de API para o CRUD completo.
Passo 2 — Cadastrar uma inscrição de webhook
Antes de criar o primeiro intent, inscreva-se nos eventospayment_intent.* que importam. O segredo de assinatura também volta exatamente uma vez.
Passo 3 — Criar um payment intent
Cada intent é um pedido de cobrança de valor específico de comprador específico.externalId é sua chave primária — re-POSTar o mesmo valor é seguro.
Passo 4 — Encaminhar o link de pagamento
E-mail, SMS, ou renderize ohostedPaymentUrl na sua UI — qualquer canal que você já usa para engajar o comprador. A Caratuva não envia e-mail automático ao comprador na superfície de payment-intent, porque você é dono do relacionamento.
A página hospedada cuida do login por magic link, KYC, cotação de câmbio e coleta. Seu comprador não sai de pay.caratuva.com até o redirect para returnUrl após a liquidação.
Passo 5 — Reconciliar via webhooks
Toda mudança de estado dispara um eventopayment_intent.*. Os dois eventos que importam para a maioria dos ERPs:
payment_intent.settled— fundos na conta BRL do vendedor. Marque o pedido como pago no seu sistema. O payload carregapaymentIntentId,externalIde ometadataoriginal (além desourceeexternalEventId). Para os valores de liquidação (amount,currency,brlSettledAmount,fxRateAtSettlement), faça umGET /v1/payment-intents/{id}ao receber — eles não estão no corpo do webhook.payment_intent.failed— falha terminal. O payload carrega o motivo. Estorne o pedido ou exiba erro ao comprador.
X-Caratuva-Delivery-Id como chave de idempotência — a Caratuva reentrega até sete vezes com backoff exponencial (imediato, 30s, 2m, 10m, 1h, 6h, 24h) e seu endpoint vê o mesmo delivery id em toda tentativa.
Modo teste
Chavespk_test_ rodam o fluxo inteiro de ponta a ponta contra uma instância de pagamento sandbox. As mesmas transições de intent, os mesmos webhooks, os mesmos formatos de resposta — mas KYB e KYC do comprador são aprovados automaticamente e nenhum dinheiro real se move. Use para CI e staging. Veja Ambientes.
Armadilhas comuns
- E-mail do comprador ausente. Obrigatório e precisa ser real — é para lá que vai o magic link.
- Enviar floats. Passe
amountcomo string ("12500.00") para evitar drift de float. - Re-serializar o body do webhook antes de verificar. A assinatura é computada sobre os bytes brutos. Sempre verifique contra
req.rawBody, nãoJSON.stringify(req.body). - Reusar
Idempotency-Keyem operações lógicas distintas. É escopada por organização e colapsa retentativas; não compartilhe entre intents distintos.
Para onde ir
- Payment intents — schema completo, códigos de erro, máquina de estados.
- Webhooks — verificação de assinatura, política de retentativa, referência de eventos
payment_intent.*. - Chaves de API — emissão, rotação, revogação.