Update automation
curl --request PUT \
--url https://app.famulor.de/api/user/automate/flows/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"enabled": true,
"flow": {},
"sample": {},
"assistant_id": 123,
"confirm_side_effects": true
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
enabled: true,
flow: {},
sample: {},
assistant_id: 123,
confirm_side_effects: true
})
};
fetch('https://app.famulor.de/api/user/automate/flows/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.famulor.de/api/user/automate/flows/{id}"
payload = {
"name": "<string>",
"enabled": True,
"flow": {},
"sample": {},
"assistant_id": 123,
"confirm_side_effects": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/automate/flows/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'enabled' => true,
'flow' => [
],
'sample' => [
],
'assistant_id' => 123,
'confirm_side_effects' => true
]),
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.de/api/user/automate/flows/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"enabled\": true,\n \"flow\": {},\n \"sample\": {},\n \"assistant_id\": 123,\n \"confirm_side_effects\": true\n}")
req, _ := http.NewRequest("PUT", 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))
}{
"data": {
"id": "f4EaLhOW2zoEsXXSOJP2r",
"name": "Order lookup v2",
"status": "disabled",
"updated": true
}
}
{
"automation_id": "f4EaLhOW2zoEsXXSOJP2r",
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": []
},
"response": null,
"binding": null
}
{
"message": "Automation not found"
}
Update automation
Rename a Famulor automation, turn it on or off, or repair it with a corrected definition.
PUT
/
api
/
user
/
automate
/
flows
/
{id}
Update automation
curl --request PUT \
--url https://app.famulor.de/api/user/automate/flows/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"enabled": true,
"flow": {},
"sample": {},
"assistant_id": 123,
"confirm_side_effects": true
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
enabled: true,
flow: {},
sample: {},
assistant_id: 123,
confirm_side_effects: true
})
};
fetch('https://app.famulor.de/api/user/automate/flows/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.famulor.de/api/user/automate/flows/{id}"
payload = {
"name": "<string>",
"enabled": True,
"flow": {},
"sample": {},
"assistant_id": 123,
"confirm_side_effects": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/automate/flows/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'enabled' => true,
'flow' => [
],
'sample' => [
],
'assistant_id' => 123,
'confirm_side_effects' => true
]),
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.de/api/user/automate/flows/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"enabled\": true,\n \"flow\": {},\n \"sample\": {},\n \"assistant_id\": 123,\n \"confirm_side_effects\": true\n}")
req, _ := http.NewRequest("PUT", 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))
}{
"data": {
"id": "f4EaLhOW2zoEsXXSOJP2r",
"name": "Order lookup v2",
"status": "disabled",
"updated": true
}
}
{
"automation_id": "f4EaLhOW2zoEsXXSOJP2r",
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": []
},
"response": null,
"binding": null
}
{
"message": "Automation not found"
}
This endpoint has two modes:
A request with none of
- Rename / toggle — pass
nameand/orenabledto rename the automation or turn it on/off. - Repair — pass a corrected
flowdefinition and the automation is rebuilt in place, re-tested with a real run, and re-activated only when the test passes. Use this after diagnosing a failure with Get automation and List automation runs.
A repair definition replaces the whole automation — it is never merged. Read the current definition first and resend the complete chain, including every step that must stay; steps you leave out are deleted. The repair test run executes the automation for real, so
confirm_side_effects: true is required again when the corrected definition contains sending steps.Path Parameters
string
required
The ID of the automation (from List automations)
Request body
string
A new name for the automation (max 255 characters). In repair mode, the current name is kept when omitted.
boolean
true to turn the automation on, false to turn it offobject
Repair mode: the corrected full definition, in the same format as Create automation (
{"trigger": {...}, "steps": [...]}). Max 1 MB.object
Sample payload for the repair test run (for assistant events, the canonical sample is used when omitted). Max 256 KB.
integer
For repairs of assistant-event automations: the assistant to (re)attach to. Usually already carried inside the definition’s trigger.
boolean
Required (
true) when the corrected definition contains steps that send messages or emails, start calls, or make non-GET HTTP requestsname, enabled or flow returns a 422 asking for at least one of them.
Response — rename / toggle
object
Response — repair
The same envelope as Create automation (automation_id, status, test, response, binding), without webhook_url — a repaired automation keeps its original webhook URL. Returned with HTTP 200; status is active, active_untested or test_failed. A repair whose test fails leaves the automation disabled; a repair rejected before the test run (e.g. no_steps) leaves the existing automation untouched.
A missing automation — or one that does not belong to your account — returns a 404 with {"message": "Automation not found"}.
{
"data": {
"id": "f4EaLhOW2zoEsXXSOJP2r",
"name": "Order lookup v2",
"status": "disabled",
"updated": true
}
}
{
"automation_id": "f4EaLhOW2zoEsXXSOJP2r",
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": []
},
"response": null,
"binding": null
}
{
"message": "Automation not found"
}
Related pages: Get automation, Restore previous version, and Authentication.
⌘I