DM Champ Docs

Automations-API

Eine Automatisierung ist ein Workflow, der aus Schritten besteht: einem oder mehreren Triggern, die ihn starten, gefolgt von Aktionen, Bedingungen, Verzögerungen, KI-Schritten und dem Rest, die zu einem Graphen verbunden sind. Es ist dieselbe Automatisierung, die Sie auf der Seite Automatisierungen sehen und bearbeiten können. Dieser Leitfaden behandelt das Lesen und Erstellen dieser Automatisierungen über die API.

Alle Beispiele unten zeigen die ?apiKey=-Abfrageform in cURL und den X-API-Key-Header in JavaScript und Python. Beides funktioniert an jedem Endpunkt.

Agenturen: Jeder Endpunkt auf dieser Seite akzeptiert sub_account_id als Abfrageparameter, sodass Sie die Automatisierungen eines Kunden mit Ihrem Agenturschlüssel lesen und erstellen können. Ein sub_account_id, das kein Kundenkonto von Ihnen ist, gibt 404 zurück. Siehe API für Agenturen.


Funktionsweise: Zuerst ein Entwurf

Die API ist so aufgebaut, dass nichts versehentlich gestartet wird.

  1. Katalog lesen. GET /automations/steps listet jeden Trigger, jede Aktion und jeden Schritttyp auf, den Sie verwenden können, sowie die Grammatik zum Schreiben eines Graphen (graph_rules).
  2. Entwurf erstellen. POST /automations speichert die Automatisierung im Status ausgeschaltet. Es läuft noch nichts.
  3. Überprüfen. Lesen Sie sie zurück, öffnen Sie sie im Builder (die Antwort liefert Ihnen die open_path) und stellen Sie sicher, dass der Kontoinhaber gesehen hat, was sie tut und für wen.
  4. Einschalten. POST /automations/{automationId}/enable ist ein eigener Aufruf. Dies ist der Schritt, der echte Aktionen auslöst: Nachrichten werden gesendet, Datensätze geändert, Werkzeuge an einen KI-Agenten übergeben.

Das Bearbeiten ändert niemals, ob eine Automatisierung ein- oder ausgeschaltet ist. Das bedeutet auch, dass eine Änderung an einer eingeschalteten Automatisierung sofort wirksam wird, direkt in der laufenden Automatisierung. Um eine laufende Automatisierung sicher zu ändern, deaktivieren Sie sie, bearbeiten Sie sie, überprüfen Sie sie und aktivieren Sie sie erneut.

Jeder Graph, den Sie senden, durchläuft dieselben Prüfungen, die auch der Builder-Canvas anwendet. Ein Graph, der nicht geöffnet oder ausgeführt werden kann, wird mit einem 400 abgelehnt, das genau auflistet, was zu korrigieren ist.

Zugriff

  • Das Konto benötigt Automatisierungen. Ohne diese Berechtigung gibt jeder Aufruf auf dieser Seite 403 zurück.
  • Der Zugriff eines Teammitglieds richtet sich nach seinem Bereich Automatisierungen in der Teamverwaltung: Lesen (Liste, Abrufen, Schritte, Ausführungen, Ordner) erfordert Anzeigen, alles, was etwas ändert, erfordert Bearbeiten.
  • Bei einem Kundenkonto, dessen Plan das Erstellen und Bearbeiten von Automatisierungen nicht vorsieht, geben die Schreibaufrufe 403 zurück, genau wie der Builder in der App.

Das Automatisierungsobjekt

Die Liste gibt eine Zusammenfassung jeder Automatisierung zurück, ohne deren Schritte:

{
  "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"
}
Feld Bedeutung
id Die ID der Automatisierung.
name Wie sie in der Liste genannt wird.
description Ein bis drei Sätze darüber, was sie tut, oder null.
enabled Ob sie eingeschaltet ist. Eine deaktivierte Automatisierung läuft nie.
updated_at Wann sie zuletzt geändert wurde.
trigger_kind Was sie auslöst, zum Beispiel incoming_message, schedule, webhook, agent_function oder manual. null, wenn der Graph noch keinen Trigger hat.
folder_id, folder_name Der Ordner, in dem sie abgelegt ist, oder null für keinen Ordner.

