curl --request GET \
--url https://api.meetingkit.com/api/v1/bots/{id} \
--header 'Authorization: <api-key>'import requests
url = "https://api.meetingkit.com/api/v1/bots/{id}"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.meetingkit.com/api/v1/bots/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meetingkit.com/api/v1/bots/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.meetingkit.com/api/v1/bots/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.meetingkit.com/api/v1/bots/{id}")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/bots/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "bot_01k0h4r9s8x7c2dvq3m5n6p4ab",
"object": "bot",
"meeting_id": "mtg_01k0h4r9s8x7c2dvq3m5n6p4ab",
"meeting_url": "https://zoom.us/j/123456789",
"join_at": "2026-07-20T14:00:00Z",
"status": "queued",
"bot_name": "Acme Notetaker",
"welcome_message": "Recording this meeting for Acme",
"language": "en",
"recording_start": "on_join",
"recording_mode": "audio_only",
"silence_alert": true,
"summary_language": "en",
"summary_template": "discovery_call",
"participants": [
{
"email": "carmen@example.com",
"name": "Carmen"
}
],
"metadata": {
"partner_meeting_id": "meeting-123"
},
"created_at": "2026-07-20T13:58:12Z",
"ended_at": null
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Retrieve a bot
Retrieves a bot, including the full transcript and summary once they are ready. Poll this endpoint or configure a bot webhook for push updates.
curl --request GET \
--url https://api.meetingkit.com/api/v1/bots/{id} \
--header 'Authorization: <api-key>'import requests
url = "https://api.meetingkit.com/api/v1/bots/{id}"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.meetingkit.com/api/v1/bots/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meetingkit.com/api/v1/bots/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.meetingkit.com/api/v1/bots/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.meetingkit.com/api/v1/bots/{id}")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/bots/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "bot_01k0h4r9s8x7c2dvq3m5n6p4ab",
"object": "bot",
"meeting_id": "mtg_01k0h4r9s8x7c2dvq3m5n6p4ab",
"meeting_url": "https://zoom.us/j/123456789",
"join_at": "2026-07-20T14:00:00Z",
"status": "queued",
"bot_name": "Acme Notetaker",
"welcome_message": "Recording this meeting for Acme",
"language": "en",
"recording_start": "on_join",
"recording_mode": "audio_only",
"silence_alert": true,
"summary_language": "en",
"summary_template": "discovery_call",
"participants": [
{
"email": "carmen@example.com",
"name": "Carmen"
}
],
"metadata": {
"partner_meeting_id": "meeting-123"
},
"created_at": "2026-07-20T13:58:12Z",
"ended_at": null
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Authorizations
Your API key, sent bare. See Authentication.
Path Parameters
Bot ID, beginning with bot_. Treat it as an opaque string.
"bot_01k0h4r9s8x7c2dvq3m5n6p4ab"
Response
The bot.
A bot is one way of recording a meeting. It carries its identity in the call and the
meeting's recording choices; what the meeting produced (transcript, speakers, summary,
media) is read from GET /meetings/{id}/results.
Stable typed bot ID beginning with bot_. Treat it as an opaque string.
Always bot.
The meeting this bot records, beginning with mtg_. It exists from the moment the bot is queued; read its results with GET /meetings/{meeting_id}/results.
Normalized URL supplied at creation. Treat as sensitive — it may contain credentials.
Requested ISO 8601 join time, or null for an immediate dispatch.
Current lifecycle state:
queued: the provider accepted the bot and the notetaker is pendingjoining: the notetaker is joining the callin_call: the notetaker is in the call and recordingprocessing: the recording is being transcribed or summarizedcompleted: the transcript and summary are ready on the meetingfailed: the bot ended without a usable resultcancelled: the bot was cancelled
queued, joining, in_call, processing, completed, failed, cancelled Display name of the notetaker in the call.
Chat message the notetaker posts when it joins, or null when it posts none.
Transcription language as a BCP-47 code, auto or multi. The meeting's settings.transcription.language.
When the notetaker starts recording. The meeting's settings.recording.methods.bot.start.
on_join: as soon as it joins the callon_command: when someone in the call asks it to
on_join, on_command What the notetaker records. The meeting's settings.recording.methods.bot.mode.
audio_and_video: audio and videoaudio_only: audio only
audio_and_video, audio_only Whether the notetaker posts an audible and chat alert after a long silence, in case it is recording nothing. The meeting's settings.recording.methods.bot.silence_detection.alert.
Language of the summary as a BCP-47 code, or null to follow the transcription. The meeting's settings.summary.language.
The summary template that runs, a built-in slug or a custom template's tpl_ id. The meeting's settings.summary.template.
Everyone invited to the meeting. Meeting rooms and the notetaker itself are excluded.
Show child attributes
Show child attributes
A flat map of strings from 2026-10-12. Before it, the object stored at creation, returned as stored; a value stored as a nested object reads as its JSON text from 2026-10-12.
Show child attributes
Show child attributes
{ "gurusup_user_id": "usr_8812" }
When the bot was created.
When the recording first became available. null until then, and for a bot that never recorded. Reprocessing does not change it.
Machine-readable failure reason. Present only for failed bots.
no_recording: the call ended without anything recordedinvalid_meeting_url: the meeting URL could not be joinedbot_error: the notetaker failed in the calltranscription_failed: the recording could not be transcribed
no_recording, invalid_meeting_url, bot_error, transcription_failed Human-readable failure detail for debugging. Present only for failed bots. Do not match on its text; use reason.