curl --request POST \
--url https://api.erdo.ai/v1/voice/widget-conversations/get \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"session_id": "<string>",
"widget": "<string>"
}
'import requests
url = "https://api.erdo.ai/v1/voice/widget-conversations/get"
payload = {
"session_id": "<string>",
"widget": "<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({session_id: '<string>', widget: '<string>'})
};
fetch('https://api.erdo.ai/v1/voice/widget-conversations/get', 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.erdo.ai/v1/voice/widget-conversations/get",
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([
'session_id' => '<string>',
'widget' => '<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://api.erdo.ai/v1/voice/widget-conversations/get"
payload := strings.NewReader("{\n \"session_id\": \"<string>\",\n \"widget\": \"<string>\"\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://api.erdo.ai/v1/voice/widget-conversations/get")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"session_id\": \"<string>\",\n \"widget\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/voice/widget-conversations/get")
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 \"session_id\": \"<string>\",\n \"widget\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"contact": {
"email": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>"
},
"created_at": "2023-11-07T05:31:56Z",
"duration_seconds": -1,
"ended_at": "2023-11-07T05:31:56Z",
"has_transcript": true,
"lead_saved_at": "2023-11-07T05:31:56Z",
"lead_status": "<string>",
"modality": "<string>",
"origin": "<string>",
"session_id": "<string>",
"topics": [
"<string>"
],
"transcript_json": {},
"transcript_summary": "<string>",
"transcript_text": "<string>",
"transcript_turns": [
{
"at": "2023-11-07T05:31:56Z",
"role": "<string>",
"text": "<string>"
}
],
"turns": [
{
"after_knowledge_result": true,
"after_tool_result": true,
"cache_read_tokens": 123,
"input_tokens": 123,
"llm_override": "<string>",
"models": [
"<string>"
],
"output_tokens": 123,
"rescued": true,
"time_in_call_secs": 123,
"tool_calls": [
"<string>"
],
"tool_result_chars": 123,
"ttfb_seconds": 123,
"turn_index": 123
}
],
"widget": "<string>",
"widget_id": "<string>",
"widget_name": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}GetVoiceWidgetConversationAPI mirrors erdo_voice_widget_conversation_get,
returning the displayable `transcript_turns`, the raw transcript, the topics, the structured per-turn LLM metrics (`turns`), and the lead the conversation produced (`contact`, `lead_status`, `lead_saved_at` — see the list endpoint).
curl --request POST \
--url https://api.erdo.ai/v1/voice/widget-conversations/get \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"session_id": "<string>",
"widget": "<string>"
}
'import requests
url = "https://api.erdo.ai/v1/voice/widget-conversations/get"
payload = {
"session_id": "<string>",
"widget": "<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({session_id: '<string>', widget: '<string>'})
};
fetch('https://api.erdo.ai/v1/voice/widget-conversations/get', 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.erdo.ai/v1/voice/widget-conversations/get",
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([
'session_id' => '<string>',
'widget' => '<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://api.erdo.ai/v1/voice/widget-conversations/get"
payload := strings.NewReader("{\n \"session_id\": \"<string>\",\n \"widget\": \"<string>\"\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://api.erdo.ai/v1/voice/widget-conversations/get")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"session_id\": \"<string>\",\n \"widget\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/voice/widget-conversations/get")
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 \"session_id\": \"<string>\",\n \"widget\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"contact": {
"email": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>"
},
"created_at": "2023-11-07T05:31:56Z",
"duration_seconds": -1,
"ended_at": "2023-11-07T05:31:56Z",
"has_transcript": true,
"lead_saved_at": "2023-11-07T05:31:56Z",
"lead_status": "<string>",
"modality": "<string>",
"origin": "<string>",
"session_id": "<string>",
"topics": [
"<string>"
],
"transcript_json": {},
"transcript_summary": "<string>",
"transcript_text": "<string>",
"transcript_turns": [
{
"at": "2023-11-07T05:31:56Z",
"role": "<string>",
"text": "<string>"
}
],
"turns": [
{
"after_knowledge_result": true,
"after_tool_result": true,
"cache_read_tokens": 123,
"input_tokens": 123,
"llm_override": "<string>",
"models": [
"<string>"
],
"output_tokens": 123,
"rescued": true,
"time_in_call_secs": 123,
"tool_calls": [
"<string>"
],
"tool_result_chars": 123,
"ttfb_seconds": 123,
"turn_index": 123
}
],
"widget": "<string>",
"widget_id": "<string>",
"widget_name": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Response
Success response
ones the leads dataset has columns for; there is deliberately no company, because nothing downstream would use it.
Show child attributes
Show child attributes
-2147483648 <= x <= 2147483647still awaiting one, then created | existing | disabled | test.
analysed yet", [] is "analysed, nothing found".
own turns array), passed through verbatim. Null when no transcript was captured.
displaying a conversation renders ONE shape instead of re-parsing both the ElevenLabs post-call array and our own turns array. Built by the same tolerant renderer as TranscriptText, so the two can never disagree. Always present (empty when nothing rendered).
Show child attributes
Show child attributes
from an ElevenLabs transcript (empty for our simpler text/video turn shapes, which carry no LLM metrics). See extractWidgetConversationTurns.
Show child attributes
Show child attributes

