Webhooks
Registrando um endpoint
Se você prefere ser chamado a manter um socket aberto, registre um endpoint HTTPS. Fazemos um POST de cada evento correspondente com o mesmo envelope JSON, assinado com HMAC-SHA256 sobre o corpo bruto em X-XSF-Signature.
registrar — o segredo é exibido uma única 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"}'
Verificando uma entrega
Verifique sobre o corpo bruto. Reserializar o JSON já analisado altera os bytes e a assinatura nunca vai bater. Leia o corpo como bytes antes que qualquer outra coisa o 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))Novas tentativas e recuperação
Tentamos novamente três vezes em caso de resposta não 2xx ou timeout, e então descartamos aquela entrega. Nada fica enfileirado para sempre. Se seu endpoint estava fora do ar, pegue o último sid que você armazenou e recupere o atraso com GET /v1/events ou um WebSocket com replay — esse, e não a política de novas tentativas, é o verdadeiro caminho de recuperação.