> For the complete documentation index, see [llms.txt](https://docs.maiagent.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.maiagent.ai/api/en/api-reference/hui-yi-ji-lu.md).

# Meeting Records

The meeting record endpoints let your system create meetings, import audio files for transcription, retrieve transcripts and summaries, and store transcripts in a knowledge base. Before importing an audio file, upload it using `POST /api/v1/upload-presigned-url/` (`modelName` is `meeting-record` and `fieldName` is `audio`), as described in [Attachments and Files](/api/en/api-reference/fu-jian-he-dang-an.md). For feature details, see [Meeting Records](https://docs.maiagent.ai/work/meeting-records) in the user manual.

### List Meeting Records <a href="#meeting-records-list" id="meeting-records-list"></a>

GET `/api/v1/meeting-records/`

#### Parameters

| Parameter Name | Required | Type    | Description                                                                                                                   |
| -------------- | -------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `endDate`      | ❌        |         |                                                                                                                               |
| `page`         | ❌        | integer | A page number within the paginated result set.                                                                                |
| `pageSize`     | ❌        | integer | Number of results to return per page.                                                                                         |
| `query`        | ❌        |         |                                                                                                                               |
| `startDate`    | ❌        |         |                                                                                                                               |
| `status`       | ❌        | string  | \`pending\`: Pending ; \`recording\`: Recording ; \`processing\`: Processing ; \`completed\`: Completed ; \`failed\`: Failed; |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# API call example (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/?endDate=example&page=1&pageSize=1&query=example&startDate=example&status=completed" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/?endDate=example&page=1&pageSize=1&query=example&startDate=example&status=completed", config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/?endDate=example&page=1&pageSize=1&query=example&startDate=example&status=completed"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/?endDate=example&page=1&pageSize=1&query=example&startDate=example&status=completed", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Structure**

```typescript
{
  "count": integer
  "next"?: string (uri) // Optional
  "previous"?: string (uri) // Optional
  "results": [
    {
      "id": string (uuid)
      "sttContext"?: string // Optional
      "sttContextLlmId"?: string (uuid) // Optional
      "liveTranscriptionResult": object
      "eventContext"?: object // Optional
      "meetingRecordSttProvider": 
      {
        "id": string (uuid)
        "name": string // Display name for this STT provider
        "provider": string (enum: whisperlive, azure, deepgram, assemblyai, bronci, alibaba, localai, openai, rap) // * `whisperlive` - Whisperlive
* `azure` - Azure
* `deepgram` - Deepgram
* `assemblyai` - Assemblyai
* `bronci` - Bronci
* `alibaba` - Alibaba
* `localai` - Localai
* `openai` - Openai
* `rap` - Rap
        "modelName": string
      }
      "offlineTranscriptProviderDetail": 
      {
        "id": string (uuid)
        "name": string // Display name for this provider
        "provider": string (enum: whisper_openai, whisper_groq, whisper_offline, localai, azure, bronci, alibaba, rap, deepgram, assemblyai) // * `whisper_openai` - whisper_openai
* `whisper_groq` - whisper_groq
* `whisper_offline` - whisper_offline
* `localai` - localai
* `azure` - azure
* `bronci` - bronci
* `alibaba` - alibaba
* `rap` - rap
* `deepgram` - deepgram
* `assemblyai` - assemblyai
        "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
      }
      "meetingRecordSttProviderId"?: string (uuid) // Optional
      "speakerDiarizationProvider": 
      {
        "id": string (uuid)
        "name": string // Display name for this provider
        "provider": string (enum: pyannoteai) // * `pyannoteai` - pyannoteai
        "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
      }
      "enableTranslation"?: boolean // Optional
      "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
        string
      ]
      "translationLlmId"?: string (uuid) // Optional
      "knowledgeBaseId"?: string (uuid) // Optional
      "audioUrl": string
      "transcriptUrl": string
      "mp3Url": string
      "backupAudioUrl": string
      "backupSyncStatus": string
      "backupUnavailableReason": string
      "backupError": object
      "backupDurationSeconds": number (double)
      "backupTotalParts": integer
      "backupTotalChunks": integer
      "backupRecordingStartedAt": string (timestamp)
      "backupLastActivityAt": string (timestamp)
      "backupFinalizedAt": string (timestamp)
      "knowledgeBase": object
      "transcriptFile": object
      "qaConfig": object // Generate qa_config for frontend to use with chatbot completion API.
      "availableChatbots": [ // Get chatbots that have this meeting's knowledge base (detail view only).
        object
      ]
      "createdBy": 
      {
        "id": string (uuid)
        "name": string
      }
      "members": [ // The meeting's access roster, visible to anyone who can see the meeting.

Editing (add/remove) is gated separately on the members endpoint; here the
list is read-only context so members can see who participated and who else
was granted view access.
        object
      ]
      "myRole": string // The requesting user's role on this meeting, or None if not a member.
      "createdAt": string (timestamp)
      "updatedAt": string (timestamp)
      "meetingName": string
      "participants"?: object // List of meeting participants (Optional)
      "durationSeconds"?: number (double) // Optional
      "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
      "stopRequestedAt": string (timestamp) // When a user explicitly requested to stop the recording. A finished recording without this set ended on the server side (e.g. the client connection was lost).
      "recordingLimitReachedAt": string (timestamp) // When LiveKit ended the egress at its maximum recording duration. The main audio file ends here; the STT agent and the browser backup keep going until the room closes, and the meeting completes on room end.
      "failureReason": // May have different types
      string (enum: egress_not_started, egress_failed, finalize_timeout) // Why the live recording ended as failed. Empty for meetings that did not fail.

* `` - None
* `egress_not_started` - Recording did not start
* `egress_failed` - Recording failed
* `finalize_timeout` - Recording was never finalized
      "clientSurface":  // Durable client entry point captured when recording starts. Legacy records remain unknown.

* `unknown` - Unknown
* `web` - Web
* `desktop` - Desktop
      {
      }
      "requestedSourceMode":  // Audio source mode requested by the client when recording starts.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
      {
      }
      "effectiveSourceMode":  // Server-resolved audio source mode used for runtime and billing reconciliation.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
      {
      }
      "sourceLanguages"?: object // Source languages for transcription (Optional)
      "speakerDiarizationConfig": object // Per-meeting non-secret speaker diarization hints, such as numSpeakers.
      "offlineAsrRequestOptions": object // Per-request ASR payload for the offline audio import, keyed by the selected provider row request_option_specs contract. EMPTY MEANS: no extra parameters.
      "audioProcessingSnapshot": object // Immutable audio processing policy snapshot frozen from the platform active profile at meeting start (via MeetingAudioProcessingProfile.to_snapshot). Downlinked to the LiveKit Agent with this meeting client/source facts and used to correlate per-track usage.
      "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
      "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
      "deletedAt"?: string (timestamp) // Optional
      "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
    }
  ]
}
```

**Example Response Values**

```json
{
  "count": 123,
  "next": "http://api.example.org/accounts/?page=4",
  "previous": "http://api.example.org/accounts/?page=2",
  "results": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "meeting_name": "Product Planning Meeting",
      "participants": [
        "Zhang San",
        "Li Si",
        "Wang Wu"
      ],
      "duration_seconds": 3600.5,
      "status": "completed",
      "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
      "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
      "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
      "source_languages": [
        "zh-TW"
      ],
      "enable_translation": true,
      "target_languages": [
        "en-US",
        "ja-JP"
      ],
      "meeting_record_stt_provider": {
        "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
        "provider": "deepgram",
        "model_name": "nova-2",
        "supported_languages": [
          "zh-TW",
          "en-US",
          "ja-JP"
        ],
        "config": {
          "punctuate": true,
          "diarize": true
        },
        "created_at": "2025-01-15T10:00:00Z",
        "updated_at": "2025-01-15T10:00:00Z"
      },
      "created_at": "2025-01-15T14:00:00Z",
      "updated_at": "2025-01-15T15:00:00Z"
    }
  ]
}
```

***

### Create a Meeting Record <a href="#meeting-records-create" id="meeting-records-create"></a>

POST `/api/v1/meeting-records/`

#### Request Body

**Request Parameters**

| Field                      | Type                                                             | Required | Description                                                                                                                              |
| -------------------------- | ---------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| sttContext                 | string                                                           | No       |                                                                                                                                          |
| sttContextLlmId            | string (uuid)                                                    | No       |                                                                                                                                          |
| eventContext               | object                                                           | No       |                                                                                                                                          |
| meetingRecordSttProviderId | string (uuid)                                                    | No       |                                                                                                                                          |
| enableTranslation          | boolean                                                          | No       |                                                                                                                                          |
| targetLanguages            | array\[string]                                                   | No       | Target language codes for live transcript translation.                                                                                   |
| translationLlmId           | string (uuid)                                                    | No       |                                                                                                                                          |
| knowledgeBaseId            | string (uuid)                                                    | No       |                                                                                                                                          |
| meetingName                | string                                                           | Yes      |                                                                                                                                          |
| participants               | object                                                           | No       | List of meeting participants                                                                                                             |
| durationSeconds            | number (double)                                                  | No       |                                                                                                                                          |
| status                     | string (enum: pending, recording, processing, completed, failed) | No       | `pending`: Pending ; `recording`: Recording ; `processing`: Processing ; `completed`: Completed ; `failed`: Failed;                      |
| sourceLanguages            | object                                                           | No       | Source languages for transcription                                                                                                       |
| translationInputTokens     | integer (int64)                                                  | No       | Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. |
| translationOutputTokens    | integer (int64)                                                  | No       | Cumulative LLM output tokens consumed by realtime translation.                                                                           |
| deletedAt                  | string (timestamp)                                               | No       |                                                                                                                                          |
| translationLlm             | string (uuid)                                                    | No       | LLM model to use for translation when enabled                                                                                            |

**Example Request Structure**

```typescript
{
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "eventContext"?: object // Optional
  "meetingRecordSttProviderId"?: string (uuid) // Optional
  "enableTranslation"?: boolean // Optional
  "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
    string
  ]
  "translationLlmId"?: string (uuid) // Optional
  "knowledgeBaseId"?: string (uuid) // Optional
  "meetingName": string
  "participants"?: object // List of meeting participants (Optional)
  "durationSeconds"?: number (double) // Optional
  "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
  "sourceLanguages"?: object // Source languages for transcription (Optional)
  "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
  "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
  "deletedAt"?: string (timestamp) // Optional
  "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
}
```

**Example Request Values**

```json
{
  "meeting_name": "Product Planning Meeting",
  "participants": [
    "Zhang San",
    "Li Si",
    "Wang Wu"
  ],
  "source_languages": [
    "zh-TW"
  ],
  "enable_translation": true,
  "target_languages": [
    "en-US",
    "ja-JP"
  ]
}
```

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# API call example (Shell)
curl -X POST "https://api.maiagent.ai/api/v1/meeting-records/" \
  -H "Authorization: Api-Key YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_name": "Product Planning Meeting",
    "participants": [
      "Zhang San",
      "Li Si",
      "Wang Wu"
    ],
    "source_languages": [
      "zh-TW"
    ],
    "enable_translation": true,
    "target_languages": [
      "en-US",
      "ja-JP"
    ]
  }'

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
};

// Request Body (payload)
const data = {
    "meeting_name": "Product Planning Meeting",
    "participants": [
      "Zhang San",
      "Li Si",
      "Wang Wu"
    ],
    "source_languages": [
      "zh-TW"
    ],
    "enable_translation": true,
    "target_languages": [
      "en-US",
      "ja-JP"
    ]
  };

axios.post("https://api.maiagent.ai/api/v1/meeting-records/", data, config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY",
    "Content-Type": "application/json"
}

# Request Body (payload)
data = {
    "meeting_name": "Product Planning Meeting",
    "participants": [
        "Zhang San",
        "Li Si",
        "Wang Wu"
    ],
    "source_languages": [
        "zh-TW"
    ],
    "enable_translation": True,
    "target_languages": [
        "en-US",
        "ja-JP"
    ]
}

response = requests.post(url, json=data, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->post("https://api.maiagent.ai/api/v1/meeting-records/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY',
            'Content-Type' => 'application/json'
        ],
        'json' => [
            'meeting_name' => 'Product Planning Meeting',
            'participants' => [
                'Zhang San',
                'Li Si',
                'Wang Wu'
            ],
            'source_languages' => [
                'zh-TW'
            ],
            'enable_translation' => true,
            'target_languages' => [
                'en-US',
                'ja-JP'
            ]
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 201**

**Example Response Structure**

```typescript
{
  "id": string (uuid)
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "liveTranscriptionResult": object
  "eventContext"?: object // Optional
  "meetingRecordSttProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this STT provider
    "provider": string (enum: whisperlive, azure, deepgram, assemblyai, bronci, alibaba, localai, openai, rap) // * `whisperlive` - Whisperlive
* `azure` - Azure
* `deepgram` - Deepgram
* `assemblyai` - Assemblyai
* `bronci` - Bronci
* `alibaba` - Alibaba
* `localai` - Localai
* `openai` - Openai
* `rap` - Rap
    "modelName": string
  }
  "offlineTranscriptProviderDetail": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: whisper_openai, whisper_groq, whisper_offline, localai, azure, bronci, alibaba, rap, deepgram, assemblyai) // * `whisper_openai` - whisper_openai
