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 utterance
  • language: 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 number
  • words: Array of word-level timestamps
  • speaker: Real speaker name

Word Structure:

  • word: The word text
  • start: Start time in seconds
  • end: End time in seconds
  • confidence: 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 transcription artifact 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 UUID
  • transcriptions: Array of transcription payloads, one per audio chunk
  • created_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 summary
  • translation: Translated transcriptions by target language
  • sentiment_analysis: Sentiment scores for utterances
  • named_entity_recognition: Extracted entities (names, organizations, locations)
  • audio_to_llm: LLM prompt responses
  • moderation: Content moderation results
  • chapterization: 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 name
  • start_time: Start time in seconds
  • end_time: End time in seconds
  • user_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 optional lang fields 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 sender
  • sender_id: Participant ID of the sender. For Google Meet, this is the assigned sequential ID. For Zoom, this is the SDK user ID. May be null for 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_id is 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 be null in some cases.
  • Microsoft Teams: sender_id is always null (Teams does not provide a participant ID mapping for chat senders). Sender names are resolved from the platform's display name field.
  • Zoom: sender_id is 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 name
  • id: Platform or assigned user ID (null if unavailable)
  • display_name: Display name shown in UI (optional, only present if different from name)
  • 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 name
  • id: Platform or assigned user ID (null if unavailable)
  • display_name: Display name shown in UI (optional, only present if different from name)
  • 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 response
  • bot.completed webhook 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 be null
  • 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: true flag
  • 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, and user_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 transcription artifact (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, and end_time (no user_id or lang)
  • Single audio file processing

Best Practices

  1. Download Promptly: Presigned URLs expire after 4 hours - download artifacts as soon as they're available
  2. Store Long-Term: If you need artifacts long-term, download and store them in your own storage
  3. Use Webhooks: Set up webhooks to receive artifact URLs automatically when bots complete
  4. Delete When Done: Use the delete endpoint to remove data when you no longer need it
  5. Use Appropriate Artifacts: Use transcription for display, raw_transcription for advanced features
  6. Track Transcription IDs: For BYOK users, use transcription_ids to 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

On this page