Das Lesen einer Automatisierung fügt created_at und deren graph hinzu:

{
  "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" }]
  }
}

Jeder Schritt (nodes[]) enthält:

Feld Bedeutung
id Die ID des Schritts, eindeutig innerhalb des Graphen.
kind Die Art des Schritts: trigger, action, condition, transform, ai, delay, loop oder respond. Siehe Schrittarten.
label Der Name, der im Builder auf dem Schritt angezeigt wird.
alias Der Referenzname des Schritts. Spätere Schritte lesen dessen Ausgabe als ${nodes.<alias>.<field>}. null bei einem Schritt, der keinen hat (er wird dann über seine ID referenziert).
action Was der Schritt tut: die Aktion, die er ausführt, oder bei einem Trigger-Schritt die Trigger-Art. null bei anderen Schritten.
params Die Parameter der Aktion bei einem Aktionsschritt oder die Einstellungen des Triggers bei einem Trigger-Schritt. null bei jeder anderen Art. Für ältere Reader beibehalten: config enthält dieselben Werte und mehr.
config Die vollständigen Einstellungen des Schritts, wie sie der Builder speichert, für jede Art von Schritt: die Regeln einer Bedingung, der Prompt eines KI-Schritts, die Dauer einer Verzögerung, der Slug und die Parameter einer Aktion.

Jede Verbindung (edges[]) hat from und to (Schritt-IDs) sowie branch, wenn sie einem Zweig eines Schritts folgt, zum Beispiel true oder false nach einer Bedingung.

Zwei Dinge in config werden beim Export geändert:

  • Geheimnisse werden verborgen. Werte, die wie Anmeldedaten aussehen (Webhook-Geheimnisse, Token, API-Schlüssel, Passwörter, Header-Werte), werden als "[redacted]" zurückgegeben. Senden Sie "[redacted]" unverändert zurück, damit der gespeicherte Wert erhalten bleibt.
  • Lange Texte werden gekürzt. Ein einzelner Text, der länger als etwa 4.000 Zeichen ist, wird abgeschnitten und endet mit Auslassungspunkten. Wenn Sie diesen Schritt zurücksenden, fügen Sie zuerst den vollständigen Text wieder ein.

Automatisierungen auflisten

GET /automations gibt die Automatisierungen des Kontos zurück, sortiert nach der letzten Änderung, als Zusammenfassungen (ohne Schritte).

Abfrageparameter (alle optional): folder_id (nur die Automatisierungen in diesem Ordner, eine ID aus Ordner auflisten oder none für solche in keinem Ordner), 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"]

Antwort (200)

{ "success": true, "automations": [{ "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": false, "...": "..." }] }

Wenn der Automatisierungsdienst nicht erreichbar ist, erhalten Sie einen 503, niemals stattdessen eine leere Liste. Eine leere Liste bedeutet immer, dass keine Automatisierungen vorhanden sind.


Eine Automatisierung abrufen

GET /automations/{automationId} gibt eine Automatisierung mit ihrem vollständigen Graphen zurück: Art, Bezeichnung, Alias, Aktion, Parameter und Einstellungen jedes Schritts sowie die Verbindungen zwischen ihnen.

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"]

Antwort (200)

