curl --request GET \
--url https://api.meetingkit.com/api/v1/meetings/{id}/results \
--header 'Authorization: <api-key>'import requests
url = "https://api.meetingkit.com/api/v1/meetings/{id}/results"
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/meetings/{id}/results', 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/meetings/{id}/results",
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/meetings/{id}/results"
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/meetings/{id}/results")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/meetings/{id}/results")
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{
"object": "meeting_results",
"meeting_id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
"status": "ready",
"transcript": {
"status": "ready",
"language": "en",
"segments": [
{
"speaker_id": "spk_1",
"start_seconds": 0,
"end_seconds": 14.2,
"text": "Morning all, shall we start with the renewal?",
"words": [
{
"text": "Morning",
"start_seconds": 0,
"end_seconds": 0.42
},
{
"text": "all,",
"start_seconds": 0.42,
"end_seconds": 0.7
}
]
},
{
"speaker_id": "spk_2",
"start_seconds": 14.2,
"end_seconds": 31.8,
"text": "Yes. We're keen, but pricing needs to move."
}
]
},
"speakers": [
{
"id": "spk_1",
"label": "Marc",
"name": "Marc",
"email": "marc@gurusup.com",
"member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab",
"identified": true,
"talk_time_seconds": 812.4
},
{
"id": "spk_2",
"label": "Speaker 2",
"name": null,
"email": null,
"member_id": null,
"identified": false,
"talk_time_seconds": 640.1
}
],
"summary": {
"status": "ready",
"markdown": "## Renewal\n- Acme wants to renew",
"sections": [
{
"heading": "Renewal",
"text": null,
"items": [
"Acme wants to renew"
]
}
],
"action_items": [
{
"text": "Marc: send revised pricing",
"assignee": {
"name": "Marc",
"email": "marc@gurusup.com",
"member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
}
}
]
},
"media": {
"status": "ready",
"duration_seconds": 1834,
"audio_url": "https://storage.meetingkit.com/signed-audio",
"video_url": "https://storage.meetingkit.com/signed-video",
"expires_at": "2026-09-29T09:46:10Z"
}
}{
"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"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Get a meeting's results
Transcript, speakers, summary and media in one read. Each part has its own
status: the transcript is ready before the summary. Media URLs are signed for one
hour (media.expires_at); read the results again for fresh ones.
This is the one place a meeting’s results are read, whichever way it was recorded.
curl --request GET \
--url https://api.meetingkit.com/api/v1/meetings/{id}/results \
--header 'Authorization: <api-key>'import requests
url = "https://api.meetingkit.com/api/v1/meetings/{id}/results"
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/meetings/{id}/results', 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/meetings/{id}/results",
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/meetings/{id}/results"
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/meetings/{id}/results")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/meetings/{id}/results")
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{
"object": "meeting_results",
"meeting_id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
"status": "ready",
"transcript": {
"status": "ready",
"language": "en",
"segments": [
{
"speaker_id": "spk_1",
"start_seconds": 0,
"end_seconds": 14.2,
"text": "Morning all, shall we start with the renewal?",
"words": [
{
"text": "Morning",
"start_seconds": 0,
"end_seconds": 0.42
},
{
"text": "all,",
"start_seconds": 0.42,
"end_seconds": 0.7
}
]
},
{
"speaker_id": "spk_2",
"start_seconds": 14.2,
"end_seconds": 31.8,
"text": "Yes. We're keen, but pricing needs to move."
}
]
},
"speakers": [
{
"id": "spk_1",
"label": "Marc",
"name": "Marc",
"email": "marc@gurusup.com",
"member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab",
"identified": true,
"talk_time_seconds": 812.4
},
{
"id": "spk_2",
"label": "Speaker 2",
"name": null,
"email": null,
"member_id": null,
"identified": false,
"talk_time_seconds": 640.1
}
],
"summary": {
"status": "ready",
"markdown": "## Renewal\n- Acme wants to renew",
"sections": [
{
"heading": "Renewal",
"text": null,
"items": [
"Acme wants to renew"
]
}
],
"action_items": [
{
"text": "Marc: send revised pricing",
"assignee": {
"name": "Marc",
"email": "marc@gurusup.com",
"member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
}
}
]
},
"media": {
"status": "ready",
"duration_seconds": 1834,
"audio_url": "https://storage.meetingkit.com/signed-audio",
"video_url": "https://storage.meetingkit.com/signed-video",
"expires_at": "2026-09-29T09:46:10Z"
}
}{
"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"
}
]
}{
"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
Meeting ID, beginning with mtg_. Treat it as an opaque string.
"mtg_01k6a2r9s8x7c2dvq3m5n6p4ab"
Query Parameters
Extra parts to include. Off by default.
words: each segment's word timings, intranscript.segments[].words
words Response
The results.
Always meeting_results.
The meeting these results belong to.
none until a recording produces it (and for good when nothing was recorded, or no
summary for a failed transcript), processing while it is made, then ready or
failed. Results never forecast: whether a recording will come is the meeting's
phase, recordings and settings.recording.
processing, ready, failed, none The transcript as speaker turns.
Show child attributes
Show child attributes
Everyone who spoke, listed once.
Show child attributes
Show child attributes
The summary and its action items.
Show child attributes
Show child attributes
The recording.
Show child attributes
Show child attributes