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"
}
]
}
}{
"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": "conflict",
"message": "Campaign is not running."
}
}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"
}
]
}
}{
"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": "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.
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