How to get Mixed Video MP4 (Async)

📘

Mixed video is enabled by default for all bots.

This guide is for you if you want to view the full audio and video recording of the meeting.

Platforms Support

Platform
Zoom
Microsoft Teams
Google Meet
Webex
Slack Huddles (Beta)
Go-To Meeting (Beta)

Recording Specifications

  • Resolution: 1280x720 (720p)
  • FPS: 30 FPS
  • Bitrate: 2 Mbps

Implementation

Step 1: Create a bot

Mixed video is enabled by default, so there are no additional parameters needed in your request.

curl --request POST \
     --url https://us-east-1.recall.ai/api/v1/bot \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'authorization: YOUR_RECALL_API_KEY' \
     --data '
{
  "meeting_url": "YOUR_MEETING_URL"
}
'

const response = await fetch("https://us-east-1.recall.ai/api/v1/bot", {
  method: "POST",
  headers: {
    "accept": "application/json",
    "content-type": "application/json"
    "authorization": "YOUR_RECALL_API_KEY" // Update this
  },
  body: JSON.stringify({
    meeting_url: "YOUR_MEETING_URL", // Update this
    recording_config: {
      video_mixed_layout: "gallery_view_v2", // Add this to your request body
      video_separate_mp4: {} # Add this to your request body
    }
  })
});

if (!response.ok) {
  throw new Error(`Error: ${response.status} ${response.statusText}`);
}

const data = await response.json();

import requests

response = requests.post(
    "https://us-east-1.recall.ai/api/v1/bot",
    json={
      "meeting_url": "YOUR_MEETING_URL", # Update this
      "recording_config": {
	      "video_mixed_layout": "gallery_view_v2" # Add this to your request body
		    "video_separate_mp4": {} # Add this to your request body
      }
    },
    headers={
      "accept": "application/json",
      "content-type": "application/json",
    	"authorization": "YOUR_RECALL_API_KEY" # Update this
    }
)

if not response.ok:
 	errorMessage = f"Error: {response.status_code} - {response.text}"
  raise requests.RequestException(errorMessage)
  
result = response.json()

Step 2: Retrieve the recording

Once the call has ended, you can retrieve its recording with the Retrieve Bot API endpoint.

curl --request GET \
     --url https://us-east-1.recall.ai/api/v1/bot/YOUR_RECALL_BOT_ID/ \
     --header 'Authorization: YOUR_RECALL_API_KEY' \
     --header 'accept: application/json'
     
const recall_bot_id = 'YOUR_RECALL_BOT_ID' // Update this
const recall_api_key = 'YOUR_RECALL_API_KEY' // Update this

const get_recall_bot = async (args: { recall_bot_id: string, recall_api_key: string }) => {
    const { recall_bot_id } = args
    const bot_response = await fetch(`https://us-east-1.recall.ai/api/v1/bot/${recall_bot_id}`, {
        method: "GET",
        headers: {
            "accept": "application/json",
            "content-type": "application/json",
            "authorization": recall_api_key
        }
    });

    if (!bot_response.ok) {
        throw new Error(`Error: ${bot_response.status} ${bot_response.statusText}`);
    }

    return await bot_response.json();
}

const recall_bot = await get_recall_bot({ recall_bot_id, recall_api_key });

import requests

recall_bot_id = 'YOUR_RECALL_BOT_ID'  # Update this
recall_api_key = 'YOUR_RECALL_API_KEY'  # Update this

def get_recall_bot(args: dict):
    recall_bot_id = args.get("recall_bot_id")
    recall_api_key = args.get("recall_api_key")
    
    url = f"https://us-east-1.recall.ai/api/v1/bot/{recall_bot_id}"
    headers = {
        "accept": "application/json",
        "content-type": "application/json",
        "authorization": recall_api_key
    }
    
    response = requests.get(url, headers=headers)
    
    if not response.ok:
        raise Exception(f"Error: {response.status_code} {response.reason}")
    
    return response.json()

recall_bot = get_recall_bot({"recall_bot_id": recall_bot_id, "recall_api_key": recall_api_key})

The bot will have an array of recordings in the bot.recording field as defined in the Retrieve Bot 200 response.

The mp4 recording itself is located in the video_mixed object in the media_shortcuts field of the recording object. In the data field, you'll see a download_url. You can download this recording or use the download_url as the source for an HTML video element in your application's UI. For detailed implementation examples and best practices, see our Video Playback Guide.

