curl --request GET \
--url https://api.myhamlet.com/v1/meetings/{uuid}/transcript \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.myhamlet.com/v1/meetings/{uuid}/transcript"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.myhamlet.com/v1/meetings/{uuid}/transcript', 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.myhamlet.com/v1/meetings/{uuid}/transcript",
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: Bearer <token>"
],
]);
$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.myhamlet.com/v1/meetings/{uuid}/transcript"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.myhamlet.com/v1/meetings/{uuid}/transcript")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.myhamlet.com/v1/meetings/{uuid}/transcript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"uuid": "d8e1f2a3-4b5c-6d7e-8f90-1a2b3c4d5e6f",
"meeting_uuid": "9a1c...",
"format": "jsonl",
"download_url": "https://hamlet-transcripts-prod.s3.us-west-1.amazonaws.com/…?X-Amz-Signature=…",
"url_expires_at": "2026-06-22T15:30:00.000Z",
"generated_at": "2026-05-22T09:20:00.000Z"
}{
"error": {
"code": "not_found",
"message": "The requested resource was not found."
}
}{
"error": {
"code": "not_found",
"message": "The requested resource was not found."
}
}{
"error": {
"code": "not_found",
"message": "The requested resource was not found."
}
}Get a meeting's transcript
Returns metadata plus a short-lived (1-hour) presigned S3 URL to download the meeting’s transcript as a JSONL file (one utterance per line, no embeddings). Returns 404 if the meeting does not exist, your API key is not entitled to it, or it has no built transcript artifact (has_transcript on the meeting list tells you in advance). The link is never broken: a 200 always carries a valid, downloadable URL.
Every meeting has at most one transcript artifact, covering the whole proceeding. A meeting that recessed and reconvened is one dense sequence of utterances whose timestamps remain absolute against the recording, so a recess appears as a jump between two adjacent lines rather than as a separate file to fetch.
curl --request GET \
--url https://api.myhamlet.com/v1/meetings/{uuid}/transcript \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.myhamlet.com/v1/meetings/{uuid}/transcript"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.myhamlet.com/v1/meetings/{uuid}/transcript', 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.myhamlet.com/v1/meetings/{uuid}/transcript",
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: Bearer <token>"
],
]);
$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.myhamlet.com/v1/meetings/{uuid}/transcript"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.myhamlet.com/v1/meetings/{uuid}/transcript")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.myhamlet.com/v1/meetings/{uuid}/transcript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"uuid": "d8e1f2a3-4b5c-6d7e-8f90-1a2b3c4d5e6f",
"meeting_uuid": "9a1c...",
"format": "jsonl",
"download_url": "https://hamlet-transcripts-prod.s3.us-west-1.amazonaws.com/…?X-Amz-Signature=…",
"url_expires_at": "2026-06-22T15:30:00.000Z",
"generated_at": "2026-05-22T09:20:00.000Z"
}{
"error": {
"code": "not_found",
"message": "The requested resource was not found."
}
}{
"error": {
"code": "not_found",
"message": "The requested resource was not found."
}
}{
"error": {
"code": "not_found",
"message": "The requested resource was not found."
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The meeting's public uuid.
"9a1c2b3d-4e5f-6071-8293-a4b5c6d7e8f9"
Response
Transcript metadata with a 1-hour presigned download URL.
The transcript's public identifier.
"d8e1f2a3-4b5c-6d7e-8f90-1a2b3c4d5e6f"
The meeting's public identifier; matches the path.
"9a1c..."
The downloaded artifact's format. Always jsonl (one utterance object per line).
jsonl "jsonl"
Presigned S3 URL for the JSONL transcript, valid 1 hour. Download it before it expires. One artifact covers the whole meeting, recesses included.
"https://hamlet-transcripts-prod.s3.us-west-1.amazonaws.com/…?X-Amz-Signature=…"
ISO-8601 UTC timestamp when download_url expires.
"2026-06-22T15:30:00.000Z"
ISO-8601 UTC timestamp for when the transcript artifact was built.
"2026-05-22T09:20:00.000Z"