Contractum

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.

  1. En Zapier: creá un Zap → Trigger Webhooks by Zapier → Catch Hook, copiá la URL generada.
  2. En Make: creá un escenario → módulo Webhooks → Custom webhook, copiá la URL generada.
  3. Pegá esa URL en Contractum, seleccioná los eventos que querés recibir y guardá.

Eventos disponibles

EventoSe 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-8
  • X-Contractum-Event — nombre del evento (ej. contract.signed)
  • X-Contractum-Signature — firma HMAC-SHA256 del body, con prefijo sha256=
{
  "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.