
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 
As páginas de novo webhook e de edição de webhook têm um botão Send Test Payload que envia uma requisição para a URL atualmente no formulário, tenha ela sido salva ou não. Os eventos Create e Update enviam um objeto WebhookComment fictício, enquanto o teste de Delete enviará um corpo de requisição fictício contendo apenas um ID.
Verificando Payloads
Ao testar sua integração de webhook, verifique se as requisições recebidas incluem os seguintes cabeçalhos:
X-FastComments-Timestamp- Timestamp Unix (segundos)X-FastComments-Signature- Assinatura HMAC-SHA256
Webhooks criados antes da introdução do esquema de assinatura também recebem um cabeçalho token contendo seu API Secret. Webhooks novos não recebem.
Use a verificação de assinatura HMAC para garantir que os payloads são autênticos.
Ferramentas de Teste
Você pode usar ferramentas como webhook.site ou ngrok para inspecionar os payloads de webhook recebidos durante o desenvolvimento.
Tipos de Evento
- Evento Create: Disparado quando um novo comentário é criado.
- Evento Update: Disparado quando um comentário é editado.
- Evento Delete: Disparado quando um comentário é excluído.
Cada webhook está vinculado a um evento e a um método HTTP (POST, PUT ou DELETE). Cada evento inclui os dados completos do comentário no corpo da requisição (veja Estruturas de Dados para o formato do payload).
Estruturas de Dados 
A única estrutura enviada via webhooks é o objeto WebhookComment, descrita 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 uma 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 
Cada entrada na lista badges tem a seguinte estrutura. Veja o Guia de Badges para os tipos de badge.
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 de API |
X-FastComments-Timestamp | Timestamp Unix (segundos) quando a requisição foi assinada |
X-FastComments-Signature | assinatura HMAC-SHA256 (sha256=<hex>) |
Veja Segurança & Tokens de API para informações sobre como verificar a assinatura HMAC.
Segurança e Tokens de API 
As solicitações de webhook do FastComments incluem múltiplos mecanismos de autenticação para segurança.
Cabeçalhos Enviados
| Cabeçalho | Descrição |
|---|---|
token | Seu API Secret (para compatibilidade retroativa) |
X-FastComments-Timestamp | Timestamp Unix (segundos) de quando a requisição foi assinada |
X-FastComments-Signature | Assinatura HMAC-SHA256 do payload |
Verificação de Assinatura HMAC (Recomendado)
Recomendamos fortemente verificar a assinatura HMAC para garantir que os payloads do webhook sejam autênticos e não tenham sido adulterados.
Formato da assinatura: sha256=<hex-encoded-signature>
Como a assinatura é calculada:
- Concatenar:
timestamp + "." + JSON_payload_body - Calcular HMAC-SHA256 usando seu API Secret como chave
- Codificar o resultado em hexadecimal
Exemplo de Verificação (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;
}
// Verify timestamp is recent (within 5 minutes)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Replay attack prevention
}
// Verify signature
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Exemplo de Verificação (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
# Verify timestamp is recent
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Verify signature
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}"
Exemplo de Verificação (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Verify timestamp is recent (within 5 minutes)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Verify signature
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Autenticação Legada
O cabeçalho token contendo seu API Secret ainda é enviado para compatibilidade retroativa. No entanto, recomendamos migrar para a verificação HMAC para melhorar a segurança, pois ela 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.