Webhooks — Documentación para developers
Referencia de eventos, formato de payload y verificación de firma para integrar Contractum con Zapier, Make u otro sistema mediante webhooks salientes.
Configuración
Cada usuario configura sus propios webhooks desde Perfil → Integraciones (hasta 5 por cuenta). Al crear uno, se genera un secret único usado para firmar cada entrega.
- En Zapier: creá un Zap → Trigger Webhooks by Zapier → Catch Hook, copiá la URL generada.
- En Make: creá un escenario → módulo Webhooks → Custom webhook, copiá la URL generada.
- Pegá esa URL en Contractum, seleccioná los eventos que querés recibir y guardá.
Eventos disponibles
| Evento | Se dispara cuando… |
|---|---|
approval.decided |
Un flujo de aprobación se resuelve (aprobado, rechazado o con cambios solicitados). |
contract.created |
Se crea un contrato nuevo. |
contract.expiring_soon |
El contrato entra en la ventana de alerta de vencimiento configurada (por defecto 30 y 7 días antes). |
contract.reviewed |
Se completa una revisión con IA sobre el contrato. |
contract.signed |
Todos los firmantes completaron la firma electrónica. |
contract.signer_signed |
Un firmante individual completa su firma (antes de que el proceso completo termine). |
obligation.due_soon |
Una obligación contractual vence en 7 días o en 1 día. |
obligation.overdue |
Una obligación contractual vence hoy o ya está vencida. |
Formato del payload
Cada entrega es un POST con body JSON y estos headers:
Content-Type: application/json; charset=utf-8X-Contractum-Event— nombre del evento (ej.contract.signed)X-Contractum-Signature— firma HMAC-SHA256 del body, con prefijosha256=
{
"event": "contract.signed",
"fired_at": "2026-07-27T18:04:00.000000",
"data": {
"contract_id": 1234,
"contract_name": "Acuerdo de confidencialidad",
"tipo_contrato": "NDA",
"parte_a": "Mi Empresa S.A.",
"parte_b": "Contraparte S.R.L.",
"estado": "completado",
"fecha_firma": "2026-07-27",
"monto": null,
"jurisdiccion": "CABA, Argentina",
"origin": "ai_generated",
"created_at": "2026-07-20T12:00:00.000000"
}
}
fired_at siempre está en UTC (sin sufijo de zona horaria).
Eventos específicos agregan campos adicionales dentro de data — por ejemplo contract.signer_signed incluye signer_id/signer_email, approval.decided incluye approval_status, y los eventos de obligation.* incluyen obligation_id/due_date.
Verificar la firma
Para confirmar que una entrega viene de Contractum, recalculá el HMAC-SHA256 del body crudo usando tu secret y comparalo contra el header X-Contractum-Signature:
import hashlib, hmac
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
hmac.compare_digest(expected, request.headers["X-Contractum-Signature"])
Reintentos
Si tu endpoint no responde con un código 2xx (o no responde dentro de 5 segundos), Contractum reintenta automáticamente hasta 5 veces con backoff creciente: 1, 5, 30, 120 y 360 minutos. Podés ver el historial de entregas de cada webhook — incluyendo reintentos pendientes — desde Perfil → Integraciones → Historial.