Payload shape
POST /your/endpoint
content-type: application/json
x-praatbox-signature: sha256=...
x-praatbox-event: conversation.handoff
{
"event": "conversation.handoff",
"id": "evt_4f9c2a",
"occurred_at": "2026-04-12T14:32:08Z",
"data": {
"conversation_id": "c_9a3f",
"reason": "low_confidence",
"transcript_url": "https://api.praatbox.com/v1/..."
}
}Events
conversation.created— visitor opened the widgetconversation.message— any new message in either directionconversation.handoff— AI couldn't continue, escalating to humanconversation.resolved— thread closedconversation.csat— visitor rated the conversationknowledge.indexed— a source finished crawling
Verifying signatures
Compute HMAC-SHA256 over the raw request body using your endpoint's signing secret. Compare in constant time against the x-praatbox-signature header.
Retries
We retry on any 5xx or timeout. Five attempts, exponential backoff up to 24 hours. After that the event is dead-lettered and visible in Settings → Webhooks → Failed deliveries — replay any event with one click.
Testing
Use the dashboard's "Send test event" button to fire a synthetic webhook at any endpoint. Or use the Praatbox CLI: praatbox webhooks tail streams every event to your terminal as JSON.