
Idioma 🇪🇸 Español
Visión general
Implementación
Detrás de cámaras
Webhooks
Con FastComments es posible invocar un endpoint de la API cada vez que se añade, actualiza o elimina un comentario de nuestro sistema.
Lo logramos con webhooks asíncronos a través de HTTP/HTTPS.
Qué son los Webhooks 
Un Webhook es un mecanismo, o una integración, entre dos sistemas donde el "productor" (FastComments) desencadena un evento que el "consumidor" (Usted) consume mediante una llamada a la API.
Eventos y recursos compatibles 
FastComments admite webhooks solo para el recurso Comentario.
Admitimos webhooks para la creación, eliminación y actualización de comentarios.
Cada uno de estos se considera un evento separado en nuestro sistema y, como tal, tiene diferentes semánticas y estructuras para los eventos de webhook.
Cualquier número de endpoints puede suscribirse al mismo evento, desde el panel de control o a través de la API (vea Administrar Webhooks a través de la API). Cada webhook se entrega de forma independiente.
Configuración de desarrollo local 
For Local development, use a tool like ngrok.
In order to simplify keeping the system secure, local development follows the same process as setting up and securing other environments.
Step 1: Add "localhost" to domains in your account.
Add "localhost" como dominio aquí.
Step 2: Pick an API Key
We're going to be adding webhook configuration for your domain, so we'll need an API key. Puedes hacerlo aquí.
Under "Associate with domain" - select your "localhost" domain.
NOTA: Alternatively, you can use one API Secret for all testing activity and staging environments. Simply add an API Secret for "All Domains", and give it a name like "test".
Ensure you have an API Secret defined for your production domain(s). Events for all other domains will use the wildcard (testing) secret.
Step 3: Add Your Webhook
While running ngrok or similar tool, set the value for "localhost" aquí.
When clicking Send Test Payload, we will send two test events to check that you validate the API key.
Once it validates, hit Save.
Step 4: Add A Comment
Now you can add, edit, or delete comments and should see us call your local development machine with the events, using your testing API key. There may be up to 30 seconds delay for the events to reach your machine.
Configuración 
Siga los mismos pasos para localhost que haría en producción. Asegúrese de que tiene configurados los dominios de producción y los secretos de API.
Primero, navegue a la administración de Webhooks. Esto es accesible a través de Administrar datos -> Webhooks.
La página muestra cada webhook en su cuenta:
Haga clic en Nuevo Webhook para agregar uno. Cada webhook tiene una URL, un evento de comentario (creado, actualizado o eliminado), un dominio y un método HTTP:
Cada webhook se entrega de forma independiente. Puede enviar el mismo evento a varios puntos finales, y un webhook con alcance a Todos los dominios recibe comentarios de todos los dominios incluso cuando existe un webhook específico de dominio para el mismo evento. No se puede agregar la misma URL, evento y dominio dos veces.
Antes de guardar, haga clic en Enviar carga de prueba para verificar que el punto final acepta una solicitud firmada. Consulte la siguiente sección, "Pruebas", para obtener más detalles.
Desde la lista puede editar, desactivar, volver a activar o eliminar un webhook. Desactivar mantiene los eventos en cola hasta que el webhook se vuelva a activar; eliminar los descarta.
Los webhooks también pueden crearse a través de la API, por ejemplo mediante Zapier. Estos aparecen en la misma lista con la fuente API. Consulte la gestión de webhooks a través de la API.
Pruebas 
Las nuevas páginas de webhook y de edición tienen un botón Send Test Payload que envía una solicitud a la URL que está actualmente en el formulario, haya sido guardada o no. Los eventos Create y Update envían un objeto WebhookComment de prueba, mientras que al probar Delete se enviará un cuerpo de solicitud de prueba con solo un ID.
Verificando Cargas Útiles
Al probar su integración de webhook, verifique que las solicitudes entrantes incluyan los siguientes encabezados:
X-FastComments-Timestamp- Marca de tiempo Unix (segundos)X-FastComments-Signature- Firma HMAC‑SHA256
Los webhooks creados antes de que se introdujera el esquema de firma también reciben un encabezado token que contiene su API Secret. Los webhooks nuevos no lo hacen.
Utilice la verificación de firma HMAC para garantizar que las cargas sean auténticas.
Herramientas de Prueba
Puede usar herramientas como webhook.site o ngrok para inspeccionar las cargas de webhook entrantes durante el desarrollo.
Tipos de Eventos
- Create Event: Se dispara cuando se crea un nuevo comentario.
- Update Event: Se dispara cuando se edita un comentario.
- Delete Event: Se dispara cuando se elimina un comentario.
Cada webhook está asociado a un evento y a un método HTTP (POST, PUT o DELETE). Cada evento incluye los datos completos del comentario en el cuerpo de la solicitud (vea Data Structures para el formato de la carga).
Estructuras de datos 
The only structure sent via webhooks is the WebhookComment object, outlined in TypeScript below.
The WebhookComment Object Structure
The "Create" Event Structure
The "create" event request body is a WebhookComment object.
The "Update" Event Structure
The "update" event request body is a WebhookComment object.
The "Delete" Event Structure
The "delete" event request body is a WebhookComment object.
Change as of Nov 14th 2023
Previously the "delete" event request body only contained the comment id. It now contains the full comment at the time of deletion.
Every key is always present in the body. When the comment has no value for a field the body carries null
(or false for booleans and [] for lists), so the shape of a delivery never varies from one comment to the next.
Run 
When users are tagged in a comment, the information is stored in a list called mentions. Each object in that list
has the following structure.
Run 
HTTP Methods
You can configure the HTTP method for each webhook event type in the admin panel:
- Evento Create: POST o PUT (por defecto: PUT)
- Evento Update: POST o PUT (por defecto: PUT)
- Evento Delete: DELETE, POST o PUT (por defecto: DELETE)
Since all requests contain an ID, Create and Update operations are idempotent by default (PUT). Repeating the same Create or Update request should not create duplicate objects on your side.
Request Headers
Each webhook request includes the following headers:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Tu secreto de API |
X-FastComments-Timestamp | Marca de tiempo Unix (segundos) cuando la solicitud fue firmada |
X-FastComments-Signature | HMAC-SHA256 signature (sha256=<hex>) |
See Security & API Tokens for information on verifying the HMAC signature.
Seguridad y tokens de API 
Las solicitudes webhook de FastComments incluyen múltiples mecanismos de autenticación por motivos de seguridad.
Encabezados enviados
| Header | Description |
|---|---|
token | Tu API Secret (para compatibilidad con versiones anteriores) |
X-FastComments-Timestamp | Marca de tiempo Unix (segundos) cuando se firmó la solicitud |
X-FastComments-Signature | Firma HMAC-SHA256 de la carga útil |
Verificación de firma HMAC (Recomendado)
Recomendamos encarecidamente verificar la firma HMAC para garantizar que las cargas útiles de los webhooks sean auténticas y no hayan sido manipuladas.
Formato de la firma: sha256=<hex-encoded-signature>
Cómo se calcula la firma:
- Concatenar:
timestamp + "." + JSON_payload_body - Calcular HMAC-SHA256 usando tu API Secret como clave
- Codificar el resultado en hexadecimal
Ejemplo de verificación (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Verificar que la marca de tiempo sea reciente (dentro de 5 minutos)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Prevención de ataques de repetición
}
// Verificar firma
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Ejemplo de verificación (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Verificar que la marca de tiempo sea reciente
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Verificar firma
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Ejemplo de verificación (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Verificar que la marca de tiempo sea reciente (dentro de 5 minutos)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Verificar firma
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Autenticación heredada
El encabezado token que contiene tu API Secret todavía se envía por compatibilidad con versiones anteriores. Sin embargo, recomendamos migrar a la verificación HMAC para mejorar la seguridad, ya que protege contra ataques de repetición.
Gestión de Webhooks a través de la API 
Webhooks también pueden gestionarse a través de la API REST. Así es como integraciones como Zapier se suscriben a eventos de comentarios sin tocar el panel de control, y sigue el patrón REST Hooks: suscribirse, recibir eventos, cancelar la suscripción.
Las suscripciones API conviven con los webhooks configurados en el panel de control. Un evento de comentario se entrega a cada webhook que coincida con su dominio, cada uno como una entrega independiente, sin importar cómo se haya creado el webhook.
Autenticación
Cada solicitud necesita su API Key en el encabezado x-api-key (o el parámetro de consulta API_KEY) y su ID de inquilino en el parámetro de consulta tenantId. Ambos se muestran en la página API Secret del panel de control.
Suscripción
POST https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
x-api-key: YOUR_API_KEY
Content-Type: application/json
{
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created"
}| Campo | Obligatorio | Descripción |
|---|---|---|
url | Sí | Una URL http o https absoluta. |
event | Sí | comment-created, comment-updated o comment-deleted. |
domain | No | Un dominio de la configuración de su cuenta. Por defecto es *, que recibe eventos para todos los dominios. |
method | No | POST (por defecto), PUT o DELETE. |
La respuesta contiene la suscripción:
{
"status": "success",
"webhook": {
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created",
"domain": "*",
"method": "POST",
"source": "api",
"enabled": true,
"createdAt": "2026-09-08T12:00:00.000Z"
}
}
Suscribir la misma URL al mismo evento y dominio nuevamente devuelve la suscripción existente en lugar de crear un duplicado, por lo que un cliente puede reintentar de forma segura. Cada inquilino puede tener hasta 50 suscripciones API.
Listado
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Devuelve todos los webhooks del inquilino, incluidos los gestionados en el panel de control ("source": "dashboard").
Filtre con event, domain o source.
Cancelar suscripción
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Eliminar una suscripción también descarta cualquier evento que aún esté en cola para ella. Solo las suscripciones creadas a través de la API pueden eliminarse de esta manera; un webhook del panel de control, o un id que no exista en su cuenta, responde con 404 y el código not-found. Los webhooks del panel de control se editan en la página Webhooks.
Cargas útiles y firma
Las entregas utilizan la misma carga útil que los webhooks del panel de control (ver Estructuras de datos) y están firmadas con el mismo esquema HMAC (ver Seguridad y tokens API). Las suscripciones API nunca reciben el encabezado token heredado, por lo que debe verificar el encabezado X-FastComments-Signature en su lugar.
Cargas útiles de ejemplo
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Devuelve los comentarios más recientes de la cuenta con exactamente la forma que lleva una entrega, de modo que una integración pueda mostrar datos de muestra reales antes de que llegue el primer evento. event es opcional y solo se valida, ya que cada evento entrega el mismo objeto de comentario. limit por defecto es 3 y acepta valores de 1 a 10. Cuesta 2 créditos API.
{
"status": "success",
"payloads": [
{
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"urlId": "https://example.com/blog/hello-world",
"commenterName": "Jane Reader",
"comment": "Great article!",
"date": "2026-09-08T12:00:00.000Z",
"approved": true
}
]
}
Responder con 410 Gone
Si el endpoint de una suscripción API responde con HTTP 410 Gone, FastComments lo trata como una cancelación de suscripción: la suscripción se elimina junto con sus eventos en cola, y no se intentan más entregas. Los webhooks configurados en el panel de control nunca se eliminan automáticamente; para ellos un 410 es un fallo ordinario. Cualquier otro estado de error se reintenta y eventualmente desactiva el webhook, como se describe en Cómo funciona y manejo de reintentos.
Panel de control
Las suscripciones API aparecen en la lista de Webhooks con la fuente API, donde un administrador puede editar, desactivar, volver a activar o eliminarlas.
Cómo funciona y manejo de reintentos 
Todos los cambios en el objeto Comment en el sistema disparan un evento que termina en una cola.
El evento webhook inicial suele enviarse dentro de seis segundos desde que ocurre la fuente del evento.
Puedes supervisar esta cola en el panel de administración de Webhooks en caso de que tu API se caiga.
Si una solicitud a tu API falla, la volveremos a encolar según un programa.
Ese programa es 1 Minute * the retry count. Si la llamada falla una vez, intentará de nuevo en
un minuto. Si falla dos veces, esperará entonces dos minutos, y así sucesivamente. Esto es para que no
sobrecarguemos tu API si estáis cayendo por razones relacionadas con la carga.
Los webhooks pueden cancelarse desde la página de registros.
En conclusión
Esto concluye nuestra documentación de Webhooks.
Esperamos que la integración de Webhooks de FastComments le resulte fácil de entender y rápida de configurar.
Si considera que ha identificado alguna laguna en nuestra documentación, háganoslo saber a continuación.