Poll conversation updates
curl --request GET \
--url https://akapulu.com/api/conversations/{conversation_session_id}/updates \
--header 'Authorization: Bearer <token>'import requests
url = "https://akapulu.com/api/conversations/{conversation_session_id}/updates"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://akapulu.com/api/conversations/{conversation_session_id}/updates', 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://akapulu.com/api/conversations/{conversation_session_id}/updates",
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://akapulu.com/api/conversations/{conversation_session_id}/updates"
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://akapulu.com/api/conversations/{conversation_session_id}/updates")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://akapulu.com/api/conversations/{conversation_session_id}/updates")
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{
"conversation_session_id": "7f1e7f76-b38d-4d03-b8f8-2570ce8d4e6d",
"call_is_ready": false,
"completion_percent": 63.6,
"latest_update_text": "bot joined daily room"
}{
"error": "Invalid API key",
"error_code": "AUTH_INVALID"
}{
"error": "ConversationSession not found"
}Starting a conversation
Poll Conversation Updates
Fetch current conversation readiness and progress for a conversation session.
GET
/
conversations
/
{conversation_session_id}
/
updates
Poll conversation updates
curl --request GET \
--url https://akapulu.com/api/conversations/{conversation_session_id}/updates \
--header 'Authorization: Bearer <token>'import requests
url = "https://akapulu.com/api/conversations/{conversation_session_id}/updates"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://akapulu.com/api/conversations/{conversation_session_id}/updates', 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://akapulu.com/api/conversations/{conversation_session_id}/updates",
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://akapulu.com/api/conversations/{conversation_session_id}/updates"
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://akapulu.com/api/conversations/{conversation_session_id}/updates")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://akapulu.com/api/conversations/{conversation_session_id}/updates")
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{
"conversation_session_id": "7f1e7f76-b38d-4d03-b8f8-2570ce8d4e6d",
"call_is_ready": false,
"completion_percent": 63.6,
"latest_update_text": "bot joined daily room"
}{
"error": "Invalid API key",
"error_code": "AUTH_INVALID"
}{
"error": "ConversationSession not found"
}Use this endpoint to track setup progress after
POST /conversations/connect. It is for the loading screen until the assistant is ready. It is not a live transcript channel — once call_is_ready is true, stop polling. Live captions and speaking state come from the Daily call.
The Web SDK polls this (via your local updates route) about every 200ms while joining, then stops. If you call the REST API yourself, poll until call_is_ready is true and then stop. Every 0.5 seconds is fine if you are not using the SDK.
If you expose your own updates route to the browser, authenticate it the same way as connect. The SDK sends config.headers on each updates GET.
Response behavior
conversation_session_idis the conversation session being tracked.latest_update_textis the latest human-readable setup status.completion_percentis a progress indicator for setup/readiness from0to100.call_is_readybecomestruewhen the bot and participant are ready.- when
call_is_readyistrue,completion_percentis returned as100
{
"conversation_session_id": "7f1e7f76-b38d-4d03-b8f8-2570ce8d4e6d",
"call_is_ready": false,
"completion_percent": 64,
"latest_update_text": "bot joined daily room"
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Conversation session ID returned from the connect endpoint.
Response
Conversation updates fetched successfully

