Skip to main content
Los webhooks están en desarrollo. Este contrato es el que se publicará; todavía no se pueden configurar.
Firmalo puede avisar a tu sistema cuando cambia el estado de firma de un documento, con un POST firmado a una URL HTTPS de tu organización. Así no tienes que consultar la API periódicamente. Por ahora se notifican los documentos creados con la API de integración, y cada organización tiene un solo endpoint.

Eventos

Cuando firma el último participante recibes dos eventos independientes, document.collaborator_signed y document.signed, cada uno con su propio id. No dependas del orden en que llegan.

Payload

Todos los eventos comparten la misma forma: data.document.status es el estado del documento justo después del hecho: PENDING_SIGNATURE, SIGNED, REJECTED o CANCELLED. El id del participante es el mismo que devuelve la API de integración.
El payload nunca incluye el PDF, URLs de descarga, API keys, tokens, certificados, IP, geolocalización ni evidencia de firma. Para obtener más detalle del documento, consúltalo con la API usando data.document.id. Se pueden agregar campos nuevos sin cambiar version, así que ignora los que no conozcas. Quitar o renombrar un campo exigiría una versión nueva.

Headers

Verifica la firma

Cada intento se firma con el secreto del endpoint:
  • secret es el secreto completo, con su prefijo whsec_.
  • timestamp es el texto exacto de X-Signature-Timestamp.
  • rawBody son los bytes exactos del cuerpo recibido.
1

Lee el cuerpo crudo

Calcula la firma sobre los bytes recibidos, antes de parsear el JSON. Si lo parseas y lo vuelves a serializar, la firma no coincidirá.
2

Revisa el timestamp

Rechaza la entrega si faltan headers o si X-Signature-Timestamp difiere de tu reloj en más de 5 minutos.
3

Compara en tiempo constante

Calcula la firma esperada y compárala con X-Signature-Hmac con una comparación de tiempo constante.
En Express, usa express.raw({ type: 'application/json' }) en la ruta del webhook. Con express.json() pierdes el cuerpo original.

Responde y procesa

  • Responde con cualquier 2xx para confirmar la entrega. El cuerpo de tu respuesta se ignora.
  • Responde en menos de 10 segundos. Si tu proceso tarda, guarda el evento, responde 200 y procésalo después.
  • Las redirecciones no se siguen: un 3xx cuenta como fallo.

Reintentos

Si tu endpoint no responde 2xx, no contesta en 10 segundos o no se puede conectar, Firmalo reintenta la entrega. Son 8 intentos en total, en algo más de 24 horas: Cada reintento lleva un timestamp y una firma nuevos, pero el mismo X-Signature-Webhook-Id y el mismo id de evento. La entrega es al menos una vez: un mismo evento puede llegar más de una vez. Deduplica por id antes de actuar.

Secreto y rotación

  • El secreto tiene el formato whsec_… y se muestra una sola vez, al configurar el endpoint o al rotarlo. Guárdalo en el gestor de secretos de tu backend.
  • Al rotar, las entregas nuevas se firman con el secreto nuevo, pero las que ya estaban pendientes se siguen firmando con el anterior. Acepta los dos secretos durante 24 horas después de rotar.

Requisitos del endpoint

  • URL https:// en el puerto 443, accesible desde internet.
  • No se aceptan direcciones privadas, localhost ni direcciones internas de nube.