* `whisper_groq` - whisper_groq
* `whisper_offline` - whisper_offline
* `localai` - localai
* `azure` - azure
* `bronci` - bronci
* `alibaba` - alibaba
* `rap` - rap
* `deepgram` - deepgram
* `assemblyai` - assemblyai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "meetingRecordSttProviderId"?: string (uuid) // Optional
  "speakerDiarizationProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: pyannoteai) // * `pyannoteai` - pyannoteai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "enableTranslation"?: boolean // Optional
  "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
    string
  ]
  "translationLlmId"?: string (uuid) // Optional
  "knowledgeBaseId"?: string (uuid) // Optional
  "audioUrl": string
  "transcriptUrl": string
  "mp3Url": string
  "backupAudioUrl": string
  "backupSyncStatus": string
  "backupUnavailableReason": string
  "backupError": object
  "backupDurationSeconds": number (double)
  "backupTotalParts": integer
  "backupTotalChunks": integer
  "backupRecordingStartedAt": string (timestamp)
  "backupLastActivityAt": string (timestamp)
  "backupFinalizedAt": string (timestamp)
  "knowledgeBase": object
  "transcriptFile": object
  "qaConfig": object // Generate qa_config for frontend to use with chatbot completion API.
  "availableChatbots": [ // Get chatbots that have this meeting's knowledge base (detail view only).
    object
  ]
  "createdBy": 
  {
    "id": string (uuid)
    "name": string
  }
  "members": [ // The meeting's access roster, visible to anyone who can see the meeting.

Editing (add/remove) is gated separately on the members endpoint; here the
list is read-only context so members can see who participated and who else
was granted view access.
    object
  ]
  "myRole": string // The requesting user's role on this meeting, or None if not a member.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
  "meetingName": string
  "participants"?: object // List of meeting participants (Optional)
  "durationSeconds"?: number (double) // Optional
  "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
  "stopRequestedAt": string (timestamp) // When a user explicitly requested to stop the recording. A finished recording without this set ended on the server side (e.g. the client connection was lost).
  "recordingLimitReachedAt": string (timestamp) // When LiveKit ended the egress at its maximum recording duration. The main audio file ends here; the STT agent and the browser backup keep going until the room closes, and the meeting completes on room end.
  "failureReason": // May have different types
  string (enum: egress_not_started, egress_failed, finalize_timeout) // Why the live recording ended as failed. Empty for meetings that did not fail.

* `` - None
* `egress_not_started` - Recording did not start
* `egress_failed` - Recording failed
* `finalize_timeout` - Recording was never finalized
  "clientSurface":  // Durable client entry point captured when recording starts. Legacy records remain unknown.

