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é lo antes posible, en menos de 10 segundos. Waspy considera entregado cualquier 2xx y cualquier 3xx (301, 302, 303, 307, 308 y el resto): el POST ya se ejecutó y no lo repetimos contra Location. El body no cambia el resultado. Un 4xx, un 5xx o un timeout sí se reintentan. Ver códigos que cuentan como entrega.
  • 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.