curl --request POST \
--url https://app.famulor.io/api/v1/translation-sessions/{id}/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"speaker1": {
"phone_number": "<string>"
},
"speaker2": {
"phone_number": "<string>"
},
"phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.famulor.io/api/v1/translation-sessions/{id}/start"
payload = {
"speaker1": { "phone_number": "<string>" },
"speaker2": { "phone_number": "<string>" },
"phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
speaker1: {phone_number: '<string>'},
speaker2: {phone_number: '<string>'},
phone_number_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.famulor.io/api/v1/translation-sessions/{id}/start', 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}/start",
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([
'speaker1' => [
'phone_number' => '<string>'
],
'speaker2' => [
'phone_number' => '<string>'
],
'phone_number_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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.famulor.io/api/v1/translation-sessions/{id}/start"
payload := strings.NewReader("{\n \"speaker1\": {\n \"phone_number\": \"<string>\"\n },\n \"speaker2\": {\n \"phone_number\": \"<string>\"\n },\n \"phone_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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.famulor.io/api/v1/translation-sessions/{id}/start")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"speaker1\": {\n \"phone_number\": \"<string>\"\n },\n \"speaker2\": {\n \"phone_number\": \"<string>\"\n },\n \"phone_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/translation-sessions/{id}/start")
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 \"speaker1\": {\n \"phone_number\": \"<string>\"\n },\n \"speaker2\": {\n \"phone_number\": \"<string>\"\n },\n \"phone_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
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
}
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}Start translation room
Start each participant in the browser, through a callback, or speaker 1 by dialing the assigned number and entering the room code. The Translate Agent mode must be included in the workspace’s current plan. Phone participants require phone_number. One shared talk rate and translation surcharge apply, plus actual costs for each phone connection. Requires calls:write and a credential belonging to the room host. Workspace roles, credits, assistant and calling limits apply.
curl --request POST \
--url https://app.famulor.io/api/v1/translation-sessions/{id}/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"speaker1": {
"phone_number": "<string>"
},
"speaker2": {
"phone_number": "<string>"
},
"phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.famulor.io/api/v1/translation-sessions/{id}/start"
payload = {
"speaker1": { "phone_number": "<string>" },
"speaker2": { "phone_number": "<string>" },
"phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
speaker1: {phone_number: '<string>'},
speaker2: {phone_number: '<string>'},
phone_number_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.famulor.io/api/v1/translation-sessions/{id}/start', 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}/start",
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([
'speaker1' => [
'phone_number' => '<string>'
],
'speaker2' => [
'phone_number' => '<string>'
],
'phone_number_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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.famulor.io/api/v1/translation-sessions/{id}/start"
payload := strings.NewReader("{\n \"speaker1\": {\n \"phone_number\": \"<string>\"\n },\n \"speaker2\": {\n \"phone_number\": \"<string>\"\n },\n \"phone_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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.famulor.io/api/v1/translation-sessions/{id}/start")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"speaker1\": {\n \"phone_number\": \"<string>\"\n },\n \"speaker2\": {\n \"phone_number\": \"<string>\"\n },\n \"phone_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/translation-sessions/{id}/start")
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 \"speaker1\": {\n \"phone_number\": \"<string>\"\n },\n \"speaker2\": {\n \"phone_number\": \"<string>\"\n },\n \"phone_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
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
}
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}web, phone, or inbound; Speaker 2 supports web or phone.
All six combinations are supported. Each phone participant requires an
international E.164 destination and an eligible outgoing connection. An inbound
participant instead uses the assistant’s assigned incoming number and room code;
an outgoing connection is not required for dial-in itself.
Start the room before entering its six-digit code by phone. Starting reserves
the workspace’s available budget before outgoing calls are queued. Each actual
phone connection has its own carrier charge; the shared conversation rate and
translation surcharge apply once. Guests cannot start the room or request calls.
When call recording is enabled for the Translate assistant, recording starts
automatically unless spoken consent is also enabled. With consent enabled, both
speakers hear a recording notice in their configured language before translation
begins, and recording starts only after both people consent. The completed room is stored as
one Translate history entry with its bilingual transcript and, when available,
the recording from Speaker 1’s side.
The Translate Agent mode must be included in the workspace’s current plan when the room is created or started.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
Body
Response
Success
Show child attributes
Show child attributes