* `unknown` - Unknown
* `web` - Web
* `desktop` - Desktop
  {
  }
  "requestedSourceMode":  // Audio source mode requested by the client when recording starts.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "effectiveSourceMode":  // Server-resolved audio source mode used for runtime and billing reconciliation.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "sourceLanguages"?: object // Source languages for transcription (Optional)
  "speakerDiarizationConfig": object // Per-meeting non-secret speaker diarization hints, such as numSpeakers.
  "offlineAsrRequestOptions": object // Per-request ASR payload for the offline audio import, keyed by the selected provider row request_option_specs contract. EMPTY MEANS: no extra parameters.
  "audioProcessingSnapshot": object // Immutable audio processing policy snapshot frozen from the platform active profile at meeting start (via MeetingAudioProcessingProfile.to_snapshot). Downlinked to the LiveKit Agent with this meeting client/source facts and used to correlate per-track usage.
  "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
  "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
  "deletedAt"?: string (timestamp) // Optional
  "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
}
```

**Example Response Values**

```json
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "meeting_name": "Product Planning Meeting",
  "participants": [
    "Zhang San",
    "Li Si",
    "Wang Wu"
  ],
  "duration_seconds": 3600.5,
  "status": "completed",
  "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
  "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
  "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
  "source_languages": [
    "zh-TW"
  ],
  "enable_translation": true,
  "target_languages": [
    "en-US",
    "ja-JP"
  ],
  "meeting_record_stt_provider": {
    "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "provider": "deepgram",
    "model_name": "nova-2",
    "supported_languages": [
      "zh-TW",
      "en-US",
      "ja-JP"
    ],
    "config": {
      "punctuate": true,
      "diarize": true
    },
    "created_at": "2025-01-15T10:00:00Z",
    "updated_at": "2025-01-15T10:00:00Z"
  },
  "created_at": "2025-01-15T14:00:00Z",
  "updated_at": "2025-01-15T15:00:00Z"
}
```

***

### Retrieve a Specific Meeting Record <a href="#meeting-records-retrieve" id="meeting-records-retrieve"></a>

GET `/api/v1/meeting-records/{id}/`

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# API Call Example (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/", config)
  .then(response => {
    console.log('Response retrieved successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response retrieved successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response retrieved successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Schema**

```typescript
{
  "id": string (uuid)
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "liveTranscriptionResult": object
  "eventContext"?: object // Optional
  "meetingRecordSttProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this STT provider
    "provider": string (enum: whisperlive, azure, deepgram, assemblyai, bronci, alibaba, localai, openai, rap) // * `whisperlive` - Whisperlive
* `azure` - Azure
* `deepgram` - Deepgram
* `assemblyai` - Assemblyai
* `bronci` - Bronci
* `alibaba` - Alibaba
* `localai` - Localai
* `openai` - Openai
* `rap` - Rap
    "modelName": string
  }
  "offlineTranscriptProviderDetail": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: whisper_openai, whisper_groq, whisper_offline, localai, azure, bronci, alibaba, rap, deepgram, assemblyai) // * `whisper_openai` - whisper_openai
* `whisper_groq` - whisper_groq
* `whisper_offline` - whisper_offline
* `localai` - localai
* `azure` - azure
* `bronci` - bronci
* `alibaba` - alibaba
* `rap` - rap
* `deepgram` - deepgram
* `assemblyai` - assemblyai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "meetingRecordSttProviderId"?: string (uuid) // Optional
  "speakerDiarizationProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: pyannoteai) // * `pyannoteai` - pyannoteai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "enableTranslation"?: boolean // Optional
  "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
    string
  ]
  "translationLlmId"?: string (uuid) // Optional
  "knowledgeBaseId"?: string (uuid) // Optional
  "audioUrl": string
  "transcriptUrl": string
  "mp3Url": string
  "backupAudioUrl": string
  "backupSyncStatus": string
  "backupUnavailableReason": string
  "backupError": object
  "backupDurationSeconds": number (double)
  "backupTotalParts": integer
  "backupTotalChunks": integer
  "backupRecordingStartedAt": string (timestamp)
  "backupLastActivityAt": string (timestamp)
  "backupFinalizedAt": string (timestamp)
  "knowledgeBase": object
  "transcriptFile": object
  "qaConfig": object // Generate qa_config for frontend to use with chatbot completion API.
  "availableChatbots": [ // Get chatbots that have this meeting's knowledge base (detail view only).
    object
  ]
  "createdBy": 
  {
    "id": string (uuid)
    "name": string
  }
  "members": [ // The meeting's access roster, visible to anyone who can see the meeting.

Editing (add/remove) is gated separately on the members endpoint; here the
list is read-only context so members can see who participated and who else
was granted view access.
    object
  ]
  "myRole": string // The requesting user's role on this meeting, or None if not a member.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
  "meetingName": string
  "participants"?: object // List of meeting participants (Optional)
  "durationSeconds"?: number (double) // Optional
  "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
  "stopRequestedAt": string (timestamp) // When a user explicitly requested to stop the recording. A finished recording without this set ended on the server side (e.g. the client connection was lost).
  "recordingLimitReachedAt": string (timestamp) // When LiveKit ended the egress at its maximum recording duration. The main audio file ends here; the STT agent and the browser backup keep going until the room closes, and the meeting completes on room end.
  "failureReason": // May have different types
  string (enum: egress_not_started, egress_failed, finalize_timeout) // Why the live recording ended as failed. Empty for meetings that did not fail.

* `` - None
* `egress_not_started` - Recording did not start
* `egress_failed` - Recording failed
* `finalize_timeout` - Recording was never finalized
  "clientSurface":  // Durable client entry point captured when recording starts. Legacy records remain unknown.