{ "success": true, "automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "graph": { "nodes": ["..."], "edges": ["..."] } } }

Eine ID, die nicht zu diesem Konto gehört, gibt 404 zurück.


Schrittkatalog

GET /automations/steps gibt alles zurück, woraus eine Automatisierung erstellt werden kann:

  • node_kinds: die 8 Arten von Schritten, jeweils mit einer Bezeichnung und einer Beschreibung.
  • triggers: jeder Auslöser, der eine Automatisierung starten kann, mit seinen Einstellungsfeldern (fields) und den Werten, die er an nachfolgende Schritte weitergibt (output_keys).
  • actions: die integrierten Aktionen, die ein Aktionsschritt ausführen kann, jeweils mit ihrem key (dem Slug, den Sie in einem Graphen verwenden) und ihrem params, markiert mit required, wo sie sich befinden.
  • api_actions: die Operationen dieser API, die ein Aktionsschritt aufrufen kann. Ohne q werden sie als nach Bereich gruppierte Bezeichnungen in api_actions_by_tag zurückgegeben, und die flache Liste ist leer, da es mehrere hundert davon gibt.
  • graph_rules: die Grammatik zum Schreiben eines Graphen: die Daten, die jede Schrittart enthält, jede Auslöserart mit ihren Einstellungsschlüsseln, die Aktionsanbieter, die Zweignamen und die Vorlagensyntax. Lesen Sie dies, bevor Sie einen erstellen oder bearbeiten.
  • counts: die Summen pro Liste, wonach auch immer Sie gesucht haben.

Dies ist das, was der Builder bietet, nicht das, was das Konto bereits erstellt hat. Überprüfen Sie dies, bevor Sie zu dem Schluss kommen, dass ein Auslöser oder eine Aktion nicht existiert.

Abfrageparameter (alle optional): q, ein Wort, um jede Liste zu durchsuchen (Groß-/Kleinschreibung wird ignoriert), und sub_account_id.

Mit q:

  • api_actions ist die flache Liste der Treffer, begrenzt auf 60. api_actions_truncated ist true, wenn das Limit angewendet wurde. Die ersten Treffer enthalten ihre Parameter.
  • Aktionen für verbundene Drittanbieter-Apps werden ebenfalls durchsucht und in app_actions zurückgegeben. Suchen Sie nach dem Namen der App, zum Beispiel q=hubspot. Jede gibt an, ob das Konto diese App verbunden hat (connected), und connected_apps listet die Apps auf, die das Konto verbunden hat.
  • app_actions_unavailable ist true, wenn die App-Aktionen diesmal nicht durchsucht werden konnten. Die anderen Listen sind weiterhin vollständig.
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()

Antwort (200, gekürzt)

{
  "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 }
}

Die Listen der Schrittarten und Auslöser unten stammen aus diesem Endpunkt. Der Endpunkt selbst ist immer die aktuelle Liste.


Eine Automatisierung erstellen

POST /automations erstellt eine Automatisierung aus einem Namen und einem Graphen. Sie wird ausgeschaltet als Entwurf gespeichert.

Textkörper

Feld Erforderlich Bedeutung
name Ja Wie es in der Liste genannt wird. Kurz und spezifisch.
description Nein Ein bis drei Sätze darüber, was es tut und wann es ausgeführt wird.
graph Ja { nodes, edges }, siehe unten.
folder_id Nein Der Ordner, in dem es abgelegt werden soll, eine ID aus Ordner auflisten. Wenn weggelassen oder null, wird es in keinem Ordner abgelegt.

Der Graph. graph_rules aus dem Schrittkatalog ist die vollständige Grammatik. Kurz gesagt:

  • Jeder Knoten hat eine id (eindeutig im Graphen, zum Beispiel trigger_1 oder send_reminder), eine type (eine der 8 Schrittarten), eine optionale label und ihre Einstellungen in data, unter einem Schlüssel, der nach ihrem Typ benannt ist: 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 }.
  • Eine Automatisierung benötigt mindestens einen Auslöser. Die Live-Grammatik erlaubt bis zu 10, und die Automatisierung startet, wenn einer von ihnen ausgelöst wird.
  • Jeder andere Schritt muss von einem Auslöser aus erreichbar sein, und keine Verbindung darf zu einem früheren Schritt zurückführen.
  • Jede Kante hat eine source und eine target. Kanten, die eine Bedingung verlassen, tragen sourceHandle true oder false. Kanten, die eine Schleife verlassen, tragen body oder done. Kanten, die eine Wartezeit auf Antwort verlassen, tragen replied oder timed_out. Andere Kanten haben keine sourceHandle; die Grammatik listet den Rest auf.
  • Aktions-Slugs und Parameter stammen aus dem Katalog. Raten Sie niemals eine ID (einen Agenten, ein Tag, eine Liste, eine Phase): Schlagen Sie sie zuerst über die API nach oder lassen Sie das Feld als "", damit die Person es im Builder auswählen kann.
  • Positionen sind optional. Schritte ohne Position werden automatisch angeordnet.
  • Werte aus früheren Schritten werden als ${trigger.<field>} und ${nodes.<step>.<field>} geschrieben. Siehe Verwendung der Rückgabewerte eines früheren Schritts und Ausdrücke im Automatisierungsleitfaden.

