curl --request GET \
--url https://app.harmonica.chat/api/v1/meetings \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.harmonica.chat/api/v1/meetings"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.harmonica.chat/api/v1/meetings', 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://app.harmonica.chat/api/v1/meetings",
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://app.harmonica.chat/api/v1/meetings"
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://app.harmonica.chat/api/v1/meetings")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.harmonica.chat/api/v1/meetings")
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{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"meeting_url": "<string>",
"meeting_provider": "google_meet",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"timezone": "<string>",
"status": "scheduled",
"error_code": "<string>",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"transcript_status": "processing",
"transcript_language": "<string>",
"has_transcript": true,
"empty_transcript": true,
"utterance_count": 1,
"speaker_count": 1,
"actual_duration_ms": 1,
"effective_restriction_scopes": [
"synthesis"
],
"project_attachment_count": 1,
"transcript": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "processing",
"availability": "pending",
"language": "<string>",
"revision": 2,
"content_hash": "<string>",
"restriction_revision": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"source": {
"kind": "harmonica_capture",
"provider": "<string>"
},
"processing": {
"provider": "<string>",
"model": "<string>",
"normalization_version": "<string>",
"attempt_status": "pending",
"failure_stage": "capture",
"failure_disposition": "retryable",
"error_code": "<string>",
"error_message": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z"
}
}
}
],
"pagination": {
"total": 1,
"limit": 50,
"offset": 1,
"next_cursor": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}List owned meetings
Lists only personal calendar meetings owned by the API-key user. Project membership never expands this catalogue. Results include compact transcript currentness, processing provenance, safe restriction scopes, and Project attachment counts without transcript text. Provider speaker labels remain unverified source labels and do not establish identity across recordings.
curl --request GET \
--url https://app.harmonica.chat/api/v1/meetings \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.harmonica.chat/api/v1/meetings"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.harmonica.chat/api/v1/meetings', 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://app.harmonica.chat/api/v1/meetings",
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://app.harmonica.chat/api/v1/meetings"
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://app.harmonica.chat/api/v1/meetings")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.harmonica.chat/api/v1/meetings")
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{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"meeting_url": "<string>",
"meeting_provider": "google_meet",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"timezone": "<string>",
"status": "scheduled",
"error_code": "<string>",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"transcript_status": "processing",
"transcript_language": "<string>",
"has_transcript": true,
"empty_transcript": true,
"utterance_count": 1,
"speaker_count": 1,
"actual_duration_ms": 1,
"effective_restriction_scopes": [
"synthesis"
],
"project_attachment_count": 1,
"transcript": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "processing",
"availability": "pending",
"language": "<string>",
"revision": 2,
"content_hash": "<string>",
"restriction_revision": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"source": {
"kind": "harmonica_capture",
"provider": "<string>"
},
"processing": {
"provider": "<string>",
"model": "<string>",
"normalization_version": "<string>",
"attempt_status": "pending",
"failure_stage": "capture",
"failure_disposition": "retryable",
"error_code": "<string>",
"error_message": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z"
}
}
}
],
"pagination": {
"total": 1,
"limit": 50,
"offset": 1,
"next_cursor": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}Authorizations
API key authentication. Pass your key as a Bearer token.
Keys use the format hm_live_<32 hex chars>.
Generate keys from your Harmonica dashboard settings.
Query Parameters
scheduled, joining, in_call, recording, transcribing, ready, failed, cancelled google_meet, zoom, microsoft_teams Filter by whether the meeting is attached to at least one Project.
attached, unattached Include meetings starting at or after this timestamp.
Include meetings starting before this timestamp.
Include meetings updated at or after this timestamp.
1 <= x <= 100Legacy offset pagination. Cannot be combined with a non-first-page cursor.
x >= 0Opaque stable cursor returned by the previous meeting page.
1