Attach meeting transcripts to a project in a bounded batch
curl --request POST \
--url https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"meetings": [
{
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>"
}
]
}
'import requests
url = "https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings"
payload = { "meetings": [
{
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
meetings: [{meeting_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', title: '<string>'}]
})
};
fetch('https://app.harmonica.chat/api/v1/projects/{id}/context-sources/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/projects/{id}/context-sources/meetings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'meetings' => [
[
'meeting_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'title' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings"
payload := strings.NewReader("{\n \"meetings\": [\n {\n \"meeting_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"meetings\": [\n {\n \"meeting_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"meetings\": [\n {\n \"meeting_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"index": 1,
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "created",
"source": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "file",
"title": "<string>",
"content_mode": "verbatim",
"source_ref": "<string>",
"token_estimate": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"transcript_status": "<string>",
"error": {
"code": "<string>",
"message": "<string>"
}
}
],
"summary": {
"requested": 25,
"succeeded": 25,
"failed": 25,
"created": 25,
"existing": 25,
"processing": 25
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key"
}
}Endpoints
Attach meeting transcripts to a project in a bounded batch
Attach between 1 and 50 owned meetings. Work is processed with bounded concurrency and results retain request order. Every requested item receives an independent outcome, so valid items continue when another item is invalid, unavailable, restricted, over quota, or fails. Repeated meeting IDs and partial retries are idempotent and return the existing source. Knowledge extraction is scheduled after the response with separately bounded concurrency. Requires a Pro, LTD, or ENTERPRISE subscription.
POST
/
projects
/
{id}
/
context-sources
/
meetings
Attach meeting transcripts to a project in a bounded batch
curl --request POST \
--url https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"meetings": [
{
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>"
}
]
}
'import requests
url = "https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings"
payload = { "meetings": [
{
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
meetings: [{meeting_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', title: '<string>'}]
})
};
fetch('https://app.harmonica.chat/api/v1/projects/{id}/context-sources/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/projects/{id}/context-sources/meetings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'meetings' => [
[
'meeting_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'title' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings"
payload := strings.NewReader("{\n \"meetings\": [\n {\n \"meeting_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"meetings\": [\n {\n \"meeting_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.harmonica.chat/api/v1/projects/{id}/context-sources/meetings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"meetings\": [\n {\n \"meeting_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"title\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"index": 1,
"meeting_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "created",
"source": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_type": "file",
"title": "<string>",
"content_mode": "verbatim",
"source_ref": "<string>",
"token_estimate": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"transcript_status": "<string>",
"error": {
"code": "<string>",
"message": "<string>"
}
}
],
"summary": {
"requested": 25,
"succeeded": 25,
"failed": 25,
"created": 25,
"existing": 25,
"processing": 25
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key"
}
}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.
Path Parameters
Body
application/json
Required array length:
1 - 50 elementsShow child attributes
Show child attributes