Der Graph wird in zwei Schreibweisen akzeptiert: die des Builders (Knoten mit type und data, Kanten mit source und target, wie unten) und die, mit der Eine Automatisierung abrufen antwortet (Knoten mit kind, config, action, params; Kanten mit from, to, branch). Sie können also eine Automatisierung lesen, einen Schritt ändern und sie zurücksenden.

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()

Antwort (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 ist die Automatisierung wie gespeichert, in der gleichen Form wie bei Eine Automatisierung abrufen.
  • draft ist true, während sie ausgeschaltet ist. Eine neue Automatisierung ist immer ein Entwurf, bis Sie sie aktivieren, daher ist enabled: false hier normal und kein Fehler.
  • open_path ist der Ort, an dem sie sich im Builder der App öffnet.
  • warnings listet Dinge auf, die der Builder nicht abschließen konnte, als kurze Bezeichnungen (zum Beispiel agent_function:not_linked). Sie ist leer, wenn alles in Ordnung ist.

Ein Erstellen-Vorgang sollte nicht blind wiederholt werden. Wenn eine Anfrage eine Zeitüberschreitung verursacht, listen Sie Ihre Automatisierungen auf, bevor Sie sie erneut senden, da Sie sonst möglicherweise zwei Entwürfe erhalten.


Automatisierung aktualisieren

PUT /automations/{automationId} ändert den Namen, die Beschreibung und/oder den Graphen. Senden Sie nur die Felder, die Sie ändern möchten.

Body: name, description, graph (alle optional, mindestens eines erforderlich).

Ein graph ersetzt den gesamten Graphen, arbeiten Sie also immer mit dem, was gespeichert ist:

  1. Lesen Sie die Automatisierung mit GET /automations/{automationId}.
  2. Ändern Sie, was Sie in diesem Graphen benötigen.
  3. Senden Sie den gesamten Graphen zurück, inklusive aller Schritte.

Wenn Sie ihn zurücksenden:

  • Behalten Sie das alias jedes Schrittes genau so bei, wie Sie es erhalten haben. Spätere Schritte beziehen sich über ihren Alias (${nodes.<alias>.<field>}) auf einen Schritt. Wenn Sie diesen ändern oder löschen, wird jeder Verweis auf diesen Schritt ungültig. Siehe Benennung Ihrer Schritte.
  • Belassen Sie "[redacted]"-Werte so, wie sie sind. Ein Wert, der als "[redacted]" angezeigt wird, behält seinen gespeicherten Wert bei.
  • Stellen Sie gekürzte Texte wieder her. Ein Text, der mit Auslassungspunkten endet, wurde beim Lesen gekürzt.

Ob die Automatisierung eingeschaltet ist, wird hier nie geändert. Wenn sie eingeschaltet ist, wird Ihre Änderung sofort nach dem Speichern wirksam. Während eine Automatisierung eingeschaltet ist, wird eine Änderung, die dazu führen würde, dass sie sich selbst auslöst, abgelehnt: Deaktivieren Sie sie zuerst.

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"]})

Antwort (200): dieselbe Struktur wie beim Erstellen (automation, draft, open_path, warnings). Wenn keines von name, description oder graph gesendet wird, wird 400 zurückgegeben.


Aktivieren und deaktivieren

POST /automations/{automationId}/enable schaltet eine Automatisierung ein, sodass sie ab sofort bei ihrem Auslöser ausgeführt wird. Rufen Sie dies erst auf, wenn die Person, der das Konto gehört, gesehen hat, was die Automatisierung tut und für wen, und der Einschaltung zugestimmt hat. Der Builder verweigert das Einschalten eines Graphen, den er nicht ausführen kann (kein Auslöser, eine Schleife, ein Schritt, der sich selbst auslöst), mit einem 400, das den Grund angibt.

POST /automations/{automationId}/disable schaltet sie aus (pausiert sie). Bereits laufende Ausführungen werden beendet; es werden keine neuen Ausführungen gestartet. Das Deaktivieren ist immer zulässig.

Keiner der Aufrufe benötigt einen Body.

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"},
)

