Crear acción durante la llamada
curl --request POST \
--url https://app.famulor.de/api/user/tools \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"endpoint": "<string>",
"method": "<string>",
"body_format": "<string>",
"timeout": 123,
"headers": [
{
"name": "<string>",
"value": "<string>"
}
],
"static_fields": [
{
"key": "<string>",
"value": "<string>"
}
],
"schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>",
"required": true
}
]
}
'import requests
url = "https://app.famulor.de/api/user/tools"
payload = {
"name": "<string>",
"description": "<string>",
"endpoint": "<string>",
"method": "<string>",
"body_format": "<string>",
"timeout": 123,
"headers": [
{
"name": "<string>",
"value": "<string>"
}
],
"static_fields": [
{
"key": "<string>",
"value": "<string>"
}
],
"schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>",
"required": 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>',
description: '<string>',
endpoint: '<string>',
method: '<string>',
body_format: '<string>',
timeout: 123,
headers: [{name: '<string>', value: '<string>'}],
static_fields: [{key: '<string>', value: '<string>'}],
schema: [{name: '<string>', type: '<string>', description: '<string>', required: true}]
})
};
fetch('https://app.famulor.de/api/user/tools', 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/tools",
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>',
'description' => '<string>',
'endpoint' => '<string>',
'method' => '<string>',
'body_format' => '<string>',
'timeout' => 123,
'headers' => [
[
'name' => '<string>',
'value' => '<string>'
]
],
'static_fields' => [
[
'key' => '<string>',
'value' => '<string>'
]
],
'schema' => [
[
'name' => '<string>',
'type' => '<string>',
'description' => '<string>',
'required' => 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/tools"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"endpoint\": \"<string>\",\n \"method\": \"<string>\",\n \"body_format\": \"<string>\",\n \"timeout\": 123,\n \"headers\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"static_fields\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true\n }\n ]\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/tools")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"endpoint\": \"<string>\",\n \"method\": \"<string>\",\n \"body_format\": \"<string>\",\n \"timeout\": 123,\n \"headers\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"static_fields\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/tools")
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 \"description\": \"<string>\",\n \"endpoint\": \"<string>\",\n \"method\": \"<string>\",\n \"body_format\": \"<string>\",\n \"timeout\": 123,\n \"headers\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"static_fields\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Tool created successfully",
"data": {
"id": 1,
"name": "send_notification",
"description": "Use this tool to send a notification to the customer. Call this when customer requests updates.",
"type": "http",
"endpoint": "https://api.yourcompany.com/notifications/send",
"method": "POST",
"body_format": "json",
"timeout": 15,
"headers": [
{
"name": "Content-Type",
"value": "application/json"
}
],
"static_fields": [
{
"key": "caller",
"value": "{{customer_phone}}"
}
],
"schema": [
{
"name": "message",
"type": "string",
"description": "The notification message to send",
"required": true
},
{
"name": "send_sms",
"type": "boolean",
"description": "Whether to also send SMS notification",
"required": false
}
],
"created_at": "2025-10-10T12:00:00.000000Z",
"updated_at": "2025-10-10T12:00:00.000000Z"
}
}
{
"message": "The name field format is invalid.",
"errors": {
"name": [
"Tool name must contain only letters, numbers and underscores, and start with a letter or underscore."
]
}
}
{
"message": "You have reached your plan limit of 5 mid call tools. Please upgrade your plan to create more tools."
}
Acciones durante la llamada
Crear acción durante la llamada
Crea una nueva acción durante la llamada para la integración con el asistente de IA
POST
/
api
/
user
/
tools
Crear acción durante la llamada
curl --request POST \
--url https://app.famulor.de/api/user/tools \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"endpoint": "<string>",
"method": "<string>",
"body_format": "<string>",
"timeout": 123,
"headers": [
{
"name": "<string>",
"value": "<string>"
}
],
"static_fields": [
{
"key": "<string>",
"value": "<string>"
}
],
"schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>",
"required": true
}
]
}
'import requests
url = "https://app.famulor.de/api/user/tools"
payload = {
"name": "<string>",
"description": "<string>",
"endpoint": "<string>",
"method": "<string>",
"body_format": "<string>",
"timeout": 123,
"headers": [
{
"name": "<string>",
"value": "<string>"
}
],
"static_fields": [
{
"key": "<string>",
"value": "<string>"
}
],
"schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>",
"required": 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>',
description: '<string>',
endpoint: '<string>',
method: '<string>',
body_format: '<string>',
timeout: 123,
headers: [{name: '<string>', value: '<string>'}],
static_fields: [{key: '<string>', value: '<string>'}],
schema: [{name: '<string>', type: '<string>', description: '<string>', required: true}]
})
};
fetch('https://app.famulor.de/api/user/tools', 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/tools",
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>',
'description' => '<string>',
'endpoint' => '<string>',
'method' => '<string>',
'body_format' => '<string>',
'timeout' => 123,
'headers' => [
[
'name' => '<string>',
'value' => '<string>'
]
],
'static_fields' => [
[
'key' => '<string>',
'value' => '<string>'
]
],
'schema' => [
[
'name' => '<string>',
'type' => '<string>',
'description' => '<string>',
'required' => 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/tools"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"endpoint\": \"<string>\",\n \"method\": \"<string>\",\n \"body_format\": \"<string>\",\n \"timeout\": 123,\n \"headers\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"static_fields\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true\n }\n ]\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/tools")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"endpoint\": \"<string>\",\n \"method\": \"<string>\",\n \"body_format\": \"<string>\",\n \"timeout\": 123,\n \"headers\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"static_fields\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/tools")
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 \"description\": \"<string>\",\n \"endpoint\": \"<string>\",\n \"method\": \"<string>\",\n \"body_format\": \"<string>\",\n \"timeout\": 123,\n \"headers\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"static_fields\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Tool created successfully",
"data": {
"id": 1,
"name": "send_notification",
"description": "Use this tool to send a notification to the customer. Call this when customer requests updates.",
"type": "http",
"endpoint": "https://api.yourcompany.com/notifications/send",
"method": "POST",
"body_format": "json",
"timeout": 15,
"headers": [
{
"name": "Content-Type",
"value": "application/json"
}
],
"static_fields": [
{
"key": "caller",
"value": "{{customer_phone}}"
}
],
"schema": [
{
"name": "message",
"type": "string",
"description": "The notification message to send",
"required": true
},
{
"name": "send_sms",
"type": "boolean",
"description": "Whether to also send SMS notification",
"required": false
}
],
"created_at": "2025-10-10T12:00:00.000000Z",
"updated_at": "2025-10-10T12:00:00.000000Z"
}
}
{
"message": "The name field format is invalid.",
"errors": {
"name": [
"Tool name must contain only letters, numbers and underscores, and start with a letter or underscore."
]
}
}
{
"message": "You have reached your plan limit of 5 mid call tools. Please upgrade your plan to create more tools."
}
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.Parámetros del cuerpo
La API pública crea acciones durante la llamada de tipo HTTP. Las acciones durante la llamada de la plataforma de automatización (que generan un flujo vinculado) se crean desde el panel. Los valores de las acciones durante la llamada admiten variables dinámicas: usa{param} para los parámetros extraídos por la IA en la URL, y {{variable}} (p. ej., {{customer_phone}}) en la URL, en los valores de encabezado y en los valores de los campos estáticos.
string
requerido
Nombre de la acción durante la llamada: letras, números y guiones bajos, que empiece por una letra o un guion bajo (máx. 64 caracteres, p. ej.,
get_weather, book_appointment)string
requerido
Explicación detallada de cuándo y cómo debe usar la IA esta acción durante la llamada (máx. 255 caracteres)
string
requerido
URL válida del endpoint de la API a llamar (máx. 2048 caracteres)
string
requerido
Método HTTP:
GET, POST, PUT, PATCH o DELETEstring
Cómo se codifica el cuerpo de la solicitud para los métodos de escritura (POST/PUT/PATCH):
json (predeterminado) o form (application/x-www-form-urlencoded)integer
Tiempo de espera de la solicitud en segundos (1-30, predeterminado: 10)
array
array
array
Parámetros que la IA extraerá de la conversación y enviará al endpoint
Mostrar Propiedades de schema
Mostrar Propiedades de schema
string
requerido
Nombre del parámetro (1-64 caracteres, debe empezar por una letra o un guion bajo, puede contener letras, números y guiones bajos)
string
requerido
Tipo de parámetro:
string, number, float o booleanstring
requerido
Descripción que ayuda a la IA a entender cómo extraer este parámetro (3-255 caracteres)
boolean
Indica si la IA debe recopilar este parámetro obligatoriamente. Los parámetros opcionales solo se envían cuando se recopiló un valor. El valor predeterminado es
false.Campos de respuesta
string
Mensaje de éxito
object
El objeto de la acción durante la llamada creada
Mostrar Propiedades de data
Mostrar Propiedades de data
integer
El identificador único de la acción durante la llamada
string
El nombre de la acción durante la llamada
string
Descripción de la acción durante la llamada
string
Tipo de acción durante la llamada:
http o automationstring
URL del endpoint de la API
string
Método HTTP
string
Codificación del cuerpo de la solicitud:
json o forminteger
Tiempo de espera de la solicitud en segundos
array
Encabezados HTTP
array
Pares clave/valor fijos que siempre se envían con la solicitud
array
Esquema de parámetros
string
Marca de tiempo ISO 8601
string
Marca de tiempo ISO 8601
{
"message": "Tool created successfully",
"data": {
"id": 1,
"name": "send_notification",
"description": "Use this tool to send a notification to the customer. Call this when customer requests updates.",
"type": "http",
"endpoint": "https://api.yourcompany.com/notifications/send",
"method": "POST",
"body_format": "json",
"timeout": 15,
"headers": [
{
"name": "Content-Type",
"value": "application/json"
}
],
"static_fields": [
{
"key": "caller",
"value": "{{customer_phone}}"
}
],
"schema": [
{
"name": "message",
"type": "string",
"description": "The notification message to send",
"required": true
},
{
"name": "send_sms",
"type": "boolean",
"description": "Whether to also send SMS notification",
"required": false
}
],
"created_at": "2025-10-10T12:00:00.000000Z",
"updated_at": "2025-10-10T12:00:00.000000Z"
}
}
{
"message": "The name field format is invalid.",
"errors": {
"name": [
"Tool name must contain only letters, numbers and underscores, and start with a letter or underscore."
]
}
}
{
"message": "You have reached your plan limit of 5 mid call tools. Please upgrade your plan to create more tools."
}
Vincular acciones durante la llamada a los asistentes
Después de crear una acción durante la llamada, vincúlala a un asistente para usarla durante las llamadas. Gestiona las asignaciones a través de la API de asistentes:- Crear asistente — Usa el parámetro
tool_idspara vincular acciones durante la llamada al crear un asistente - Actualizar asistente — Usa el parámetro
tool_idspara añadir, quitar o reemplazar acciones durante la llamada en un asistente existente
¿Necesitas todo un conjunto de herramientas en lugar de crear acciones HTTP una por una? Conecta un servidor MCP externo: las herramientas se descubren automáticamente. Consulta Servidores MCP.