Automation erstellen
curl --request POST \
--url https://app.famulor.de/api/user/automate/flows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"flow": {}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', flow: {}})
};
fetch('https://app.famulor.de/api/user/automate/flows', 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"
payload = {
"name": "<string>",
"flow": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(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",
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>',
'flow' => [
]
]),
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"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"flow\": {}\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))
}{
"automation_id": "f4EaLhOW2zoEsXXSOJP2r",
"webhook_url": "https://automate.famulor.ai/api/v1/webhooks/f4EaLhOW2zoEsXXSOJP2r",
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": [
{ "name": "trigger", "status": "SUCCEEDED", "classification": "ok", "error": null },
{ "name": "step_1", "status": "SUCCEEDED", "classification": "ok", "error": null }
]
},
"response": { "ok": "true", "echo": "hello" },
"binding": null
}
{
"automation_id": "aB3xYz01MnOpQrStUvWxY",
"webhook_url": null,
"status": "active_untested",
"test": {
"run_status": "not_tested",
"steps": []
},
"response": null,
"binding": null
}
{
"message": "This automation contains steps that would REALLY send messages, emails or start calls during the test run: Send SMS. Confirm with the user first — point those steps at a safe recipient the user owns — then retry with confirm_side_effects set to true.",
"error": "side_effects_require_confirmation"
}
Automation erstellen
Erstelle eine Famulor-Automation aus einer Definition, aktiviere sie und prüfe sie mit einem echten Testlauf.
POST
/
api
/
user
/
automate
/
flows
Automation erstellen
curl --request POST \
--url https://app.famulor.de/api/user/automate/flows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"flow": {}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', flow: {}})
};
fetch('https://app.famulor.de/api/user/automate/flows', 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"
payload = {
"name": "<string>",
"flow": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(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",
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>',
'flow' => [
]
]),
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"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"flow\": {}\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))
}{
"automation_id": "f4EaLhOW2zoEsXXSOJP2r",
"webhook_url": "https://automate.famulor.ai/api/v1/webhooks/f4EaLhOW2zoEsXXSOJP2r",
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": [
{ "name": "trigger", "status": "SUCCEEDED", "classification": "ok", "error": null },
{ "name": "step_1", "status": "SUCCEEDED", "classification": "ok", "error": null }
]
},
"response": { "ok": "true", "echo": "hello" },
"binding": null
}
{
"automation_id": "aB3xYz01MnOpQrStUvWxY",
"webhook_url": null,
"status": "active_untested",
"test": {
"run_status": "not_tested",
"steps": []
},
"response": null,
"binding": null
}
{
"message": "This automation contains steps that would REALLY send messages, emails or start calls during the test run: Send SMS. Confirm with the user first — point those steps at a safe recipient the user owns — then retry with confirm_side_effects set to true.",
"error": "side_effects_require_confirmation"
}
Dieser Endpunkt erstellt eine Automation aus ihrer Definition (Trigger und verkettete Steps), aktiviert sie, führt einen echten Testlauf mit deinem Sample-Payload aus und meldet das Ergebnis Schritt für Schritt. Der Testlauf ist das Tor: schlägt der Test fehl, bleibt die Automation deaktiviert; eine Assistant-Event-Automation wird erst nach bestandenem Test an den Assistant gebunden.
Wenn eine fertige Vorlage passt, ist Anwenden einer Vorlage einfacher als eine Definition von Grund auf zu schreiben.
Die Steps werden in der angegebenen Reihenfolge an den Trigger gehängt. Nesting schreibst du nur dort, wo es nötig ist — bedingte Steps eines Unterstützte Trigger (
Steps referenzieren frühere Ausgaben über den Step-Namen —
Der Testlauf führt die Automation echt aus. Definitionen mit Steps, die Nachrichten oder E-Mails senden oder Anrufe starten, werden abgelehnt, sofern du nicht explizit
confirm_side_effects: true setzt — und dann senden diese Steps während des Tests wirklich. Richte sie auf Empfänger, die dir gehören.Definitionsformat
Dasflow-Objekt ist die Definition der Automation. Bevorzugte Form ist eine flache Liste:
{
"trigger": { ... },
"steps": [ step1, step2, ... ]
}
BRANCH-Steps unter onSuccessAction / onFailureAction. (Ein handverschachtelter Baum, in dem jeder Step unter dem nextAction des vorherigen liegt, wird ebenfalls akzeptiert.)
Eine Definition ersetzt immer die gesamte Automation — sie wird nie gemerged. Ein Trigger ohne Steps wird abgelehnt (no_steps): eine Automation, die nichts tut, kann nicht aktiviert werden.
Unterstützte Trigger (trigger.settings)
| Trigger | pieceName / triggerName | Verhalten |
|---|---|---|
| Webhook | @activepieces/piece-webhook / catch_webhook | Du erhältst eine webhook_url für externe Systeme. Der Payload kommt gewrappt: Felder als {{trigger['body']['field']}}. Synchron mit deinem Sample getestet. |
| Anruf beendet | @famulor/piece-famulor / phoneCallEnded | Erfordert assistant_id. Nach grünem Test an den Assistant gebunden. Payload-Felder liegen direkt auf dem Trigger: {{trigger['extracted_variables']['x']}}, {{trigger['customer_phone']}}, … |
| Eingehender Anruf | @famulor/piece-famulor / inboundCall | Erfordert assistant_id. Läuft, bevor der Assistant antwortet; muss in einem Respond-Step enden, der eine flache Map von Strings zurückgibt. |
| Neue Conversation | @famulor/piece-famulor / newConversation | Erfordert assistant_id. |
| Conversation beendet | Webhook-Trigger + bind_webhook: "conversation_ended" | Erfordert assistant_id. Feuert, wenn ein Chat endet; Payload kommt gewrappt — Felder über {{trigger['body']['...']}}. |
| Zeitplan | @activepieces/piece-schedule / every_x_minutes, every_day, … | Kann nicht on-demand gefeuert werden — aktiviert als active_untested; der erste geplante Lauf ist der Beweis (Runs prüfen). |
| Externe Integrationen | eigener Trigger der Integration (neue Tabellenzeile, neuer CRM-Kontakt, neuer Lead, …) | Dein verbundenes Konto wird automatisch angehängt; fehlt es oder ist es abgelaufen, erhältst du needs_connection / needs_reconnection mit den genauen Schritten in der Famulor-App. Aktiviert als active_untested. |
{{step_1['body']['field']}} für HTTP-Steps (JSON liegt unter body). Häufige Step-Formen: HTTP-Requests, Code-Transforms, Branches, Delays, Respond-Steps und Famulor-Plattform-Aktionen (SMS/WhatsApp senden, Anruf starten, Lead erneut in die Queue). Am einfachsten lernst du die genaue Form, indem du eine bestehende Automation mit Automation abrufen liest oder eine Vorlage anwendest und das Ergebnis inspizierst.
Request Body
string
erforderlich
Ein kurzer, menschenlesbarer Name für die Automation (max. 255 Zeichen)
object
erforderlich
Die Automation-Definition —
{"trigger": {...}, "steps": [...]} wie oben beschrieben. Max. 1 MB.object
Ein realistisch geformter Sample-Payload für den Testlauf (was der Trigger empfängt). Bei Assistant-Events wird bei Weglassen ein kanonisches Sample aus den Variablen des Assistants verwendet. Max. 256 KB.
integer
Pflicht für Assistant-Event-Automationen (
phoneCallEnded, inboundCall, newConversation und bind_webhook): der Assistant, an den die Automation gebunden wird. Er empfängt die echten Events erst nach bestandenem Test. (Bei Plattform-Triggern funktioniert auch die Auswahl des Assistants in settings.input.assistant — der explizite Parameter hat Vorrang.)string
Nur für webhook-getriggerte Definitionen: an das Conversation-Ended-Event des Assistants binden. Einziger unterstützter Wert:
conversation_ended. Erfordert assistant_id.boolean
Pflicht (
true), wenn die Definition Steps enthält, die Nachrichten oder E-Mails senden, Anrufe starten oder Non-GET-HTTP-Requests machen — der Testlauf führt sie echt aus.Response
Liefert201, wenn die Automation aktiv ist (active / active_untested), 200, wenn sie gebaut wurde, der Test aber fehlschlug (test_failed), und 422 für eine Definition, die den Testlauf nie erreicht hat (siehe Fehlercodes unten).
string
Die ID der erstellten Automation
string | null
Bei webhook-getriggerten Automationen (inkl. Conversation-Ended): die URL, die externe Systeme aufrufen.
null bei Assistant-Event- und Schedule-Automationen.string
active — Testlauf bestanden; die Automation ist live (und bei Assistant-Events gebunden).
active_untested — Trigger kann nicht on-demand gefeuert werden (Schedules, externe Integrationen); die Automation ist live und scharf, der erste echte Event ist der Beweis.
test_failed — Testlauf fehlgeschlagen; Automation bleibt deaktiviert. Lies test.steps für die Klassifikation pro Step.object
Ergebnis des Testlaufs
Anzeigen test-Eigenschaften
Anzeigen test-Eigenschaften
string
SUCCEEDED, PAUSED, FAILED oder not_tested (nicht testbare Trigger); selten no_run, wenn der Test keinen Ausführungsdatensatz erzeugt hat. PAUSED zählt als Erfolg: der Lauf wartet an einem Delay-Step auf die Zielzeit — alle Steps davor sind bereits gelaufen.array
Ergebnis pro Step des Testlaufs
Anzeigen Step-Eigenschaften
Anzeigen Step-Eigenschaften
string
Der Step-Name (
trigger, step_1, …)string
SUCCEEDED, FAILED oder PAUSEDstring
ok, paused_at_delay oder — bei Fehlern — wiring_error (Definition falsch: reparieren über Automation aktualisieren), missing_connection (Konto muss zuerst in der Famulor-App verbunden werden), missing_record (Sample referenziert nicht existierende Daten — oft unkritisch).string | null
Fehlermeldung des Steps, falls fehlgeschlagen
object | string | null
Bei synchron getesteten Automationen (Webhook- und Inbound-Trigger): was die Automation während des Testlaufs geantwortet hat
object | null
Bei Assistant-Event-Automationen:
{"type": "post_call" | "inbound" | "conversation" | "conversation_ended", "assistant_id": <id>, "bound": <bool>}. bound ist nur nach grünem Test true.Fehlercodes (422)
Harte Fehler liefern{"message": "...", "error": "<code>"} und nichts wird aktiviert. Wichtige Codes:
| error | Bedeutung |
|---|---|
side_effects_require_confirmation | Die Definition enthält Steps, die im Test echt senden würden — erneut mit confirm_side_effects: true versuchen, nachdem die Empfänger geprüft wurden. |
no_steps | Am Trigger hängen keine Steps. |
invalid_definition / unsupported_trigger | Der Definition fehlt der Trigger, oder der Trigger-Typ wird nicht unterstützt. |
assistant_required / assistant_not_found | Der Trigger braucht eine assistant_id, oder der Assistant gehört nicht zu deinem Account. |
binding_conflict | Der Assistant hat bereits eine Automation (oder einen Custom-Webhook) für dieses Event — ein Slot pro Event-Typ. Bestehende Automation aktualisieren oder zuerst löschen. |
needs_connection / needs_reconnection | Das Integrationskonto des Triggers muss zuerst in der Famulor-App verbunden (oder neu verbunden) werden — die Meldung enthält die genauen Schritte. |
import_failed / publish_failed / create_failed | Die Definition wurde abgelehnt oder konnte nicht aktiviert werden. |
{
"automation_id": "f4EaLhOW2zoEsXXSOJP2r",
"webhook_url": "https://automate.famulor.ai/api/v1/webhooks/f4EaLhOW2zoEsXXSOJP2r",
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": [
{ "name": "trigger", "status": "SUCCEEDED", "classification": "ok", "error": null },
{ "name": "step_1", "status": "SUCCEEDED", "classification": "ok", "error": null }
]
},
"response": { "ok": "true", "echo": "hello" },
"binding": null
}
{
"automation_id": "aB3xYz01MnOpQrStUvWxY",
"webhook_url": null,
"status": "active_untested",
"test": {
"run_status": "not_tested",
"steps": []
},
"response": null,
"binding": null
}
{
"message": "This automation contains steps that would REALLY send messages, emails or start calls during the test run: Send SMS. Confirm with the user first — point those steps at a safe recipient the user owns — then retry with confirm_side_effects set to true.",
"error": "side_effects_require_confirmation"
}
Verwandte Seiten: Vorlagen auflisten, Vorlage anwenden und Authentifizierung.
⌘I