Apply automation template
curl --request POST \
--url https://app.famulor.de/api/user/automate/templates/{key} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"params": {},
"assistant_id": 123,
"name": "<string>",
"confirm_side_effects": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', '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));import requests
url = "https://app.famulor.de/api/user/automate/templates/{key}"
payload = {
"params": {},
"assistant_id": 123,
"name": "<string>",
"confirm_side_effects": True
}
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/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 => [
"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/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("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": "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
}
Apply automation template
Create a Famulor automation from a ready-made template and prove it with a real test run.
POST
/
api
/
user
/
automate
/
templates
/
{key}
Apply automation template
curl --request POST \
--url https://app.famulor.de/api/user/automate/templates/{key} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"params": {},
"assistant_id": 123,
"name": "<string>",
"confirm_side_effects": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', '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));import requests
url = "https://app.famulor.de/api/user/automate/templates/{key}"
payload = {
"params": {},
"assistant_id": 123,
"name": "<string>",
"confirm_side_effects": True
}
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/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 => [
"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/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("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": "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
}
This endpoint creates an automation from a template (see List automation templates), runs a real test, and — for assistant-event templates — attaches the automation to the assistant once the test passes. It returns the same envelope as Create automation.
Templates marked
side_effects: true really send messages or start calls during their test run — applying them requires confirm_side_effects: true, and the test targets the real values you supplied. Never apply a template with example or guessed values.Path Parameters
string
required
The template key (from List automation templates). An unknown key returns a
404.Request body
object
The template’s parameters as key-value pairs — see the template’s
params list for what each one needs. Missing required parameters return a 422 (missing_params) listing exactly what is needed. Max 64 KB.integer
The assistant the resulting automation attaches to. Required for templates with
requires_assistant: true.string
A custom name for the automation (max 255 characters); defaults to the template name
boolean
Required (
true) for templates marked side_effects: trueResponse
The Create automation envelope:automation_id, webhook_url (for webhook-triggered templates such as lead-intake-webhook and the mid-call lookup ones; null for assistant-event templates), status (active / active_untested / test_failed), test (run_status + per-step outcomes), response, binding. Returns 201 when the automation is active, 200 when its test run failed.
A template whose test run parks at a Delay step (e.g. post-call-callback) reports run_status: "PAUSED" — that is success, not a failure: every step before the delay ran, and the run resumes at the target time.
Error codes (422)
Hard failures return{"message": "...", "error": "<code>", "params": ...} and nothing is created. Notable codes:
| error | Meaning |
|---|---|
missing_params | Required parameters are missing — the response’s params array lists their full specs. |
invalid_param_choice | A parameter references a resource (e.g. a spreadsheet) that does not exist in your connected account — the message lists the real choices by name. |
needs_connection / needs_reconnection | A required account connection is missing or broken — the message contains the exact steps to fix it in the Famulor app (one-time). |
side_effects_require_confirmation | The template sends for real — retry with confirm_side_effects: true. |
assistant_required / assistant_not_found / binding_conflict | Same as Create automation. |
{
"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
}
Related pages: List automation templates, Create automation, and Authentication.
⌘I