{
  "id": "95db53d7-47f6-4d49-be61-dd4481038958",
  ...,
  "recording": "824ad909-8736-4bb1-92d8-1639aa297cd2",
  "recordings": [
    {
      "id": "824ad909-8736-4bb1-92d8-1639aa297cd2",
      ...
      "media_shortcuts": {
        "video_mixed": {
          "data": {
            "download_url": "https://recallai-production-bot-data.s3.amazonaws.com/_workspace-8ef4bed2-e139-4449-af6a-e26d2d231555/recordings/824ad909-8736-4bb1-92d8-1639aa297cd2/video_mixed/39718d95-a981-450e-b16c-170b9b153d9c/bot/95db53d7-47f6-4d49-be61-dd4481038958/AROA3Z2PRSQAET6FSC3NG%3Ai-0d05e48eb769f7e40/video.mp4?AWSAccessKeyId=ASIA3Z2PRSQAP7V2VTVW&Signature=1qwkdS2KLwxKxjkbqk9fma5lb%2F8%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEKT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQC01t0cqG%2BJ%2BaXuQliX6hx3ilkkq5kA7cze1y4MEDrgzgIhAO8zSkOKHBa0GsZufper%2FgO%2FJzp4C%2BUqR1o6DXv4YfNpKroFCE0QABoMODExMzc4Nzc1MDQwIgySUiwgZFsPTUKB8MAqlwXPG%2BVAI41s3Ag1SJsLPP5vX8IGxpgE2sT4pj3Z%2B8GnzRdfQCtWYl9ZUbzQ%2FPgAzl7MZfgtKcZ8Sn8qttsGbQIdx3McIqr1XaV7MxibaRETywjeaQGeEFDZQNbSjvvw7zsryRAcB5FKY8ZaTTrbnyrRwSq%2BPTovOh98DNzXteNDNvh6azntys7HcuTfUHrRmp%2FgmmFGIRCdU96x1qvmdqvIJKprWpVuoAmdGVtHR6ArtVtBdxKC%2BjUSivXOdlSkYNTJ0wYXyMmMRLYzNezDEIqrHNahsz%2BcnNfP01rFLlhIfP64gWUgGWMrQb%2FY4q7stPUBTPq2MQDdNC0tE2zHyb1XYzcS0vvpyen8GfUwK5SQhwzmCYEaq648%2FUPvLVR6Akd1CpByAE6zjVFB7G5mwCWoC02Mmua8%2F9t1vToSHB7JWwBdNtwua4glUJ01kzjqkFdACzlJB31FpUSpxkwSPl1Vi1v%2FQa4jvcdm0DtPA6%2B1%2BAI98ddx81WjLkgePqwlEIcH7rNTIlZLElIzjesNGWIFFMSazm1PuntVv9LnWtUttHWmVjlF%2FCyZYF2pevbnaKw%2FmKqWPUT0U92RjrFvaPyZmJ1YQZcOzTg1t8VdeKwMqj5pX2mfAD2MPPZAk5rDGMhjitBKYPnNy%2FP31HsUDuxwKjyoKrI4QelcYUTcAgIT2%2FQUIaBZ%2Bc90hUt7cS9qk8hQzKKZfQuM%2FhTiCGcBS5CE8KBPd9QUtucTYKzzW3e0%2FlYG3u8ha2gBqmR%2FN8%2FiiT0ewVZaFeoDttjnZ1ySN21hLqIxvh%2Fn4rcPn%2FooRjlHOjbrrkX5q%2Bw2eVhOxby0E%2BDqk6HXTHBfC7xlLQI9vCDP3Rc045qaPbToTLYXafExMTdpDVzLGaEwweedugY6sAEebI5sdpC9i3I0wJL%2BYPHKQz9MJzjPc88cN4%2FtHT5XEhQJMCXeakGl3Gbgu%2F1G9dGX%2FtlVwUVZjABUKCNt32RzDbfKQgHa28dgkphubSlA7SxKIObbIJm3o3xJuV%2Fp93qHFK%2FgyWQ9w5CoqPFJJZuMEYyoZZLyhip8su%2Bdnp9eveV7qkHYLFEec4BVu54yImfqf5kYVWumGM8WMcFuuwsE4GuSuRFSeatxXInJs6JBEg%3D%3D&Expires=1732766680"
          },
          "format": "mp4",
          ...
        },
        ...
      }
    }
  ]
}