Attendee tracks all participants in a meeting and when they take certain actions. This information can be used for:
- Tracking meeting attendance
- Triggering actions when a certain number of participants join
- Monitoring when participants are speaking
- Building analytics dashboards
The bot itself is not considered a participant in the meeting and will not appear in the participant events.
Event Types
Attendee tracks four types of participant events:
Join
A participant has joined the meeting
Leave
A participant has left the meeting
Speech Start
A participant has started speaking
Speech Stop
A participant has stopped speaking
Fetching Participant Events
Retrieve a list of participant events for a specific bot by making a GET request to the /bots/{bot_id}/participant_events endpoint.
curl -X GET https://app.attendee.dev/api/v1/bots/bot_abc123/participant_events \
-H 'Authorization: Token YOUR_API_KEY' \
-H 'Content-Type: application/json'
Response Example
[
{
"id": "evt_123",
"participant_name": "John Doe",
"participant_uuid": "16778240",
"participant_user_uuid": "AAB6E21A-6B36-EA95-58EC-5AF42CD48AF8",
"participant_is_host": false,
"event_type": "join",
"event_data": {},
"timestamp_ms": 1234567890000
},
{
"id": "evt_124",
"participant_name": "John Doe",
"participant_uuid": "16778240",
"participant_user_uuid": "AAB6E21A-6B36-EA95-58EC-5AF42CD48AF8",
"participant_is_host": false,
"event_type": "speech_start",
"event_data": {},
"timestamp_ms": 1234567895000
}
]
For complete API documentation, see the Participant Events API reference.
Real-time Webhooks
You can receive real-time notifications for participant events by setting up webhooks:
Create webhook
Go to Settings → Webhooks in the Attendee dashboard and click Create Webhook.
Select triggers
Enable the triggers you need:
participant_events.join_leave - For join and leave events
participant_events.speech_start_stop - For speech activity
Specify endpoint
Enter the URL where you want to receive webhook notifications.
Webhook Payload
When a participant event occurs, Attendee sends a POST request to your webhook URL:
{
"idempotency_key": "550e8400-e29b-41d4-a716-446655440000",
"bot_id": "bot_abc123",
"bot_metadata": { "user_id": "user_456" },
"trigger": "participant_events.join_leave",
"data": {
"id": "evt_123",
"participant_name": "John Doe",
"participant_uuid": "16778240",
"participant_user_uuid": "AAB6E21A-6B36-EA95-58EC-5AF42CD48AF8",
"participant_is_host": false,
"event_type": "join",
"event_data": {},
"timestamp_ms": 1234567890000
}
}
For more details on webhook payloads, see the webhooks documentation.
Use Cases
Attendance Tracking
Track who attended a meeting and for how long:
import requests
from datetime import datetime, timedelta
def get_attendance_summary(bot_id, api_key):
url = f"https://app.attendee.dev/api/v1/bots/{bot_id}/participant_events"
headers = {
"Authorization": f"Token {api_key}",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
events = response.json()
# Calculate attendance duration for each participant
attendance = {}
for event in events:
name = event['participant_name']
event_type = event['event_type']
timestamp = event['timestamp_ms']
if name not in attendance:
attendance[name] = {'join_time': None, 'total_duration': 0}
if event_type == 'join':
attendance[name]['join_time'] = timestamp
elif event_type == 'leave' and attendance[name]['join_time']:
duration = timestamp - attendance[name]['join_time']
attendance[name]['total_duration'] += duration
attendance[name]['join_time'] = None
return attendance
Speech Activity Analysis
Analyze who spoke and for how long:
def get_speech_analytics(bot_id, api_key):
url = f"https://app.attendee.dev/api/v1/bots/{bot_id}/participant_events"
headers = {
"Authorization": f"Token {api_key}",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
events = response.json()
# Calculate speech duration for each participant
speech_stats = {}
for event in events:
if event['event_type'] not in ['speech_start', 'speech_stop']:
continue
name = event['participant_name']
if name not in speech_stats:
speech_stats[name] = {'start_time': None, 'total_speaking_time': 0}
if event['event_type'] == 'speech_start':
speech_stats[name]['start_time'] = event['timestamp_ms']
elif event['event_type'] == 'speech_stop' and speech_stats[name]['start_time']:
duration = event['timestamp_ms'] - speech_stats[name]['start_time']
speech_stats[name]['total_speaking_time'] += duration
speech_stats[name]['start_time'] = None
return speech_stats
Next Steps
API Reference
Explore the complete Participant Events API
Webhooks
Set up real-time notifications
Transcripts
Get meeting transcripts with speaker attribution
List Participants
Get current meeting participants