* `unknown` - Unknown
* `web` - Web
* `desktop` - Desktop
  {
  }
  "requestedSourceMode":  // Audio source mode requested by the client when recording starts.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "effectiveSourceMode":  // Server-resolved audio source mode used for runtime and billing reconciliation.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "sourceLanguages"?: object // Source languages for transcription (Optional)
  "speakerDiarizationConfig": object // Per-meeting non-secret speaker diarization hints, such as numSpeakers.
  "offlineAsrRequestOptions": object // Per-request ASR payload for the offline audio import, keyed by the selected provider row request_option_specs contract. EMPTY MEANS: no extra parameters.
  "audioProcessingSnapshot": object // Immutable audio processing policy snapshot frozen from the platform active profile at meeting start (via MeetingAudioProcessingProfile.to_snapshot). Downlinked to the LiveKit Agent with this meeting client/source facts and used to correlate per-track usage.
  "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
  "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
  "deletedAt"?: string (timestamp) // Optional
  "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
}
```

**Example Response Values**

```json
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "meeting_name": "Product Planning Meeting",
  "participants": [
    "Zhang San",
    "Li Si",
    "Wang Wu"
  ],
  "duration_seconds": 3600.5,
  "status": "completed",
  "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
  "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
  "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
  "source_languages": [
    "zh-TW"
  ],
  "enable_translation": true,
  "target_languages": [
    "en-US",
    "ja-JP"
  ],
  "meeting_record_stt_provider": {
    "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "provider": "deepgram",
    "model_name": "nova-2",
    "supported_languages": [
      "zh-TW",
      "en-US",
      "ja-JP"
    ],
    "config": {
      "punctuate": true,
      "diarize": true
    },
    "created_at": "2025-01-15T10:00:00Z",
    "updated_at": "2025-01-15T10:00:00Z"
  },
  "created_at": "2025-01-15T14:00:00Z",
  "updated_at": "2025-01-15T15:00:00Z"
}
```

***

### Partially Update a Meeting Record <a href="#meeting-records-partial-update" id="meeting-records-partial-update"></a>

PATCH `/api/v1/meeting-records/{id}/`

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Request Body

**Request Parameters**

| Field                      | Type                                                             | Required | Description                                                                                                                              |
| -------------------------- | ---------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| sttContext                 | string                                                           | No       |                                                                                                                                          |
| sttContextLlmId            | string (uuid)                                                    | No       |                                                                                                                                          |
| eventContext               | object                                                           | No       |                                                                                                                                          |
| meetingRecordSttProviderId | string (uuid)                                                    | No       |                                                                                                                                          |
| enableTranslation          | boolean                                                          | No       |                                                                                                                                          |
| targetLanguages            | array\[string]                                                   | No       | Target language codes for live transcript translation.                                                                                   |
| translationLlmId           | string (uuid)                                                    | No       |                                                                                                                                          |
| knowledgeBaseId            | string (uuid)                                                    | No       |                                                                                                                                          |
| meetingName                | string                                                           | No       |                                                                                                                                          |
| participants               | object                                                           | No       | List of meeting participants                                                                                                             |
| durationSeconds            | number (double)                                                  | No       |                                                                                                                                          |
| status                     | string (enum: pending, recording, processing, completed, failed) | No       | `pending`: Pending ; `recording`: Recording ; `processing`: Processing ; `completed`: Completed ; `failed`: Failed;                      |
| sourceLanguages            | object                                                           | No       | Source languages for transcription                                                                                                       |
| translationInputTokens     | integer (int64)                                                  | No       | Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. |
| translationOutputTokens    | integer (int64)                                                  | No       | Cumulative LLM output tokens consumed by realtime translation.                                                                           |
| deletedAt                  | string (timestamp)                                               | No       |                                                                                                                                          |
| translationLlm             | string (uuid)                                                    | No       | LLM model to use for translation when enabled                                                                                            |

**Example Request Schema**

```typescript
{
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "eventContext"?: object // Optional
  "meetingRecordSttProviderId"?: string (uuid) // Optional
  "enableTranslation"?: boolean // Optional
  "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
    string
  ]
  "translationLlmId"?: string (uuid) // Optional
  "knowledgeBaseId"?: string (uuid) // Optional
  "meetingName"?: string // Optional
  "participants"?: object // List of meeting participants (Optional)
  "durationSeconds"?: number (double) // Optional
  "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
  "sourceLanguages"?: object // Source languages for transcription (Optional)
  "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
  "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
  "deletedAt"?: string (timestamp) // Optional
  "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
}
```

**Example Request Values**

```json
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "meeting_name": "Product Planning Meeting",
  "participants": [
    "Zhang San",
    "Li Si",
    "Wang Wu"
  ],
  "duration_seconds": 3600.5,
  "status": "completed",
  "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
  "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
  "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
  "source_languages": [
    "zh-TW"
  ],
  "enable_translation": true,
  "target_languages": [
    "en-US",
    "ja-JP"
  ],
  "meeting_record_stt_provider": {
    "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "provider": "deepgram",
    "model_name": "nova-2",
    "supported_languages": [
      "zh-TW",
      "en-US",
      "ja-JP"
    ],
    "config": {
      "punctuate": true,
      "diarize": true
    },
    "created_at": "2025-01-15T10:00:00Z",
    "updated_at": "2025-01-15T10:00:00Z"
  },
  "created_at": "2025-01-15T14:00:00Z",
  "updated_at": "2025-01-15T15:00:00Z"
}
```

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# API Call Example (Shell)
curl -X PATCH "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/" \
  -H "Authorization: Api-Key YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "meeting_name": "Product Planning Meeting",
    "participants": [
      "Zhang San",
      "Li Si",
      "Wang Wu"
    ],
    "duration_seconds": 3600.5,
    "status": "completed",
    "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
    "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
    "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
    "source_languages": [
      "zh-TW"
    ],
    "enable_translation": true,
    "target_languages": [
      "en-US",
      "ja-JP"
    ],
    "meeting_record_stt_provider": {
      "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
      "provider": "deepgram",
      "model_name": "nova-2",
      "supported_languages": [
        "zh-TW",
        "en-US",
        "ja-JP"
      ],
      "config": {
        "punctuate": true,
        "diarize": true
      },
      "created_at": "2025-01-15T10:00:00Z",
      "updated_at": "2025-01-15T10:00:00Z"
    },
    "created_at": "2025-01-15T14:00:00Z",
    "updated_at": "2025-01-15T15:00:00Z"
  }'

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
};

// Request body (payload)
const data = {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "meeting_name": "Product Planning Meeting",
    "participants": [
      "Zhang San",
      "Li Si",
      "Wang Wu"
    ],
    "duration_seconds": 3600.5,
    "status": "completed",
    "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
    "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
    "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
    "source_languages": [
      "zh-TW"
    ],
    "enable_translation": true,
    "target_languages": [
      "en-US",
      "ja-JP"
    ],
    "meeting_record_stt_provider": {
      "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
      "provider": "deepgram",
      "model_name": "nova-2",
      "supported_languages": [
        "zh-TW",
        "en-US",
        "ja-JP"
      ],
      "config": {
        "punctuate": true,
        "diarize": true
      },
      "created_at": "2025-01-15T10:00:00Z",
      "updated_at": "2025-01-15T10:00:00Z"
    },
    "created_at": "2025-01-15T14:00:00Z",
    "updated_at": "2025-01-15T15:00:00Z"
  };

axios.patch("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/", data, config)
  .then(response => {
    console.log('Response retrieved successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY",
    "Content-Type": "application/json"
}

# Request body (payload)
data = {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "meeting_name": "Product Planning Meeting",
    "participants": [
        "Zhang San",
        "Li Si",
        "Wang Wu"
    ],
    "duration_seconds": 3600.5,
    "status": "completed",
    "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
    "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
    "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
    "source_languages": [
        "zh-TW"
    ],
    "enable_translation": True,
    "target_languages": [
        "en-US",
        "ja-JP"
    ],
    "meeting_record_stt_provider": {
        "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
        "provider": "deepgram",
        "model_name": "nova-2",
        "supported_languages": [
            "zh-TW",
            "en-US",
            "ja-JP"
        ],
        "config": {
            "punctuate": True,
            "diarize": True
        },
        "created_at": "2025-01-15T10:00:00Z",
        "updated_at": "2025-01-15T10:00:00Z"
    },
    "created_at": "2025-01-15T14:00:00Z",
    "updated_at": "2025-01-15T15:00:00Z"
}

response = requests.patch(url, json=data, headers=headers)
try:
    print("Response retrieved successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->patch("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY',
            'Content-Type' => 'application/json'
        ],
        'json' => [
            'id' => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
            'meeting_name' => 'Product Planning Meeting',
            'participants' => [
                'Zhang San',
                'Li Si',
                'Wang Wu'
            ],
            'duration_seconds' => 3600.5,
            'status' => 'completed',
            'audio_url' => 'https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg',
            'transcript_url' => 'https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json',
            'mp3_url' => 'https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3',
            'source_languages' => [
                'zh-TW'
            ],
            'enable_translation' => true,
            'target_languages' => [
                'en-US',
                'ja-JP'
            ],
            'meeting_record_stt_provider' => [
                'id' => 'c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f',
                'provider' => 'deepgram',
                'model_name' => 'nova-2',
                'supported_languages' => [
                    'zh-TW',
                    'en-US',
                    'ja-JP'
                ],
                'config' => [
                    'punctuate' => true,
                    'diarize' => true
                ],
                'created_at' => '2025-01-15T10:00:00Z',
                'updated_at' => '2025-01-15T10:00:00Z'
            ],
            'created_at' => '2025-01-15T14:00:00Z',
            'updated_at' => '2025-01-15T15:00:00Z'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response retrieved successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Response Schema Example**

```typescript
{
  "id": string (uuid)
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "liveTranscriptionResult": object
  "eventContext"?: object // Optional
  "meetingRecordSttProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this STT provider
    "provider": string (enum: whisperlive, azure, deepgram, assemblyai, bronci, alibaba, localai, openai, rap) // * `whisperlive` - Whisperlive
* `azure` - Azure
* `deepgram` - Deepgram
* `assemblyai` - Assemblyai
* `bronci` - Bronci
* `alibaba` - Alibaba
* `localai` - Localai
* `openai` - Openai
* `rap` - Rap
    "modelName": string
  }
  "offlineTranscriptProviderDetail": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: whisper_openai, whisper_groq, whisper_offline, localai, azure, bronci, alibaba, rap, deepgram, assemblyai) // * `whisper_openai` - whisper_openai
