---
title: VoiceBot Webhooks
slug: intelligent-voice-agents/voicebot-webhooks
docTags: 
createdAt: 2026-01-09T13:36:15.941Z
---

VoiceBot Webhooks allow you to receive **real-time notifications** about events occurring during a voicebot call. When specific events occur, the VoiceBot platform sends **HTTP POST requests** to your configured webhook endpoints.

Webhooks enable:

- Real-time transcripts
- Dynamic webhook overrides per session
- Agent transfer orchestration
- Post-call analytics pipelines

## Overview

Webhooks can be:

- Configured at **bot creation time**
- Overridden **per session** using:
  - Custom parameters on the voicebot WebSocket connection
  - The response of the **Session Start webhook**

:::BlockQuote
Webhook overrides (except session start) are cached for the **lifecycle of the session**.
:::

## Supported Webhook Types

| **Webhook**          | **Description**                                |
| -------------------- | ---------------------------------------------- |
| session\_start       | Triggered when a voicebot call begins          |
| session\_end         | Triggered when the conversation ends           |
| pre\_agent\_transfer | Triggered before transferring to a human agent |
| transcript\_events   | Triggered on turn-progress and turn-complete   |

## Important Notes

- **Timeouts**: Your webhook must respond within the configured timeout
- **Success Criteria**: HTTP 2xx responses are treated as successful
- **Retries**: Failed webhooks are retried based on the retry configuration
- **Ordering**: Consumers must handle **out-of-order events**
- **Session Scope**: Webhook overrides apply only to a single session
- **Bot-to-Bot Transfer**: Webhook endpoints should be generic
- **Special Override**: call-setup-url custom param overrides the session\_start webhook

## Common Webhook Request Format

All webhook requests follow the same structure.

:::BlockQuote
\{
&#x20; "session\_id": "\<voicebot session id>",
&#x20; "conversation\_id": "\<voicebot conversation id>",
&#x20; "start\_time": "2025-07-16T11:40:57.000Z",
&#x20; "end\_time": null,
&#x20; "landing\_number": "",
&#x20; "external\_id": "CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
&#x20; "session\_state": "session\_start | session\_in\_progress | session\_end",
&#x20; "trigger\_reason": "timer | turn-complete | turn-progress | pre-agent-transfer | start | end",
&#x20; "contact\_uri": "\<phone number / endpoint>",
&#x20; "network\_type": "sip | pstn",
&#x20; "account\_id": "",
&#x20; "bot\_id": "bot\_uuid",
&#x20; "bot\_name": "bot\_name",
&#x20; "metadata": \{
&#x20;   "call\_sid": "CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
&#x20;   "stream\_sid": ""
&#x20; },
&#x20; "custom\_parameters": \{
&#x20;   "key1": "value1",
&#x20;   "key2": "value2"
&#x20; },
&#x20; "events": \[
&#x20;   \{
&#x20;     "event\_type": "sentiment",
&#x20;     "event\_id": "evt\_1",
&#x20;     "event\_data": \{}
&#x20;   }
&#x20; ]
}
:::

## Event Object

:::BlockQuote
\{
&#x20; "event\_type": "sentiment | summary | intent | entity | outcome | transcript",
&#x20; "event\_id": "\<event id>",
&#x20; "event\_data": \{}
}
:::

## Transcript Event Data

:::BlockQuote
\{
&#x20; "transcripts": \[
&#x20;   \{
&#x20;     "sequence": 1,
&#x20;     "status": "inprogress | completed",
&#x20;     "transcript\_segments": \[
&#x20;       \{
&#x20;         "speaker": "assistant",
&#x20;         "text": "Hello! How may I help you?",
&#x20;         "start\_timestamp": "2025-10-31T21:27:44.330756Z",
&#x20;         "end\_timestamp": "2025-10-31T21:27:51.082429Z"
&#x20;       }
&#x20;     ]
&#x20;   }
&#x20; ]
}
:::

### Transcript Notes

- status defaults to completed
- inprogress is used only for active turns
- Accumulated transcripts are sent **per turn**
- At most **one sequence** per webhook
- Transcripts are **not sent in session\_end webhook**

# Webhook Types

## Session Start Webhook

### When

Triggered when a voicebot call begins.

Allows dynamic override of other webhook endpoints.

### Expected Response (2xx)

:::BlockQuote
\{
&#x20; "http\_code": 200,
&#x20; "response": \{
&#x20;   "data": \{
&#x20;     "greeting\_message": \{
&#x20;       "text": "Dynamic greeting message for the user"
&#x20;     },
&#x20;     "session\_constants": \{
&#x20;       "phone\_number": "x\_call\_from"
&#x20;     },
&#x20;     "conversation\_assistant\_id": "",
&#x20;     "webhook\_config": \{
&#x20;       "session\_end": \{
&#x20;         "url": "https\://api.example.com/webhooks/session-end"
&#x20;       },
&#x20;       "pre\_agent\_transfer": \{
&#x20;         "url": "https\://api.example.com/webhooks/pre-agent-transfer"
&#x20;       },
&#x20;       "insights\_events": \{
&#x20;         "url": "https\://api.example.com/webhooks/insights",
&#x20;         "trigger\_type": "timer",
&#x20;         "trigger\_interval\_sec": 30
&#x20;       },
&#x20;       "transcript\_events": \{
&#x20;         "url": "https\://api.example.com/webhooks/transcripts"
&#x20;       }
&#x20;     }
&#x20;   }
&#x20; }
}
:::

## Pre-Agent Transfer Webhook

### When

Triggered when the bot detects user intent to talk to an agent.

### Expected Response (2xx)

:::BlockQuote
\{
&#x20; "http\_code": 200,
&#x20; "response": \{
&#x20;   "data": \{
&#x20;     "agent\_transfer\_message": \{
&#x20;       "text": "Connecting you to a support agent"
&#x20;     }
&#x20;   }
&#x20; }
}
:::

## Session End Webhook

### When

Triggered when the conversation ends.

### Expected Response (2xx)

:::BlockQuote
\{
&#x20; "http\_code": 200,
&#x20; "response": \{
&#x20;   "data": \{}
&#x20; }
}
:::

## Transcript Events Webhook

### When

Triggered on:

- turn-progress
- turn-complete

### Expected Response (2xx)

:::BlockQuote
\{
&#x20; "http\_code": 200,
&#x20; "response": \{
&#x20;   "data": \{}
&#x20; }
}
:::

## Error Response (All Webhooks)

:::BlockQuote
\{
&#x20; "http\_code": 500,
&#x20; "response": \{
&#x20;   "data": null,
&#x20;   "error\_data": \{
&#x20;     "error\_code": "CL52894",
&#x20;     "message": "Internal server error",
&#x20;     "description": "Internal server error"
&#x20;   }
&#x20; }
}
:::

