Centro de Ajuda
Chat API

Webhooks

Última atualização:

Visão geral dos webhooks

Os webhooks permitem que o ChatLab notifique os seus sistemas no momento em que algo acontece nos seus chatbots. Em vez de consultar repetidamente a Management API ou exportar dados manualmente, regista um endpoint HTTPS e o ChatLab envia um pedido HTTP POST assinado para o mesmo em tempo real - quando um visitante deixa um lead, submete um formulário de contacto, avalia uma conversa, solicita um operador humano ou quando uma ação de IA é executada.

Utilizações típicas:

  • enviar novos leads diretamente para o seu CRM no segundo em que são capturados
  • notificar a sua equipa no Slack quando um visitante solicita Live Chat (chat em direto)
  • alimentar as suas próprias ferramentas de análise com avaliações e resumos de conversas
  • monitorizar a execução de ações de IA e alertar sobre erros

Disponibilidade: os webhooks estão disponíveis a partir do plano Standard (funcionalidade: Webhooks).

Onde configurar: na aplicação de administração, aceda a Account settings -> Webhooks (Definições de conta -> Webhooks) (logo ao lado da secção Management API). Os webhooks funcionam ao nível da conta - um único endpoint pode receber eventos de todos os seus bots ou de um subconjunto filtrado.

Configurar um endpoint

  1. Aceda a Account settings -> Webhooks (Definições de conta -> Webhooks) e clique em Create endpoint (Criar endpoint).
  2. Preencha o formulário do endpoint:
    • Name (Nome) - uma etiqueta para sua própria referência, por exemplo, "Sincronização de CRM" ou "Alertas do Slack".
    • URL - o endereço HTTPS para o qual o ChatLab enviará os eventos via POST.
    • Events (Eventos) - selecione os tipos de eventos que este endpoint recebe (consulte o catálogo abaixo). Selecione apenas o necessário; eventos de grande volume como ai_action.executed podem gerar muito tráfego.
    • Bot filter (Filtro de bots) (opcional) - restrinja o endpoint a bots específicos. Deixe em branco para receber eventos de todos os bots da sua conta.
    • Custom form filter (Filtro de formulário personalizado) (opcional) - encaminha as submissões de um formulário personalizado para este endpoint. Limita apenas o evento custom_form.submitted; todos os outros eventos subscritos (leads, pedidos de contacto, conversas, Live Chat, ações de IA) são entregues independentemente desta definição.
  3. Submeta. O secret (segredo) do endpoint é apresentado exatamente uma vez na janela de confirmação - copie-o agora e guarde-o em segurança. Irá precisar dele para verificar assinaturas (consulte a secção Segurança abaixo). O texto simples não pode ser recuperado mais tarde.

Cada endpoint também possui:

  • Controlo para ativar/desativar - pause as entregas sem eliminar o endpoint. Os endpoints desativados descartam eventos de forma silenciosa (não ficam em fila de espera para envio posterior).
  • Send sample event (Enviar evento de exemplo) - envia um pedido de teste assinado para o seu URL para verificar o seu recetor de ponta a ponta. Pode escolher o tipo de evento e editar os valores de exemplo antes de enviar, para que o seu processador veja dados realistas. O teste chega como uma entrega normal com o eventType correspondente à sua seleção (ou como webhook.test para uma verificação simples de conectividade).
  • Roll secret (Renovar segredo) - gera um novo segredo e invalida o anterior. Utilize esta opção se o segredo tiver sido exposto. O novo segredo também é apresentado apenas uma vez. Atualize o seu recetor antes de proceder à renovação, caso contrário, as entregas falharão na verificação de assinatura do seu lado.
  • Delivery log (Registo de entregas) - uma lista de entregas recentes por endpoint com data/hora, tipo de evento, estado HTTP devolvido pelo seu servidor e tempo de resposta. As entregas com falha e as pausas por circuit breaker são visíveis aqui. O registo é mantido durante 14 dias.

Envelope do evento

Cada entrega é um HTTP POST com Content-Type: application/json. O corpo do pedido tem sempre o mesmo envelope; o objeto data varia consoante o tipo de evento:

{
  "eventId": "9f1c1c8e-6a2b-4b9e-9d2f-3f8a1e2b4c5d",
  "eventType": "lead.created",
  "timestamp": "2026-08-13T14:22:31Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": { }
}
  • eventId - identificador único por evento. Utilize-o para deduplicação se o seu processamento tiver de ser idempotente.
  • eventType - um dos tipos documentados abaixo; enviado também no cabeçalho X-ChatLab-Event.
  • timestamp - data e hora UTC em formato ISO 8601 em que o evento ocorreu.
  • botId / botName - o bot ao qual o evento pertence.
  • conversationId / sessionId - o contexto da conversa, quando aplicável.

Catálogo de eventos

lead.created

Disparado quando um visitante submete os seus dados de contacto - através do formulário de recolha de leads, do pré-formulário de Live Chat ou de um formulário personalizado utilizado para recolha de leads.

{
  "eventId": "9f1c1c8e-6a2b-4b9e-9d2f-3f8a1e2b4c5d",
  "eventType": "lead.created",
  "timestamp": "2026-08-13T14:22:31Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "email": "jane.doe@example.com",
    "name": "Jane Doe",
    "phone": "+1 555 0123",
    "source": "LEAD_COLLECTION_FORM",
    "formCodeName": "lead_form",
    "formName": "Lead form",
    "fields": [
      {"name": "email", "value": "jane.doe@example.com", "type": "email"},
      {"name": "company", "value": "Acme Inc.", "type": "text"},
      {"name": "topics", "value": ["Billing", "Delivery"], "type": "multichoice"},
      {"name": "attachment", "value": "https://api.chatlab.com/aichat/customform/download?key=...&token=...", "type": "file"}
    ],
    "pageUrl": "https://acme.com/pricing"
  }
}
  • source - como os dados de contacto foram capturados: LEAD_COLLECTION_FORM (formulário de recolha de leads), LIVE_CHAT_FORM (pré-formulário de Live Chat), CONVERSATION (a IA recolheu os detalhes durante a conversa), ADMIN_DATA_UPDATE ou UPDATE_CLIENT_CONTEXT (editado do lado do ChatLab). As submissões do formulário de suporte humano nunca disparam este evento - disparam contact_form.submitted.
  • email, name, phone - os detalhes de contacto mapeados no registo do lead.
  • Quando é utilizado um formulário personalizado para recolha de leads, todos os campos definidos nesse formulário são incluídos em fields, na ordem do formulário, e formCodeName / formName identificam o formulário. No formulário de leads clássico, ambos são null e fields é um array vazio.
  • Cada entrada em fields segue o formato {name, value, type}. name é o nome técnico do campo, que permanece inalterado perante edições na etiqueta - utilize-o para mapeamento no seu CRM.
  • Para campos do tipo multichoice, value é um array das opções selecionadas. Os campos de caixa de seleção são entradas individuais com valores "true" / "false".
  • Para campos do tipo file, value é uma ligação para descarregar o ficheiro carregado; o webhook nunca transporta o conteúdo dos ficheiros.
  • pageUrl - a página em que o visitante se encontrava no momento da submissão.

contact_form.submitted

Disparado quando um visitante submete o formulário de contacto para suporte humano ou um formulário personalizado utilizado para contacto humano.

{
  "eventId": "3a7b9c2d-1e4f-4a6b-8c0d-5e2f7a9b1c3d",
  "eventType": "contact_form.submitted",
  "timestamp": "2026-08-13T14:25:02Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "email": "jane.doe@example.com",
    "message": "I need help with my last invoice.",
    "source": "CUSTOM_FORM",
    "formCodeName": "contact_form",
    "formName": "Contact form",
    "fields": [
      {"name": "email", "value": "jane.doe@example.com", "type": "email"},
      {"name": "order_number", "value": "A-10293", "type": "text"},
      {"name": "message", "value": "I need help with my last invoice.", "type": "textarea"}
    ]
  }
}
  • email - o endereço indicado pelo visitante, para o qual a sua equipa de suporte deve responder.
  • source - CUSTOM_FORM quando o formulário de contacto é baseado num formulário personalizado, CONTACT_FORM para o formulário integrado predefinido.
  • formCodeName / formName - identificam o formulário personalizado associado ao pedido; ambos são null para o formulário integrado.
  • Quando é utilizado um formulário personalizado, todos os campos definidos nesse formulário são incluídos em fields (no mesmo formato {name, value, type} de lead.created). Com o formulário de contacto integrado, apenas email e message são preenchidos, fields é um array vazio e os identificadores do formulário são null.
  • message - o campo de mensagem mapeado, ou a junção de todos os valores preenchidos caso o formulário não defina um campo de mensagem específico.

custom_form.submitted

Disparado para todas as submissões de formulários personalizados, independentemente da finalidade do formulário. Tenha em atenção que os formulários cuja finalidade é a recolha de leads ou o contacto humano também disparam os respetivos eventos dedicados lead.created / contact_form.submitted - subscreva um ou outro dependendo de pretender a visão genérica ou especializada, e proceda à deduplicação através de conversationId + timestamp se subscrever ambos.

{
  "eventId": "6c1d8e3f-2a5b-4c7d-9e0f-1a4b6c8d0e2f",
  "eventType": "custom_form.submitted",
  "timestamp": "2026-08-13T14:27:45Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "formCodeName": "warranty_claim",
    "formName": "Warranty claim",
    "fields": [
      {"name": "order_number", "value": "A-10293", "type": "text"},
      {"name": "issue", "value": "Damaged on arrival", "type": "textarea"},
      {"name": "photo", "value": "https://api.chatlab.com/aichat/customform/download?key=...&token=...", "type": "file"}
    ],
    "purpose": "STANDALONE"
  }
}
  • formCodeName - o identificador técnico estável do formulário, inalterado quando muda o nome do formulário; utilize-o para encaminhar submissões no seu próprio sistema. formName é a etiqueta de visualização apresentada aos visitantes.
  • fields utiliza as mesmas entradas {name, value, type} que lead.created: os valores de seleção múltipla são arrays e os valores de ficheiros são ligações para descarregar.
  • purpose - STANDALONE, LEAD_COLLECTION ou HUMAN_CONTACT, dependendo de como o formulário está associado ao chatbot.

conversation.started

Disparado quando um visitante envia a primeira mensagem de uma nova conversa.

{
  "eventId": "8e2f0a4b-3c6d-4e8f-a1b2-2c5d7e9f1a3b",
  "eventType": "conversation.started",
  "timestamp": "2026-08-13T14:20:11Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "firstMessage": "Do you ship to Canada?",
    "chatSource": "WIDGET",
    "byAdmin": false,
    "countryCode": "PL",
    "ipAddress": "83.12.44.7"
  }
}
  • firstMessage - o texto exato da mensagem de abertura do visitante. null se a conversa tiver sido aberta sem conteúdo de mensagem.
  • chatSource - o canal através do qual a conversa foi iniciada: WIDGET, WHATSAPP, MESSENGER, VOICE, VOICE_PHONE, API, BOOKING, AIRBNB ou IDOBOOKING.
  • byAdmin - true quando a conversa tem origem na pré-visualização do chatbot dentro do painel de administração do ChatLab e não de um visitante real. Utilize este campo para evitar o envio de conversas de teste para o seu CRM.
  • countryCode - código de país ISO obtido através do endereço IP do visitante, null se não foi possível determinar.
  • ipAddress - o endereço IP do visitante tal como visto pelo ChatLab, null quando indisponível. Trate-o como dado pessoal ao abrigo do RGPD e armazene-o apenas se possuir uma base de licitude válida.

conversation.rated

Disparado quando um visitante avalia a resposta de um bot com um polegar para cima ou para baixo (consulte Classificação de conversas).

{
  "eventId": "1b4c6d8e-5f0a-4b2c-8d3e-4f7a9b1c3d5e",
  "eventType": "conversation.rated",
  "timestamp": "2026-08-13T14:31:09Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "rating": "POSITIVE"
  }
}
  • rating - POSITIVE ou NEGATIVE. Remover uma avaliação não dispara o evento, pelo que nunca receberá um valor neutro.

conversation.summarized

Disparado quando o ChatLab gera um resumo de uma conversa terminada.

{
  "eventId": "4d7e9f1a-6b2c-4d4e-9f0a-5b8c0d2e4f6a",
  "eventType": "conversation.summarized",
  "timestamp": "2026-08-13T14:45:00Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "summary": "Visitor asked about shipping to Canada and delivery times. The bot confirmed availability and quoted 5-7 business days. Visitor left satisfied.",
    "language": "en"
  }
}
  • summary - o texto do resumo gerado. Os resumos são produzidos alguns minutos após a conversa ficar inativa, pelo que este evento chega mais tarde do que os restantes eventos da conversa.
  • language - código ISO do idioma em que o resumo foi redigido, acompanhando o idioma da conversa.

client.summarized

Disparado quando o ChatLab atualiza o perfil de IA de um cliente. O perfil é reconstruído a partir do perfil anterior em conjunto com o resumo da conversa acabada de terminar, pelo que este evento segue o conversation.summarized para a mesma conversa. Os clientes são identificados por e-mail, razão pela qual o endereço é repetido no nível superior de data.

{
  "eventId": "b5d8f1a3-7c2e-4d9b-a6f0-1e3c5a7b9d2f",
  "eventType": "client.summarized",
  "timestamp": "2026-08-18T09:12:04Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "clientEmail": "jane.doe@example.com",
    "client": {
      "email": "jane.doe@example.com",
      "name": "Jane Doe",
      "phone": "+1 555 0123",
      "countryCode": "PL",
      "ipAddress": "83.12.44.7"
    },
    "clientSummary": "Returning customer interested in international shipping. Asked about delivery times to Canada twice and about return costs once."
  }
}
  • clientEmail - o identificador para associar o cliente ao seu próprio CRM. É null para visitantes anónimos que nunca indicaram um endereço, sendo que o evento ainda assim é disparado para estes - ignore essas entregas caso a sua integração seja indexada por e-mail.
  • client - o registo de contacto que o ChatLab mantém para esta pessoa: email, name, phone, countryCode e ipAddress. Todas as chaves estão sempre presentes; os valores desconhecidos são null.
  • clientSummary - o texto integral do perfil em texto simples, não um diff. Substitui qualquer resumo anterior, pelo que deve guardá-lo sobrescrevendo o registo existente em vez de anexar.
  • O perfil é reconstruído apenas para bots com a funcionalidade memória de chat ativa, e apenas para conversas que estiveram inativas tempo suficiente para serem resumidas - conte receber este evento alguns minutos após o fim da conversa, não de forma imediata.

live_chat.requested

Disparado quando a IA transfere a conversa para o Live Chat, quer porque o visitante solicitou um assistente humano, quer porque o bot determinou que era necessária intervenção humana.

{
  "eventId": "7a0b2c4d-8e3f-4a5b-b0c1-6d9e1f3a5b7c",
  "eventType": "live_chat.requested",
  "timestamp": "2026-08-13T14:33:20Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "requestedBy": "AI"
  }
}
  • requestedBy - atualmente sempre AI, dado que a transferência é sempre desencadeada pela ação de Live Chat do bot, incluindo nos casos em que o visitante o solicita expressamente por palavras. Trate-o como um enum aberto: processe valores desconhecidos em vez de validar estritamente com base em AI.
  • O evento indica que foi solicitada uma transferência, não que um operador tenha aceitado a mesma. Aguarde pelo evento live_chat.started para essa confirmação.

live_chat.started

Disparado quando um operador entra na sessão e o Live Chat tem início efetivo.

{
  "eventId": "0c3d5e7f-9a4b-4c6d-a1b2-7e0f2a4b6c8d",
  "eventType": "live_chat.started",
  "timestamp": "2026-08-13T14:33:55Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {}
}
  • O objeto data encontra-se propositadamente vazio. Tudo o que precisa está no envelope: botId identifica o chatbot e conversationId / sessionId associam o evento à conversa para a qual já recebeu o evento live_chat.requested.

live_chat.ended

Disparado quando a sessão de Live Chat termina.

{
  "eventId": "2e5f7a9b-0c5d-4e7f-b2c3-8f1a3b5c7d9e",
  "eventType": "live_chat.ended",
  "timestamp": "2026-08-13T14:52:41Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "durationSeconds": 1126
  }
}
  • durationSeconds - tempo em segundos durante o qual o operador esteve na conversa, contabilizado a partir do momento em que a sessão teve início. O campo é omitido na circunstância excecional em que uma sessão é encerrada sem ter chegado a ser iniciada.

ai_action.executed

Disparado sempre que o bot executa uma ação de IA - uma chamada de integração gerida ou uma função de API personalizada. Este é um evento de tráfego elevado: um bot de comércio eletrónico ativo pode executar centenas de ações por dia, e uma única interação de um visitante pode acionar várias. Subscreva este evento num endpoint dedicado, ou certifique-se de que o seu recetor tem capacidade para processar o volume gerado.

{
  "eventId": "5f8a0b2c-1d6e-4f8a-c3d4-9a2b4c6d8e0f",
  "eventType": "ai_action.executed",
  "timestamp": "2026-08-13T14:21:03Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "actionName": "search_products",
    "status": "SUCCESS",
    "durationMs": 842,
    "errorMessage": null
  }
}
  • actionName - o nome da ação executada tal como a IA a reconhece, por exemplo search_products para uma integração gerida ou o nome que atribuiu a uma ação de API personalizada.
  • status - SUCCESS ou ERROR.
  • durationMs - a duração da execução da ação, em milissegundos. Útil para identificar integrações lentas antes que os visitantes apresentem queixas.
  • errorMessage - o motivo da falha, preenchido apenas quando status é ERROR; caso contrário, é null.

webhook.test

Enviado através do botão Send sample event (Enviar evento de exemplo) quando efetua um teste simples de conectividade. É assinado exatamente como um evento real.

{
  "eventId": "9b2c4d6e-3f8a-4b0c-d5e6-0b3c5d7e9f1a",
  "eventType": "webhook.test",
  "timestamp": "2026-08-13T14:10:00Z",
  "botId": 1234,
  "botName": "Support Bot",
  "conversationId": "conv_a1b2c3",
  "sessionId": "sess_x9y8z7",
  "data": {
    "message": "Test delivery from ChatLab"
  }
}
  • message - texto estático, sempre idêntico. Os campos do envelope incluem valores de exemplo, pelo que nunca deve processar uma entrega de webhook.test como dados reais.
  • Este é o único tipo de evento que não pode subscrever num endpoint: é enviado a pedido a partir do painel de administração e chega sempre ao endpoint onde clicou, independentemente dos eventos aos quais este está associado.

Segurança: verificar envios

Cada envio inclui quatro cabeçalhos:

Cabeçalho Valor
X-ChatLab-Signature sha256=<hex hmac> - assinatura HMAC-SHA256 do payload
X-ChatLab-Timestamp Hora Unix em segundos de quando o envio foi assinado
X-ChatLab-Event O tipo de evento, por exemplo, lead.created
X-ChatLab-Delivery ID de envio exclusivo, igual ao eventId do corpo

A assinatura é calculada como HMAC-SHA256 sobre a cadeia de carateres {timestamp}.{rawBody} utilizando o segredo do seu endpoint, onde {timestamp} é o valor de X-ChatLab-Timestamp e {rawBody} é o corpo bruto e não processado do pedido. Verifique sempre em relação aos bytes brutos - voltar a serializar o JSON analisado alterará a sequência de bytes e invalidará a assinatura.

Para se proteger contra ataques de repetição, rejeite envios cujo X-ChatLab-Timestamp tenha mais de 5 minutos.

Node.js

const crypto = require('crypto');