* `whisper_groq` - whisper_groq
* `whisper_offline` - whisper_offline
* `localai` - localai
* `azure` - azure
* `bronci` - bronci
* `alibaba` - alibaba
* `rap` - rap
* `deepgram` - deepgram
* `assemblyai` - assemblyai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "meetingRecordSttProviderId"?: string (uuid) // Optional
  "speakerDiarizationProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: pyannoteai) // * `pyannoteai` - pyannoteai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "enableTranslation"?: boolean // Optional
  "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
    string
  ]
  "translationLlmId"?: string (uuid) // Optional
  "knowledgeBaseId"?: string (uuid) // Optional
  "audioUrl": string
  "transcriptUrl": string
  "mp3Url": string
  "backupAudioUrl": string
  "backupSyncStatus": string
  "backupUnavailableReason": string
  "backupError": object
  "backupDurationSeconds": number (double)
  "backupTotalParts": integer
  "backupTotalChunks": integer
  "backupRecordingStartedAt": string (timestamp)
  "backupLastActivityAt": string (timestamp)
  "backupFinalizedAt": string (timestamp)
  "knowledgeBase": object
  "transcriptFile": object
  "qaConfig": object // Generate qa_config for frontend to use with chatbot completion API.
  "availableChatbots": [ // Get chatbots that have this meeting's knowledge base (detail view only).
    object
  ]
  "createdBy": 
  {
    "id": string (uuid)
    "name": string
  }
  "members": [ // The meeting's access roster, visible to anyone who can see the meeting.

Editing (add/remove) is gated separately on the members endpoint; here the
list is read-only context so members can see who participated and who else
was granted view access.
    object
  ]
  "myRole": string // The requesting user's role on this meeting, or None if not a member.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
  "meetingName": string
  "participants"?: object // List of meeting participants (Optional)
  "durationSeconds"?: number (double) // Optional
  "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
  "stopRequestedAt": string (timestamp) // When a user explicitly requested to stop the recording. A finished recording without this set ended on the server side (e.g. the client connection was lost).
  "recordingLimitReachedAt": string (timestamp) // When LiveKit ended the egress at its maximum recording duration. The main audio file ends here; the STT agent and the browser backup keep going until the room closes, and the meeting completes on room end.
  "failureReason": // May have different types
  string (enum: egress_not_started, egress_failed, finalize_timeout) // Why the live recording ended as failed. Empty for meetings that did not fail.

* `` - None
* `egress_not_started` - Recording did not start
* `egress_failed` - Recording failed
* `finalize_timeout` - Recording was never finalized
  "clientSurface":  // Durable client entry point captured when recording starts. Legacy records remain unknown.

* `unknown` - Unknown
* `web` - Web
* `desktop` - Desktop
  {
  }
  "requestedSourceMode":  // Audio source mode requested by the client when recording starts.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "effectiveSourceMode":  // Server-resolved audio source mode used for runtime and billing reconciliation.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "sourceLanguages"?: object // Source languages for transcription (Optional)
  "speakerDiarizationConfig": object // Per-meeting non-secret speaker diarization hints, such as numSpeakers.
  "offlineAsrRequestOptions": object // Per-request ASR payload for the offline audio import, keyed by the selected provider row request_option_specs contract. EMPTY MEANS: no extra parameters.
  "audioProcessingSnapshot": object // Immutable audio processing policy snapshot frozen from the platform active profile at meeting start (via MeetingAudioProcessingProfile.to_snapshot). Downlinked to the LiveKit Agent with this meeting client/source facts and used to correlate per-track usage.
  "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
  "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
  "deletedAt"?: string (timestamp) // Optional
  "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
}
```

**Example Response Values**

```json
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "meeting_name": "Product Planning Meeting",
  "participants": [
    "Zhang San",
    "Li Si",
    "Wang Wu"
  ],
  "duration_seconds": 3600.5,
  "status": "completed",
  "audio_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890.ogg",
  "transcript_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4_transcript.json",
  "mp3_url": "https://cdn.example.com/media/meeting-record/a1b2c3d4-e5f6-7890-abcd-ef1234567890_mp3.mp3",
  "source_languages": [
    "zh-TW"
  ],
  "enable_translation": true,
  "target_languages": [
    "en-US",
    "ja-JP"
  ],
  "meeting_record_stt_provider": {
    "id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "provider": "deepgram",
    "model_name": "nova-2",
    "supported_languages": [
      "zh-TW",
      "en-US",
      "ja-JP"
    ],
    "config": {
      "punctuate": true,
      "diarize": true
    },
    "created_at": "2025-01-15T10:00:00Z",
    "updated_at": "2025-01-15T10:00:00Z"
  },
  "created_at": "2025-01-15T14:00:00Z",
  "updated_at": "2025-01-15T15:00:00Z"
}
```

***

### Delete Meeting Record <a href="#meeting-records-destroy" id="meeting-records-destroy"></a>

DELETE `/api/v1/meeting-records/{id}/`

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# API call example (Shell)
curl -X DELETE "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

// Request Body (payload)
const data = null;

axios.delete("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/", data, config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.delete(url, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->delete("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

| Status Code | Description      |
| ----------- | ---------------- |
| 204         | No response body |

***

### Import an Audio File and Start Transcription <a href="#meeting-records-import-audio-create" id="meeting-records-import-audio-create"></a>

POST `/api/v1/meeting-records/import-audio/`

{% hint style="info" %}
Transcribe an uploaded audio file asynchronously; check transcription progress in the meeting record’s status field.
{% endhint %}

#### Request Body

**Request Parameters**

| Field                       | Type          | Required | Description                                                                                                                                                                                                   |
| --------------------------- | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sttContext                  | string        | No       |                                                                                                                                                                                                               |
| sttContextLlmId             | string (uuid) | No       |                                                                                                                                                                                                               |
| offlineTranscriptProviderId | string (uuid) | Yes      |                                                                                                                                                                                                               |
| asrOptions                  | object        | No       | Nested ASR selection shared by every ASR entry point: languages (at least one), provider payload keys governed by the provider row request\_option\_specs contract, and the diarization selection (source ... |
| meetingName                 | string        | Yes      |                                                                                                                                                                                                               |
| audioFilePath               | string        | Yes      |                                                                                                                                                                                                               |
| clientSurface               | object        | No       | Client uploading the audio. Omitting it stays unknown instead of claiming web. `unknown`: Unknown ; `web`: Web ; `desktop`: Desktop;                                                                          |

**Example Request Schema**

```typescript
{
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "offlineTranscriptProviderId": string (uuid)
  "asrOptions"?: object // Nested ASR selection shared by every ASR entry point: languages (at least one), provider payload keys governed by the provider row request_option_specs contract, and the diarization selection (source / provider_id / options). (Optional)
  "meetingName": string
  "audioFilePath": string
  "clientSurface"?:  // Client uploading the audio. Omitting it stays unknown instead of claiming web.

* `unknown` - Unknown
* `web` - Web
* `desktop` - Desktop (Optional)
  {
  }
}
```

**Example Request Values**

```json
{
  "meeting_name": "Customer interview recording",
  "audio_file_path": "media/chatbot-file/2026/06/customer-interview.m4a",
  "offline_transcript_provider_id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
  "asr_options": {
    "languages": [
      "zh-TW"
    ],
    "diarization": {
      "source": "model",
      "provider_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    }
  }
}
```

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# API Call Example (Shell)
curl -X POST "https://api.maiagent.ai/api/v1/meeting-records/import-audio/" \
  -H "Authorization: Api-Key YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_name": "Customer interview recording",
    "audio_file_path": "media/chatbot-file/2026/06/customer-interview.m4a",
    "offline_transcript_provider_id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "asr_options": {
      "languages": [
        "zh-TW"
      ],
      "diarization": {
        "source": "model",
        "provider_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
      }
    }
  }'

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set Request Headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
};

// Request Body (payload)
const data = {
    "meeting_name": "Customer interview recording",
    "audio_file_path": "media/chatbot-file/2026/06/customer-interview.m4a",
    "offline_transcript_provider_id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "asr_options": {
      "languages": [
        "zh-TW"
      ],
      "diarization": {
        "source": "model",
        "provider_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
      }
    }
  };

axios.post("https://api.maiagent.ai/api/v1/meeting-records/import-audio/", data, config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request failed:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/import-audio/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY",
    "Content-Type": "application/json"
}

# Request Body (payload)
data = {
    "meeting_name": "Customer interview recording",
    "audio_file_path": "media/chatbot-file/2026/06/customer-interview.m4a",
    "offline_transcript_provider_id": "c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f",
    "asr_options": {
        "languages": [
            "zh-TW"
        ],
        "diarization": {
            "source": "model",
            "provider_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
        }
    }
}

response = requests.post(url, json=data, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request failed:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->post("https://api.maiagent.ai/api/v1/meeting-records/import-audio/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY',
            'Content-Type' => 'application/json'
        ],
        'json' => [
            'meeting_name' => 'Customer interview recording',
            'audio_file_path' => 'media/chatbot-file/2026/06/customer-interview.m4a',
            'offline_transcript_provider_id' => 'c8dc9f8a-2b5e-4a2d-8f93-1a2b3c4d5e6f',
            'asr_options' => [
                'languages' => [
                    'zh-TW'
                ],
                'diarization' => [
                    'source' => 'model',
                    'provider_id' => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'
                ]
            ]
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request failed: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 202**

**Example Response Schema**

```typescript
{
  "id": string (uuid)
  "sttContext"?: string // Optional
  "sttContextLlmId"?: string (uuid) // Optional
  "liveTranscriptionResult": object
  "eventContext"?: object // Optional
  "meetingRecordSttProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this STT provider
    "provider": string (enum: whisperlive, azure, deepgram, assemblyai, bronci, alibaba, localai, openai, rap) // * `whisperlive` - Whisperlive
* `azure` - Azure
* `deepgram` - Deepgram
* `assemblyai` - Assemblyai
* `bronci` - Bronci
* `alibaba` - Alibaba
* `localai` - Localai
* `openai` - Openai
* `rap` - Rap
    "modelName": string
  }
  "offlineTranscriptProviderDetail": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: whisper_openai, whisper_groq, whisper_offline, localai, azure, bronci, alibaba, rap, deepgram, assemblyai) // * `whisper_openai` - whisper_openai