Antwort (200): die Automatisierung in ihrer aktuellen Speicherung, in derselben Struktur wie beim Erstellen, mit draft: false nach einer Aktivierung.


Ausführungsverlauf

GET /automations/{automationId}/runs gibt die Ausführungen einer Automatisierung zurück, beginnend mit der neuesten: wann jede Ausführung gestartet und beendet wurde, was sie ausgelöst hat, ob sie erfolgreich war und welcher Fehler bei einem Fehlschlag auftrat. Das Lesen der Automatisierung zeigt Ihnen, was sie tun würde. Der Ausführungsverlauf zeigt Ihnen, was sie getan hat, und ist die einzige Möglichkeit, eine Automatisierung, die nie ausgeführt wurde, von einer zu unterscheiden, die jedes Mal ausgeführt wird und fehlschlägt.

Abfrageparameter (alle optional): limit (1 bis 50, Standard 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"]

Antwort (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 ist live für eine echte Ausführung oder safe für eine Sichere Ausführung aus dem Editor. Eine sichere Ausführung sendet nichts, ist also kein Beweis dafür, dass die Automatisierung im realen Einsatz funktioniert.
  • Eine leere runs-Liste ist eine Antwort, keine Lücke. Die Antwort enthält dann ein note: Entweder wurde der Auslöser nie aktiviert oder die Automatisierung ist ausgeschaltet, sodass nichts ausgeführt wurde.

Ordner

Ordner gruppieren Automatisierungen in der Liste lediglich. Sie ändern niemals, was eine Automatisierung tut oder ob sie eingeschaltet ist. Siehe Automatisierungen in Ordnern organisieren.

Ordner auflisten

GET /automations/folders gibt die Ordner zurück, jeweils mit der Anzahl der darin enthaltenen Automatisierungen sowie unfiled_count: wie viele Automatisierungen sich in keinem Ordner befinden.

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
}

Ordner erstellen

POST /automations/folders mit { "name": "Appointment reminders" }. Der Name ist erforderlich, darf bis zu 100 Zeichen lang sein und muss innerhalb des Kontos eindeutig sein. Verschieben Sie Automatisierungen mit Eine Automatisierung verschieben hinein oder übergeben Sie folder_id, wenn Sie eine neue erstellen.

curl -X POST "https://api.dmchamp.com/v1/automations/folders?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Appointment reminders" }'

Antwort (201): { "success": true, "folder": { "id": "...", "name": "Appointment reminders", "automation_count": 0 } }. Ein Name, den bereits ein anderer Ordner hat, gibt 409 mit code: "folder_name_taken" zurück.

Ordner umbenennen

PUT /automations/folders/{folderId} mit { "name": "..." }. Die darin enthaltenen Automatisierungen bleiben, wo sie sind.

Antwort (200): { "success": true, "folder": { ... } }.

Ordner löschen

DELETE /automations/folders/{folderId} löscht nur den Ordner. Die darin enthaltenen Automatisierungen werden nicht gelöscht: Sie werden keinem Ordner mehr zugeordnet und laufen genau wie zuvor weiter.

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." }

Eine Automatisierung in einen Ordner verschieben

PUT /automations/{automationId}/folder mit { "folder_id": "<folder id>" }, oder { "folder_id": null }, um sie aus ihrem Ordner zu entfernen. folder_id ist erforderlich. Es ändert sich nur der Ort, an dem die Automatisierung aufgelistet ist.

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" }'

Antwort (200): { "success": true, "automation_id": "...", "folder_id": "..." }.


Katalog

Schrittarten

