Webhooks Eventos em tempo real
Callbacks assinados com HMAC para cada evento de documento, tarefa, espaço de trabalho e atividade. 22 tipos de eventos, novas tentativas exponenciais, HTTPS recomendado.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Confiança de empresas líderes em todo o mundo
22 tipos de eventos, agrupados por entidade
Inscreva-se em eventos individuais ou use o curinga * para tudo.
Documentos
14-
documento.enviadoNovo documento carregado em um espaço de trabalho -
documento.criadoAlias para document.uploaded (compatibilidade) -
documento.processadoPipeline de OCR/IDP concluído com sucesso -
documento.editadoMetadados, tags ou conteúdo atualizados -
documento.excluidoDocumento movido para a lixeira -
documento.restauradoDocumento recuperado da lixeira -
documento.movidoDocumento movido entre espaços de trabalho -
documento.versao_criadaNova versão adicionada a um documento existente -
documento.ciclo_vida_alteradoStatus de retenção/arquivamento alterado -
documento.comentario_adicionadoComentário publicado em um documento -
documento.nota_adicionadaNota interna anexada -
documento.etiqueta_adicionadaTag atribuída a um documento -
documento.retencao_legal_aplicadaBloqueio legal ativado (imutável) -
documento.retencao_legal_libertadaBloqueio legal liberado
Tarefas (Jobs)
3-
tarefa.concluidaTarefa assíncrona concluída com sucesso -
tarefa.falhouTarefa assíncrona falhou terminalmente -
tarefa.em_andamentoAtualização de progresso durante tarefas de longa duração
Espaços de trabalho
2-
espaco_trabalho.compartilhadoEspaço de trabalho compartilhado com um usuário ou equipe -
espaco_trabalho.nao_compartilhadoAcesso ao espaço de trabalho revogado
Tarefas
3-
tarefa.criadaNova tarefa criada -
tarefa.concluidaTarefa marcada como concluída -
tarefa.atrasadaTarefa passou da data de vencimento
Inscreva-se em ["*"] para receber todos os eventos da sua conta.
Cada entrega segue o mesmo esquema
Corpo JSON previsível, cinco cabeçalhos HTTP assinados, carimbos de data/hora UTC ISO-8601.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6c9f1d4e7b2a5c8f1",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": {
"pofid": "doc_01HZY8K3M7P2Q9R5T1V6W4X2Y8",
"workspace_id": 17,
"filename": "invoice-2026-04-17.pdf",
"mime_type": "application/pdf",
"size_bytes": 284521,
"processing_result": {
"ocr_done": true,
"classification": "invoice",
"confidence": 0.98
}
}
} Content-Type application/json Sempre JSON, codificado em UTF-8 User-Agent PaperOffice-Webhook/1.0 Identificador fixo para listas de permissão de firewall X-PaperOffice-Event document.processed Tipo de evento sendo entregue X-PaperOffice-Event-ID a3b7f9c1… ID único de 128 bits. Use para idempotência. X-PaperOffice-Subscription-ID 42 ID da assinatura que recebe o evento X-PaperOffice-Signature sha256=… HMAC-SHA256 do corpo bruto, codificado em hexadecimal Verifique cada entrega com HMAC-SHA256
Calcule o HMAC-SHA256 sobre o corpo bruto da solicitação usando seu segredo compartilhado e compare com X-PaperOffice-Signature usando comparação de tempo constante (hash_equals, crypto.timingSafeEqual).
import crypto from 'crypto';
import express from 'express';
const app = express();
const WEBHOOK_SECRET = process.env.PAPEROFFICE_WEBHOOK_SECRET;
app.post('/webhooks/paperoffice', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.header('X-PaperOffice-Signature'); // "sha256=..."
const eventId = req.header('X-PaperOffice-Event-ID');
const eventType = req.header('X-PaperOffice-Event');
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (!signature || !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send('invalid signature');
}
const event = JSON.parse(req.body.toString());
// eventId als Idempotency-Key speichern -> gleiche ID nicht zweimal verarbeiten
console.log(eventType, event.data);
res.status(200).send('ok');
}); Três estratégias de nova tentativa, até 10 tentativas
Escolha uma política por assinatura. Cada tentativa é registrada com código de status, corpo da resposta e tempo.
exponential Exponencial (padrão)
O intervalo dobra após cada tentativa: 30s, 60s, 120s, 240s, 480s…
linear Linear
Crescimento fixo: 30s, 60s, 90s, 120s, 150s…
none Nenhuma
Disparar e esquecer. Sem novas tentativas mesmo em erro 5xx. Útil para webhooks de teste.
9 endpoints em /latest/webhooks/
CRUD completo para assinaturas, registros de entrega, assinaturas de tarefa únicas e um endpoint de teste — todos com OAuth2 Bearer, todos prontos para MCP.
/webhooks/subscribe Criar uma nova assinatura (ilimitada por conta) po_webhooks_subscribe /webhooks/list Listar todas as assinaturas da conta po_webhooks_list /webhooks/update Atualizar uma assinatura existente po_webhooks_update /webhooks/delete Excluir suavemente uma assinatura (registro de entrega preservado) po_webhooks_delete /webhooks/deliveries Recuperar registro de entrega com filtros (event_type, success_only) po_webhooks_deliveries /webhooks/test Enviar um evento test.ping para verificar a entrega po_webhooks_test /webhooks/subscribe-job Webhook único para um job_id específico po_webhooks_subscribe_job /webhooks/job-subscriptions Listar assinaturas escopadas por tarefa po_webhooks_job_subscriptions /webhooks/info Eventos disponíveis, endpoints, políticas de nova tentativa, informações de assinatura po_webhooks_info Reforçado por design
HMAC-SHA256
Cada payload assinado com seu segredo. Comparação de tempo constante obrigatória.
Proteção contra SSRF
IPs privados/internos, localhost e endpoints de metadados de nuvem bloqueados na inscrição e no despacho.
Seguro contra rebinding de DNS
IP revalidado no momento do despacho, fixado via CURLOPT_RESOLVE.
HTTPS fortemente preferido
http e https aceitos. HTTPS recomendado para produção.
Idempotência via Event-ID
Cada entrega carrega um X-PaperOffice-Event-ID único. Deduza no seu lado.
Registro de auditoria completo
Todas as tentativas registradas: código de status, corpo da resposta, tempo, mensagem de erro.
Assinaturas ilimitadas, comportamento de entrega totalmente configurável
Disponível em todos os planos. Pagamento por uso: 1 crédito por entrega bem-sucedida (HTTP 2xx). Novas tentativas, eventos de teste e entregas falhadas são gratuitos.
Seu primeiro webhook em 60 segundos
Crie um endpoint, inscreva-se via API, dispare um evento de teste. É só isso.