Artifacts
Complete guide to all artifacts generated by Meeting BaaS v2 bots
Meeting BaaS v2 generates various artifacts for each bot, including video recordings, audio files, transcriptions, and diarization data. All artifacts are stored securely and accessed via presigned URLs that are valid for 4 hours.
Overview
When a bot completes recording a meeting, it generates several artifacts that you can access:
- Video: MP4 video recording (when video recording is enabled)
- Audio: FLAC audio recording (always generated)
- Transcription: Standardized transcription with accurate timestamps
- Raw Transcription: Provider-specific transcription with advanced features
- Diarization: Speaker identification and timing data
- Chat Messages: JSON file containing all chat messages exchanged during the meeting
All artifacts are accessed via presigned URLs provided in bot details responses and webhook payloads.
Video Artifact
The video artifact contains the complete video recording of the meeting.
Format: MP4 video file
When Available: Only when recording_mode is NOT audio_only
Use Cases:
- Providing users with raw video recording of meetings
- Video playback and review
- Integration with video analysis tools
- Archival purposes
- Creating video summaries or highlights
Access: Available via the video field in bot details and webhook payloads. Returns null if video recording was not enabled or if the bot's data has been deleted.
Signed URL: Valid for 4 hours
Audio Artifact
The audio artifact contains the complete audio recording of the meeting.
Format: FLAC audio file
When Available: Always generated for every bot (regardless of recording mode)
Use Cases:
- Audio-only playback
- Integration with external transcription workflows
- Audio analysis and processing
- Backup audio source
- Creating audio-only versions of meetings
Access: Available via the audio field in bot details and webhook payloads. Returns null if the bot's data has been deleted.
Signed URL: Valid for 4 hours
Transcription Artifact
The transcription artifact provides a standardized, processed transcription with accurate timestamps and speaker identification.
Format: JSON file
Structure:
{
"bot_id": "123e4567-e89b-12d3-a456-426614174000",
"provider": "gladia",
"result": {
"utterances": [
{
"text": "Hello everyone, welcome to the meeting",
"language": "en",
"start": 0.5,
"end": 2.1,
"confidence": 0.95,
"channel": 0,
"words": [
{
"word": "Hello",
"start": 0.5,
"end": 0.8,
"confidence": 0.98
},
{
"word": "everyone",
"start": 0.8,
"end": 1.2,
"confidence": 0.96
}
],
"speaker": "John Doe"
}
],
"languages": ["en"],
"total_utterances": 150,
"total_duration": 3600.5
},
"created_at": "2025-01-15T11:00:00Z"
}Utterance Fields:
text: The transcribed text for this utterancelanguage: ISO 639-1 language code (e.g., "en", "es")start: Start time in seconds (floating point)end: End time in seconds (floating point)confidence: Confidence score (0.0 to 1.0)channel: Audio channel numberwords: Array of word-level timestampsspeaker: Real speaker name
Word Structure:
word: The word textstart: Start time in secondsend: End time in secondsconfidence: Confidence score (0.0 to 1.0)
Key Features:
- Speaker names are real names (not numeric IDs)
- All utterances sorted chronologically
- Accurate timestamps for the entire meeting
- Word-level timestamps for precise alignment
Use Cases:
- Standard transcript display with accurate timestamps
- Building transcript viewers/players
- Search and indexing
- Meeting summaries and analysis
- Creating subtitles or captions
- Speaker analytics and talk time analysis
Access: Available via the transcription field in bot details and webhook payloads. Returns null if transcription was not enabled or if the bot's data has been deleted.
Signed URL: Valid for 4 hours
Raw Transcription Artifact
The raw transcription artifact contains the complete, unmodified response from the transcription provider. This includes all provider-specific features and metadata.
Format: JSON file
Structure: Varies by transcription provider
Important Notes:
- Structure varies by provider
- Timestamps may not be accurate due to internal chunking processes
- Speaker IDs are numeric (not real names)
- Contains provider-specific features (summarization, LLM responses, etc.)
Use Cases:
- Accessing provider-specific features (summarization, LLM prompts, etc.)
- Custom transcription processing workflows
- Accessing full transcript text without time-matched utterances
- Integration with provider-specific APIs
- Accessing advanced features like translations, sentiment analysis, and named entity recognition
Limitations:
- NOT suitable for transcript display (use
transcriptionartifact instead) - Timestamps may not be accurate
- Speaker IDs are numeric, not names
Access: Available via the raw_transcription field in bot details and webhook payloads. Returns null if transcription was not enabled or if the bot's data has been deleted.
Signed URL: Valid for 4 hours
Provider-Specific Structures
Gladia
The Gladia raw transcription combines all audio chunk transcriptions into a single file:
{
"bot_id": "123e4567-e89b-12d3-a456-426614174000",
"transcriptions": [
{
"metadata": {
"audio_duration": 1800.5,
"number_of_distinct_channels": 1,
"billing_time": 1800.5,
"transcription_time": 22.1
},
"transcription": {
"full_transcript": "Hello everyone, welcome to the meeting...",
"languages": ["en"],
"utterances": [
{
"start": 0.5,
"end": 2.1,
"confidence": 0.95,
"channel": 0,
"speaker": 0,
"words": [
{
"word": "Hello",
"start": 0.5,
"end": 0.8,
"confidence": 0.98
}
],
"text": "Hello everyone",
"language": "en"
}
]
},
"summarization": {
"summary": "Meeting discussed Q4 goals and team alignment..."
},
"translation": {
"es": {
"utterances": [...]
}
},
"audio_to_llm": {
"response": "The meeting covered..."
}
},
{
"metadata": {
"audio_duration": 1800.0,
"number_of_distinct_channels": 1,
"billing_time": 1800.0,
"transcription_time": 23.0
},
"transcription": {
"full_transcript": "Let's continue with the next topic...",
"languages": ["en"],
"utterances": [...]
}
}
],
"created_at": "2025-01-15T11:00:00Z"
}Structure:
bot_id: The bot UUIDtranscriptions: Array of transcription payloads, one per audio chunkcreated_at: ISO 8601 timestamp when the combined transcription was created
Each element in the transcriptions array contains the Gladia transcription payload structure with:
Additional Fields (based on custom parameters):
summarization: AI-generated meeting summarytranslation: Translated transcriptions by target languagesentiment_analysis: Sentiment scores for utterancesnamed_entity_recognition: Extracted entities (names, organizations, locations)audio_to_llm: LLM prompt responsesmoderation: Content moderation resultschapterization: Automatic meeting chapters- And more based on your configuration
Reference: For complete documentation on Gladia's response structure and all available fields, see the Gladia API Documentation.
Additional Providers
Support for additional transcription providers (Assembly AI, Deepgram, etc.) is coming soon. Each provider will have its own structure documented here.
Diarization Artifact
The diarization artifact contains speaker identification and timing information, useful for custom transcription workflows.
Format: JSONL file
Structure (Zoom example):
{"speaker": "John Doe", "start_time": 0.5, "end_time": 5.2, "user_id": 123, "lang": "en"}
{"speaker": "Jane Smith", "start_time": 5.3, "end_time": 10.1, "user_id": 456, "lang": "en"}Structure (Google Meet/Teams example):
{"speaker": "John Doe", "start_time": 0.5, "end_time": 5.2, "user_id": 1}
{"speaker": "Jane Smith", "start_time": 5.3, "end_time": 10.1, "user_id": 2}Fields:
speaker: Real speaker namestart_time: Start time in secondsend_time: End time in secondsuser_id: Platform or Assigned user ID - (Zoom and Google Meet only, optional)lang: Language code (Zoom only, optional)
Use Cases:
- Custom transcription workflows
- Speaker identification and analysis
- Building custom transcript processing
- Integration with external diarization tools
- Maintaining speaker-to-transcript relationships
- Talk time analysis per speaker
Access: Available via the diarization field in bot details and webhook payloads. Returns null if diarization data is not available or if the bot's data has been deleted.
Signed URL: Valid for 4 hours
Platform Differences:
- Zoom: Includes
user_id(platform user ID) and optionallangfields in each segment - Google Meet/Teams: Includes
user_id(assigned user ID) when available. The assigned ID attempts to remain consistent even if a participant rejoins the meeting.
Chat Messages Artifact
The chat messages artifact contains all chat messages exchanged during the meeting, including messages from participants and messages sent by the bot via the send chat message endpoint.
Format: JSON file
When Available: Only when chat messages were exchanged during the meeting. If no messages were sent or received, this artifact will not be generated.
Structure:
[
{
"message_id": "spaces/XxM_aNTpzGkB/messages/1773539019302815",
"sender_name": "John Doe",
"sender_id": 2,
"text": "Hi everyone!",
"timestamp": "2025-01-15T10:30:15.359Z"
},
{
"message_id": "71149604-eb75-433c-91bc-6a3c02defa94",
"sender_name": "Meeting Bot",
"sender_id": 1,
"text": "Hello! How can I help?",
"timestamp": "2025-01-15T10:30:28.456Z"
}
]Fields:
message_id: Unique identifier for the message (format varies by platform)sender_name: Display name of the message sendersender_id: Participant ID of the sender. For Google Meet, this is the assigned sequential ID. For Zoom, this is the SDK user ID. May benullfor Teams or if the sender could not be resolved to a participant.text: Text content of the message (HTML tags stripped for Teams messages)timestamp: ISO 8601 timestamp of when the message was sent or received
Note on timestamps: The timestamp field in the artifact represents when the message was sent or received in the meeting. This differs from the sent_at field in the bot.chat_message webhook, which represents when the webhook was dispatched by the server.
Real-Time Events: In addition to the artifact, each chat message triggers a bot.chat_message webhook event in real-time as messages are received during the meeting. The artifact provides a complete record of all messages for post-meeting access.
Use Cases:
- Post-meeting review of chat discussions
- Capturing action items and links shared in chat
- Audit trail of meeting communications
- Integration with note-taking and project management tools
- Correlating chat messages with transcript timestamps
Access: Available via the chat_messages field in bot details and webhook payloads. Returns null if no chat messages were exchanged or if the bot's data has been deleted.
Signed URL: Valid for 4 hours
Platform Differences:
- Google Meet:
sender_idis an auto-assigned sequential participant ID (same as in diarization). Since Google Meet does not provide native participant IDs, these are generated internally and may benullin some cases. - Microsoft Teams:
sender_idis alwaysnull(Teams does not provide a participant ID mapping for chat senders). Sender names are resolved from the platform's display name field. - Zoom:
sender_idis the Zoom SDK user ID (numeric, e.g.,16778240). Both received messages and bot-sent messages include the SDK user ID.
Additional Response Fields
Transcription IDs
Type: string[] | null
Description: Array of transcription job IDs from the transcription provider
Use Cases:
- BYOK (Bring Your Own Key) users maintaining relationships with transcription providers
- Accessing provider-specific endpoints using these IDs
- Tracking transcription jobs across provider APIs
- Debugging and support
- Correlating transcription errors with specific provider jobs
Example:
{
"transcription_ids": ["gladia-job-12345", "gladia-job-12346"],
"transcription_provider": "gladia"
}Access: Available via the transcription_ids field in bot details and webhook payloads. Returns null if transcription was not enabled.
Participants Array
Type: Array<{name: string, id: number | null, display_name?: string, profile_picture?: string}>
Description: List of all participants who joined the meeting
Structure:
{
"participants": [
{
"name": "John Doe",
"id": 1,
"display_name": "John",
"profile_picture": "https://lh3.googleusercontent.com/..."
},
{
"name": "Jane Smith",
"id": 2
}
]
}Fields:
name: Participant full nameid: Platform or assigned user ID (null if unavailable)display_name: Display name shown in UI (optional, only present if different fromname)profile_picture: Profile picture URL (optional, only present when available)
Use Cases:
- Participant tracking and analytics
- Meeting attendance reports
- Integration with CRM/HR systems
- Building participant lists for meeting summaries
Access: Available via the participants field in bot details and webhook payloads.
Speakers Array
Type: Array<{name: string, id: number | null, display_name?: string, profile_picture?: string}>
Description: List of speakers identified in the meeting (subset of participants who spoke)
Structure: Same as participants array
Fields:
name: Speaker full nameid: Platform or assigned user ID (null if unavailable)display_name: Display name shown in UI (optional, only present if different fromname)profile_picture: Profile picture URL (optional, only present when available)
Use Cases:
- Speaker analytics
- Talk time analysis
- Identifying active participants
- Building speaker-focused meeting summaries
Access: Available via the speakers field in bot details and webhook payloads.
Artifact Access
All artifacts are accessed via presigned URLs that are valid for 4 hours from the time they are generated.
Where to Find Artifacts:
GET /v2/bots/{bot_id}response - All artifact URLs in the responsebot.completedwebhook payload - All artifact URLs when bot completes- Bot callbacks - Same URLs as webhook payloads
Important Notes:
- URLs expire after 4 hours - download artifacts promptly
- If
artifacts_deleted: true, all artifact URLs will benull - Artifacts are stored securely with data retention tags
- Download and store artifacts in your own storage for long-term access
Data Retention and Security
With security built into every aspect of v2, data retention is as well. This approach severely limits data exposure by automatically removing artifacts after a specified retention period.
Retention by Plan
Data retention periods vary by your API plan:
- Pay-as-you-go: 3 days
- Pro: 7 days
- Scale: 14 days
- Enterprise: 30 days
Automatic Deletion
A background job automatically deletes artifacts that have exceeded the retention period based on your plan. This ensures data is not stored longer than necessary and minimizes security exposure.
Manual Deletion
We recommend users take ownership of their data by using the DELETE /v2/bots/{bot_id}/delete-data endpoint to manually delete artifacts once they've been saved at your end.
What Gets Deleted:
- All artifacts from S3 (video, audio, transcription, diarization, chat messages, screenshots)
- Optionally deletes transcription data from the transcription provider (default:
true) - Sets
artifacts_deleted: trueflag - Ensures complete data scrubbing from our system
Transcription Provider Deletion: When using the delete endpoint with delete_from_provider=true (default), we also delete the transcription data from the transcription provider's servers (e.g., Gladia). This ensures complete data removal across all systems.
Extended Retention
If you have a specific reason for needing data retained longer than your plan's default retention period, please contact our support team and we'll discuss how we can best support your needs.
Platform-Specific Notes
Zoom
- JSONL diarization format
- User ID mapping in diarization data
- Multi-speaker support with channel-based audio
Google Meet
- JSONL diarization format (same as Zoom)
- Network-based speaker detection for improved accuracy
- Diarization segments include
speaker,start_time,end_time, anduser_id(assigned user ID) - Single audio file processing
- Diarization Accuracy:
- Uses network-based detection which provides more accurate speaker identification
- May have slight inaccuracies in timestamp alignment (typically less than 1 second)
- Our system uses a statistical analysis approach to improve accuracy:
- Matches transcription utterances to diarization segments using a ±1 second time window
- Samples 30% of utterances (minimum 50, maximum 200 samples per speaker) for statistical significance
- Uses frequency-based matching: the speaker with the highest match count within the time window is selected
- Calculates confidence scores based on match frequency
- This approach compensates for any timing discrepancies by finding the most likely speaker match statistically
- For the most accurate timestamps, use the
transcriptionartifact (output transcription) which applies timestamp offsets to account for chunk boundaries and provides accurate timing across the entire meeting
Microsoft Teams
- JSONL diarization format (same as Zoom)
- UI-based speaker detection
- Diarization segments only include
speaker,start_time, andend_time(nouser_idorlang) - Single audio file processing
Best Practices
- Download Promptly: Presigned URLs expire after 4 hours - download artifacts as soon as they're available
- Store Long-Term: If you need artifacts long-term, download and store them in your own storage
- Use Webhooks: Set up webhooks to receive artifact URLs automatically when bots complete
- Delete When Done: Use the delete endpoint to remove data when you no longer need it
- Use Appropriate Artifacts: Use
transcriptionfor display,raw_transcriptionfor advanced features - Track Transcription IDs: For BYOK users, use
transcription_idsto correlate with provider jobs
Examples
Accessing Artifacts from Bot Details
curl -X GET "https://api.meetingbaas.com/v2/bots/BOT-ID" \
-H "x-meeting-baas-api-key: YOUR-API-KEY"Response:
{
"success": true,
"data": {
"bot_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "completed",
"video": "https://s3.amazonaws.com/.../video.mp4",
"audio": "https://s3.amazonaws.com/.../output.flac",
"transcription": "https://s3.amazonaws.com/.../output_transcription.json",
"raw_transcription": "https://s3.amazonaws.com/.../raw_transcription.json",
"diarization": "https://s3.amazonaws.com/.../diarization.jsonl",
"chat_messages": "https://s3.amazonaws.com/.../chat_messages.json",
"participants": [
{ "name": "John Doe", "id": 1, "display_name": "John", "profile_picture": "https://lh3.googleusercontent.com/..." },
{ "name": "Jane Smith", "id": 2 }
],
"speakers": [
{ "name": "John Doe", "id": 1, "display_name": "John", "profile_picture": "https://lh3.googleusercontent.com/..." },
{ "name": "Jane Smith", "id": 2 }
],
"transcription_ids": ["gladia-job-12345"],
"transcription_provider": "gladia"
}
}Accessing Artifacts from Webhook
When a bot completes, you'll receive a webhook with all artifact URLs:
{
"event": "bot.completed",
"data": {
"bot_id": "123e4567-e89b-12d3-a456-426614174000",
"video": "https://s3.amazonaws.com/.../video.mp4",
"audio": "https://s3.amazonaws.com/.../output.flac",
"transcription": "https://s3.amazonaws.com/.../output_transcription.json",
"raw_transcription": "https://s3.amazonaws.com/.../raw_transcription.json",
"diarization": "https://s3.amazonaws.com/.../diarization.jsonl",
"chat_messages": "https://s3.amazonaws.com/.../chat_messages.json",
"transcription_ids": ["gladia-job-12345"],
"transcription_provider": "gladia"
}
}Frequently Asked Questions
Next Steps
- Learn about Getting the Data to access artifacts
- Set up Webhooks to receive artifact URLs automatically
- Explore Transcription features and custom parameters
- Check the API Reference for complete endpoint documentation
