Pular para o conteúdo

Webhooks

O Corban envia um POST para a URL cadastrada pelo seu canal a cada mudança de status de uma proposta dos seus links.

curl -s -X PUT https://sandbox-api.eagleix-corban.com.br/v1/webhooks \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://api.suaempresa.com.br/webhooks/corban"}'

A resposta traz o segredo (whsec_...), exibido uma única vez. Guarde-o.

  • Um webhook por canal. No momento, apenas o sandbox está disponível.
  • Filtrar eventos: envie "eventos": ["proposta.aprovada", "proposta.recusada"]. Sem a lista, todos os eventos são enviados.
  • Requisitos da URL: https, domínio público, sem endereço IP, sem credenciais na URL e fora de redes internas.
  • Testar: POST /v1/webhooks/teste envia um evento webhook.teste assinado e devolve o resultado da entrega.
Evento Quando
proposta.criada A proposta foi criada no banco.
proposta.aguardando_formalizacao O link de assinatura foi gerado para o cliente.
proposta.formalizada O cliente assinou.
proposta.aprovada O banco aprovou.
proposta.recusada O banco recusou (final).
proposta.cancelada A proposta foi cancelada (final).
proposta.falha O banco recusou a criação; o cliente pode tentar de novo no mesmo link.
Corpo do evento
{
"id": "5d1f7c52-1d1c-4c0b-9a55-2f7a0b6c9e11",
"tipo": "proposta.aprovada",
"ocorridoEm": "2026-10-13T18:20:11Z",
"ambiente": "SANDBOX",
"link": { "id": "fd6e64ed-5ebe-434d-9351-983ff129e9c0", "referenciaExterna": "promotor-42" },
"proposta": { "numero": 100004, "status": "APROVADA", "valor": 20000, "parcelas": 36, "valorParcela": 971.54 }
}

Os eventos não levam dados pessoais. Relacione-os aos seus registros por link.id e link.referenciaExterna.

Header Conteúdo
X-Corban-Signature t=<unix>,v1=<hex> (durante a troca de segredo, dois v1)
X-Corban-Event-Id Igual ao id do corpo; o mesmo em todas as tentativas
X-Corban-Event-Type Igual ao tipo
X-Corban-Delivery-Attempt Número da tentativa (1 a 7)

v1 é o HMAC-SHA256, em hexadecimal, da string "<t>.<corpo bruto>" com o seu segredo.

import crypto from 'node:crypto'
export function verify(header, rawBody, secret, toleranceSec = 300) {
const parts = header.split(',').map((p) => p.split('='))
const t = Number(parts.find(([k]) => k === 't')?.[1])
const sigs = parts.filter(([k]) => k === 'v1').map(([, v]) => v)
if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex')
return sigs.some(
(s) => s.length === expected.length && crypto.timingSafeEqual(Buffer.from(s), Buffer.from(expected)),
)
}

Recuse (400 ou 401) o evento cuja assinatura não for válida. Recuse também eventos com t diferente do seu relógio em mais de 5 minutos: isso impede a reutilização de um envio antigo capturado por terceiros.

  1. Responda dentro do prazo. Qualquer 2xx em até 10 segundos confirma o recebimento. Recomendamos gravar o evento, responder 200 e processá-lo depois, em uma fila do seu sistema. Redirecionamentos não são seguidos.

  2. Descarte duplicados. A entrega é pelo menos uma vez: o mesmo evento pode ser recebido mais de uma vez. Use o id (ou o header X-Corban-Event-Id) como chave de deduplicação.

  3. Ordene pelo horário. Os eventos podem chegar fora de ordem. Use ocorridoEm para ordená-los e considere que o status da proposta nunca retrocede.

Se o seu endpoint falhar ou não responder no prazo, o Corban tenta novamente após 1 min, 5 min, 30 min, 2 h, 6 h e 24 h (7 tentativas no total) e, em seguida, marca a entrega como FALHOU.

  • Histórico: GET /v1/webhooks/entregas (filtre por status=FALHOU).
  • Reenvio manual: POST /v1/webhooks/entregas/{id}/reenviar.

Os exemplos usam os mesmos caminhos da referência da API.

Consultar o webhook cadastrado (o segredo não é devolvido):

curl -s -X GET https://sandbox-api.eagleix-corban.com.br/v1/webhooks \
-H "Authorization: Bearer $ACCESS_TOKEN"

Enviar um evento de teste (webhook.teste, assinado) para a URL cadastrada:

curl -s -X POST https://sandbox-api.eagleix-corban.com.br/v1/webhooks/teste \
-H "Authorization: Bearer $ACCESS_TOKEN"

Listar as entregas (use status=FALHOU para ver apenas as que falharam):

curl -s -X GET https://sandbox-api.eagleix-corban.com.br/v1/webhooks/entregas?status=FALHOU \
-H "Authorization: Bearer $ACCESS_TOKEN"

Reenviar uma entrega, usando o id da entrega retornado na listagem:

curl -s -X POST https://sandbox-api.eagleix-corban.com.br/v1/webhooks/entregas/$ENTREGA_ID/reenviar \
-H "Authorization: Bearer $ACCESS_TOKEN"

Remover o webhook:

curl -s -X DELETE https://sandbox-api.eagleix-corban.com.br/v1/webhooks \
-H "Authorization: Bearer $ACCESS_TOKEN"

POST /v1/webhooks/segredo gera um novo segredo, exibido uma única vez:

curl -s -X POST https://sandbox-api.eagleix-corban.com.br/v1/webhooks/segredo \
-H "Authorization: Bearer $ACCESS_TOKEN"

O segredo anterior continua válido por 24 horas e, nesse período, cada envio traz as duas assinaturas v1. Atualize o segredo no seu sistema dentro desse prazo e nenhum evento será rejeitado na troca.