Fluxo geral
1
Você cadastra uma URL HTTPS e escolhe os eventos
Use
POST /webhooks ou cadastre pelo painel,
informando quais eventos (events) você quer receber. Nós te devolvemos
um secret — a chave de assinatura.2
Acontece um evento
Por exemplo: o cliente paga uma cobrança PIX.
3
Disparamos um POST
Enviamos uma requisição
POST para a sua URL com o payload do evento e
o header de assinatura.4
Você responde 2xx
Seu backend valida a assinatura, processa o evento e responde com
HTTP 2xx rapidamente. Se responder erro 5xx ou demorar muito
(timeout), fazemos retry.
Estrutura do payload
Todo webhook tem o mesmo formato base:id: identificador único desta entrega de evento (evt_...) — use como chave de idempotênciaevent: nome do evento, ver tabela abaixocreatedAt: quando o evento ocorreudata: dados específicos do evento
Beta: o shape de
data pode ganhar novos campos sem aviso. Trate o
payload como append-only e ignore campos/eventos desconhecidos.Eventos disponíveis
Ao cadastrar um endpoint você escolhe de 1 a 8 eventos emevents — o
endpoint só recebe os eventos que ele está inscrito, não recebe tudo por padrão.
CHECKOUT_PAID e CHECKOUT_REFUNDED pertencem ao Checkout Hospedado
(documentação completa em breve). CHARGE_EXPIRED existe no schema mas
nenhum job dispara esse evento atualmente — não dependa dele ainda.Header enviado
Toda requisiçãoPOST para a sua URL inclui:
Validando a assinatura
Achave de assinatura (secret) é devolvida uma única vez, na resposta
do POST /webhooks. Guarde-a em variável de ambiente ou cofre — é ela que
prova que uma requisição realmente veio da Liquerapay.
O header Liquera-Signature segue o formato t=<timestamp>,v1=<assinatura>:
t: timestamp Unix (segundos) de quando o evento foi assinadov1: HMAC-SHA256, em hex, calculado sobre a string"${t}.${corpo_bruto}"(o timestamp, um ponto, e o corpo bruto da requisição — antes deJSON.parse), usando osecretdo endpoint como chave
t e v1 do header, recalcule o HMAC da mesma forma
e compare com v1 usando uma comparação em tempo constante.
Política de retry
Quando uma tentativa falha, o comportamento depende do tipo de falha:- Erro
4xx(ex.: sua URL retorna400/404): tratamos como rejeição definitiva do seu lado — não tentamos de novo. - Erro
5xx, timeout ou falha de rede: reagendamos automaticamente com backoff exponencial (base de 2 segundos), até 3 tentativas no total.
Timeout de cada request: 10 segundos. Depois da 3ª tentativa, a entrega
fica
FAILED definitivamente.
Use GET /webhooks/{id}/deliveries para
inspecionar o histórico de entregas (status HTTP, sucesso, tentativa e erro)
de um endpoint e debugar falhas.
Idempotência
Como podemos retentar entregas, o mesmo evento pode chegar mais de uma vez. Implemente idempotência usando oid do topo do payload (evt_...) como
chave única.
Boas práticas
Recomendações
- Responda rápido (idealmente < 2s) — mova trabalho pesado para fila
- Sempre valide a assinatura
Liquera-Signature - Implemente idempotência pelo
iddo payload - Tenha logs de todos os payloads recebidos para debugging
- Use HTTPS com certificado válido
- Não dependa de ordem de entrega — eventos podem chegar fora de ordem