* `whisper_groq` - whisper_groq
* `whisper_offline` - whisper_offline
* `localai` - localai
* `azure` - azure
* `bronci` - bronci
* `alibaba` - alibaba
* `rap` - rap
* `deepgram` - deepgram
* `assemblyai` - assemblyai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "meetingRecordSttProviderId"?: string (uuid) // Optional
  "speakerDiarizationProvider": 
  {
    "id": string (uuid)
    "name": string // Display name for this provider
    "provider": string (enum: pyannoteai) // * `pyannoteai` - pyannoteai
    "modelName": string // Free-form vendor model identifier; any string the vendor deployment accepts is valid.
  }
  "enableTranslation"?: boolean // Optional
  "targetLanguages"?: [ // Target language codes for live transcript translation. (Optional)
    string
  ]
  "translationLlmId"?: string (uuid) // Optional
  "knowledgeBaseId"?: string (uuid) // Optional
  "audioUrl": string
  "transcriptUrl": string
  "mp3Url": string
  "backupAudioUrl": string
  "backupSyncStatus": string
  "backupUnavailableReason": string
  "backupError": object
  "backupDurationSeconds": number (double)
  "backupTotalParts": integer
  "backupTotalChunks": integer
  "backupRecordingStartedAt": string (timestamp)
  "backupLastActivityAt": string (timestamp)
  "backupFinalizedAt": string (timestamp)
  "knowledgeBase": object
  "transcriptFile": object
  "qaConfig": object // Generate qa_config for frontend to use with chatbot completion API.
  "availableChatbots": [ // Get chatbots that have this meeting's knowledge base (detail view only).
    object
  ]
  "createdBy": 
  {
    "id": string (uuid)
    "name": string
  }
  "members": [ // The meeting's access roster, visible to anyone who can see the meeting.

Editing (add/remove) is gated separately on the members endpoint; here the
list is read-only context so members can see who participated and who else
was granted view access.
    object
  ]
  "myRole": string // The requesting user's role on this meeting, or None if not a member.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
  "meetingName": string
  "participants"?: object // List of meeting participants (Optional)
  "durationSeconds"?: number (double) // Optional
  "status"?: string (enum: pending, recording, processing, completed, failed) // * `pending` - Pending
* `recording` - Recording
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed (Optional)
  "stopRequestedAt": string (timestamp) // When a user explicitly requested to stop the recording. A finished recording without this set ended on the server side (e.g. the client connection was lost).
  "recordingLimitReachedAt": string (timestamp) // When LiveKit ended the egress at its maximum recording duration. The main audio file ends here; the STT agent and the browser backup keep going until the room closes, and the meeting completes on room end.
  "failureReason": // May have different types
  string (enum: egress_not_started, egress_failed, finalize_timeout) // Why the live recording ended as failed. Empty for meetings that did not fail.

* `` - None
* `egress_not_started` - Recording did not start
* `egress_failed` - Recording failed
* `finalize_timeout` - Recording was never finalized
  "clientSurface":  // Durable client entry point captured when recording starts. Legacy records remain unknown.

* `unknown` - Unknown
* `web` - Web
* `desktop` - Desktop
  {
  }
  "requestedSourceMode":  // Audio source mode requested by the client when recording starts.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "effectiveSourceMode":  // Server-resolved audio source mode used for runtime and billing reconciliation.

