curl --request GET \
--url https://app.famulor.io/api/v1/translation-sessions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/translation-sessions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.famulor.io/api/v1/translation-sessions/{id}', 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.famulor.io/api/v1/translation-sessions/{id}",
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.famulor.io/api/v1/translation-sessions/{id}"
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.famulor.io/api/v1/translation-sessions/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/translation-sessions/{id}")
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": {
"session": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "waiting",
"speakers": [
{
"side": 1,
"display_name": "<string>",
"language": "<string>",
"transport": "web",
"status": "waiting"
}
],
"assistant_name": "<string>",
"host_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"ended_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"talk_duration_sec": 1,
"max_duration_sec": 1,
"invite_url": "<string>",
"dial_in": {
"number": "<string>",
"code": "<string>"
},
"phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"can_call": true
},
"segments": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 123,
"side": 1,
"original_text": "<string>",
"translated_text": "<string>",
"source_language": "<string>",
"target_language": "<string>",
"created_at": "2023-11-07T05:31:56Z"
}
]
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}Get translation room
Read connection state and original/translated phrase pairs while the room is active. Phrase history expires when the room ends. Requires calls:read and a credential belonging to the room host.
curl --request GET \
--url https://app.famulor.io/api/v1/translation-sessions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/translation-sessions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.famulor.io/api/v1/translation-sessions/{id}', 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.famulor.io/api/v1/translation-sessions/{id}",
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.famulor.io/api/v1/translation-sessions/{id}"
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.famulor.io/api/v1/translation-sessions/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/translation-sessions/{id}")
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": {
"session": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "waiting",
"speakers": [
{
"side": 1,
"display_name": "<string>",
"language": "<string>",
"transport": "web",
"status": "waiting"
}
],
"assistant_name": "<string>",
"host_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"ended_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"talk_duration_sec": 1,
"max_duration_sec": 1,
"invite_url": "<string>",
"dial_in": {
"number": "<string>",
"code": "<string>"
},
"phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"can_call": true
},
"segments": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 123,
"side": 1,
"original_text": "<string>",
"translated_text": "<string>",
"source_language": "<string>",
"target_language": "<string>",
"created_at": "2023-11-07T05:31:56Z"
}
]
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}session.can_call. It is true when the assistant has a
connected outgoing phone number. Use this value to enable phone controls;
false or a missing value keeps them disabled. An incoming-only number does
not enable callbacks. Destination, credit and calling-limit checks still run
when a call is requested. Guest and list responses omit this host capability.
Dial-in is independent: session.dial_in.number contains an eligible incoming
number assigned to the assistant, or null when none is connected. The room code
is displayed after the host starts the room and remains available with the number.
Speaker 1 then calls the number and enters all six digits, including any leading
zero. Guest responses omit the number and code. An outgoing connection is required
only for participants receiving a call.
Creating and starting Translate rooms requires the Translate Agent mode to be included in the workspace’s current plan. Existing room details remain readable after a later plan change.Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). REST operations also require API Access for the credential's workspace. Keys can be restricted to scopes such as assistants:read, calls:write, campaigns:write, automations:read, dashboards:read, dashboards:write, leads:write, segments:write, loop:read, loop:write, phone_numbers:write, sip_trunks:write, knowledge:write, voices:read, billing:read, billing:write, settings:write, platform:read, platform:write; a *:write scope implies the matching *:read. Automation and dashboard endpoints also accept the legacy calls:* scope. Keys without scope restrictions have full access within the workspace's available capabilities.
Path Parameters
Query Parameters
Last received phrase sequence; returns up to 200 newer active-session phrases.
x >= 0Response
Success
Show child attributes
Show child attributes