Art Was sie bewirkt
trigger Startet die Automatisierung, wenn etwas passiert.
action Führt einen Schritt aus: eine integrierte Aktion, eine API-Aktion, eine Aktion einer verbundenen App, eine HTTP-Anfrage oder eine E-Mail.
condition Teilt den Ablauf basierend auf einer Regel in einen true- und einen false-Zweig auf.
transform Führt ein kurzes Stück Code aus, um Daten zwischen Schritten umzuwandeln.
ai Befragt die KI mit einem von Ihnen geschriebenen Prompt. Sie kann Text zurückgeben, Felder trennen oder einen von mehreren Zweigen auswählen.
delay Wartet eine festgelegte Zeit lang oder wartet auf eine Antwort des Kontakts (mit Zeitüberschreitung).
loop Wiederholt die darin enthaltenen Schritte für jedes Element in einer Liste.
respond Gibt eine Antwort an den Webhook-Aufruf oder den KI-Agenten-Funktionsaufruf zurück, der den Durchlauf gestartet hat.

Auslöser (Trigger)

Dies sind die 40 Trigger, die der Katalog heute auflistet, gruppiert so, wie der Builder sie gruppiert. Die Spalte Einstellungen enthält die eigenen Einstellungsschlüssel des Triggers (fields), die einschränken, wann er ausgelöst wird. Jeder Trigger akzeptiert außerdem respect_quiet_hours, run_hours, reentry und stop_on_response; siehe Automatisierungseinstellungen.

Messaging

Trigger (kind) Löst aus bei Einstellungen
Eingehende Nachricht (incoming_message) Ein Kontakt sendet eine Nachricht über einen beliebigen Kanal. campaign (beschränkt auf einen KI-Agenten), channel, message_filter_contains (Stichwort), message_filter_regex (Muster)
Verpasster Anruf (missed_call) Jemand ruft eine Ihrer WhatsApp Web-Nummern oder Ihre eigene SMS-Nummer an und niemand nimmt ab. to_number
Nachricht zugestellt (message_delivered) Eine von Ihnen gesendete Nachricht wird vom Kanal als zugestellt bestätigt. channel, agent
Nachricht fehlgeschlagen (message_failed) Eine von Ihnen gesendete Nachricht konnte nicht zugestellt werden, inklusive Fehler. channel, agent
Nachricht gesendet (message_sent) Jede Nachricht, die Ihr Konto verlässt: die des KI-Agenten, Ihre eigene, eine Broadcast-Nachricht, eine Nachfassaktion. Filtern Sie diese, sonst wird sie für alle ausgeführt. channel, sent_by
Nachfassaktion gesendet (follow_up_sent) Eine automatische Nachfassaktion wird versendet. keine
Nachfassaktion übersprungen (follow_up_skipped) Eine Nachfassaktion wurde zurückgehalten, weil ihre Sende-Bedingung nicht erfüllt war. keine
Nachfassaktionen beendet (follow_up_exhausted) Ein Kontakt hat die letzte Nachfassaktion in der Sequenz erhalten und es steht nichts mehr in der Warteschlange. keine
Konversation geschlossen (conversation_closed) Ein Chat wird geschlossen, inklusive Art des Abschlusses und einer Zusammenfassung. channel, agent
Broadcast beendet (broadcast_completed) Ein Broadcast wurde fertig versendet, inklusive Anzahl der versendeten und fehlgeschlagenen Nachrichten. keine
Lead-Antwort sortiert (outreach_reply_labelled) Die Antwort eines Cold-Email-Leads wird sortiert, zum Beispiel als Interessiert. label
Skool-Kommentar erhalten (skool_comment_received) Ein Mitglied kommentiert unter einem Skool-Beitrag, den eine Ihrer Kommentarregeln überwacht. keine

Kontakte

