Créer une automatisation
curl --request POST \
--url https://app.famulor.de/api/user/automate/flows \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"flow": {},
"sample": {},
"assistant_id": 123,
"bind_webhook": "<string>",
"confirm_side_effects": true
}
'import requests
url = "https://app.famulor.de/api/user/automate/flows"
payload = {
"name": "<string>",
"flow": {},
"sample": {},
"assistant_id": 123,
"bind_webhook": "<string>",
"confirm_side_effects": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
flow: {},
sample: {},
assistant_id: 123,
bind_webhook: '<string>',
confirm_side_effects: true
})
};
fetch('https://app.famulor.de/api/user/automate/flows', 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.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' => [
],
'sample' => [
],
'assistant_id' => 123,
'bind_webhook' => '<string>',
'confirm_side_effects' => true
]),
CURLOPT_HTTPHEADER => [
"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 \"sample\": {},\n \"assistant_id\": 123,\n \"bind_webhook\": \"<string>\",\n \"confirm_side_effects\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
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.de/api/user/automate/flows")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"flow\": {},\n \"sample\": {},\n \"assistant_id\": 123,\n \"bind_webhook\": \"<string>\",\n \"confirm_side_effects\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/automate/flows")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"flow\": {},\n \"sample\": {},\n \"assistant_id\": 123,\n \"bind_webhook\": \"<string>\",\n \"confirm_side_effects\": true\n}"
response = http.request(request)
puts response.read_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"
}
Automatisations
Créer une automatisation
Créez une automatisation Famulor à partir d’une définition, activez-la et validez-la avec une véritable exécution de test.
POST
/
api
/
user
/
automate
/
flows
Créer une automatisation
curl --request POST \
--url https://app.famulor.de/api/user/automate/flows \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"flow": {},
"sample": {},
"assistant_id": 123,
"bind_webhook": "<string>",
"confirm_side_effects": true
}
'import requests
url = "https://app.famulor.de/api/user/automate/flows"
payload = {
"name": "<string>",
"flow": {},
"sample": {},
"assistant_id": 123,
"bind_webhook": "<string>",
"confirm_side_effects": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
flow: {},
sample: {},
assistant_id: 123,
bind_webhook: '<string>',
confirm_side_effects: true
})
};
fetch('https://app.famulor.de/api/user/automate/flows', 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.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' => [
],
'sample' => [
],
'assistant_id' => 123,
'bind_webhook' => '<string>',
'confirm_side_effects' => true
]),
CURLOPT_HTTPHEADER => [
"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 \"sample\": {},\n \"assistant_id\": 123,\n \"bind_webhook\": \"<string>\",\n \"confirm_side_effects\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
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.de/api/user/automate/flows")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"flow\": {},\n \"sample\": {},\n \"assistant_id\": 123,\n \"bind_webhook\": \"<string>\",\n \"confirm_side_effects\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/automate/flows")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"flow\": {},\n \"sample\": {},\n \"assistant_id\": 123,\n \"bind_webhook\": \"<string>\",\n \"confirm_side_effects\": true\n}"
response = http.request(request)
puts response.read_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"
}
API Famulor 1.0 (héritée). Cette page concerne uniquement Famulor 1.0 (
app.famulor.de) et est conservée pour la compatibilité. Pour la plateforme actuelle, consultez la référence API Famulor 2.0.L’exécution de test exécute réellement l’automatisation. Les définitions contenant des étapes qui envoient des messages ou des e-mails, ou démarrent des appels, sont refusées à moins que vous ne transmettiez explicitement
confirm_side_effects: true — et si vous le faites, ces étapes envoient réellement pendant le test. Ciblez des destinataires qui vous appartiennent.Le format de la définition
L’objetflow est la définition de l’automatisation. La forme privilégiée est une liste à plat :
{
"trigger": { ... },
"steps": [ step1, step2, ... ]
}
BRANCH se placent sous onSuccessAction / onFailureAction. (Un arbre imbriqué manuellement, où chaque étape se trouve sous le nextAction de la précédente, est également accepté.)
Une définition remplace toujours l’automatisation entière — elle n’est jamais fusionnée. Un déclencheur sans étapes est rejeté (no_steps) : une automatisation qui ne fait rien ne peut pas être activée.
Déclencheurs pris en charge (trigger.settings)
| Déclencheur | pieceName / triggerName | Comportement |
|---|---|---|
| Webhook | @activepieces/piece-webhook / catch_webhook | Vous obtenez une webhook_url à appeler depuis des systèmes externes. La charge utile arrive enveloppée : référencez les champs sous la forme {{trigger['body']['field']}}. Testé de manière synchrone avec votre exemple. |
| Appel téléphonique terminé | @famulor/piece-famulor / phoneCallEnded | Nécessite assistant_id. Associé à l’assistant après un test réussi. Les champs de la charge utile se trouvent directement sur le déclencheur : {{trigger['extracted_variables']['x']}}, {{trigger['customer_phone']}}, … |
| Appel entrant | @famulor/piece-famulor / inboundCall | Nécessite assistant_id. S’exécute avant que l’assistant ne réponde ; doit se terminer par une étape de réponse renvoyant une map à plat de chaînes. |
| Nouvelle conversation | @famulor/piece-famulor / newConversation | Nécessite assistant_id. |
| Conversation terminée | déclencheur webhook + bind_webhook: "conversation_ended" | Nécessite assistant_id. Se déclenche à la fin d’un chat ; la charge utile arrive enveloppée, référencez donc les champs via {{trigger['body']['...']}}. |
| Programmation (Schedule) | @activepieces/piece-schedule / every_x_minutes, every_day, … | Ne peut pas être déclenché à la demande — s’active en tant que active_untested, armé ; la première exécution planifiée en fait la preuve (consultez les exécutions). |
| Intégrations externes | le déclencheur propre à l’intégration (nouvelle ligne de feuille de calcul, nouveau contact CRM, nouveau lead, …) | Votre compte connecté est associé automatiquement ; s’il est manquant ou expiré, vous obtenez une erreur needs_connection / needs_reconnection avec les étapes exactes pour la corriger dans l’application Famulor. S’active en tant que active_untested. |
{{step_1['body']['field']}} pour les étapes HTTP (leur JSON s’imbrique sous body). Formes d’étapes courantes : requêtes HTTP, transformations de code, branchements, délais, étapes de réponse, et actions de la plateforme Famulor (envoyer un SMS/WhatsApp, démarrer un appel, remettre un lead en file d’attente). Le moyen le plus simple d’apprendre la forme exacte d’une étape est de lire une automatisation existante avec Récupérer une automatisation ou d’appliquer un modèle et d’inspecter ce qu’il a construit.
Corps de la requête
string
requis
Un nom court et lisible pour l’automatisation (255 caractères max.)
object
requis
La définition de l’automatisation —
{"trigger": {...}, "steps": [...]} comme décrit ci-dessus. 1 Mo max.object
Une charge utile d’exemple de forme réaliste pour l’exécution de test (ce que le déclencheur recevra). Pour les événements d’assistant, un exemple canonique construit à partir des propres variables de l’assistant est utilisé en cas d’omission. 256 Ko max.
integer
Requis pour les automatisations déclenchées par un événement d’assistant (
phoneCallEnded, inboundCall, newConversation, et bind_webhook) : l’assistant auquel cette automatisation s’associe. Elle commence à recevoir les événements réels de cet assistant une fois le test réussi. (Pour les déclencheurs de plateforme, sélectionner l’assistant dans settings.input.assistant du déclencheur fonctionne aussi — le paramètre explicite l’emporte.)string
Pour une définition déclenchée par webhook uniquement : l’associer à l’événement de fin de conversation de l’assistant. La seule valeur prise en charge est
conversation_ended. Nécessite assistant_id.boolean
Requis (
true) lorsque la définition contient des étapes qui envoient des messages ou des e-mails, démarrent des appels, ou effectuent des requêtes HTTP non-GET — l’exécution de test les exécute réellement.Réponse
Renvoie201 lorsque l’automatisation est active (active / active_untested), 200 lorsqu’elle a été construite mais que son exécution de test a échoué (test_failed), et 422 pour une définition qui n’a jamais atteint l’exécution de test (voir les codes d’erreur ci-dessous).
string
L’ID de l’automatisation créée
string | null
Pour les automatisations déclenchées par webhook (y compris celles de fin de conversation) : l’URL que les systèmes externes appellent pour la déclencher.
null pour les automatisations déclenchées par un événement d’assistant ou par une programmation.string
active — l’exécution de test a réussi ; l’automatisation est active (et associée, pour les événements d’assistant).
active_untested — le déclencheur ne peut pas être déclenché à la demande (programmations, intégrations externes) ; l’automatisation est active et armée, et le premier événement réel en fait la preuve.
test_failed — l’exécution de test a échoué ; l’automatisation est restée désactivée. Consultez test.steps pour la classification par étape.object
Le résultat de l’exécution de test
Afficher Propriétés de test
Afficher Propriétés de test
string
SUCCEEDED, PAUSED, FAILED, ou not_tested (déclencheurs non testables) ; rarement no_run lorsque le test n’a produit aucun enregistrement d’exécution. PAUSED compte comme un succès : l’exécution est mise en pause à une étape Delay en attendant son heure cible — chaque étape avant la pause s’est déjà exécutée.array
Résultat de l’exécution de test, étape par étape
Afficher Propriétés d’une étape
Afficher Propriétés d’une étape
string
Le nom de l’étape (
trigger, step_1, …)string
SUCCEEDED, FAILED ou PAUSEDstring
ok, paused_at_delay, ou — pour les échecs — wiring_error (la définition est incorrecte : corrigez-la et réparez via Mettre à jour une automatisation), missing_connection (un compte doit d’abord être connecté dans l’application Famulor), missing_record (l’exemple référençait des données qui n’existent pas — souvent sans gravité).string | null
Le message d’erreur de l’étape, en cas d’échec
object | string | null
Pour les automatisations testées de manière synchrone (déclencheurs webhook et entrants) : ce que l’automatisation a répondu pendant l’exécution de test
object | null
Pour les automatisations déclenchées par un événement d’assistant :
{"type": "post_call" | "inbound" | "conversation" | "conversation_ended", "assistant_id": <id>, "bound": <bool>}. bound vaut true uniquement après un test réussi.Codes d’erreur (422)
Les échecs définitifs renvoient{"message": "...", "error": "<code>"} et rien n’est activé. Codes notables :
| error | Signification |
|---|---|
side_effects_require_confirmation | La définition contient des étapes qui enverraient réellement pendant le test — réessayez avec confirm_side_effects: true après avoir vérifié les destinataires. |
no_steps | Le déclencheur n’a aucune étape qui lui est enchaînée. |
invalid_definition / unsupported_trigger | Il manque le déclencheur à la définition, ou elle utilise un type de déclencheur non pris en charge. |
assistant_required / assistant_not_found | Le déclencheur a besoin d’un assistant_id, ou l’assistant n’appartient pas à votre compte. |
binding_conflict | L’assistant a déjà une automatisation (ou un webhook personnalisé) pour cet événement — un assistant dispose d’un emplacement par type d’événement. Mettez plutôt à jour l’automatisation existante, ou supprimez-la d’abord. |
needs_connection / needs_reconnection | Le compte d’intégration du déclencheur doit d’abord être connecté (ou reconnecté) dans l’application Famulor — le message contient les étapes exactes. |
import_failed / publish_failed / create_failed | La définition a été rejetée ou n’a pas pu être activée. |
{
"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"
}
Pages associées : Lister les modèles d’automatisation, Appliquer un modèle d’automatisation, et Authentification.