Webhooks
Los webhooks entregan notificaciones HTTP POST en tiempo real cuando se completan tareas asíncronas en segundo plano, como la publicación exitosa de posts, fallas o envíos de respuestas.
📌 Puntos finales
Section titled “📌 Puntos finales”| Método | Ruta | Descripción | Alcance requerido |
|---|---|---|---|
POST | /v1/brand/webhooks | Registrar un nuevo punto final de webhook | webhooks:write o * |
GET | /v1/brand/webhooks | Listar suscripciones de webhook registradas | webhooks:read o * |
DELETE | /v1/brand/webhooks/{webhook_id} | Eliminar una suscripción de webhook | webhooks:write o * |
🔔 Tipos de eventos compatibles
Section titled “🔔 Tipos de eventos compatibles”| Nombre del evento | Condición de activación |
|---|---|
sns.publish.succeeded | Post publicado con éxito en la red social de destino |
sns.publish.failed | Falló la publicación del post (incluye el código de error y la elegibilidad para reintento) |
sns.publish.blocked_entitlement | Publicación bloqueada debido a límites de cuota o plan vencido |
sns.reply.succeeded | Comentario de respuesta publicado con éxito |
sns.reply.failed | Falló el envío del comentario de respuesta |
sns.provider.notification_received | Webhook en tiempo real recibido de un proveedor de SNS externo |
📦 Ejemplo de payload de webhook (sns.publish.succeeded)
Section titled “📦 Ejemplo de payload de webhook (sns.publish.succeeded)”{ "event_id": "evt_01jm8za2example", "event_type": "sns.publish.succeeded", "schema_version": 1, "occurred_at": "2026-08-16T03:30:00Z", "brand_ref": "brand_01jm8v4k9example", "trace_id": "trc_9a8b7c6d", "data": { "content_id": "content_01jm8za2example", "publish_job_id": "job_01jm8za2jobexample", "sns_type": "instagram", "connection_id": "conn_01jm8x9k2example", "provider_post_id": "18029384756102938", "status": "succeeded" }}🔐 Verificación de firma (HMAC SHA256)
Section titled “🔐 Verificación de firma (HMAC SHA256)”Las solicitudes de webhook incluyen encabezados de verificación personalizados:
Social-Webhook-Signature: Payload de la firma (v1=hex_signature)Social-Webhook-Timestamp: Marca de tiempo Unix en segundosSocial-Webhook-Id: Identificador de entrega
Verificación en Node.js (Crypto)
Section titled “Verificación en Node.js (Crypto)”import crypto from 'node:crypto';
export function verifyWebhookSignature(rawBody: string, signatureHeader: string, timestampHeader: string, secret: string): boolean { const signedPayload = `${timestampHeader}.${rawBody}`; const expectedSignature = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
const actual = Buffer.from(signatureHeader); const expected = Buffer.from(`v1=${expectedSignature}`); return actual.length === expected.length && crypto.timingSafeEqual(actual, expected);}Verificación en Python (hmac)
Section titled “Verificación en Python (hmac)”import hmacimport hashlib
def verify_webhook_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool: signed_payload = f"{timestamp}.".encode('utf-8') + raw_body expected = hmac.new(secret.encode('utf-8'), signed_payload, hashlib.sha256).hexdigest() return hmac.compare_digest(signature, f"v1={expected}")[!CAUTION] La verificación de la firma debe utilizar el cuerpo de la solicitud sin procesar (raw body).