Trigger (kind) Löst aus bei Einstellungen
Neuer Kontakt (contact_created) Eine neue Person erreicht Sie zum ersten Mal über einen beliebigen Kanal, sowie bei Importen, über die API und bei Kontakten, die Sie manuell erstellen. keine
Kontakt aktualisiert (contact_updated) Ein Kontaktfeld ändert sich. field
Kontakte, die Sie hier hinzufügen (contact_added) Nur für Kontakte, die Sie selbst über die Kontaktseite in diese Automatisierung einfügen. Ein Durchlauf pro Kontakt. keine
Tag hinzugefügt (tag_applied) Ein Tag wird einem Kontakt hinzugefügt, durch Ihren KI-Agenten, eine Person, eine Automatisierung oder einen Import. tag_name, channel, applied_by
Tag entfernt (tag_removed) Ein Tag wird von einem Kontakt entfernt. tag_name, channel
Skool-Mitglied beigetreten (skool_member_joined) Jemand tritt einer Skool-Community bei, die Sie besitzen oder leiten, inklusive Profil, Antworten und Eignungs-Score. group_id, create_contact
Skool-Mitglied qualifiziert (skool_member_qualified) Die Antworten eines neuen Skool-Mitglieds erreichen oder übertreffen Ihren Schwellenwert. min_score

Deals

Trigger (kind) Löst aus bei Einstellungen
Deal erstellt (deal_created) Ein neuer Deal wird einer Ihrer Pipelines hinzugefügt. pipeline_id, stage_id
Deal-Phase geändert (deal_stage_changed) Ein Deal wechselt in eine andere Phase, unter Angabe der Phase, die er verlassen hat, und derjenigen, in die er eingetreten ist. pipeline_id, to_stage_id, from_stage_id
Deal aktualisiert (deal_updated) Ein Deal-Feld ändert sich. field

Termine

Trigger (kind) Löst aus bei Einstellungen
Termin gebucht (appointment_booked) Ein neuer Termin wird gebucht. keine
Termin storniert (appointment_cancelled) Ein gebuchter Termin wird storniert. keine
Termin verschoben (appointment_rescheduled) Ein gebuchter Termin wird auf eine andere Zeit verschoben, wobei die alte Zeit neben der neuen angezeigt wird. event_id
Vor einem Termin (appointment_upcoming) Eine festgelegte Zeit vor jedem bestätigten Termin, für Erinnerungen. Bis zu fünf Erinnerungen pro Automatisierung. offsets_minutes

Aufgaben

Trigger (kind) Löst aus bei Einstellungen
Aufgabe erstellt (task_created) Eine Aufgabe wird erstellt. task_type
Aufgabe abgeschlossen (task_completed) Eine Aufgabe wird in eine abgeschlossene Phase verschoben. keine

Konto

Trigger (kind) Löst aus bei Einstellungen
Niedriger Guthabenstand (low_credit_balance) Ihr Guthaben fällt unter Ihren Warnschwellenwert. keine
Kanal verbunden (channel_connected) Einer Ihrer Kanäle hat die Verbindung hergestellt. channel
Kanal getrennt (channel_disconnected) Einer Ihrer Kanäle ist ausgefallen: abgemeldet, entkoppelt oder unterbrochen. Eine WhatsApp Web-Nummer, die sich von selbst wieder verbindet, zählt nur, wenn sie nach 30 Minuten immer noch offline ist. channel

Agentur

Trigger (kind) Löst aus bei Einstellungen
Unterkonto erstellt (sub_account_created) Ein neues Kundenkonto wird erstellt, über Ihr Dashboard, die API oder Ihre Anmeldeseite. keine
Unterkonto-Aktivität (sub_account_event) Etwas passiert in einem Ihrer Kundenkonten: Guthaben wird knapp, ein Kanal verbindet sich, ein Planwechsel. event, threshold

Allgemein und Apps

Trigger (kind) Löst aus bei Einstellungen
Nach Zeitplan (schedule) Nach einem Cron-Zeitplan. cron, timezone
Webhook (webhook) Ein externes System ruft die Webhook-Adresse der Automatisierung auf. webhook_secret
KI-Agent-Funktion (agent_function) Ihr KI-Agent ruft diese Automatisierung während eines Gesprächs als Funktion auf. function_name, function_description, parameters, agent_ids, campaign_ids
Neues Feed-Element (rss) Ein neues Element erscheint in einem RSS- oder Atom-Feed. feed_url
E-Mail empfangen (email_received) Eine E-Mail geht in Ihrem verbundenen Postfach ein. from_contains, subject_contains
App-Ereignis (app_event) Etwas passiert in einer verbundenen App: eine Deal-Phase ändert sich, eine Zahlung geht ein, ein Formular wird abgesendet. toolkit, trigger_slug, connected_account_id, config
Manuelle Ausführung (manual) Nur wenn sie manuell gestartet wird. keine

