Webhooks-API
Abonneer je op gebeurtenissen en ontvang realtime meldingen via webhooks.
Met de Webhooks-API kun je je programmatisch abonneren op gebeurtenissen. Gebruik het voor directe triggers in Zapier-stijl of voor aangepaste integraties die realtime meldingen nodig hebben.
Let op: de Webhooks-API vereist een Hobby-plan of hoger met actieve facturering.
Endpoints
| Endpoint | Methode | Beschrijving |
|---|---|---|
/api/v1/webhooks/subscribe | POST | Webhookabonnement aanmaken |
/api/v1/webhooks/subscribe/[id] | DELETE | Abonnement verwijderen |
/api/v1/chatbots | GET | Agents weergeven (voor abonnement) |
Abonnement aanmaken
POST /api/v1/webhooks/subscribe
Request-body
{
"event": "form_submission",
"targetUrl": "https://your-server.com/webhook",
"chatbotId": "123e4567-e89b-12d3-a456-426614174000"
}
Parameters
| Veld | Type | Vereist | Beschrijving |
|---|---|---|---|
event | string | Ja | lead_created, form_submission, custom_form_submitted, conversation_started, conversation_ended of escalation_created |
targetUrl | string | Ja | URL die de gebeurtenissen ontvangt — in productie is HTTPS verplicht, buiten productie wordt ook HTTP geaccepteerd |
chatbotId | string (UUID) | Ja | Agent om op te abonneren |
Respons
Succes (201):
{
"id": "subscription-uuid"
}
Voorbeeld
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"
}'
Abonnement verwijderen
DELETE /api/v1/webhooks/subscribe/[id]
Respons
Succes (200): Geeft een lege respons terug met status 200.
Voorbeeld
curl -X DELETE 'https://your-domain.com/api/v1/webhooks/subscribe/sub_abc123' \ -H 'Authorization: Bearer YOUR_API_KEY'
Agents weergeven
Beschikbare agents opvragen waarop je je kunt abonneren:
GET /api/v1/chatbots
Respons
{
"chatbots": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Support Bot",
"url": "https://your-domain.com/chat/support-bot"
}
]
}
Webhook-payload
Wanneer er een gebeurtenis plaatsvindt, sturen we een POST-request naar je doel-URL:
Gebeurtenis: formulierinzending
{
"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"
}
Headers
Bij elke aflevering sturen we deze headers mee:
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>
Verifieer de handtekening aan de hand van de exacte, ruwe UTF-8-requestbody voordat je de JSON parseert. Zie Webhookbeveiliging voor de ondertekeningsprocedure en de payloadcatalogus.
URL-vereisten
Beveiliging
In productie moet een abonnements-URL HTTPS gebruiken. Buiten productie wordt ook HTTP geaccepteerd — maar alleen http:- en https:-URL's zijn ooit toegestaan, en elke URL moet bovendien een publieke-bestemmingscontrole op de URL zelf doorstaan, die localhost en vergelijkbare loopback-hostnamen, letterlijke privé- en link-local-adressen en cloud-metadata-endpoints weigert.
Zie Webhookbeveiliging voor de volledige lijst met bestemmingsbeperkingen; dat is de canonieke beschrijving van deze regel.
Validatie
De URL wordt gecontroleerd op het moment dat je het abonnement aanmaakt; URL's die de bovenstaande controles niet doorstaan worden geweigerd met een 400-fout waarvan het bericht de productievereiste noemt. De controle beoordeelt de URL zoals die is geschreven — ze lost geen hostnamen op, dus richt je abonnement op het publieke endpoint waar je de events daadwerkelijk wilt ontvangen. Bij de aflevering wordt de hostnaam één keer opgelost, moet elk opgelost adres openbaar zijn en wordt de verbinding vastgepind op die adressen — een hostnaam die naar een privé- of intern adres verwijst (ook als dat tussen opzoeken en verbinden verandert) wordt nooit benaderd; de poging wordt vastgelegd als target_blocked.
Betrouwbaarheid
Eisen aan je respons
Je endpoint moet:
- Binnen 10 seconden een 2xx-status teruggeven
- Dubbele afleveringen afhandelen (idempotent)
Foutafhandeling
- Mislukte afleveringen worden na het eerste verzoek vijf keer opnieuw geprobeerd
- Eén uitgeputte gebeurtenis verhoogt de opeenvolgende foutenreeks met precies één
- Zodra minstens 10 uitgeputte gebeurtenissen zich binnen zeven dagen voordoen, wordt een abonnement automatisch uitgeschakeld
- Eigenaren kunnen abonnementen herstellen en opnieuw inschakelen vanuit de webhookinstellingen
- Aflevering gebeurt minstens één keer; gebruik
eventIdvoor idempotentie en ga niet uit van een vaste volgorde
Foutmeldingen
| Status | Bericht | Oorzaak |
|---|---|---|
| 400 | Invalid JSON body | JSON is onjuist opgemaakt |
| 400 | Invalid request body | Ontbrekende/ongeldige velden (inclusief niet-ondersteunde gebeurtenistypen) |
| 400 | Target URL must be a public HTTPS endpoint (localhost and private IPs are not allowed) | URL faalt de SSRF-validatie |
| 401 | Missing or invalid Authorization header | Header niet meegestuurd of verkeerd formaat |
| 401 | Invalid API key | Sleutel niet herkend |
| 403 | Webhook subscriptions require a Hobby plan or above with active billing | Abonnement of factureringsstatus staat integraties niet toe |
| 403 | Chatbot does not belong to this account | Agent behoort tot een ander account |
| 403 | Subscription does not belong to this account | Abonnement behoort tot een ander account |
| 404 | Chatbot not found | Ongeldige agent-id |
| 404 | Webhook subscription not found | Ongeldige abonnement-id |
| 409 | Webhook subscription already exists for this event and URL | Duplicaatabonnement |
Zapier-integratie
Deze endpoints vormen de basis van onze Zapier-integratie. Wanneer je Agentkit koppelt aan Zapier:
- Zapier roept
/api/v1/authaan om je API-sleutel te verifiëren - Zapier roept
/api/v1/chatbotsaan om je agents op te halen - Wanneer je een trigger inschakelt, roept Zapier
/api/v1/webhooks/subscribeaan - Gebeurtenissen worden afgeleverd op de webhook-URL van Zapier
- Wanneer je de trigger uitschakelt, roept Zapier DELETE aan op het abonnement
Wil je zonder te programmeren integreren, gebruik dan rechtstreeks Zapier in plaats van deze API's.
Codevoorbeeld
Node.js-abonnementsbeheer
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;
}
}
Volgende stappen
- Leads verzamelen instellen om gebeurtenissen te genereren
- Webhooks configureren in de interface via het dashboard
- Verbinden met Zapier voor 5.000+ integraties