Crear automatización
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"
}
Automatizaciones
Crear automatización
Crea una automatización de Famulor a partir de una definición, actívala y compruébala con una ejecución de prueba real.
POST
/
api
/
user
/
automate
/
flows
Crear automatización
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 de Famulor 1.0 (legado). Esta página se aplica únicamente a Famulor 1.0 (
app.famulor.de) y se conserva por compatibilidad. Para la plataforma actual, usa la referencia de la API de Famulor 2.0.La ejecución de prueba ejecuta la automatización de verdad. Las definiciones que contienen pasos que envían mensajes o correos, o inician llamadas, se rechazan a menos que pases explícitamente
confirm_side_effects: true; y cuando lo haces, esos pasos realmente se ejecutan durante la prueba. Dirígelos a destinatarios que te pertenezcan.El formato de la definición
El objetoflow es la definición de la automatización. La forma preferida es una lista plana:
{
"trigger": { ... },
"steps": [ step1, step2, ... ]
}
BRANCH van bajo onSuccessAction / onFailureAction. (También se acepta un árbol anidado a mano, en el que cada paso está bajo el nextAction del anterior).
Una definición siempre reemplaza toda la automatización; nunca se combina con la anterior. Un activador sin pasos se rechaza (no_steps): una automatización que no hace nada no se puede activar.
Activadores admitidos (trigger.settings)
| Activador | pieceName / triggerName | Comportamiento |
|---|---|---|
| Webhook | @activepieces/piece-webhook / catch_webhook | Obtienes una webhook_url para llamar desde sistemas externos. El payload llega envuelto: referencia los campos como {{trigger['body']['field']}}. Se prueba de forma síncrona con tu ejemplo. |
| Llamada finalizada | @famulor/piece-famulor / phoneCallEnded | Requiere assistant_id. Se vincula al asistente tras una prueba superada. Los campos del payload están directamente en el activador: {{trigger['extracted_variables']['x']}}, {{trigger['customer_phone']}}, … |
| Llamada entrante | @famulor/piece-famulor / inboundCall | Requiere assistant_id. Se ejecuta antes de que el asistente responda; debe terminar en un paso de respuesta que devuelva un mapa plano de cadenas de texto. |
| Nueva conversación | @famulor/piece-famulor / newConversation | Requiere assistant_id. |
| Conversación finalizada | activador de webhook + bind_webhook: "conversation_ended" | Requiere assistant_id. Se dispara cuando termina un chat; el payload llega envuelto, así que referencia los campos mediante {{trigger['body']['...']}}. |
| Programación | @activepieces/piece-schedule / every_x_minutes, every_day, … | No se puede disparar a demanda: se activa como active_untested; la primera ejecución programada es la prueba (consulta las ejecuciones). |
| Integraciones externas | el propio activador de la integración (nueva fila de hoja de cálculo, nuevo contacto de CRM, nuevo lead, …) | Tu cuenta conectada se vincula automáticamente; si falta o ha caducado, obtienes un error needs_connection / needs_reconnection con los pasos exactos para solucionarlo en la app de Famulor. Se activa como active_untested. |
{{step_1['body']['field']}} para pasos HTTP (su JSON se anida bajo body). Formas habituales de paso: solicitudes HTTP, transformaciones de código, ramificaciones, retrasos, pasos de respuesta y acciones de la plataforma Famulor (enviar SMS/WhatsApp, iniciar una llamada, volver a poner un lead en cola). La forma más fácil de aprender la estructura exacta de un paso es leer una automatización existente con Obtener automatización o aplicar una plantilla e inspeccionar lo que ha creado.
Cuerpo de la solicitud
string
requerido
Un nombre breve y legible para la automatización (máx. 255 caracteres)
object
requerido
La definición de la automatización —
{"trigger": {...}, "steps": [...]} como se describe arriba. Máx. 1 MB.object
Un payload de ejemplo con una forma realista para la ejecución de prueba (lo que recibirá el activador). Para eventos de asistente, si se omite se usa un ejemplo canónico construido a partir de las propias variables del asistente. Máx. 256 KB.
integer
Obligatorio para automatizaciones de eventos de asistente (
phoneCallEnded, inboundCall, newConversation y bind_webhook): el asistente al que se vincula esta automatización. Empieza a recibir los eventos reales de ese asistente después de superar la prueba. (En los activadores de plataforma, seleccionar el asistente dentro de settings.input.assistant del activador también funciona; el parámetro explícito tiene prioridad).string
Solo para una definición activada por webhook: la vincula al evento de conversación finalizada del asistente. El único valor admitido es
conversation_ended. Requiere assistant_id.boolean
Obligatorio (
true) cuando la definición contiene pasos que envían mensajes o correos, inician llamadas o hacen solicitudes HTTP que no son GET; la ejecución de prueba los ejecuta de verdad.Respuesta
Devuelve201 cuando la automatización está activa (active / active_untested), 200 cuando se creó pero su ejecución de prueba falló (test_failed), y 422 para una definición que nunca llegó a la ejecución de prueba (consulta los códigos de error más abajo).
string
El ID de la automatización creada
string | null
Para automatizaciones activadas por webhook (incluidas las de conversación finalizada): la URL que llaman los sistemas externos para dispararla.
null para automatizaciones de eventos de asistente y de programación.string
active — la ejecución de prueba se superó; la automatización está activa (y vinculada, en el caso de eventos de asistente).
active_untested — el activador no se puede disparar a demanda (programaciones, integraciones externas); la automatización está activa y lista, y el primer evento real es la prueba.
test_failed — la ejecución de prueba falló; la automatización quedó desactivada. Consulta test.steps para la clasificación por paso.object
El resultado de la ejecución de prueba
Mostrar propiedades de test
Mostrar propiedades de test
string
SUCCEEDED, PAUSED, FAILED, o not_tested (activadores que no se pueden probar); rara vez no_run cuando la prueba no generó ningún registro de ejecución. PAUSED cuenta como éxito: la ejecución está detenida en un paso de Retraso esperando su hora objetivo; todos los pasos anteriores al retraso ya se ejecutaron.array
Resultado por paso de la ejecución de prueba
Mostrar propiedades de step
Mostrar propiedades de step
string
El nombre del paso (
trigger, step_1, …)string
SUCCEEDED, FAILED o PAUSEDstring
ok, paused_at_delay, o —para fallos— wiring_error (la definición está mal: corrígela y repárala mediante Actualizar automatización), missing_connection (primero hay que conectar una cuenta en la app de Famulor), missing_record (el ejemplo hacía referencia a datos que no existen; a menudo no es grave).string | null
El mensaje de error del paso, si falló
object | string | null
Para automatizaciones probadas de forma síncrona (activadores de webhook e inbound): lo que respondió la automatización durante la ejecución de prueba
object | null
Para automatizaciones de eventos de asistente:
{"type": "post_call" | "inbound" | "conversation" | "conversation_ended", "assistant_id": <id>, "bound": <bool>}. bound solo es true después de una prueba superada.Códigos de error (422)
Los fallos graves devuelven{"message": "...", "error": "<code>"} y no se activa nada. Códigos destacados:
| error | Significado |
|---|---|
side_effects_require_confirmation | La definición contiene pasos que enviarían datos de verdad durante la prueba: vuelve a intentarlo con confirm_side_effects: true después de comprobar los destinatarios. |
no_steps | El activador no tiene pasos encadenados. |
invalid_definition / unsupported_trigger | A la definición le falta el activador, o usa un tipo de activador no compatible. |
assistant_required / assistant_not_found | El activador necesita un assistant_id, o el asistente no pertenece a tu cuenta. |
binding_conflict | El asistente ya tiene una automatización (o un webhook personalizado) para este evento: cada asistente tiene un único espacio por tipo de evento. Actualiza la automatización existente en su lugar, o elimínala primero. |
needs_connection / needs_reconnection | La cuenta de integración del activador debe conectarse (o reconectarse) primero en la app de Famulor; el mensaje contiene los pasos exactos. |
import_failed / publish_failed / create_failed | La definición fue rechazada o no se pudo activar. |
{
"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"
}
Páginas relacionadas: Listar plantillas de automatización, Aplicar plantilla de automatización, y Autenticación.