Webhooks
Registrar un endpoint
Si prefieres que te llamen a mantener un socket abierto, registra un endpoint HTTPS. Enviamos por POST cada evento coincidente como el mismo sobre JSON, firmado con HMAC-SHA256 sobre el cuerpo en bruto en X-XSF-Signature.
registrar — el secreto se muestra una sola vez
curl -X PUT https://api.xsignalfeed.com/v1/account/webhook \ -H "Authorization: Bearer xsf_your_key" -H "Content-Type: application/json" \ -d '{"url": "https://example.com/hooks/xsf"}'
Verificar una entrega
Verifica sobre el cuerpo en bruto. Volver a serializar el JSON analizado cambia los bytes y la firma nunca coincidirá. Lee el cuerpo como bytes antes de que cualquier otra cosa lo toque.
import hmac, hashlib def valid(raw_body: bytes, signature: str, secret: str) -> bool: want = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest(want, signature)
import { createHmac, timingSafeEqual } from "crypto"; function valid(rawBody, signature, secret) { const want = createHmac("sha256", secret).update(rawBody).digest("hex"); return timingSafeEqual(Buffer.from(want), Buffer.from(signature)); }
mac := hmac.New(sha256.New, []byte(secret))
mac.Write(rawBody)
ok := hmac.Equal([]byte(hex.EncodeToString(mac.Sum(nil))), []byte(signature))Reintentos y recuperación
Reintentamos tres veces ante un código distinto de 2xx o un tiempo de espera agotado, y luego descartamos esa entrega. Nada se encola para siempre. Si tu endpoint estaba caído, toma el último sid que guardaste y ponte al día con GET /v1/events o con un WebSocket en modo de repetición — esa, y no la política de reintentos, es la verdadera vía de recuperación.