- Project-level webhooks: Apply to all bots in a project (created via UI)
- Bot-level webhooks: Apply to specific bots only (created via API)
Creating Project-Level Webhooks
Select triggers
Select the triggers you want to receive notifications for (we currently have eight triggers:
bot.state_change, transcript.update, chat_messages.update, participant_events.join_leave, participant_events.speech_start_stop, calendar.events_update, calendar.state_change, and bot_logs.update)Creating Bot-Level Webhooks
Bot-level webhooks are created via the API when creating a bot. Include awebhooks field in your bot creation request:
Available Webhook Triggers
| Trigger | Description |
|---|---|
bot.state_change | Bot changes state (joins, leaves, starts recording, etc.) |
transcript.update | Real-time transcript updates during meeting |
chat_messages.update | Chat message updates in the meeting |
participant_events.join_leave | A participant joins or leaves the meeting |
participant_events.speech_start_stop | A participant starts or stops speaking |
calendar.events_update | Calendar events have been synced and updated |
calendar.state_change | Calendar connection state has changed (connected/disconnected) |
bot_logs.update | A log entry associated with a bot has been created |
Webhook Delivery Priority
When a bot has both project-level and bot-level webhooks configured, the bot-level webhooks will be used instead of the project-level webhooks.Webhook Limits and Validation
- Maximum: 2 webhooks per project or per bot
- URL Format: Must start with
https:// - Uniqueness: Same URL cannot be used multiple times for the same bot/project
Webhook Payload
When a webhook is delivered, Attendee will send an HTTP POST request to your webhook URL with the following structure:For Bot-Related Events
For Calendar-Related Events
Payload for bot.state_change trigger
For webhooks triggered by bot.state_change, the data field contains:
Using webhooks to know when the recording is available
The most common use case for webhooks is to be notified when the meeting has ended and the recording is available. You can do this by listening for thepost_processing_completed event type.
The data field will look like this:
Payload for transcript.update trigger
For webhooks triggered by transcript.update, the data field contains a single utterance:
Payload for chat_messages.update trigger
For webhooks triggered by chat_messages.update, the data field contains a single chat message:
Payload for participant_events.join_leave and participant_events.speech_start_stop triggers
For webhooks triggered by participant_events.join_leave and participant_events.speech_start_stop, the data field contains a single participant event:
Payload for calendar.events_update trigger
For webhooks triggered by calendar.events_update, the data field contains calendar sync information:
Payload for calendar.state_change trigger
For webhooks triggered by calendar.state_change, the data field contains the same structure as calendar.events_update:
connection_failure_data field will contain error details such as:
Payload for bot_logs.update trigger
For webhooks triggered by bot_logs.update, the data field contains information about a log entry associated with a bot:
Debugging Webhook Deliveries
Go to the ‘Bots’ page and navigate to a Bot which was created after you created your webhook. You should see a ‘Webhooks’ tab on the page. Clicking it will show a list of all the webhook deliveries for that bot, whether they succeeded and the response from your server.Verifying Webhooks
To ensure the webhook requests are coming from Attendee, we sign each request with a secret. You can verify this signature to confirm the authenticity of the request.- Each project has a single webhook secret used for both project and bot-level webhooks. You can get the secret in the Settings → Webhooks page.
- The signature is included in the
X-Webhook-Signatureheader of each webhook request