Agency & Reseller
Manage endpoints under Agency > Webhooks in your dashboard, or via the Agency API.
{
"id": "9194bb86-10ab-443c-829c-5c420c475e2f",
"event": "lead.captured",
"timestamp": "2026-08-18T11:43:08+00:00",
"team_id": "8e7a1b4c-8c7c-4029-aa4e-c3bf3c8b7abc",
"external_reference": "your-billing-id-123",
"chatbot_id": "8cc9fd44-4c7c-4d5d-aebe-68b03e8236fd",
"data": {
"visitor": {
"id": "a176e7eb-c8bb-4be0-bc1a-608f4377df8d",
"visitor_id": "wh-visitor-1",
"email": "customer@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": null,
"custom_data": { "company": "Acme Co" }
},
"chatbot_name": "Support Agent"
}
}
escalation.created adds last_message and inbox_url.client.credits_exhaustedcarries message_limit, messages_used, and topup_credits_remaining.
const crypto = require("crypto")
function verify(rawBody, signatureHeader, secret) {
const expected =
"sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex")
const received = Buffer.from(signatureHeader ?? "")
const expectedBuffer = Buffer.from(expected)
// timingSafeEqual throws on length mismatch, so check length first.
return (
received.length === expectedBuffer.length &&
crypto.timingSafeEqual(received, expectedBuffer)
)
}
function verify(string $rawBody, ?string $signatureHeader, string $secret): bool
{
if ($signatureHeader === null) {
return false;
}
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
return hash_equals($expected, $signatureHeader);
}
Ready to automate your customer service with AI?
Join over 1000+ businesses, websites and startups automating their customer service and other tasks with a custom trained AI agent.