Download URL Recording Media Data Schemas

Download URLs are populated once the relevant media object has transitioned to done status. For accessing media data during recording, you can use Real-Time Endpoints

Schema Timestamps

There are two types of timestamps you'll see in the schemas below:

  • relative - represents the time in seconds from the start of the recording (calculated from the latest in_call_recording bot status change event). For example, "relative": 9.73 means approximately 9.73 seconds after the recording began
  • absolute - represents the exact date and time this event occurred in ISO 8601 format. For example, "absolute": "2025-07-17T00:00:09.730066Z" shows the precise moment when something occurred

[JSON] Participant download URL data schema

[
  {
    "id": number, // Id of the participant in the meeting. This id is not unique across meetings.
    "name": string | null, // Display name of the participant.
    "is_host": boolean | null, // Whether the participant is the host of the meeting.
    "platform": string | null, // Meeting platform constant. values: "desktop", "dial-in", "unknown"
    "extra_data": json | null, // Extra data about the participant from the meeting platform.
    "email": string | null,  // Email, if participant identification is turned on
  }
]

[JSON] Participant event download URL data schema

[
  {
    "id": string, // Id of the participant event.
    "action": string, // The action that the participant took. values: "join" | "leave" | "update" | "speech_on" | "speech_off" | "webcam_on" | "webcam_off" | "screenshare_on" | "screenshare_off" | "chat_message"
    "participant": {
      "id": integer, // Id of the participant in the meeting. This id is not unique across meetings.
      "name": string | null, // Display name of the participant.
      "is_host": boolean | null, // Whether the participant is the host of the meeting.
      "platform": string | null, // Meeting platform constant
      "extra_data": json | null, // Extra data about the participant from the meeting platform.
      "email": string | null, // Email, if participant identification is turned on
    },
    "timestamp": {
      "absolute": string, // ISO 8601
      "relative": number, // seconds
    },
    "data": 
    	{
        "text": string, // The text of chat message
        "to": string, // The recipient of the chat message. values: "everyone" | "only_bot"
      } // populated if the action is a `chat_message`
    	| null
  }
]

[JSON] Speaker timeline download URL data schema

[
  {
    "participant": {
      "id": integer, // Id of the participant in the meeting. This id is not unique across meetings.
      "name": string | null, // Display name of the participant.
      "is_host": boolean | null, // Whether the participant is the host of the meeting.
      "platform": string | null, // Meeting platform constant
      "extra_data": json | null, // Extra data about the participant from the meeting platform.
      "email": string | null, // Email, if participant identification is turned on
    },
    "start_timestamp": {
      "absolute": string, // ISO 8601
      "relative": number, // seconds
    },
    "end_timestamp": {
      "absolute": string, // ISO 8601
      "relative": number, // seconds
    }
  }
]

[JSON] Transcript download URL data schema

[
  {
    "participant": {
      "id": number, // Id of the participant in the meeting. This id is not unique across meetings.
      "name": string | null, // Display name of the participant.
      "is_host": boolean | null, // Whether the participant is the host of the meeting.
      "platform": string | null, // Meeting platform constant
      "extra_data": json | null, // Extra data about the participant from the meeting platform.
      "email": string | null, // Email, if participant identification is turned on
    },
    "language_code": str, // The language code from the transcription provider, normalized to BCP-47.
                          // The simple code is .split('-')[0], and beware that some languages require
                          // 3-character codes (e.g. yue and haw)
    "words": [
      {
        "text": string, // The text of the word.
        "start_timestamp": {
          "absolute": string, // ISO 8601, will return null for async transcription
          "relative": number // seconds
        },
        "end_timestamp": {
          "absolute": string, // ISO 8601, will return null for async transcription
          "relative": number // seconds
        }
      }
    ]
  }
]

[JSON] Participant separate video download URL data schema

[
  {
    "id": string, // Id of the separate part
    "participant": {
      "id": integer, // Id of the participant in the meeting. This id is not unique across meetings.
      "name": string | null, // Display name of the participant.
      "is_host": boolean | null, // Whether the participant is the host of the meeting.
      "platform": string | null, // Meeting platform constant
      "extra_data": json | null, // Extra data about the participant from the meeting platform.
      "email": string | null, // Email, if participant identification is turned on
    },
    "start_timestamp": {
      "absolute": string, // ISO 8601
      "relative": number, // seconds
    },
    "duration": number, // seconds
    "type": "webcam" | "screenshare", // the type of video part
    "download_url": string, // URL to download the media file from
  }
]

[JSON] Participant Separate Audio Parts

[
  {
    "id": string, // Id of the separate part
    "participant": {
      "id": integer, // Id of the participant in the meeting. This id is not unique across meetings.
      "name": string | null, // Display name of the participant.
      "is_host": boolean | null, // Whether the participant is the host of the meeting.
      "platform": string | null, // Meeting platform constant
      "extra_data": json | null, // Extra data about the participant from the meeting platform.
      "email": string | null, // Email, if participant identification is turned on
    },
    "start_timestamp": {
      "absolute": string, // ISO 8601
      "relative": number, // seconds
    },
    "duration": number, // seconds
    "download_url": string, // URL to download the media file from
  }
]

[JSON] Transcript Provider Data Download URL

{
  "parts": [
    {
      "id": string,
      "created_at": string, // ISO 8601
      
      // context of audio which was the transcription source for this part
      "source_audio": {
        	"type": "mixed" | "separate",
          "offset": float, // seconds from recording start
        	"participant": {
            "id": integer, // Id of the participant in the meeting. This id is not unique across meetings.
            "name": string | null, // Display name of the participant.
            "is_host": boolean | null, // Whether the participant is the host of the meeting.
            "platform": string | null, // Meeting platform constant
            "extra_data": json | null, // Extra data about the participant from the meeting platform.
            "email": string | null, // Email, if participant identification is turned on
          } | null  // participant data (only available for type=separate)
      },
      
      // part type, dictates the structure of 'data' key
      "type": "webhook" | "http_response" | "websocket_message",
      "data": 
      	{ payload: object } | // type=webhook,
        { url: string, status_code: integer, body: object } | // type=http_response
        { url: string, event: string, payload: object }, // type=websocket_message
    }
  ]
}
🚧

Provider data is currently not available when using the assembly_ai_async_chunked Real-Time Transcription provider, or when using async transcriptions with Perfect Diarization