curl --request PATCH \
--url https://app.famulor.io/api/v1/loop/routing-rules/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"active": true,
"steps": [
{
"target_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_number": "<string>",
"timeout_seconds": 62,
"continue_on": [],
"time_condition": "always"
}
],
"schedule_enabled": false,
"schedule_timezone": "<string>"
}
'import requests
url = "https://app.famulor.io/api/v1/loop/routing-rules/{id}"
payload = {
"name": "<string>",
"active": True,
"steps": [
{
"target_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_number": "<string>",
"timeout_seconds": 62,
"continue_on": [],
"time_condition": "always"
}
],
"schedule_enabled": False,
"schedule_timezone": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
active: true,
steps: [
{
target_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
external_number: '<string>',
timeout_seconds: 62,
continue_on: [],
time_condition: 'always'
}
],
schedule_enabled: false,
schedule_timezone: '<string>'
})
};
fetch('https://app.famulor.io/api/v1/loop/routing-rules/{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/loop/routing-rules/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'active' => true,
'steps' => [
[
'target_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'external_number' => '<string>',
'timeout_seconds' => 62,
'continue_on' => [
],
'time_condition' => 'always'
]
],
'schedule_enabled' => false,
'schedule_timezone' => '<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.famulor.io/api/v1/loop/routing-rules/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"active\": true,\n \"steps\": [\n {\n \"target_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"external_number\": \"<string>\",\n \"timeout_seconds\": 62,\n \"continue_on\": [],\n \"time_condition\": \"always\"\n }\n ],\n \"schedule_enabled\": false,\n \"schedule_timezone\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.famulor.io/api/v1/loop/routing-rules/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"active\": true,\n \"steps\": [\n {\n \"target_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"external_number\": \"<string>\",\n \"timeout_seconds\": 62,\n \"continue_on\": [],\n \"time_condition\": \"always\"\n }\n ],\n \"schedule_enabled\": false,\n \"schedule_timezone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/loop/routing-rules/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"active\": true,\n \"steps\": [\n {\n \"target_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"external_number\": \"<string>\",\n \"timeout_seconds\": 62,\n \"continue_on\": [],\n \"time_condition\": \"always\"\n }\n ],\n \"schedule_enabled\": false,\n \"schedule_timezone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"active": true,
"schedule_enabled": true,
"schedule_timezone": "<string>",
"weekly_availability": {
"mon": [
[
"<string>"
]
],
"tue": [
[
"<string>"
]
],
"wed": [
[
"<string>"
]
],
"thu": [
[
"<string>"
]
],
"fri": [
[
"<string>"
]
],
"sat": [
[
"<string>"
]
],
"sun": [
[
"<string>"
]
]
},
"steps": [
{
"target_type": "member",
"target_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_number": "<string>",
"timeout_seconds": 62,
"continue_on": [
"unavailable"
],
"position": 1,
"time_condition": "always"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "\"to_number\" is required (E.164 format, e.g. +4930123456)."
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}{
"error": {
"code": "forbidden",
"message": "This API key is missing the required scope \"assistants:write\"."
}
}{
"error": {
"code": "not_found",
"message": "Assistant not found"
}
}{
"error": {
"code": "conflict",
"message": "Campaign is not running."
}
}Update a Loop routing rule
Atomically replaces a routing rule, shared weekly hours, time-conditioned steps, and pre-answer continuation outcomes. Cycles are rejected and the previous rule remains unchanged on failure. Requires loop:write and a workspace owner or admin credential.
curl --request PATCH \
--url https://app.famulor.io/api/v1/loop/routing-rules/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"active": true,
"steps": [
{
"target_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_number": "<string>",
"timeout_seconds": 62,
"continue_on": [],
"time_condition": "always"
}
],
"schedule_enabled": false,
"schedule_timezone": "<string>"
}
'import requests
url = "https://app.famulor.io/api/v1/loop/routing-rules/{id}"
payload = {
"name": "<string>",
"active": True,
"steps": [
{
"target_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_number": "<string>",
"timeout_seconds": 62,
"continue_on": [],
"time_condition": "always"
}
],
"schedule_enabled": False,
"schedule_timezone": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
active: true,
steps: [
{
target_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
external_number: '<string>',
timeout_seconds: 62,
continue_on: [],
time_condition: 'always'
}
],
schedule_enabled: false,
schedule_timezone: '<string>'
})
};
fetch('https://app.famulor.io/api/v1/loop/routing-rules/{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/loop/routing-rules/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'active' => true,
'steps' => [
[
'target_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'external_number' => '<string>',
'timeout_seconds' => 62,
'continue_on' => [
],
'time_condition' => 'always'
]
],
'schedule_enabled' => false,
'schedule_timezone' => '<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.famulor.io/api/v1/loop/routing-rules/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"active\": true,\n \"steps\": [\n {\n \"target_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"external_number\": \"<string>\",\n \"timeout_seconds\": 62,\n \"continue_on\": [],\n \"time_condition\": \"always\"\n }\n ],\n \"schedule_enabled\": false,\n \"schedule_timezone\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.famulor.io/api/v1/loop/routing-rules/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"active\": true,\n \"steps\": [\n {\n \"target_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"external_number\": \"<string>\",\n \"timeout_seconds\": 62,\n \"continue_on\": [],\n \"time_condition\": \"always\"\n }\n ],\n \"schedule_enabled\": false,\n \"schedule_timezone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/loop/routing-rules/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"active\": true,\n \"steps\": [\n {\n \"target_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"external_number\": \"<string>\",\n \"timeout_seconds\": 62,\n \"continue_on\": [],\n \"time_condition\": \"always\"\n }\n ],\n \"schedule_enabled\": false,\n \"schedule_timezone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"active": true,
"schedule_enabled": true,
"schedule_timezone": "<string>",
"weekly_availability": {
"mon": [
[
"<string>"
]
],
"tue": [
[
"<string>"
]
],
"wed": [
[
"<string>"
]
],
"thu": [
[
"<string>"
]
],
"fri": [
[
"<string>"
]
],
"sat": [
[
"<string>"
]
],
"sun": [
[
"<string>"
]
]
},
"steps": [
{
"target_type": "member",
"target_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"external_number": "<string>",
"timeout_seconds": 62,
"continue_on": [
"unavailable"
],
"position": 1,
"time_condition": "always"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "\"to_number\" is required (E.164 format, e.g. +4930123456)."
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}{
"error": {
"code": "forbidden",
"message": "This API key is missing the required scope \"assistants:write\"."
}
}{
"error": {
"code": "not_found",
"message": "Assistant not found"
}
}{
"error": {
"code": "conflict",
"message": "Campaign is not running."
}
}Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). 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, 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.
Path Parameters
Workspace-scoped Loop resource ID.
Body
1 - 1201 - 25 elementsShow child attributes
Show child attributes
IANA timezone, or null to inherit the workspace timezone.
Show child attributes
Show child attributes
Response
Updated routing rule.
Show child attributes
Show child attributes