Appliquer un modèle d’automatisation
curl --request POST \
--url https://app.famulor.de/api/user/automate/templates/{key} \
--header 'Content-Type: application/json' \
--data '
{
"params": {},
"assistant_id": 123,
"name": "<string>",
"confirm_side_effects": true
}
'import requests
url = "https://app.famulor.de/api/user/automate/templates/{key}"
payload = {
"params": {},
"assistant_id": 123,
"name": "<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({params: {}, assistant_id: 123, name: '<string>', confirm_side_effects: true})
};
fetch('https://app.famulor.de/api/user/automate/templates/{key}', 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/templates/{key}",
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([
'params' => [
],
'assistant_id' => 123,
'name' => '<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/templates/{key}"
payload := strings.NewReader("{\n \"params\": {},\n \"assistant_id\": 123,\n \"name\": \"<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/templates/{key}")
.header("Content-Type", "application/json")
.body("{\n \"params\": {},\n \"assistant_id\": 123,\n \"name\": \"<string>\",\n \"confirm_side_effects\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/automate/templates/{key}")
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 \"params\": {},\n \"assistant_id\": 123,\n \"name\": \"<string>\",\n \"confirm_side_effects\": true\n}"
response = http.request(request)
puts response.read_body{
"automation_id": "aB3xYz01MnOpQrStUvWxY",
"webhook_url": null,
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": []
},
"response": null,
"binding": {
"type": "post_call",
"assistant_id": 123,
"bound": true
}
}
{
"message": "These values are required: spreadsheet_id. Ask the user for them — never guess or reuse example values.",
"error": "missing_params",
"params": [
{
"key": "spreadsheet_id",
"label": "Google Spreadsheet ID",
"description": "The spreadsheet to append rows to.",
"required": true,
"example": "1AbCdEfGhIjKlMnOpQrStUvWxYz"
}
]
}
{
"message": "No template with that key — call the template list first.",
"error": "template_not_found",
"params": null
}
Automatisations
Appliquer un modèle d’automatisation
Créez une automatisation Famulor à partir d’un modèle prêt à l’emploi et validez-la avec une véritable exécution de test.
POST
/
api
/
user
/
automate
/
templates
/
{key}
Appliquer un modèle d’automatisation
curl --request POST \
--url https://app.famulor.de/api/user/automate/templates/{key} \
--header 'Content-Type: application/json' \
--data '
{
"params": {},
"assistant_id": 123,
"name": "<string>",
"confirm_side_effects": true
}
'import requests
url = "https://app.famulor.de/api/user/automate/templates/{key}"
payload = {
"params": {},
"assistant_id": 123,
"name": "<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({params: {}, assistant_id: 123, name: '<string>', confirm_side_effects: true})
};
fetch('https://app.famulor.de/api/user/automate/templates/{key}', 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/templates/{key}",
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([
'params' => [
],
'assistant_id' => 123,
'name' => '<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/templates/{key}"
payload := strings.NewReader("{\n \"params\": {},\n \"assistant_id\": 123,\n \"name\": \"<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/templates/{key}")
.header("Content-Type", "application/json")
.body("{\n \"params\": {},\n \"assistant_id\": 123,\n \"name\": \"<string>\",\n \"confirm_side_effects\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/automate/templates/{key}")
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 \"params\": {},\n \"assistant_id\": 123,\n \"name\": \"<string>\",\n \"confirm_side_effects\": true\n}"
response = http.request(request)
puts response.read_body{
"automation_id": "aB3xYz01MnOpQrStUvWxY",
"webhook_url": null,
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": []
},
"response": null,
"binding": {
"type": "post_call",
"assistant_id": 123,
"bound": true
}
}
{
"message": "These values are required: spreadsheet_id. Ask the user for them — never guess or reuse example values.",
"error": "missing_params",
"params": [
{
"key": "spreadsheet_id",
"label": "Google Spreadsheet ID",
"description": "The spreadsheet to append rows to.",
"required": true,
"example": "1AbCdEfGhIjKlMnOpQrStUvWxYz"
}
]
}
{
"message": "No template with that key — call the template list first.",
"error": "template_not_found",
"params": null
}
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.Les modèles marqués
side_effects: true envoient réellement des messages ou démarrent réellement des appels pendant leur exécution de test — les appliquer nécessite confirm_side_effects: true, et le test cible les valeurs réelles que vous avez fournies. N’appliquez jamais un modèle avec des valeurs d’exemple ou devinées.Paramètres de chemin
string
requis
La clé du modèle (depuis Lister les modèles d’automatisation). Une clé inconnue renvoie une
404.Corps de la requête
object
Les paramètres du modèle sous forme de paires clé-valeur — consultez la liste
params du modèle pour savoir ce que chacun requiert. Les paramètres obligatoires manquants renvoient une 422 (missing_params) listant exactement ce qui est nécessaire. 64 Ko max.integer
L’assistant auquel l’automatisation résultante est associée. Requis pour les modèles avec
requires_assistant: true.string
Un nom personnalisé pour l’automatisation (255 caractères max.) ; utilise par défaut le nom du modèle
boolean
Requis (
true) pour les modèles marqués side_effects: trueRéponse
L’enveloppe de Créer une automatisation :automation_id, webhook_url (pour les modèles déclenchés par webhook tels que lead-intake-webhook et ceux de recherche en cours d’appel ; null pour les modèles déclenchés par un événement d’assistant), status (active / active_untested / test_failed), test (run_status + résultats par étape), response, binding. Renvoie 201 lorsque l’automatisation est active, 200 lorsque son exécution de test a échoué.
Un modèle dont l’exécution de test se met en pause à une étape Delay (par ex. post-call-callback) rapporte run_status: "PAUSED" — c’est un succès, pas un échec : chaque étape avant la pause s’est exécutée, et l’exécution reprendra à l’heure cible.
Codes d’erreur (422)
Les échecs définitifs renvoient{"message": "...", "error": "<code>", "params": ...} et rien n’est créé. Codes notables :
| error | Signification |
|---|---|
missing_params | Des paramètres obligatoires sont manquants — le tableau params de la réponse liste leurs spécifications complètes. |
invalid_param_choice | Un paramètre référence une ressource (par ex. une feuille de calcul) qui n’existe pas dans votre compte connecté — le message liste les choix réels par leur nom. |
needs_connection / needs_reconnection | Une connexion de compte requise est manquante ou rompue — le message contient les étapes exactes pour la corriger dans l’application Famulor (une seule fois). |
side_effects_require_confirmation | Le modèle envoie réellement — réessayez avec confirm_side_effects: true. |
assistant_required / assistant_not_found / binding_conflict | Identique à Créer une automatisation. |
{
"automation_id": "aB3xYz01MnOpQrStUvWxY",
"webhook_url": null,
"status": "active",
"test": {
"run_status": "SUCCEEDED",
"steps": []
},
"response": null,
"binding": {
"type": "post_call",
"assistant_id": 123,
"bound": true
}
}
{
"message": "These values are required: spreadsheet_id. Ask the user for them — never guess or reuse example values.",
"error": "missing_params",
"params": [
{
"key": "spreadsheet_id",
"label": "Google Spreadsheet ID",
"description": "The spreadsheet to append rows to.",
"required": true,
"example": "1AbCdEfGhIjKlMnOpQrStUvWxYz"
}
]
}
{
"message": "No template with that key — call the template list first.",
"error": "template_not_found",
"params": null
}
Pages associées : Lister les modèles d’automatisation, Créer une automatisation, et Authentification.