curl --request POST \
--url https://app.famulor.io/api/v1/loop/routing-rules \
--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"
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.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
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', 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",
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([
'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"
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("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/loop/routing-rules")
.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")
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 \"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"
}
]
}
}Create a Loop routing rule
Creates an ordered routing rule with optional weekly hours and time-conditioned steps. Continuation outcomes cover pre-answer failures only; an answered person or assistant is terminal. Cycles are rejected. Requires loop:write and a workspace owner or admin credential.
curl --request POST \
--url https://app.famulor.io/api/v1/loop/routing-rules \
--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"
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.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
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', 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",
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([
'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"
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("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/loop/routing-rules")
.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")
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 \"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"
}
]
}
}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, 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.
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
Created routing rule.
Show child attributes
Show child attributes