* `unknown` - Unknown
* `microphone` - Microphone
* `system_audio` - System Audio
* `both` - Microphone and System Audio
  {
  }
  "sourceLanguages"?: object // Source languages for transcription (Optional)
  "speakerDiarizationConfig": object // Per-meeting non-secret speaker diarization hints, such as numSpeakers.
  "offlineAsrRequestOptions": object // Per-request ASR payload for the offline audio import, keyed by the selected provider row request_option_specs contract. EMPTY MEANS: no extra parameters.
  "audioProcessingSnapshot": object // Immutable audio processing policy snapshot frozen from the platform active profile at meeting start (via MeetingAudioProcessingProfile.to_snapshot). Downlinked to the LiveKit Agent with this meeting client/source facts and used to correlate per-track usage.
  "translationInputTokens"?: integer (int64) // Cumulative LLM input tokens consumed by realtime translation. Atomically incremented per translate() call; settled at egress completion. (Optional)
  "translationOutputTokens"?: integer (int64) // Cumulative LLM output tokens consumed by realtime translation. (Optional)
  "deletedAt"?: string (timestamp) // Optional
  "translationLlm"?: string (uuid) // LLM model to use for translation when enabled (Optional)
}
```

**Example Response Values**

```json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "sttContext": "Response string",
  "sttContextLlmId": "550e8400-e29b-41d4-a716-446655440000",
  "liveTranscriptionResult": null,
  "eventContext": null,
  "meetingRecordSttProvider": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Response string",
    "provider": "whisperlive",
    "modelName": "Response string"
  },
  "offlineTranscriptProviderDetail": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Response string",
    "provider": "whisper_openai",
    "modelName": "Response string"
  },
  "meetingRecordSttProviderId": "550e8400-e29b-41d4-a716-446655440000",
  "speakerDiarizationProvider": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Response string",
    "provider": "pyannoteai",
    "modelName": "Response string"
  },
  "enableTranslation": false,
  "targetLanguages": [
    "Response string"
  ],
  "translationLlmId": "550e8400-e29b-41d4-a716-446655440000",
  "knowledgeBaseId": "550e8400-e29b-41d4-a716-446655440000",
  "audioUrl": "Response string",
  "transcriptUrl": "Response string",
  "mp3Url": "Response string",
  "backupAudioUrl": "Response string",
  "backupSyncStatus": "Response string",
  "backupUnavailableReason": "Response string",
  "backupError": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Example Response Name",
    "description": "Example Response Description"
  },
  "backupDurationSeconds": 456,
  "backupTotalParts": 456,
  "backupTotalChunks": 456,
  "backupRecordingStartedAt": "Response string",
  "backupLastActivityAt": "Response string",
  "backupFinalizedAt": "Response string",
  "knowledgeBase": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Example Response Name",
    "description": "Example Response Description"
  },
  "transcriptFile": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Example Response Name",
    "description": "Example Response Description"
  },
  "qaConfig": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Example Response Name",
    "description": "Example Response Description"
  },
  "availableChatbots": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Example Response Name",
      "description": "Example Response Description"
    }
  ],
  "createdBy": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Response string"
  },
  "members": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Example Response Name",
      "description": "Example Response Description"
    }
  ],
  "myRole": "Response string",
  "createdAt": "Response string",
  "updatedAt": "Response string",
  "meetingName": "Response string",
  "participants": null,
  "durationSeconds": 456,
  "status": "pending",
  "stopRequestedAt": "Response string",
  "recordingLimitReachedAt": "Response string",
  "failureReason": "egress_not_started",
  "clientSurface": {},
  "requestedSourceMode": {},
  "effectiveSourceMode": {},
  "sourceLanguages": null,
  "speakerDiarizationConfig": null,
  "offlineAsrRequestOptions": null,
  "audioProcessingSnapshot": null,
  "translationInputTokens": 456,
  "translationOutputTokens": 456,
  "deletedAt": "Response string",
  "translationLlm": "550e8400-e29b-41d4-a716-446655440000"
}
```

***

### Retrieve the Meeting Transcript (JSON) <a href="#meeting-records-transcript-retrieve" id="meeting-records-transcript-retrieve"></a>

GET `/api/v1/meeting-records/{id}/transcript/`

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API Call (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/transcript/" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/transcript/", config)
  .then(response => {
    console.log('Response retrieved successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/transcript/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response retrieved successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/transcript/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response retrieved successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Schema**

```typescript
object
```

**Example Response Values**

```json
[
  {
    "id": "9f4a0a46-1c67-45fc-b2d0-35b0f2bb5a2e",
    "type": "final",
    "text": "Let’s first confirm the meeting summary workflow today.",
    "startTime": 0,
    "endTime": 2.5,
    "language": "zh-TW"
  }
]
```

**Status Code: 400 - No response body**

***

### List Meeting Summaries <a href="#meeting-records-summaries-list" id="meeting-records-summaries-list"></a>

GET `/api/v1/meeting-records/{meetingRecordPk}/summaries/`

#### Parameters

| Parameter Name    | Required | Type    | Description                                    |
| ----------------- | -------- | ------- | ---------------------------------------------- |
| `meetingRecordPk` | ✅        | string  |                                                |
| `page`            | ❌        | integer | A page number within the paginated result set. |
| `pageSize`        | ❌        | integer | Number of results to return per page.          |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API Call (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/?page=1&pageSize=1" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/?page=1&pageSize=1", config)
  .then(response => {
    console.log('Response retrieved successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/?page=1&pageSize=1"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response retrieved successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/?page=1&pageSize=1", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response retrieved successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Schema**

```typescript
{
  "count": integer
  "next"?: string (uri) // Optional
  "previous"?: string (uri) // Optional
  "results": [
    {
      "id": string (uuid)
      "content"?: string // Summary content; empty while a background generation is in progress. (Optional)
      "status":  // Manual create/edit rows stay completed; background generations walk from pending to processing.

* `pending` - Pending
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed
      {
      }
      "failureReason": string // Why the last save/generation failed, for both AI-generated and manually-edited summaries.
      "completedSegments": integer
      "totalSegments": integer
      "transcriptOptimization": string (uuid) // Which re-transcribed pass this summary was generated from. Null means the meeting's own realtime transcript, which is the only other source a summary can have.
      "createdAt": string (timestamp)
      "updatedAt": string (timestamp)
    }
  ]
}
```

**Example Response Values**

```json
{
  "count": 123,
  "next": "http://api.example.org/accounts/?page=4",
  "previous": "http://api.example.org/accounts/?page=2",
  "results": [
    {
      "id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
      "content": "This meeting focused on product development progress, and the team confirmed the milestone goals for next week...",
      "created_at": "2025-01-15T14:30:00Z",
      "updated_at": "2025-01-15T14:30:00Z"
    }
  ]
}
```

***

### Generate a Meeting Summary <a href="#meeting-records-summaries-generate-create" id="meeting-records-summaries-generate-create"></a>

POST `/api/v1/meeting-records/{meetingRecordPk}/summaries/generate/`

#### Parameters

| Parameter Name    | Required | Type   | Description |
| ----------------- | -------- | ------ | ----------- |
| `meetingRecordPk` | ✅        | string |             |

#### Request Body

**Request Parameters**

| Field                    | Type           | Required | Description                                                                                                                                                                                              |
| ------------------------ | -------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| transcriptOptimizationId | string (uuid)  | No       | Optional re-transcribed pass to summarize, from GET /meeting-records/{id}/transcript-optimizations/; it must be completed and belong to this meeting. Omit it to summarize the meeting's own transcript. |
| chatbotId                | string (uuid)  | No       | Optional summary agent; when set, the agent generates the summary itself, reading the transcript through the transcript-reading tool.                                                                    |
| largeLanguageModelId     | string (uuid)  | No       | Optional LLM override for the base (no-agent) mode; mutually exclusive with chatbot\_id, whose agent always uses its own configured model.                                                               |
| knowledgeBaseIds         | array\[string] | No       | Optional RBAC-filtered knowledge base ids for the base (no-agent) mode; mutually exclusive with chatbot\_id, whose agent always uses its own configured knowledge bases.                                 |
| customInstructions       | string         | No       | Optional extra instructions appended to the built-in summary prompt.                                                                                                                                     |
| clientPlatform           | object         | No       | Client platform triggering this generation; stamped on the summary conversation. `web`: Web ; `desktop`: Desktop;                                                                                        |

**Example Request Schema**

```typescript
{
  "transcriptOptimizationId"?: string (uuid) // Optional re-transcribed pass to summarize, from GET /meeting-records/{id}/transcript-optimizations/; it must be completed and belong to this meeting. Omit it to summarize the meeting's own transcript. (Optional)
  "chatbotId"?: string (uuid) // Optional summary agent; when set, the agent generates the summary itself, reading the transcript through the transcript-reading tool. (Optional)
  "largeLanguageModelId"?: string (uuid) // Optional LLM override for the base (no-agent) mode; mutually exclusive with chatbot_id, whose agent always uses its own configured model. (Optional)
  "knowledgeBaseIds"?: [ // Optional RBAC-filtered knowledge base ids for the base (no-agent) mode; mutually exclusive with chatbot_id, whose agent always uses its own configured knowledge bases. (Optional)
    string (uuid)
  ]
  "customInstructions"?: string // Optional extra instructions appended to the built-in summary prompt. (Optional)
  "clientPlatform"?:  // Client platform triggering this generation; stamped on the summary conversation.

* `web` - Web
* `desktop` - Desktop (Optional)
  {
  }
}
```

**Example Request Values**

```json
{
  "transcriptOptimizationId": "550e8400-e29b-41d4-a716-446655440000",
  "chatbotId": "550e8400-e29b-41d4-a716-446655440000",
  "largeLanguageModelId": "550e8400-e29b-41d4-a716-446655440000",
  "knowledgeBaseIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "customInstructions": "Example string",
  "clientPlatform": {}
}
```

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API Call (Shell)
curl -X POST "https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/generate/" \
  -H "Authorization: Api-Key YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transcriptOptimizationId": "550e8400-e29b-41d4-a716-446655440000",
    "chatbotId": "550e8400-e29b-41d4-a716-446655440000",
    "largeLanguageModelId": "550e8400-e29b-41d4-a716-446655440000",
    "knowledgeBaseIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ],
    "customInstructions": "Example string",
    "clientPlatform": {}
  }'

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
};

// Request body (payload)
const data = {
    "transcriptOptimizationId": "550e8400-e29b-41d4-a716-446655440000",
    "chatbotId": "550e8400-e29b-41d4-a716-446655440000",
    "largeLanguageModelId": "550e8400-e29b-41d4-a716-446655440000",
    "knowledgeBaseIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ],
    "customInstructions": "Example string",
    "clientPlatform": {}
  };

axios.post("https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/generate/", data, config)
  .then(response => {
    console.log('Response retrieved successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request error:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/generate/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY",
    "Content-Type": "application/json"
}

# Request body (payload)
data = {
    "transcriptOptimizationId": "550e8400-e29b-41d4-a716-446655440000",
    "chatbotId": "550e8400-e29b-41d4-a716-446655440000",
    "largeLanguageModelId": "550e8400-e29b-41d4-a716-446655440000",
    "knowledgeBaseIds": [
        "550e8400-e29b-41d4-a716-446655440000"
    ],
    "customInstructions": "Example string",
    "clientPlatform": {}
}

response = requests.post(url, json=data, headers=headers)
try:
    print("Response retrieved successfully:")
    print(response.json())
except Exception as e:
    print("Request error:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->post("https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/generate/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY',
            'Content-Type' => 'application/json'
        ],
        'json' => [
            'transcriptOptimizationId' => '550e8400-e29b-41d4-a716-446655440000',
            'chatbotId' => '550e8400-e29b-41d4-a716-446655440000',
            'largeLanguageModelId' => '550e8400-e29b-41d4-a716-446655440000',
            'knowledgeBaseIds' => [
                '550e8400-e29b-41d4-a716-446655440000'
            ],
            'customInstructions' => 'Example string',
            'clientPlatform' => new \stdClass()
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response retrieved successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request error: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Schema**

```typescript
{
  "id": string (uuid)
  "content"?: string // Summary content; empty while a background generation is in progress. (Optional)
  "status":  // Manual create/edit rows stay completed; background generations walk from pending to processing.

* `pending` - Pending
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed
  {
  }
  "failureReason": string // Why the last save/generation failed, for both AI-generated and manually-edited summaries.
  "completedSegments": integer
  "totalSegments": integer
  "transcriptOptimization": string (uuid) // Which re-transcribed pass this summary was generated from. Null means the meeting's own realtime transcript, which is the only other source a summary can have.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
}
```

**Example Response Values**

```json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "content": "Response string",
  "status": {},
  "failureReason": "Response string",
  "completedSegments": 456,
  "totalSegments": 456,
  "transcriptOptimization": "550e8400-e29b-41d4-a716-446655440000",
  "createdAt": "Response string",
  "updatedAt": "Response string"
}
```

**Status Code: 202**

**Example Response Schema**

```typescript
{
  "id": string (uuid)
  "content"?: string // Summary content; empty while a background generation is in progress. (Optional)
  "status":  // Manual create/edit rows stay completed; background generations walk from pending to processing.

* `pending` - Pending
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed
  {
  }
  "failureReason": string // Why the last save/generation failed, for both AI-generated and manually-edited summaries.
  "completedSegments": integer
  "totalSegments": integer
  "transcriptOptimization": string (uuid) // Which re-transcribed pass this summary was generated from. Null means the meeting's own realtime transcript, which is the only other source a summary can have.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
}
```

**Example Response Values**

```json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "content": "Response string",
  "status": {},
  "failureReason": "Response string",
  "completedSegments": 456,
  "totalSegments": 456,
  "transcriptOptimization": "550e8400-e29b-41d4-a716-446655440000",
  "createdAt": "Response string",
  "updatedAt": "Response string"
}
```

***

### Retrieve a Specific Meeting Summary <a href="#meeting-records-summaries-retrieve" id="meeting-records-summaries-retrieve"></a>

GET `/api/v1/meeting-records/{meetingRecordPk}/summaries/{id}/`

#### Parameters

| Parameter Name    | Required | Type   | Description |
| ----------------- | -------- | ------ | ----------- |
| `id`              | ✅        | string |             |
| `meetingRecordPk` | ✅        | string |             |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API Call (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/550e8400-e29b-41d4-a716-446655440000/" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/550e8400-e29b-41d4-a716-446655440000/", config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request failed:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/550e8400-e29b-41d4-a716-446655440000/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request failed:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/{meetingRecordPk}/summaries/550e8400-e29b-41d4-a716-446655440000/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request failed: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Schema**

```typescript
{
  "id": string (uuid)
  "content"?: string // Summary content; empty while a background generation is in progress. (optional)
  "status":  // Manual create/edit rows stay completed; background generations walk from pending to processing.

* `pending` - Pending
* `processing` - Processing
* `completed` - Completed
* `failed` - Failed
  {
  }
  "failureReason": string // Why the last save/generation failed, for both AI-generated and manually-edited summaries.
  "completedSegments": integer
  "totalSegments": integer
  "transcriptOptimization": string (uuid) // Which re-transcribed pass this summary was generated from. Null means the meeting's own realtime transcript, which is the only other source a summary can have.
  "createdAt": string (timestamp)
  "updatedAt": string (timestamp)
}
```

**Example Response**

```json
{
  "id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
  "content": "This meeting focused on product development progress, and the team confirmed the milestone targets for next week...",
  "created_at": "2025-01-15T14:30:00Z",
  "updated_at": "2025-01-15T14:30:00Z"
}
```

***

### Upload Transcript to Knowledge Base <a href="#meeting-records-upload-transcript-create" id="meeting-records-upload-transcript-create"></a>

POST `/api/v1/meeting-records/{id}/upload-transcript/`

{% hint style="info" %}
Include `knowledge_base_id` for the first upload. If the transcript is deleted from the knowledge base, call this endpoint again to re-upload it.
{% endhint %}

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Request Body

**Request Parameters**

| Field           | Type          | Required | Description                                                                               |
| --------------- | ------------- | -------- | ----------------------------------------------------------------------------------------- |
| knowledgeBaseId | string (uuid) | No       | Knowledge base ID to upload transcript to. If not provided, uses existing knowledge base. |

**Example Request Schema**

```typescript
{
  "knowledgeBaseId"?: string (uuid) // Knowledge base ID to upload transcript to. If not provided, uses existing knowledge base. (optional)
}
```

**Example Request**

```json
{
  "knowledge_base_id": "b1c2d3e4-f5a6-7890-abcd-ef1234567890"
}
```

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API call (Shell)
curl -X POST "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/upload-transcript/" \
  -H "Authorization: Api-Key YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "knowledge_base_id": "b1c2d3e4-f5a6-7890-abcd-ef1234567890"
  }'

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
};

// Request Body (payload)
const data = {
    "knowledge_base_id": "b1c2d3e4-f5a6-7890-abcd-ef1234567890"
  };

axios.post("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/upload-transcript/", data, config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request failed:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/upload-transcript/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY",
    "Content-Type": "application/json"
}

# Request Body (payload)
data = {
    "knowledge_base_id": "b1c2d3e4-f5a6-7890-abcd-ef1234567890"
}

response = requests.post(url, json=data, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request failed:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->post("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/upload-transcript/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY',
            'Content-Type' => 'application/json'
        ],
        'json' => [
            'knowledge_base_id' => 'b1c2d3e4-f5a6-7890-abcd-ef1234567890'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request failed: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

| Status Code | Description      |
| ----------- | ---------------- |
| 202         | No response body |
| 400         | No response body |
| 404         | No response body |

***

### Download SRT Subtitle File <a href="#meeting-records-download-srt-retrieve" id="meeting-records-download-srt-retrieve"></a>

GET `/api/v1/meeting-records/{id}/download-srt/`

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API call (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-srt/" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-srt/", config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request failed:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-srt/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request failed:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-srt/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request failed: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200 - SRT subtitle file content**

**Example Response Schema**

```typescript
string (binary)
```

**Example Response**

```json
"1\n00:00:00,000 --> 00:00:05,500\nWelcome to the meeting\n\n2\n00:00:05,500 --> 00:00:10,200\nLet's begin the discussion"
```

**Status Code: 400 - No response body**

***

### Download MP3 Audio File <a href="#meeting-records-download-mp3-retrieve" id="meeting-records-download-mp3-retrieve"></a>

GET `/api/v1/meeting-records/{id}/download-mp3/`

#### Parameters

| Parameter Name | Required | Type   | Description                                    |
| -------------- | -------- | ------ | ---------------------------------------------- |
| `id`           | ✅        | string | A UUID string identifying this Meeting Record. |

#### Code Examples

{% tabs %}
{% tab title="Shell/Bash" %}

```bash
# Example API call (Shell)
curl -X GET "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-mp3/" \
  -H "Authorization: Api-Key YOUR_API_KEY"

