Skip to main content
Cada delivery incluye un header X-Waspy-Signature:
Donde:
  • t = timestamp Unix en segundos cuando Waspy generó la firma para este intento
  • v1 = HMAC-SHA256 hex de <t>.<rawBody> usando tu secret (el que devolvió POST /webhooks al crear la suscripción)
Importante — t vs. edad del payload: t se regenera en cada reintento. Su único propósito es la ventana anti-replay (5 min) sobre la firma. Si querés conocer la edad del payload original (útil para retries que pueden llegar hasta 12h después), leé el header X-Waspy-First-Attempt-At (timestamp Unix en segundos del primer intento de esta delivery). Ese header se preserva a través de todos los reintentos.

Algoritmo

  1. Tomá el body raw (string, antes de parsear JSON).
  2. Parseá el header: extraé t y v1.
  3. Calculá expected = HMAC_SHA256(secret, t + "." + rawBody).
  4. Compará expected con v1 usando una comparación constante (timing-safe).
  5. Verificá que t no sea más viejo de 5 minutos (protege contra replay del intento actual).
  6. Opcional: si querés reglas de validez del payload (por ejemplo, ignorar eventos de más de N horas), validá contra X-Waspy-First-Attempt-At en lugar de t.

Node.js

Python

Recomendaciones

  • Respondé 2xx lo antes posible (Waspy considera entregado cualquier 2xx; el body es ignorado).
  • Procesá el evento de forma asíncrona si toma más de unos segundos.
  • Guardá data.id + event para deduplicar entregas repetidas.
  • Si tu firma falla, devolvé 401 para que Waspy registre el error en lastErrorMessage.