Eine Automatisierung kann jeweils höchstens einen Trigger der Typen webhook, app_event, agent_function, rss, schedule, email_received, appointment_upcoming und contact_added enthalten. Ein Trigger, der bei der Erstellung eines Datensatzes ausgelöst wird, kann nicht mit der Aktion kombiniert werden, die denselben Datensatz erstellt, da sich die Automatisierung sonst selbst auslösen würde.

Informationen darüber, was jeder Trigger an nachfolgende Schritte (output_keys) weitergibt, sowie die vollständige Liste der Aktionen mit ihren Parametern finden Sie unter GET /automations/steps. Der Automatisierungsleitfaden erklärt jeden Trigger in der Sprache des Builders.


Fehler

Jeder Fehler hat die übliche Form { "success": false, "error_code": <status>, "error": "..." }. Ein abgelehnter Graph fügt code und errors hinzu:

{
  "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 listet jedes Problem auf, jeweils mit einem korrigierbaren Satz, und error ist der erste davon. Beheben Sie genau das, was aufgelistet ist, und senden Sie den gesamten Graphen erneut. code ist einer der Codes invalid_graph, automation_graph_has_a_cycle, self_triggering_automation, no_trigger oder ein anderer Code aus dem Builder.

Status Wann
400 Der Graph wurde abgelehnt (siehe oben), ein erforderliches Feld fehlt (name oder graph bei einer Erstellung, folder_id bei einer Verschiebung), ein Update enthielt keine Änderungen, eine Automatisierungs- oder Ordner-ID ist ungültig oder ein Ordnername fehlt, ist leer oder zu lang (code: "invalid_name").
403 Das Konto verfügt nicht über Automatisierungen; der Plan eines Kundenkontos beinhaltet nicht das Erstellen und Bearbeiten von Automatisierungen (nur Schreibzugriff); oder der Zugriff des Teammitglieds auf Automatisierungen ist zu niedrig (Anzeigen für Lesezugriff, Bearbeiten für Schreibzugriff).
404 Keine Automatisierung mit dieser ID auf diesem Konto, kein Ordner mit dieser ID (code: "folder_not_found") oder eine sub_account_id, die kein Kundenkonto von Ihnen ist.
409 Ein Ordner mit diesem Namen existiert bereits (code: "folder_name_taken").
413 Die Automatisierung ist größer als das vom Builder akzeptierte 1 MB. Verschieben Sie umfangreichen Code oder Daten aus den Schritten.
422 Der Builder hat die Anfrage aus einem anderen Grund abgelehnt. Überprüfen Sie den Graphen anhand von GET /automations/steps; das erneute Senden derselben Anfrage hilft nicht.
503 Der Automatisierungsdienst konnte nicht erreicht werden. Versuchen Sie es in einem Moment erneut. Listen Sie bei einer Erstellung zuerst Ihre Automatisierungen auf, damit Sie keinen zweiten Entwurf erstellen.

Verwendung dieser Endpunkte über MCP

Jeder Endpunkt auf dieser Seite ist auch ein Tool für einen KI-Assistenten, den Sie über MCP verbinden, mit denselben Regeln: Eine neue Automatisierung ist ein Entwurf, bis sie aktiviert wird, und eine Bearbeitung an einer laufenden Automatisierung ist sofort live.

Tool Endpunkt
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

Nächste Schritte

  • Automatisierungen: Wie Trigger, Schritte, Variablen und der Ausführungsverlauf im Builder funktionieren.
  • API für Agenturen: Erstellen Sie Automatisierungen auf einem Kundenkonto mit sub_account_id.
  • API-Referenz: Der vollständige interaktive Endpunkt-Explorer.