# Replace YOUR_API_KEY and verify the request data before running.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');

// Set request headers
const config = {
  headers: {
    'Authorization': 'Api-Key YOUR_API_KEY'
  }
};

axios.get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-mp3/", config)
  .then(response => {
    console.log('Response received successfully:');
    console.log(response.data);
  })
  .catch(error => {
    console.error('Request failed:');
    console.error(error.response?.data || error.message);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-mp3/"
headers = {
    "Authorization": "Api-Key YOUR_API_KEY"
}


response = requests.get(url, headers=headers)
try:
    print("Response received successfully:")
    print(response.json())
except Exception as e:
    print("Request failed:", e)
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

try {
    $response = $client->get("https://api.maiagent.ai/api/v1/meeting-records/550e8400-e29b-41d4-a716-446655440000/download-mp3/", [
        'headers' => [
            'Authorization' => 'Api-Key YOUR_API_KEY'
        ]
    ]);
    
    $data = json_decode($response->getBody(), true);
    echo "Response received successfully:\n";
    print_r($data);
} catch (Exception $e) {
    echo 'Request failed: ' . $e->getMessage();
}
?>
```

{% endtab %}
{% endtabs %}

#### Response Body

**Status Code: 200**

**Example Response Schema**

```typescript
{
  "downloadUrl": string (uri) // Presigned download URL
  "filename": string // Suggested filename
  "expiresIn": integer // URL expiration time in seconds
}
```

**Example Response**

```json
{
  "download_url": "https://s3.amazonaws.com/bucket/media/meeting-record/xxx_mp3.mp3?X-Amz-...",
  "filename": "產品規劃會議_20250115.mp3",
  "expires_in": 3600
}
```

**Status Code: 400 - No response body**

***


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.maiagent.ai/api/en/api-reference/hui-yi-ji-lu.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
