Webhooks Eventos en tiempo real
Callbacks firmados con HMAC para cada evento de documento, trabajo, espacio de trabajo y tarea. 22 tipos de eventos, reintentos exponenciales, HTTPS recomendado.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Confianza de empresas líderes en todo el mundo
22 tipos de eventos, agrupados por entidad
Suscríbase a eventos individuales o use el comodín * para todo.
Documentos
14-
documento.subidoNuevo documento subido a un espacio de trabajo -
documento.creadoAlias para document.uploaded (compatibilidad) -
documento.procesadoPipeline OCR/IDP finalizado con éxito -
documento.editadoMetadatos, etiquetas o contenido actualizados -
documento.eliminadoDocumento movido a la papelera -
documento.restauradoDocumento recuperado de la papelera -
documento.movidoDocumento movido entre espacios de trabajo -
documento.version_creadaNueva versión añadida a un documento existente -
documento.ciclo_de_vida_cambiadoEstado de retención/archivo cambiado -
documento.comentario_añadidoComentario publicado en un documento -
documento.nota_añadidaNota interna adjunta -
documento.etiqueta_añadidaEtiqueta asignada a un documento -
documento.retención_legal_aplicadaRetención legal activada (inmutable) -
documento.retención_legal_liberadaRetención legal liberada
Trabajos
3-
trabajo.completadoTrabajo asíncrono finalizado con éxito -
trabajo.fallidoTrabajo asíncrono fallido terminalmente -
trabajo.progresoActualización de progreso durante trabajos de larga duración
Espacios de trabajo
2-
espacio_de_trabajo.compartidoEspacio de trabajo compartido con un usuario o equipo -
espacio_de_trabajo.no_compartidoAcceso al espacio de trabajo revocado
Tareas
3-
tarea.creadaNueva tarea creada -
tarea.completadaTarea marcada como completada -
tarea.vencidaTarea superó su fecha de vencimiento
Suscríbase a ["*"] para recibir cada evento de su cuenta.
Cada entrega sigue el mismo esquema
Cuerpo JSON predecible, cinco encabezados HTTP firmados, marcas de tiempo 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 Siempre JSON, codificado en UTF-8 User-Agent PaperOffice-Webhook/1.0 Identificador fijo para listas permitidas de firewall X-PaperOffice-Event documento.procesado Tipo de evento que se está entregando X-PaperOffice-Event-ID a3b7f9c1… ID único de 128 bits. Use para idempotencia. X-PaperOffice-Subscription-ID 42 ID de la suscripción que recibe el evento X-PaperOffice-Signature sha256=… HMAC-SHA256 del cuerpo crudo, codificado en hexadecimal Verifique cada entrega con HMAC-SHA256
Calcule HMAC-SHA256 sobre el cuerpo crudo de la solicitud usando su secreto compartido, luego compare contra X-PaperOffice-Signature usando una comparación de tiempo 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');
}); Tres estrategias de reintento, hasta 10 intentos
Elija una política por suscripción. Cada intento se registra con código de estado, cuerpo de respuesta y temporización.
exponential Exponencial (predeterminado)
El retroceso se duplica después de cada intento: 30s, 60s, 120s, 240s, 480s…
linear Lineal
Crecimiento fijo: 30s, 60s, 90s, 120s, 150s…
none Ninguno
Disparar y olvidar. Sin reintentos incluso en errores 5xx. Útil para ganchos de prueba.
9 endpoints bajo /latest/webhooks/
CRUD completo para suscripciones, registros de entrega, suscripciones de trabajos únicos y un endpoint de prueba; todo con OAuth2 Bearer y listo para MCP.
/webhooks/subscribe Crear una nueva suscripción (ilimitada por cuenta) po_webhooks_subscribe /webhooks/list Listar todas las suscripciones de la cuenta po_webhooks_list /webhooks/update Actualizar una suscripción existente po_webhooks_update /webhooks/delete Eliminación suave de una suscripción (el registro de entrega se conserva) po_webhooks_delete /webhooks/deliveries Recuperar el registro de entrega con filtros (tipo_de_evento, solo_exito) po_webhooks_deliveries /webhooks/test Enviar un evento test.ping para verificar la entrega po_webhooks_test /webhooks/subscribe-job Webhook único para un job_id específico po_webhooks_subscribe_job /webhooks/job-subscriptions Listar suscripciones limitadas a trabajos po_webhooks_job_subscriptions /webhooks/info Eventos disponibles, endpoints, políticas de reintento, información de firma po_webhooks_info Endurecido por diseño
HMAC-SHA256
Cada carga útil está firmada con su secreto. La comparación de tiempo constante es obligatoria.
Protección SSRF
IPs privadas/internas, localhost y endpoints de metadatos en la nube bloqueados en la suscripción y el despacho.
Seguro contra rebind de DNS
IP revalidada en el momento del despacho, fijada mediante CURLOPT_RESOLVE.
HTTPS fuertemente preferido
Se aceptan http y https. Se recomienda HTTPS para producción.
Idempotencia de Event-ID
Cada entrega lleva un X-PaperOffice-Event-ID único. Deduplique en su lado.
Registro de auditoría completo
Todos los intentos registrados: código de estado, cuerpo de respuesta, tiempo, mensaje de error.
Suscripciones ilimitadas, comportamiento de entrega totalmente configurable
Disponible en todos los planes. Pago por uso: 1 crédito por entrega exitosa (HTTP 2xx). Los reintentos, eventos de prueba y entregas fallidas son gratuitos.
Su primer webhook en 60 segundos
Cree un endpoint, suscríbase vía API, dispare un evento de prueba. Eso es todo.