
Idioma 🇧🇷 Português (Brasil)
Visão geral
Implementação
Nos bastidores
Webhooks
Com o FastComments é possível invocar um endpoint de API sempre que um comentário for adicionado, atualizado ou removido do nosso sistema.
Fazemos isso com webhooks assíncronos sobre HTTP/HTTPS.
O que são Webhooks 
Um Webhook é um mecanismo, ou uma integração, entre dois sistemas em que o "produtor" (FastComments) dispara um evento que o "consumidor" (você) consome por meio de uma chamada de API.
Eventos e Recursos Suportados 
FastComments suporta webhooks apenas para o recurso Comentário.
Nós suportamos webhooks para criação, remoção e atualização de comentários.
Cada um desses é considerado um evento separado em nosso sistema e, como tal, possui semânticas e estruturas diferentes para os eventos de webhook.
Qualquer número de endpoints pode se inscrever no mesmo evento, a partir do painel ou através da API (veja Gerenciando Webhooks via API). Cada webhook é entregue de forma independente.
Configuração de Desenvolvimento Local 
Para desenvolvimento local, use uma ferramenta como o ngrok.
Para simplificar a manutenção da segurança do sistema, o desenvolvimento local segue o mesmo processo de configuração e proteção de outros ambientes.
Etapa 1: Adicionar "localhost" aos domínios na sua conta.
Adicione "localhost" como um domínio aqui.
Etapa 2: Escolher uma chave de API
Vamos adicionar a configuração de webhook para o seu domínio, portanto precisaremos de uma chave de API. Você pode fazer isso aqui.
Em "Associar ao domínio" - selecione o seu domínio "localhost".
NOTA: Alternativamente, você pode usar um único Segredo de API para toda a atividade de teste e ambientes de staging. Basta adicionar um Segredo de API para "Todos os Domínios" e dar a ele um nome como "test".
Certifique-se de que você tem um Segredo de API definido para seu(s) domínio(s) de produção. Eventos para todos os outros domínios usarão o segredo curinga (de teste).
Etapa 3: Adicionar seu webhook
Enquanto o ngrok ou ferramenta similar estiver em execução, defina o valor para "localhost" aqui.
Ao clicar em Send Test Payload, enviaremos dois eventos de teste para verificar se você valida a chave de API.
Depois que validar, clique em Save.
Etapa 4: Adicionar um comentário
Agora você pode adicionar, editar ou excluir comentários e deverá ver que chamamos sua máquina de desenvolvimento local com os eventos, usando sua chave de API de teste. Pode haver até 30 segundos de atraso para que os eventos cheguem à sua máquina.
Configuração 
Siga os mesmos passos para localhost como faria em produção. Certifique‑se de que os domínios de produção e as chaves secretas da API estejam configurados.
Primeiro, navegue até o Webhooks admin. Isso está acessível via Gerenciar Dados -> Webhooks.
A página lista todos os webhooks da sua conta:
Clique em Novo Webhook para adicionar um. Cada webhook tem uma URL, um evento de comentário (criado, atualizado ou excluído), um domínio e um método HTTP:
Cada webhook é entregue de forma independente. Você pode enviar o mesmo evento para vários endpoints, e um webhook com escopo para Todos os Domínios recebe comentários de todos os domínios mesmo quando um webhook específico de domínio existe para o mesmo evento. A mesma URL, evento e domínio não podem ser adicionados duas vezes.
Antes de salvar, clique em Enviar Payload de Teste para verificar se o endpoint aceita uma solicitação assinada. Veja a próxima seção, "Teste", para detalhes.
Na lista, você pode editar, desativar, reativar ou excluir um webhook. Desativar mantém os eventos enfileirados até que o webhook seja reativado; excluir descarta‑os.
Webhooks também podem ser criados através da API, por exemplo pelo Zapier. Eles aparecem na mesma lista com a origem API. Veja Gerenciando Webhooks via API.
Teste 
The new and edit webhook pages have a Send Test Payload button that sends a request to the URL currently in the form, whether or not it has been saved. The Create and Update events send a dummy WebhookComment object, while testing Delete will send a dummy request body with just an ID.
Verificando Payloads
When testing your webhook integration, verify the incoming requests include the following headers:
X-FastComments-Timestamp- Unix timestamp (seconds)X-FastComments-Signature- HMAC-SHA256 signature
Webhooks created before the signature scheme was introduced also receive a token header containing your API Secret. New webhooks do not.
Use the HMAC signature verification to ensure payloads are authentic.
Ferramentas de Teste
You can use tools like webhook.site or ngrok to inspect incoming webhook payloads during development.
Tipos de Evento
- Create Event: Triggered when a new comment is created.
- Update Event: Triggered when a comment is edited.
- Delete Event: Triggered when a comment is deleted.
Each webhook is tied to one event and one HTTP method (POST, PUT or DELETE). Each event includes the full comment data in the request body (see Data Structures for the payload format).
Estruturas de Dados 
A única estrutura enviada via webhooks é o objeto WebhookComment, descrito em TypeScript abaixo.
Estrutura do Objeto WebhookComment
Estrutura do Evento "Create"
O corpo da requisição do evento "create" é um objeto WebhookComment.
Estrutura do Evento "Update"
O corpo da requisição do evento "update" é um objeto WebhookComment.
Estrutura do Evento "Delete"
O corpo da requisição do evento "delete" é um objeto WebhookComment.
Alteração a partir de 14 de nov de 2023
Anteriormente, o corpo da requisição do evento "delete" continha apenas o id do comentário. Agora contém o comentário completo no momento da exclusão.
Cada chave está sempre presente no corpo. Quando o comentário não tem valor para um campo, o corpo contém null (ou false para booleanos e [] para listas), de modo que a estrutura de entrega nunca varia de um comentário para outro.
Run 
Quando usuários são marcados em um comentário, a informação é armazenada em uma lista chamada mentions. Cada objeto nessa lista tem a seguinte estrutura.
Run 
Métodos HTTP
Você pode configurar o método HTTP para cada tipo de evento webhook no painel de administração:
- Evento de Criação: POST ou PUT (padrão: PUT)
- Evento de Atualização: POST ou PUT (padrão: PUT)
- Evento de Exclusão: DELETE, POST ou PUT (padrão: DELETE)
Como todas as requisições contêm um ID, as operações de Criação e Atualização são idempotentes por padrão (PUT). Repetir a mesma requisição de Criação ou Atualização não deve criar objetos duplicados no seu lado.
Cabeçalhos da Requisição
Cada requisição webhook inclui os seguintes cabeçalhos:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Seu segredo da API |
X-FastComments-Timestamp | Timestamp Unix (segundos) quando a requisição foi assinada |
X-FastComments-Signature | Assinatura HMAC-SHA256 (sha256=<hex>) |
Veja Segurança e Tokens de API para informações sobre como verificar a assinatura HMAC.
Segurança e Tokens de API 
FastComments webhook requests include multiple authentication mechanisms for security.
Headers Sent
| Header | Description |
|---|---|
token | Seu API Secret (para compatibilidade com versões anteriores) |
X-FastComments-Timestamp | Timestamp Unix (segundos) quando a requisição foi assinada |
X-FastComments-Signature | Assinatura HMAC-SHA256 do payload |
HMAC Signature Verification (Recommended)
Recomendamos fortemente verificar a assinatura HMAC para garantir que os payloads do webhook sejam autênticos e não tenham sido adulterados.
Signature Format: sha256=<hex-encoded-signature>
How the signature is computed:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Example Verification (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;
}
// Verifica se o timestamp é recente (dentro de 5 minutos)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Prevenção contra replay
}
// Verifica a assinatura
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Example Verification (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
# Verifica se o timestamp é recente
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Verifica a assinatura
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}"
Example Verification (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Verifica se o timestamp é recente (dentro de 5 minutos)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Verifica a assinatura
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Legacy Authentication
O cabeçalho token contendo seu API Secret ainda é enviado para compatibilidade com versões anteriores. No entanto, recomendamos migrar para a verificação HMAC para melhorar a segurança, pois isso protege contra ataques de replay.
Gerenciando Webhooks pela API 
Webhooks também podem ser gerenciados através da API REST. É assim que integrações como o Zapier se inscrevem em eventos de comentário sem tocar no painel, e segue o padrão REST Hooks: inscrever, receber eventos, cancelar inscrição.
As inscrições de API convivem ao lado dos webhooks configurados no painel. Um evento de comentário é entregue a cada webhook que corresponde ao seu domínio, cada um como sua própria entrega, independentemente de como o webhook foi criado.
Autenticação
Cada requisição precisa da sua API Key no cabeçalho x-api-key (ou no parâmetro de consulta API_KEY) e do seu ID de locatário no parâmetro de consulta tenantId. Ambos são exibidos na página API Secret no painel.
Inscrever-se
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 | Obrigatório | Descrição |
|---|---|---|
url | Sim | Um URL http ou https absoluto. |
event | Sim | comment-created, comment-updated ou comment-deleted. |
domain | Não | Um domínio da configuração da sua conta. O padrão é *, que recebe eventos para todos os domínios. |
method | Não | POST (padrão), PUT ou DELETE. |
A resposta contém a inscrição:
{
"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"
}
}
Inscrever a mesma URL no mesmo evento e domínio novamente retorna a inscrição existente em vez de criar um duplicado, permitindo que o cliente tente novamente com segurança. Cada locatário pode ter até 50 inscrições de API.
Listar
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Retorna todos os webhooks do locatário, incluindo os gerenciados no painel (\"source\": \"dashboard\"). Filtre com event, domain ou source.
Cancelar inscrição
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Excluir uma inscrição também descarta quaisquer eventos ainda enfileirados para ela. Apenas inscrições criadas através da API podem ser excluídas desta forma; um webhook do painel, ou um id que não exista na sua conta, responde 404 com o código not-found. Webhooks do painel são editados na página Webhooks.
Payloads e assinatura
Entregas usam o mesmo payload dos webhooks do painel (veja Estruturas de Dados) e são assinadas com o mesmo esquema HMAC (veja Segurança & Tokens de API). Inscrições de API nunca recebem o cabeçalho legado token, portanto verifique o cabeçalho X-FastComments-Signature.
Payloads de exemplo
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Retorna os comentários mais recentes da conta exatamente no formato que uma entrega transporta, permitindo que uma integração mostre dados de exemplo reais antes que o primeiro evento chegue. event é opcional e apenas validado, já que todo evento entrega o mesmo objeto de comentário. limit tem padrão 3 e aceita de 1 a 10. Custa 2 créditos de 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
}
]
}
Respondendo com 410 Gone
Se o endpoint de uma inscrição de API responder com HTTP 410 Gone, o FastComments trata isso como um cancelamento de inscrição: a inscrição é excluída junto com seus eventos enfileirados, e nenhuma entrega adicional é tentada. Webhooks configurados no painel nunca são excluídos automaticamente; para eles um 410 é uma falha comum. Qualquer outro status de falha é refeito e eventualmente desabilita o webhook, conforme descrito em Como funciona & Tratamento de Repetições.
Painel
Inscrições de API aparecem na lista de Webhooks com a origem API, onde um administrador pode editar, desativar, reativar ou excluí‑las.
Como funciona e tratamento de tentativas 
Todas as alterações no objeto Comment no sistema disparam um evento que acaba em uma fila.
O evento inicial de webhook geralmente é enviado dentro de seis segundos após a ocorrência da fonte do evento.
Você pode monitorar essa fila no painel de Webhooks no caso de sua API ficar fora do ar.
Se uma solicitação para sua API falhar, nós a colocaremos novamente na fila conforme uma programação.
Essa programação é 1 Minute * the retry count. Se a chamada falhar uma vez, ela tentará novamente em
um minuto. Se falhar duas vezes, então aguardará dois minutos, e assim por diante. Isso é para que não
sobrecarreguemos sua API caso ela esteja ficando indisponível por motivos relacionados à carga.
Os Webhooks podem ser cancelados a partir da página de logs.
Conclusão
Isto conclui nossa documentação sobre Webhooks.
Esperamos que você ache a integração de Webhooks do FastComments fácil de entender e rápida de configurar.
Se você sentir que identificou alguma lacuna em nossa documentação, informe-nos abaixo.