API de automatizaciones
Una automatización es un flujo de trabajo compuesto por pasos: uno o más activadores que lo inician, seguidos de acciones, condiciones, retrasos, pasos de IA y el resto, conectados en un gráfico. Es la misma automatización que ves y editas en la página de Automatizaciones. Esta guía cubre cómo leerlas y crearlas a través de la API.
- URL base:
https://api.dmchamp.com/v1 - Autenticación: tu clave de API (consulta Autenticación)
- Errores: consulta Errores y paginación y Errores a continuación
Todos los ejemplos a continuación muestran la forma de consulta ?apiKey= en cURL y el encabezado X-API-Key en JavaScript y Python. Cualquiera de los dos funciona en todos los endpoints.
Agencias: cada endpoint en esta página acepta
sub_account_idcomo parámetro de consulta, por lo que puedes leer y crear las automatizaciones de un cliente con tu clave de agencia. Unsub_account_idque no sea una de tus cuentas de cliente devolverá404. Consulta API para agencias.
Cómo funciona: primero el borrador
La API está diseñada para que nada comience a ejecutarse por accidente.
- Lee el catálogo.
GET /automations/stepsenumera cada activador, acción y tipo de paso que puedes usar, además de la gramática para escribir un gráfico (graph_rules). - Crea un borrador.
POST /automationsalmacena la automatización desactivada. Aún no se ejecuta nada. - Compruébalo. Léelo de nuevo, ábrelo en el generador (la respuesta te da su
open_path) y asegúrate de que el propietario de la cuenta haya visto lo que hace y a quién afecta. - Actívalo.
POST /automations/{automationId}/enablees su propia llamada. Este es el paso que hace que las cosas sucedan realmente: mensajes enviados, registros modificados, herramientas proporcionadas a un agente de IA.
La edición nunca cambia si una automatización está activada o desactivada. Eso también significa que una edición en una automatización que está activada surte efecto de inmediato, en la automatización en vivo. Para cambiar una automatización en ejecución de forma segura, desactívala, edítala, compruébala y vuelve a activarla.
Cada gráfico que envías pasa por las mismas comprobaciones que aplica el lienzo del generador. Un gráfico que no se puede abrir o ejecutar es rechazado con un 400 que enumera exactamente qué corregir.
Acceso
- La cuenta necesita Automatizaciones. Sin esto, cada llamada en esta página devolverá
403. - El acceso de un miembro del equipo sigue su área de Automatizaciones en Gestión de equipos: leer (listar, obtener, pasos, ejecuciones, carpetas) requiere Ver, todo lo que cambia algo requiere Editar.
- En una cuenta de cliente cuyo plan excluye la creación y edición de automatizaciones, las llamadas de escritura devuelven
403, exactamente como lo hace el generador en la aplicación.
El objeto de automatización
La lista devuelve un resumen de cada automatización, sin sus pasos:
{
"id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
"name": "Price question auto-reply",
"description": "Replies with the price list when someone asks about prices.",
"enabled": false,
"updated_at": "2026-10-27T09:40:00.000Z",
"trigger_kind": "incoming_message",
"folder_id": "f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708",
"folder_name": "Sales"
}
| Campo | Significado |
|---|---|
id |
El id de la automatización. |
name |
Cómo se llama en la lista. |
description |
Una a tres oraciones sobre lo que hace, o null. |
enabled |
Si está activada. Una automatización desactivada nunca se ejecuta. |
updated_at |
Cuándo se cambió por última vez. |
trigger_kind |
Qué lo activa, por ejemplo incoming_message, schedule, webhook, agent_function o manual. null cuando el gráfico aún no tiene activador. |
folder_id, folder_name |
La carpeta en la que está archivada, o null si no tiene carpeta. |
Leer una automatización añade created_at y su graph:
{
"id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
"name": "Price question auto-reply",
"description": "Replies with the price list when someone asks about prices.",
"enabled": false,
"created_at": "2026-10-27T09:12:00.000Z",
"updated_at": "2026-10-27T09:40:00.000Z",
"trigger_kind": "incoming_message",
"folder_id": null,
"folder_name": null,
"graph": {
"nodes": [
{
"id": "trigger_1",
"kind": "trigger",
"label": "Incoming message",
"alias": "incoming_message",
"action": "incoming_message",
"params": { "message_filter_contains": "price" },
"config": { "kind": "incoming_message", "message_filter_contains": "price" }
},
{
"id": "send_prices",
"kind": "action",
"label": "Send message",
"alias": "send_message",
"action": "SEND_MESSAGE",
"params": { "contact_id": "${trigger.contact.id}", "body": "Hi ${trigger.contact.first_name}, here is our price list: https://example.com/prices" },
"config": { "provider": "native", "slug": "SEND_MESSAGE", "params": { "contact_id": "${trigger.contact.id}", "body": "Hi ${trigger.contact.first_name}, here is our price list: https://example.com/prices" } }
}
],
"edges": [{ "from": "trigger_1", "to": "send_prices" }]
}
}
Cada paso (nodes[]) contiene:
| Campo | Significado |
|---|---|
id |
El id del paso, único dentro del grafo. |
kind |
El tipo de paso: trigger, action, condition, transform, ai, delay, loop o respond. Consulta Tipos de paso. |
label |
El nombre que se muestra en el paso dentro del constructor. |
alias |
El nombre de referencia del paso. Los pasos posteriores leen su salida como ${nodes.<alias>.<field>}. null en un paso que no tiene ninguno (entonces se hace referencia a él por su id). |
action |
Lo que hace el paso: la acción que ejecuta, o en un paso de activación, el tipo de activación. null en otros pasos. |
params |
Los parámetros de la acción en un paso de acción, o la configuración del activador en un paso de activación. null en cualquier otro tipo. Se mantiene para lectores antiguos: config contiene los mismos valores y más. |
config |
La configuración completa del paso tal como la almacena el constructor, para cada tipo de paso: las reglas de una condición, el prompt de un paso de IA, la duración de un retraso, el slug y los parámetros de una acción. |
Cada conexión (edges[]) tiene from y to (ids de paso), y branch cuando sigue una rama de un paso, por ejemplo true o false después de una condición.
Dos cosas en config se modifican al salir:
- Los secretos están ocultos. Los valores que parecen credenciales (secretos de webhook, tokens, claves API, contraseñas, valores de cabecera) se devuelven como
"[redacted]". Envía"[redacted]"de vuelta sin cambios y se mantendrá el valor almacenado. - Los textos largos se acortan. Un texto individual de más de 4000 caracteres aproximadamente se recorta y termina con puntos suspensivos. Si envías ese paso de vuelta, primero vuelve a poner su texto completo.
Listar automatizaciones
GET /automations devuelve las automatizaciones de la cuenta, ordenadas de la más reciente a la más antigua, como resúmenes (sin pasos).
Parámetros de consulta (todos opcionales): folder_id (solo las automatizaciones en esa carpeta, un id de Listar carpetas, o none para las que no están en ninguna carpeta), sub_account_id.
cURL
curl "https://api.dmchamp.com/v1/automations?apiKey=YOUR_API_KEY&folder_id=none"
JavaScript
const res = await fetch("https://api.dmchamp.com/v1/automations?folder_id=none", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { automations } = await res.json();
Python
res = requests.get(
"https://api.dmchamp.com/v1/automations",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"folder_id": "none"},
)
automations = res.json()["automations"]
Respuesta (200)
{ "success": true, "automations": [{ "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": false, "...": "..." }] }
Si no se puede contactar con el servicio de automatización, obtendrás un 503, nunca una lista vacía en su lugar. Una lista vacía siempre significa que no hay automatizaciones.
Obtener una automatización
GET /automations/{automationId} devuelve una automatización con su grafo completo: el tipo, la etiqueta, el alias, la acción, los parámetros y la configuración de cada paso, además de las conexiones entre ellos.
curl "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f?apiKey=YOUR_API_KEY"
const res = await fetch("https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { automation } = await res.json();
res = requests.get(
"https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
headers={"X-API-Key": "YOUR_API_KEY"},
)
automation = res.json()["automation"]
Respuesta (200)
{ "success": true, "automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "graph": { "nodes": ["..."], "edges": ["..."] } } }
Un id que no pertenece a esta cuenta devuelve 404.
Catálogo de pasos
GET /automations/steps devuelve todo lo necesario para construir una automatización:
node_kinds: los 8 tipos de paso, cada uno con una etiqueta y una descripción.triggers: cada activador que puede iniciar una automatización, con sus campos de configuración (fields) y los valores que entrega a los pasos siguientes (output_keys).actions: las acciones integradas que puede ejecutar un paso de acción, cada una con sukey(el slug que utilizas en un gráfico) y suparams, marcadosrequireddonde se encuentren.api_actions: las operaciones de esta API que puede llamar un paso de acción. Sinq, se devuelven como etiquetas agrupadas por área enapi_actions_by_tag, y la lista plana está vacía, ya que hay varios cientos de ellas.graph_rules: la gramática para escribir un gráfico: los datos que contiene cada tipo de paso, cada tipo de activador con sus claves de configuración, los proveedores de acciones, los nombres de las ramas y la sintaxis de la plantilla. Léela antes de crear o editar uno.counts: los totales por lista, independientemente de lo que hayas buscado.
Esto es lo que ofrece el constructor, no lo que la cuenta ha construido. Compruébalo antes de concluir que un activador o una acción no existe.
Parámetros de consulta (todos opcionales): q, una palabra para buscar en cada lista (sin distinguir entre mayúsculas y minúsculas), y sub_account_id.
Con q:
api_actionses la lista plana de coincidencias, limitada a 60.api_actions_truncatedestruecuando se aplicó el límite. Las primeras coincidencias llevan sus parámetros.- Las acciones para aplicaciones de terceros conectadas también se buscan y se devuelven en
app_actions. Busca por el nombre de la aplicación, por ejemploq=hubspot. Cada una indica si la cuenta tiene esa aplicación conectada (connected), yconnected_appsenumera las aplicaciones que la cuenta tiene conectadas. app_actions_unavailableestruecuando no se pudieron buscar las acciones de la aplicación en esta ocasión. Las otras listas siguen estando completas.
curl "https://api.dmchamp.com/v1/automations/steps?apiKey=YOUR_API_KEY&q=tag"
const res = await fetch("https://api.dmchamp.com/v1/automations/steps?q=tag", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { triggers, actions, graph_rules } = await res.json();
res = requests.get(
"https://api.dmchamp.com/v1/automations/steps",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"q": "tag"},
)
catalogue = res.json()
Respuesta (200, abreviada)
{
"success": true,
"q": "tag",
"node_kinds": [{ "kind": "trigger", "label": "Trigger", "description": "Starts the automation when an event happens." }],
"triggers": [
{
"kind": "tag_applied",
"label": "Tag applied",
"group": "Contacts",
"fields": ["tag_name", "channel", "applied_by"],
"output_keys": ["contact.id", "contact.first_name", "..."]
}
],
"actions": [
{
"key": "SET_CONTACT_TAG",
"label": "Set contact tag",
"group": "Contacts",
"provider": "native",
"params": [{ "key": "contact_id", "required": true }, { "key": "tag", "required": true }]
}
],
"api_actions": ["..."],
"app_actions": [],
"graph_rules": "GRAPH: { nodes: [{ id, type, label?, data }], edges: [{ source, target, sourceHandle? }] } ...",
"counts": { "node_kinds": 8, "triggers": 40, "actions": 44, "api_actions": 454 }
}
Las listas de tipos de paso y activadores a continuación se toman de este endpoint. El endpoint en sí es siempre la lista actual.
Crear una automatización
POST /automations crea una automatización a partir de un nombre y un gráfico. Se almacena desactivada, como borrador.
Cuerpo
| Campo | Obligatorio | Significado |
|---|---|---|
name |
Sí | Cómo se llama en la lista. Corto y específico. |
description |
No | De una a tres frases sobre lo que hace y cuándo se ejecuta. |
graph |
Sí | { nodes, edges }, ver más abajo. |
folder_id |
No | La carpeta donde guardarlo, un id de Listar carpetas. Si se omite o es null, no va a ninguna carpeta. |
El gráfico. graph_rules del catálogo de pasos es la gramática completa. En resumen:
- Cada nodo tiene un
id(único en el gráfico, por ejemplotrigger_1osend_reminder), untype(uno de los 8 tipos de paso), unlabelopcional y su configuración endata, bajo una clave con el nombre de su tipo:data.trigger = { kind, ... },data.action = { provider, slug, params },data.condition = { ... },data.delay = { seconds },data.ai = { prompt },data.loop = { over },data.transform = { language, code },data.respond = { status, body, content_type }. - Una automatización necesita al menos un activador. La gramática activa permite hasta 10, y la automatización comienza cuando cualquiera de ellos se dispara.
- Cualquier otro paso debe ser alcanzable desde un activador, y ninguna conexión puede conducir de vuelta a un paso anterior.
- Cada borde tiene un
sourcey untarget. Los bordes que salen de una condición llevansourceHandletrueofalse. Los bordes que salen de un bucle llevanbodyodone. Los bordes que salen de un retraso de Esperar respuesta llevanrepliedotimed_out. Otros bordes no tienensourceHandle; la gramática enumera el resto. - Los slugs y parámetros de acción provienen del catálogo. Nunca adivines un id (un agente, una etiqueta, una lista, una etapa): búscala primero con la API o deja el campo como
""para que la persona elija en el constructor. - Las posiciones son opcionales. Los pasos sin una se disponen automáticamente.
- Los valores de pasos anteriores se escriben como
${trigger.<field>}y${nodes.<step>.<field>}. Consulta Usar lo que devolvió un paso anterior y Expresiones en la guía de Automatizaciones.
El gráfico se acepta en dos grafías: la propia del constructor (nodos con type y data, bordes con source y target, como se muestra a continuación) y la que responde Obtener una automatización (nodos con kind, config, action, params; bordes con from, to, branch). Así que puedes leer una automatización, cambiar un paso y enviarla de vuelta.
curl -X POST "https://api.dmchamp.com/v1/automations?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Price question auto-reply",
"description": "Replies with the price list when someone asks about prices.",
"graph": {
"nodes": [
{ "id": "trigger_1", "type": "trigger", "label": "Incoming message",
"data": { "trigger": { "kind": "incoming_message", "message_filter_contains": "price" } } },
{ "id": "send_prices", "type": "action", "label": "Send message",
"data": { "action": { "provider": "native", "slug": "SEND_MESSAGE",
"params": { "contact_id": "${trigger.contact.id}", "body": "Hi ${trigger.contact.first_name}, here is our price list: https://example.com/prices" } } } }
],
"edges": [{ "source": "trigger_1", "target": "send_prices" }]
}
}'
const res = await fetch("https://api.dmchamp.com/v1/automations", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ name: "Price question auto-reply", graph: { nodes, edges } }),
});
const { automation, draft, open_path, warnings } = await res.json();
res = requests.post(
"https://api.dmchamp.com/v1/automations",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"name": "Price question auto-reply", "graph": {"nodes": nodes, "edges": edges}},
)
draft = res.json()
Respuesta (201)
{
"success": true,
"automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": false, "graph": { "...": "..." } },
"draft": true,
"open_path": "/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
"warnings": []
}
automationes la automatización tal como se almacena, con la misma forma que Obtener una automatización.draftestruemientras está desactivada. Una nueva automatización es siempre un borrador hasta que la habilitas, por lo queenabled: falseaquí es normal, no un fallo.open_pathes donde se abre en el constructor de la aplicación.warningsenumera las cosas que el constructor no pudo terminar, como etiquetas cortas (por ejemploagent_function:not_linked). Está vacío cuando todo está limpio.
Una creación no es segura para repetirse a ciegas. Si una solicitud agota el tiempo de espera, enumere sus automatizaciones antes de enviarla de nuevo, o podría terminar con dos borradores.
Actualizar una automatización
PUT /automations/{automationId} cambia el nombre, la descripción y/o el gráfico. Envíe solo los campos que desea cambiar.
Cuerpo: name, description, graph (todos opcionales, al menos uno).
Un graph reemplaza el gráfico completo, así que trabaje siempre a partir de lo que está almacenado:
- Lea la automatización con
GET /automations/{automationId}. - Cambie lo que necesite en ese gráfico.
- Envíe el gráfico completo de vuelta, incluyendo cada paso.
Cuando lo envíe de vuelta:
- Mantenga cada
aliasde paso exactamente como lo recibió. Los pasos posteriores hacen referencia a un paso por su alias (${nodes.<alias>.<field>}). Si lo cambia o lo elimina, todas las referencias a ese paso quedarán vacías. Consulte Cómo nombrar sus pasos. - Deje los valores
"[redacted]"tal como están. Un valor mostrado como"[redacted]"conserva su valor almacenado. - Restaure los textos acortados. Un texto que se devolvió terminando en puntos suspensivos se recortó durante la lectura.
El estado de activación de la automatización nunca se modifica aquí. Si está activada, su edición estará activa tan pronto como se guarde. Mientras una automatización está activada, se rechaza cualquier cambio que pueda provocar que se active a sí misma: desactívela primero.
curl -X PUT "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Price question auto-reply (EN)" }'
// Read, edit, send back the whole graph
const get = await fetch(`https://api.dmchamp.com/v1/automations/${id}`, { headers: { "X-API-Key": "YOUR_API_KEY" } });
const { automation } = await get.json();
const step = automation.graph.nodes.find((n) => n.id === "send_prices");
step.config.params.body = "Hi ${trigger.contact.first_name}, our new price list: https://example.com/prices";
await fetch(`https://api.dmchamp.com/v1/automations/${id}`, {
method: "PUT",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ graph: automation.graph }),
});
url = f"https://api.dmchamp.com/v1/automations/{automation_id}"
automation = requests.get(url, headers={"X-API-Key": "YOUR_API_KEY"}).json()["automation"]
# ...edit automation["graph"] here, keeping every alias...
requests.put(url, headers={"X-API-Key": "YOUR_API_KEY"}, json={"graph": automation["graph"]})
Respuesta (200): tiene la misma forma que una creación (automation, draft, open_path, warnings). Si no se envía ninguno de los valores name, description o graph, se devuelve 400.
Habilitar y deshabilitar
POST /automations/{automationId}/enable activa una automatización, por lo que se ejecutará según su activador a partir de ahora. Llámelo solo una vez que el propietario de la cuenta haya visto qué hace la automatización y a quién afecta, y haya aceptado activarla. El generador se niega a activar un gráfico que no puede ejecutarse (sin activador, con un bucle o con un paso que se activa a sí mismo) y devuelve un 400 que explica el motivo.
POST /automations/{automationId}/disable la desactiva (la pausa). Las ejecuciones que ya están en curso finalizan; no se inician nuevas ejecuciones. La desactivación siempre está permitida.
Ninguna de las llamadas requiere un cuerpo.
curl -X POST "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/enable?apiKey=YOUR_API_KEY"
await fetch("https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/disable", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY" },
});
requests.post(
"https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/enable",
headers={"X-API-Key": "YOUR_API_KEY"},
)
Respuesta (200): la automatización tal como se almacena ahora, con la misma forma que una creación, con draft: false después de una habilitación.
Historial de ejecuciones
GET /automations/{automationId}/runs devuelve las ejecuciones de una automatización, de la más reciente a la más antigua: cuándo comenzó y terminó cada ejecución, qué la inició, si tuvo éxito y el error en caso de fallo. Leer la automatización le indica lo que haría. El historial de ejecuciones le indica lo que hizo, y es la única forma de distinguir una automatización que nunca se ejecutó de una que se ejecuta y falla cada vez.
Parámetros de consulta (todos opcionales): limit (de 1 a 50, valor predeterminado 10), sub_account_id.
curl "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs?apiKey=YOUR_API_KEY&limit=20"
const res = await fetch("https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs?limit=20", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { runs, note } = await res.json();
res = requests.get(
"https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"limit": 20},
)
runs = res.json()["runs"]
Respuesta (200)
{
"success": true,
"automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": true, "trigger_kind": "incoming_message" },
"runs": [
{
"id": "run_7f3a",
"status": "failed",
"trigger_source": "incoming_message",
"started_at": "2026-10-27T10:02:11.000Z",
"finished_at": "2026-10-27T10:02:12.000Z",
"error": "Contact is on Do Not Disturb list",
"cancel_reason": null,
"mode": "live"
}
]
}
modeeslivepara una ejecución real, osafepara una Ejecución segura desde el editor. Una ejecución segura no envía nada, por lo que no es prueba de que la automatización funcione en un uso real.- Una lista
runsvacía es una respuesta, no una omisión. La respuesta entonces contiene unnote: o bien el disparador nunca se ha activado, o la automatización está desactivada, por lo que no se ha ejecutado nada.
Carpetas
Las carpetas solo agrupan automatizaciones en la lista. Nunca cambian lo que hace una automatización ni si está activada. Consulte Organizar automatizaciones en carpetas.
Listar carpetas
GET /automations/folders devuelve las carpetas, cada una con la cantidad de automatizaciones que contiene, además de unfiled_count: cuántas automatizaciones no están en ninguna carpeta.
curl "https://api.dmchamp.com/v1/automations/folders?apiKey=YOUR_API_KEY"
{
"success": true,
"folders": [{ "id": "f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708", "name": "Sales", "automation_count": 3 }],
"unfiled_count": 5
}
Crear una carpeta
POST /automations/folders con { "name": "Appointment reminders" }. El nombre es obligatorio, puede tener hasta 100 caracteres y debe ser único en la cuenta. Organice las automatizaciones en ella con Mover una automatización, o pase folder_id al crear una.
curl -X POST "https://api.dmchamp.com/v1/automations/folders?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Appointment reminders" }'
Respuesta (201): { "success": true, "folder": { "id": "...", "name": "Appointment reminders", "automation_count": 0 } }. Un nombre que ya tenga otra carpeta devuelve 409 con code: "folder_name_taken".
Renombrar una carpeta
PUT /automations/folders/{folderId} con { "name": "..." }. Las automatizaciones que contiene permanecen donde están.
Respuesta (200): { "success": true, "folder": { ... } }.
Eliminar una carpeta
DELETE /automations/folders/{folderId} elimina solo la carpeta. Las automatizaciones que contiene no se eliminan: se mueven fuera de cualquier carpeta y siguen ejecutándose exactamente igual que antes.
curl -X DELETE "https://api.dmchamp.com/v1/automations/folders/f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708?apiKey=YOUR_API_KEY"
{ "success": true, "deleted": true, "moved_to_no_folder": 3, "message": "Folder deleted. 3 automations were moved to No folder; no automation was deleted." }
Mover una automatización a una carpeta
PUT /automations/{automationId}/folder con { "folder_id": "<folder id>" }, o { "folder_id": null } para sacarla de su carpeta. Se requiere folder_id. Solo cambia dónde aparece la automatización.
curl -X PUT "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/folder?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "folder_id": "f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708" }'
Respuesta (200): { "success": true, "automation_id": "...", "folder_id": "..." }.
Catálogo
Tipos de pasos
| Tipo | Qué hace |
|---|---|
trigger |
Inicia la automatización cuando ocurre algo. |
action |
Ejecuta un paso: una acción integrada, una acción de API, la acción de una aplicación conectada, una solicitud HTTP o un correo electrónico. |
condition |
Divide el flujo según una regla, en una rama true y una false. |
transform |
Ejecuta un pequeño fragmento de código para transformar datos entre pasos. |
ai |
Consulta a la IA con un prompt que tú escribes. Puede devolver texto, campos separados o elegir entre varias ramas. |
delay |
Espera durante un tiempo determinado o espera a que el contacto responda (con un tiempo de espera). |
loop |
Repite los pasos que contiene para cada elemento de una lista. |
respond |
Devuelve una respuesta a la llamada de webhook o a la llamada de función del agente de IA que inició la ejecución. |
Disparadores
Estos son los 40 disparadores que enumera el catálogo actualmente, agrupados tal como los organiza el constructor. La columna Configuración contiene las claves de configuración propias del disparador (fields), que limitan cuándo se activa. Cada disparador también acepta respect_quiet_hours, run_hours, reentry y stop_on_response; consulta Configuración de automatización.
Mensajería
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Mensaje entrante (incoming_message) |
Un contacto envía un mensaje por cualquier canal. | campaign (lo limita a un agente de IA), channel, message_filter_contains (palabra clave), message_filter_regex (patrón) |
Llamada perdida (missed_call) |
Alguien llama a uno de tus números de WhatsApp Web o a tu propio número SMS y nadie contesta. | to_number |
Mensaje entregado (message_delivered) |
Un mensaje que enviaste es confirmado como entregado por el canal. | channel, agent |
Error en mensaje (message_failed) |
Un mensaje que enviaste no pudo ser entregado, junto con el error. | channel, agent |
Mensaje enviado (message_sent) |
Cualquier mensaje sale de tu cuenta: del agente de IA, tuyo, una difusión, un seguimiento. Filtra esto, o se ejecutará en todos ellos. | channel, sent_by |
Seguimiento enviado (follow_up_sent) |
Se envía un seguimiento automático. | ninguno |
Seguimiento omitido (follow_up_skipped) |
Un seguimiento se retuvo porque su condición de envío falló. | ninguno |
Seguimientos finalizados (follow_up_exhausted) |
Un contacto recibió el último seguimiento de la secuencia y no hay nada más en cola. | ninguno |
Conversación cerrada (conversation_closed) |
Se cierra un chat, indicando cómo terminó y un resumen. | channel, agent |
Difusión finalizada (broadcast_completed) |
Una difusión ha terminado de enviarse, indicando cuántos se enviaron y cuántos fallaron. | ninguno |
Respuesta de lead clasificada (outreach_reply_labelled) |
La respuesta de un lead de correo en frío es clasificada, por ejemplo como Interesado. | label |
Comentario de Skool recibido (skool_comment_received) |
Un miembro comenta en una publicación de Skool que una de tus reglas de comentarios supervisa. | ninguno |
Contactos
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Nuevo contacto (contact_created) |
Una nueva persona te contacta por primera vez en cualquier canal, y también para importaciones, la API y contactos que creas manualmente. | ninguno |
Contacto actualizado (contact_updated) |
Un campo de contacto cambia. | field |
Contactos que añades aquí (contact_added) |
Solo para contactos que tú mismo añades a esta automatización desde la página de Contactos. Una ejecución por contacto. | ninguno |
Etiqueta aplicada (tag_applied) |
Se añade una etiqueta a un contacto, por tu agente de IA, una persona, una automatización o una importación. | tag_name, channel, applied_by |
Etiqueta eliminada (tag_removed) |
Se quita una etiqueta a un contacto. | tag_name, channel |
Miembro de Skool unido (skool_member_joined) |
Alguien se une a una comunidad de Skool que posees o administras, con su perfil, respuestas y puntuación de ajuste. | group_id, create_contact |
Miembro de Skool calificado (skool_member_qualified) |
Las respuestas de un nuevo miembro de Skool alcanzan o superan tu umbral. | min_score |
Tratos
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Negocio creado (deal_created) |
Se añade un nuevo negocio a uno de tus embudos. | pipeline_id, stage_id |
Etapa de negocio cambiada (deal_stage_changed) |
Un negocio se mueve a una etapa diferente, indicando la etapa que dejó y a la que entró. | pipeline_id, to_stage_id, from_stage_id |
Negocio actualizado (deal_updated) |
Un campo de negocio cambia. | field |
Citas
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Cita reservada (appointment_booked) |
Se reserva una nueva cita. | ninguno |
Cita cancelada (appointment_cancelled) |
Se cancela una cita reservada. | ninguno |
Cita reprogramada (appointment_rescheduled) |
Una cita reservada se mueve a otra hora, indicando la hora anterior junto a la nueva. | event_id |
Antes de una cita (appointment_upcoming) |
Un tiempo determinado antes de cada cita confirmada, para recordatorios. Hasta cinco recordatorios por automatización. | offsets_minutes |
Tareas
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Tarea creada (task_created) |
Se crea una tarea. | task_type |
Tarea completada (task_completed) |
Una tarea se mueve a una etapa de completada. | ninguno |
Cuenta
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Saldo de créditos bajo (low_credit_balance) |
Tu saldo de créditos cae por debajo de tu umbral de alerta. | ninguno |
Canal conectado (channel_connected) |
Uno de tus canales termina de conectarse. | channel |
Canal desconectado (channel_disconnected) |
Uno de tus canales se cae: cierre de sesión, desvinculación o corte. Un número de WhatsApp Web que se reconecta solo cuenta si sigue caído después de 30 minutos. | channel |
Agencia
Disparador (kind) |
Se activa cuando | Configuración |
|---|---|---|
Subcuenta creada (sub_account_created) |
Se crea una nueva cuenta de cliente, desde tu panel, la API o tu página de registro. | ninguno |
Actividad de subcuenta (sub_account_event) |
Ocurre algo en una de tus cuentas de cliente: créditos bajos, conexión de un canal, cambio de plan. | event, threshold |
General y aplicaciones
Desencadenador (kind) |
Se activa cuando | Ajustes |
|---|---|---|
Programado (schedule) |
Según una programación cron. | cron, timezone |
Webhook (webhook) |
Un sistema externo llama a la dirección de webhook de la automatización. | webhook_secret |
Función de agente de IA (agent_function) |
Su agente de IA llama a esta automatización como una función durante una conversación. | function_name, function_description, parameters, agent_ids, campaign_ids |
Nuevo elemento de feed (rss) |
Aparece un nuevo elemento en un feed RSS o Atom. | feed_url |
Correo electrónico recibido (email_received) |
Llega un correo electrónico a su propio buzón conectado. | from_contains, subject_contains |
Evento de aplicación (app_event) |
Ocurre algo en una aplicación conectada: cambia la etapa de un trato, se recibe un pago, se envía un formulario. | toolkit, trigger_slug, connected_account_id, config |
Ejecución manual (manual) |
Solo cuando se inicia manualmente. | none |
Una automatización puede contener como máximo un desencadenador de cada tipo: webhook, app_event, agent_function, rss, schedule, email_received, appointment_upcoming y contact_added. Un desencadenador que se activa cuando se crea un registro no puede combinarse con la acción que crea ese mismo registro, ya que la automatización se activaría a sí misma.
Para saber qué proporciona cada desencadenador a los pasos posteriores (output_keys) y ver la lista completa de acciones con sus parámetros, lea GET /automations/steps. La guía de automatizaciones explica cada desencadenador con las palabras del constructor.
Errores
Cada error tiene el formato habitual { "success": false, "error_code": <status>, "error": "..." }. Un grafo rechazado añade code y errors:
{
"success": false,
"error_code": 400,
"code": "invalid_graph",
"error": "<the first problem, as one sentence>",
"errors": ["<the first problem, as one sentence>", "<the next problem>"]
}
errors enumera todos los problemas, cada uno con una frase que indica cómo solucionarlo, y error es el primero. Corrija exactamente lo que se indica y vuelva a enviar el grafo completo. code es uno de los códigos invalid_graph, automation_graph_has_a_cycle, self_triggering_automation, no_trigger u otro código del constructor.
| Estado | Cuándo |
|---|---|
400 |
El grafo fue rechazado (ver arriba), falta un campo obligatorio (name o graph en una creación, folder_id en un movimiento), una actualización no envió nada para cambiar, un ID de automatización o carpeta no es válido, o falta el nombre de una carpeta, está vacío o es demasiado largo (code: "invalid_name"). |
403 |
La cuenta no tiene automatizaciones; el plan de una cuenta de cliente no incluye la creación y edición de automatizaciones (solo escritura); o el acceso a Automatizaciones del miembro del equipo es demasiado bajo (Ver para lecturas, Editar para escrituras). |
404 |
No hay ninguna automatización con ese ID en esta cuenta, no hay ninguna carpeta con ese ID (code: "folder_not_found"), o un sub_account_id que no es una de sus cuentas de cliente. |
409 |
Ya existe una carpeta con ese nombre (code: "folder_name_taken"). |
413 |
La automatización es mayor que el 1 MB que acepta el constructor. Mueva el código o los datos grandes fuera de sus pasos. |
422 |
El constructor rechazó la solicitud por otro motivo. Compruebe el grafo frente a GET /automations/steps; enviar la misma solicitud de nuevo no ayudará. |
503 |
No se pudo contactar con el servicio de automatización. Inténtelo de nuevo en un momento. Para una creación, liste primero sus automatizaciones para no crear un segundo borrador. |
Uso de estos endpoints a través de MCP
Cada endpoint en esta página es también una herramienta para un asistente de IA que conecta a través de MCP, con las mismas reglas: una nueva automatización es un borrador hasta que se habilita, y una edición en una automatización en ejecución se aplica en tiempo real.
| Herramienta | Endpoint |
|---|---|
list_automations |
GET /automations |
get_automation |
GET /automations/{automationId} |
list_automation_steps |
GET /automations/steps |
create_automation |
POST /automations |
update_automation |
PUT /automations/{automationId} |
enable_automation |
POST /automations/{automationId}/enable |
disable_automation |
POST /automations/{automationId}/disable |
list_automation_runs |
GET /automations/{automationId}/runs |
list_automation_folders |
GET /automations/folders |
create_automation_folder |
POST /automations/folders |
rename_automation_folder |
PUT /automations/folders/{folderId} |
delete_automation_folder |
DELETE /automations/folders/{folderId} |
move_automation_to_folder |
PUT /automations/{automationId}/folder |
Próximos pasos
- Automatizaciones: cómo funcionan los desencadenadores, pasos, variables y el historial de ejecución en el constructor.
- API para agencias: cree automatizaciones en una cuenta de cliente con
sub_account_id. - Referencia de la API: el explorador interactivo completo de endpoints.