Saltar al contenido principal
Los webhooks proporcionan notificaciones en tiempo real sobre eventos como la creación, actualización o eliminación de campañas. Para recibir estas notificaciones, debe especificar un URL de acceso público capaz de recibir solicitudes POST HTTP.

Cómo funciona

Cuando se produce un evento, se envía una solicitud POST HTTP con los detalles del evento a su URL especificado. Su URL debe devolver un código de estado HTTP 2xx para las solicitudes exitosas.
Los webhooks se crean mediante la función Crear webhook (API), donde se define el evento desencadenante utilizando el campo de canal. Solo se permite un webhook por canal.

Reintentos y validación

Si su webhook URL no está disponible, intentaremos enviar la solicitud hasta 5 veces en 1 minuto, utilizando un retroceso exponencial. Los reintentos solo se producen para los códigos de estado 5xx o 429 HTTP.
Para garantizar la autenticidad e integridad de las entregas de webhook, debe validar la firma. Topsort genera una firma utilizando su secreto de webhook y la carga útil del evento, incluyéndola en el encabezado X-TS-Signature-256 HTTP.
Puedes establecer tu secreto de webhook durante la creación; de lo contrario, se generará uno automáticamente. Guarda tu secreto de forma segura.
Topsort utiliza el resumen hexadecimal HMAC (que comienza con sha256=) para calcular la firma. Debe recalcular el hash en su servidor y compararlo con la cabecera X-TS-Signature-256 para verificar la firma.

Ejemplo de verificación de firma

import hmac
import hashlib

secret = "my-webhook-secret"
request = ... # incoming request from the webhook delivery

signature = hmac.new(
    key=secret.encode(),
    msg=await request.body(),
    digestmod=hashlib.sha256,
).hexdigest()

expected_signature = "sha256=" + signature
incoming_signature = request.headers["X-TS-Signature-256"]

if not hmac.compare_digest(incoming_signature, expected_signature):
    # The signature is not valid, do not process the delivery
else:
    # The signature is valid, process the delivery

Last updated: