API de Webhooks
Assine eventos e receba notificações em tempo real via webhooks.
A API de Webhooks permite que você assine eventos programaticamente. Use-a para gatilhos instantâneos no estilo Zapier ou integrações personalizadas que precisam de notificações em tempo real.
Observação: A API de Webhooks requer um plano Hobby ou superior com faturamento ativo.
Endpoints
| Endpoint | Método | Descrição |
|---|---|---|
/api/v1/webhooks/subscribe | POST | Cria uma assinatura de webhook |
/api/v1/webhooks/subscribe/[id] | DELETE | Remove uma assinatura |
/api/v1/chatbots | GET | Lista os agentes (para assinatura) |
Criar Assinatura
POST /api/v1/webhooks/subscribe
Corpo da Requisição
{
"event": "form_submission",
"targetUrl": "https://your-server.com/webhook",
"chatbotId": "123e4567-e89b-12d3-a456-426614174000"
}
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
event | string | Sim | lead_created, form_submission, custom_form_submitted, conversation_started, conversation_ended ou escalation_created |
targetUrl | string | Sim | URL para receber os eventos — HTTPS é obrigatório em produção, HTTP também é aceito fora da produção |
chatbotId | string (UUID) | Sim | Agente ao qual assinar |
Resposta
Sucesso (201):
{
"id": "subscription-uuid"
}
Exemplo
curl -X POST 'https://your-domain.com/api/v1/webhooks/subscribe' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"event": "form_submission",
"targetUrl": "https://hooks.zapier.com/hooks/catch/123456/abcdef",
"chatbotId": "123e4567-e89b-12d3-a456-426614174000"
}'
Excluir Assinatura
DELETE /api/v1/webhooks/subscribe/[id]
Resposta
Sucesso (200): Retorna uma resposta vazia com status 200.
Exemplo
curl -X DELETE 'https://your-domain.com/api/v1/webhooks/subscribe/sub_abc123' \ -H 'Authorization: Bearer YOUR_API_KEY'
Listar Agentes
Obtenha os agentes disponíveis para assinar:
GET /api/v1/chatbots
Resposta
{
"chatbots": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Support Bot",
"url": "https://your-domain.com/chat/support-bot"
}
]
}
Payload do Webhook
Quando um evento ocorre, enviamos um POST para a sua URL de destino:
Evento de Envio de Formulário
{
"event": "form_submission",
"eventId": "evt_91d0a3ce-5a9d-4b67-a454-bafb9484281a",
"data": {
"id": "lead-uuid",
"chatbotId": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Smith",
"email": "[email protected]",
"phone": "+1234567890",
"conversationId": "conv_abc123",
"createdAt": "2025-01-10T12:00:00Z"
},
"timestamp": "2025-01-10T12:00:00Z"
}
Cabeçalhos
Incluímos estes cabeçalhos em cada entrega:
Content-Type: application/json User-Agent: AgentkitWebhook/2.0 X-Agentkit-Event: form_submission X-Agentkit-Event-Id: evt_91d0a3ce-5a9d-4b67-a454-bafb9484281a X-Agentkit-Signature: t=<unix-seconds>,v1=<hex-hmac-sha256>
Verifique a assinatura em relação ao corpo bruto exato da requisição em UTF-8 antes de analisar o JSON. Consulte Segurança de webhooks para o procedimento de assinatura e o catálogo de payloads.
Requisitos de URL
Segurança
Em produção, uma URL de assinatura deve usar HTTPS. Fora da produção, HTTP também é aceito — mas apenas URLs http: e https: são permitidas, e toda URL também deve passar em uma verificação de destino público sobre a própria URL, que rejeita localhost e hostnames de loopback semelhantes, endereços privados e link-local literais, e endpoints de metadados de nuvem.
Consulte Segurança de webhooks para a lista completa de restrições de destino; essa é a descrição canônica desta regra.
Validação
A URL é verificada ao criar a assinatura; URLs que falham nas verificações acima são rejeitadas com um erro 400 cuja mensagem menciona o requisito de produção. A verificação examina a URL exatamente como foi escrita — ela não resolve hostnames, então aponte sua assinatura para o endpoint público onde você realmente pretende receber os eventos. No momento da entrega, o nome do host é resolvido uma única vez, todos os endereços resolvidos devem ser públicos e a conexão é fixada a esses endereços — um nome de host que resolva para um endereço privado ou interno (mesmo que mude entre a resolução e a conexão) nunca é contatado; a tentativa é registrada como target_blocked.
Confiabilidade
Requisitos de Resposta
Seu endpoint deve:
- Retornar status 2xx em até 10 segundos
- Lidar com entregas duplicadas (idempotente)
Tratamento de Falhas
- Entregas com falha são retentadas cinco vezes após a requisição inicial
- Um evento esgotado incrementa a sequência de falhas consecutivas uma vez
- Pelo menos 10 eventos esgotados ao longo de sete dias desabilitam automaticamente uma assinatura
- Os proprietários podem reparar e reativar assinaturas nas configurações de webhook
- A entrega é feita pelo menos uma vez; use
eventIdpara idempotência e não assuma ordenação
Respostas de Erro
| Status | Mensagem | Causa |
|---|---|---|
| 400 | Invalid JSON body | JSON malformado |
| 400 | Invalid request body | Campos ausentes/inválidos (inclui tipos de evento não suportados) |
| 400 | Target URL must be a public HTTPS endpoint (localhost and private IPs are not allowed) | A URL falha na validação de SSRF |
| 401 | Missing or invalid Authorization header | Cabeçalho não fornecido ou formato incorreto |
| 401 | Invalid API key | Chave não reconhecida |
| 403 | Webhook subscriptions require a Hobby plan or above with active billing | O plano ou status de faturamento não permite integrações |
| 403 | Chatbot does not belong to this account | O agente pertence a outra conta |
| 403 | Subscription does not belong to this account | A assinatura pertence a outra conta |
| 404 | Chatbot not found | ID de agente inválido |
| 404 | Webhook subscription not found | ID de assinatura inválido |
| 409 | Webhook subscription already exists for this event and URL | Assinatura duplicada |
Integração com Zapier
Esses endpoints alimentam nossa integração com o Zapier. Quando você conecta o Agentkit ao Zapier:
- O Zapier chama
/api/v1/authpara verificar sua chave de API - O Zapier chama
/api/v1/chatbotspara listar seus agentes - Quando você ativa um gatilho, o Zapier chama
/api/v1/webhooks/subscribe - Os eventos são entregues à URL de webhook do Zapier
- Quando você desativa, o Zapier chama DELETE na assinatura
Para integrar sem escrever código, use o Zapier diretamente em vez dessas APIs.
Exemplo de Código
Gerenciador de Assinaturas em Node.js
class WebhookManager {
constructor(apiKey, baseUrl) {
this.apiKey = apiKey;
this.baseUrl = baseUrl;
}
async subscribe(chatbotId, targetUrl, event = 'form_submission') {
const response = await fetch(`${this.baseUrl}/api/v1/webhooks/subscribe`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ event, targetUrl, chatbotId }),
});
if (!response.ok) {
throw new Error(`Subscribe failed: ${response.status}`);
}
return response.json();
}
async unsubscribe(subscriptionId) {
const response = await fetch(
`${this.baseUrl}/api/v1/webhooks/subscribe/${subscriptionId}`,
{
method: 'DELETE',
headers: { 'Authorization': `Bearer ${this.apiKey}` },
},
);
return response.ok;
}
}
Próximos Passos
- Configure a coleta de leads para gerar eventos
- Configure webhooks na interface para uma configuração pelo painel
- Conecte-se ao Zapier para mais de 5.000 integrações