Receba notificações sempre que algo acontecer na sua organização.
Webhooks (também conhecidos como retorno de chamada web) são um método simples que permite a uma aplicação ou sistema fornecer informações em tempo real sempre que um evento ocorre. É uma forma passiva de receber dados entre dois sistemas, por meio de uma solicitação HTTP POST.
As notificações de webhook podem ser configuradas para cada uma das integrações criadas na sua organização. Você também pode disparar um evento de teste que, antes de ir para produção, permite validar o funcionamento correto das suas notificações.
Uma vez configuradas, as notificações são enviadas sempre que ocorrer um dos eventos cadastrados. Isso evita a necessidade de verificações constantes, prevenindo a sobrecarga do sistema e a perda de dados em situações críticas.
Configurar
Webhooks são configurados no Painel, na área de integrações da sua organização. No cadastro você informa:
| Campo | Descrição |
|---|---|
| Nome | Como o endpoint aparece no Painel |
| URL | O endereço https:// que vai receber os POST |
| Eventos | Quais tipos assinar. Veja o catálogo abaixo |
O secret é gerado junto e é o que permite provar que o POST veio da Pixlog. Ele pode ser rotacionado pelo Painel a qualquer momento; a rotação invalida o secret anterior no ato.
Pelo Painel você também acompanha o histórico de entregas, dispara um evento de teste e reenvia uma entrega que falhou.
O que você recebe
{
"id": "evt_7b40c1f49a2e",
"type": "report.created",
"createdAt": "2026-08-27T13:04:11.000Z",
"organizationId": "org_2e7b40c1f49a",
"data": {
"id": "rpt_9c1f4a2e7b40",
"type": "PIXLOG"
}
}| Campo | Descrição |
|---|---|
id | Identificador único do evento |
type | O que aconteceu |
createdAt | Momento em que o evento foi gerado, em ISO 8601 |
organizationId | Organização dona do registro |
data.id | Identificador do registro afetado |
data.type | Tipo do relatório: PIXLOG, FRAMELOG, POLIX ou GROUP |
Junto com o corpo vêm os headers:
Content-Type: application/json
x-signature: ts=1756300000,v1=9f2c1ad0b4e7...e40b
x-request-id: dlv_1a7d0e5b93ccx-signature é a assinatura do evento. x-request-id identifica a entrega. Informe esse valor ao acionar o suporte.
Eventos
| Tipo | Quando é enviado |
|---|---|
report.created | Um escaneamento ou um grupo foi criado |
report.updated | Um grupo teve seus dados alterados |
report.archived | Um escaneamento ou um grupo foi arquivado |
report.unarchived | Um escaneamento ou um grupo foi desarquivado |
webhook.test | Disparo manual de teste feito pelo Painel |
No cadastro do endpoint você escolhe quais tipos assinar. O curinga * assina todos, inclusive tipos que venham a existir no futuro.
Operações em lote geram um evento por identificador: arquivar 30 relatórios de uma vez entrega 30 eventos report.archived.
Responda
2xxpara umtypeque você ainda não trata, em vez de devolver erro. Falhas acumuladas desativam o endpoint.
Validar a assinatura
Sua URL é pública: qualquer um pode enviar um POST para ela. Valide a assinatura antes de processar e rejeite com 401 o que não conferir.
O header x-signature traz duas partes:
| Parte | Conteúdo |
|---|---|
ts | Momento da assinatura, em epoch de segundos |
v1 | HMAC-SHA256 em hexadecimal |
A assinatura cobre um template curto, montado com o id e o type do corpo e o ts do header:
id:<id do evento>;type:<tipo do evento>;ts:<ts do header>;
Para o evento do exemplo acima, o template fica id:evt_7b40c1f49a2e;type:report.created;ts:1756300000;. A assinatura esperada é o HMAC-SHA256 desse texto com o secret do endpoint, em hexadecimal.
Como a assinatura é sobre o template e não sobre os bytes recebidos, você usa o parser JSON normal do seu framework, sem capturar corpo bruto nem desligar middleware.
const parts = Object.fromEntries(
(signatureHeader || "").split(",").map((p) => p.split("=", 2)),
);
const template = `id:${body.id};type:${body.type};ts:${parts.ts};`;
const expected = crypto.createHmac("sha256", secret).update(template).digest("hex");
const isValid = expected === parts.v1;Em produção, compare em tempo constante com crypto.timingSafeEqual no lugar de ===, e rejeite ts fora de uma janela de cerca de cinco minutos. Nunca registre o secret em log.
Resposta esperada
| Requisito | Detalhe |
|---|---|
| Protocolo | https://. Endereços de rede privada e reservada são recusados |
| Método | Aceitar POST com Content-Type: application/json |
| Resposta | Qualquer 2xx conta como sucesso; qualquer outro status conta como falha |
| Tempo | Responder em até 10 segundos |
Redirecionamento não é seguido: 301 e 302 contam como falha. Cadastre a URL final.
Uma entrega que falha é retentada automaticamente, com espera crescente entre as tentativas, de 5 minutos na segunda tentativa até 6 horas nas seguintes. Um endpoint que acumula falhas é desativado, e volta a receber quando você corrige a causa e o reativa pelo Painel.
Responda
2xxantes de processar. Se o seu handler grava em banco ou chama outro serviço dentro do ciclo da requisição, o tempo estoura, a entrega vira falha e o evento volta em retentativa, mesmo tendo sido processado. Enfileire e responda.