function verifyChatLabSignature(req, secret) {
    const signature = req.headers['x-chatlab-signature'];
    const timestamp = req.headers['x-chatlab-timestamp'];
    if (!signature || !timestamp) return false;

    // Reject stale deliveries (older than 5 minutes)
    const ageSeconds = Math.abs(Date.now() / 1000 - Number(timestamp));
    if (ageSeconds > 300) return false;

    // rawBody must be the raw request body bytes, not re-serialized JSON.
    // With Express: app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } }))
    const expected = 'sha256=' + crypto
        .createHmac('sha256', secret)
        .update(timestamp + '.' + req.rawBody)
        .digest('hex');

    const a = Buffer.from(signature);
    const b = Buffer.from(expected);
    return a.length === b.length && crypto.timingSafeEqual(a, b);
}

PHP

<?php
function verifyChatLabSignature(string $secret): bool
{
    $signature = $_SERVER['HTTP_X_CHATLAB_SIGNATURE'] ?? '';
    $timestamp = $_SERVER['HTTP_X_CHATLAB_TIMESTAMP'] ?? '';
    if ($signature === '' || $timestamp === '') {
        return false;
    }

    // Reject stale deliveries (older than 5 minutes)
    if (abs(time() - (int) $timestamp) > 300) {
        return false;
    }

    $rawBody = file_get_contents('php://input');
    $expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret);

    return hash_equals($expected, $signature);
}

Se a verificação falhar, responda com 401 e descarte o payload. Nunca processe envios não verificados - qualquer pessoa que descubra o seu URL pode enviar pedidos POST com JSON arbitrário para o mesmo.

Comportamento de envio

Compreenda estas garantias antes de criar integrações com webhooks:

  • Responda rapidamente. O seu endpoint tem de responder dentro de 3 segundos, caso contrário o envio é considerado com falha. Responda 2xx imediatamente e processe o payload de forma assíncrona (coloque-o em fila e, em seguida, confirme) - não faça chamadas de CRM nem operações de escrita na base de dados antes de responder.
  • Disparo único (fire-and-forget), no máximo uma vez. Cada evento tem exatamente uma tentativa de envio - não existem repetições. Se o seu endpoint estiver indisponível, expirar o tempo limite ou devolver um estado diferente de 2xx, esse evento é perdido e não será reenviado. Os webhooks são notificações, não um armazenamento de dados replicado: quando necessitar de integridade garantida, faça a reconciliação através da Management API ou das suas exportações de leads.
  • Disjuntor (circuit breaker). Após 5 falhas consecutivas de envio num bot, os envios para esse bot são pausados durante 5 minutos. Os eventos que ocorram durante a pausa são descartados, e o registo de envios apresenta entradas CIRCUIT_OPEN para que possa ver exatamente quando e por que razão o tráfego foi suprimido. Os envios ignorados por um disjuntor aberto não contam para a desativação automática.
  • Desativação automática. A verificação é executada no momento em que um envio falha, nunca com base num temporizador. Se um envio falhar e não houver nenhum envio bem-sucedido há 7 dias - contados a partir do último sucesso, ou da data de criação do endpoint se nunca tiver tido sucesso - o endpoint é desativado e recebe uma notificação por e-mail. Um único 2xx em qualquer momento repõe essa contagem. Um endpoint que não receba tráfego nunca é desativado, porque nada falha. Volte a ativá-lo nas Account settings (Definições de conta) assim que o seu recetor estiver corrigido; o contador de falhas e a marcação de desativação automática são repostos a zero ao voltar a ligá-lo, e os eventos perdidos enquanto esteve desativado não são preenchidos retroativamente.
  • 410 Gone. Se o seu endpoint responder com o estado HTTP 410 Gone, o ChatLab desativa-o imediatamente. Utilize isto para desativar programaticamente um endpoint a partir do lado do recetor.
  • Idempotência. Não são esperados envios duplicados no funcionamento normal, mas se o seu processamento tiver de ser estritamente idempotente, elimine duplicados através de eventId (também disponível no cabeçalho X-ChatLab-Delivery).

Limites

  • Até 10 endpoints de webhook por conta.
  • Retenção do registo de envios: 14 dias. As entradas mais antigas são removidas automaticamente.

Artigos relacionados