curl --request GET \
--url https://app.famulor.io/api/v1/automations/{id}/runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/automations/{id}/runs/{runId}"
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/automations/{id}/runs/{runId}', 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/automations/{id}/runs/{runId}",
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/automations/{id}/runs/{runId}"
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/automations/{id}/runs/{runId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/automations/{id}/runs/{runId}")
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": {
"run": {
"id": "f1b2c3d4-0000-4000-8000-000000000031",
"automation_id": "e1b2c3d4-0000-4000-8000-000000000030",
"status": "failed",
"trigger_event": "call.completed",
"error": "Email step failed: recipient address is missing",
"started_at": "2026-10-07T09:41:02Z",
"finished_at": "2026-10-07T09:41:03Z",
"created_at": "2026-10-07T09:41:01Z",
"credits_charged": 0,
"automation_name": "Lead follow-up",
"trigger_payload": {
"event": "call.completed",
"timestamp": "2026-10-07T09:41:01Z",
"data": {
"call_id": "c1b2c3d4-0000-4000-8000-000000000010",
"summary": "Caller asked for a quote."
}
}
},
"steps": [
{
"id": "a1b2c3d4-0000-4000-8000-000000000041",
"run_id": "f1b2c3d4-0000-4000-8000-000000000031",
"node_id": "action-1",
"action": "condition",
"status": "completed",
"input": {
"left": "{{data.status}}",
"operator": "equals",
"right": "completed"
},
"output": {
"branch": true
},
"error": null,
"started_at": "2026-10-07T09:41:02.100Z",
"finished_at": "2026-10-07T09:41:02.140Z",
"created_at": "2026-10-07T09:41:02.100Z"
},
{
"id": "a1b2c3d4-0000-4000-8000-000000000042",
"run_id": "f1b2c3d4-0000-4000-8000-000000000031",
"node_id": "action-2",
"action": "email.send",
"status": "failed",
"input": {
"to": "{{data.email}}",
"subject": "Your quote"
},
"output": {},
"error": "Email step failed: recipient address is missing",
"started_at": "2026-10-07T09:41:02.150Z",
"finished_at": "2026-10-07T09:41:02.900Z",
"created_at": "2026-10-07T09:41:02.150Z"
}
],
"steps_truncated": false
}
}Get automation run
One automation run with its step log: every executed step’s action, status, input (the step’s configuration as saved, before templates are filled in), output, error and timing, plus the trigger payload that started the run. Steps are ordered oldest first; a step inside a loop appears once per item. Use it to find out why a run failed. Required scope: automations:read (or calls:read).
curl --request GET \
--url https://app.famulor.io/api/v1/automations/{id}/runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/automations/{id}/runs/{runId}"
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/automations/{id}/runs/{runId}', 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/automations/{id}/runs/{runId}",
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/automations/{id}/runs/{runId}"
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/automations/{id}/runs/{runId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/automations/{id}/runs/{runId}")
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": {
"run": {
"id": "f1b2c3d4-0000-4000-8000-000000000031",
"automation_id": "e1b2c3d4-0000-4000-8000-000000000030",
"status": "failed",
"trigger_event": "call.completed",
"error": "Email step failed: recipient address is missing",
"started_at": "2026-10-07T09:41:02Z",
"finished_at": "2026-10-07T09:41:03Z",
"created_at": "2026-10-07T09:41:01Z",
"credits_charged": 0,
"automation_name": "Lead follow-up",
"trigger_payload": {
"event": "call.completed",
"timestamp": "2026-10-07T09:41:01Z",
"data": {
"call_id": "c1b2c3d4-0000-4000-8000-000000000010",
"summary": "Caller asked for a quote."
}
}
},
"steps": [
{
"id": "a1b2c3d4-0000-4000-8000-000000000041",
"run_id": "f1b2c3d4-0000-4000-8000-000000000031",
"node_id": "action-1",
"action": "condition",
"status": "completed",
"input": {
"left": "{{data.status}}",
"operator": "equals",
"right": "completed"
},
"output": {
"branch": true
},
"error": null,
"started_at": "2026-10-07T09:41:02.100Z",
"finished_at": "2026-10-07T09:41:02.140Z",
"created_at": "2026-10-07T09:41:02.100Z"
},
{
"id": "a1b2c3d4-0000-4000-8000-000000000042",
"run_id": "f1b2c3d4-0000-4000-8000-000000000031",
"node_id": "action-2",
"action": "email.send",
"status": "failed",
"input": {
"to": "{{data.email}}",
"subject": "Your quote"
},
"output": {},
"error": "Email step failed: recipient address is missing",
"started_at": "2026-10-07T09:41:02.150Z",
"finished_at": "2026-10-07T09:41:02.900Z",
"created_at": "2026-10-07T09:41:02.150Z"
}
],
"steps_truncated": false
}
}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
Automation ID.
Run ID (from List automation runs).
Response
The run and its steps.
Show child attributes
Show child attributes