DM Champ Docs

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.

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_id como parámetro de consulta, por lo que puedes leer y crear las automatizaciones de un cliente con tu clave de agencia. Un sub_account_id que 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.

  1. Lee el catálogo. GET /automations/steps enumera cada activador, acción y tipo de paso que puedes usar, además de la gramática para escribir un gráfico (graph_rules).
  2. Crea un borrador. POST /automations almacena la automatización desactivada. Aún no se ejecuta nada.
  3. 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.
  4. Actívalo. POST /automations/{automationId}/enable es 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 su key (el slug que utilizas en un gráfico) y su params, marcados required donde se encuentren.
  • api_actions: las operaciones de esta API que puede llamar un paso de acción. Sin q, se devuelven como etiquetas agrupadas por área en api_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_actions es la lista plana de coincidencias, limitada a 60. api_actions_truncated es true cuando 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 ejemplo q=hubspot. Cada una indica si la cuenta tiene esa aplicación conectada (connected), y connected_apps enumera las aplicaciones que la cuenta tiene conectadas.
  • app_actions_unavailable es true cuando 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 ejemplo trigger_1 o send_reminder), un type (uno de los 8 tipos de paso), un label opcional y su configuración en data, 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 source y un target. Los bordes que salen de una condición llevan sourceHandle true o false. Los bordes que salen de un bucle llevan body o done. Los bordes que salen de un retraso de Esperar respuesta llevan replied o timed_out. Otros bordes no tienen sourceHandle; 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": []
}
  • automation es la automatización tal como se almacena, con la misma forma que Obtener una automatización.
  • draft es true mientras está desactivada. Una nueva automatización es siempre un borrador hasta que la habilitas, por lo que enabled: false aquí es normal, no un fallo.
  • open_path es donde se abre en el constructor de la aplicación.
  • warnings enumera las cosas que el constructor no pudo terminar, como etiquetas cortas (por ejemplo agent_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:

  1. Lea la automatización con GET /automations/{automationId}.
  2. Cambie lo que necesite en ese gráfico.
  3. Envíe el gráfico completo de vuelta, incluyendo cada paso.

Cuando lo envíe de vuelta:

  • Mantenga cada alias de 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"
    }
  ]
}
  • mode es live para una ejecución real, o safe para 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 runs vacía es una respuesta, no una omisión. La respuesta entonces contiene un note: 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": "..." }.


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.