DM Champ Docs

API automatyzacji

Automatyzacja to przepływ pracy składający się z kroków: jednego lub więcej wyzwalaczy, które go uruchamiają, a następnie działań, warunków, opóźnień, kroków AI i reszty, połączonych w graf. Jest to ta sama automatyzacja, którą widzisz i edytujesz na stronie Automatyzacje. Ten przewodnik opisuje sposób ich odczytywania i tworzenia za pomocą API.

Wszystkie poniższe przykłady pokazują formularz zapytania ?apiKey= w cURL oraz nagłówek X-API-Key w JavaScript i Pythonie. Oba działają w każdym punkcie końcowym.

Agencje: każdy punkt końcowy na tej stronie akceptuje sub_account_id jako parametr zapytania, dzięki czemu możesz odczytywać i tworzyć automatyzacje klienta za pomocą klucza agencji. sub_account_id, który nie jest jednym z kont Twoich klientów, zwraca 404. Zobacz API dla agencji.


Jak to działa: najpierw wersja robocza

API zostało zbudowane tak, aby nic nie uruchamiało się przypadkowo.

  1. Przeczytaj katalog. GET /automations/steps zawiera listę wszystkich wyzwalaczy, działań i rodzajów kroków, których możesz użyć, oraz gramatykę pisania grafu (graph_rules).
  2. Utwórz wersję roboczą. POST /automations przechowuje automatyzację wyłączoną. Nic jeszcze nie działa.
  3. Sprawdź ją. Odczytaj ją, otwórz w kreatorze (odpowiedź zawiera jej open_path) i upewnij się, że właściciel konta widział, co ona robi i dla kogo.
  4. Włącz ją. POST /automations/{automationId}/enable to osobne wywołanie. To krok, który sprawia, że dzieją się prawdziwe rzeczy: wysyłane są wiadomości, zmieniane rekordy, udostępniane narzędzia agentowi AI.

Edycja nigdy nie zmienia stanu automatyzacji (włączona/wyłączona). Oznacza to również, że edycja automatyzacji, która jest włączona, odnosi skutek natychmiast, w działającej automatyzacji. Aby bezpiecznie zmienić uruchomioną automatyzację, wyłącz ją, edytuj, sprawdź i włącz ponownie.

Każdy wysyłany graf przechodzi przez te same kontrole, które stosuje kanwa kreatora. Graf, którego nie można otworzyć lub uruchomić, jest odrzucany z 400, który dokładnie wymienia, co należy naprawić.

Dostęp

  • Konto wymaga Automatyzacji. Bez tego każde wywołanie na tej stronie zwraca 403.
  • Dostęp członka zespołu zależy od jego obszaru Automatyzacje w Zarządzaniu zespołem: odczyt (lista, pobieranie, kroki, uruchomienia, foldery) wymaga uprawnienia Widok, wszystko, co coś zmienia, wymaga Edycji.
  • Na koncie klienta, którego plan nie obejmuje tworzenia i edycji automatyzacji, wywołania zapisu zwracają 403, dokładnie tak samo, jak robi to kreator w aplikacji.

Obiekt automatyzacji

Lista zwraca podsumowanie każdej automatyzacji, bez jej kroków:

{
  "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"
}
Pole Znaczenie
id Identyfikator automatyzacji.
name Nazwa użyta na liście.
description Jedno do trzech zdań o tym, co robi, lub null.
enabled Czy jest włączona. Wyłączona automatyzacja nigdy się nie uruchamia.
updated_at Kiedy była ostatnio zmieniana.
trigger_kind Co ją uruchamia, na przykład incoming_message, schedule, webhook, agent_function lub manual. null, gdy graf nie ma jeszcze wyzwalacza.
folder_id, folder_name Folder, w którym jest zapisana, lub null, jeśli nie ma folderu.

Odczytanie jednej automatyzacji dodaje created_at oraz jej 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" }]
  }
}

Każdy krok (nodes[]) zawiera:

Pole Znaczenie
id Identyfikator kroku, unikalny w obrębie grafu.
kind Rodzaj kroku: trigger, action, condition, transform, ai, delay, loop lub respond. Zobacz Rodzaje kroków.
label Nazwa wyświetlana przy kroku w kreatorze.
alias Nazwa referencyjna kroku. Kolejne kroki odczytują jego wynik jako ${nodes.<alias>.<field>}. null w przypadku kroku, który go nie posiada (wtedy odwołuje się do niego za pomocą identyfikatora).
action Co robi krok: uruchamiana akcja lub, w przypadku kroku wyzwalacza, rodzaj wyzwalacza. null w przypadku innych kroków.
params Parametry akcji w kroku akcji lub ustawienia wyzwalacza w kroku wyzwalacza. null w przypadku każdego innego rodzaju. Zachowane dla starszych czytników: config zawiera te same wartości i więcej.
config Pełne ustawienia kroku w formie, w jakiej przechowuje je kreator, dla każdego rodzaju kroku: reguły warunku, prompt kroku AI, czas trwania opóźnienia, slug i parametry akcji.

Każde połączenie (edges[]) posiada from oraz to (identyfikatory kroków), a także branch, gdy następuje po jednej z gałęzi kroku, na przykład true lub false po warunku.

Dwie rzeczy w config są zmieniane podczas wysyłania:

  • Sekrety są ukryte. Wartości wyglądające jak dane uwierzytelniające (sekrety webhooków, tokeny, klucze API, hasła, wartości nagłówków) są zwracane jako "[redacted]". Wyślij "[redacted]" z powrotem bez zmian, a zapisana wartość zostanie zachowana.
  • Długie teksty są skracane. Pojedynczy tekst dłuższy niż około 4000 znaków jest skracany i kończy się wielokropkiem. Jeśli odsyłasz ten krok, najpierw wstaw z powrotem jego pełny tekst.

Lista automatyzacji

GET /automations zwraca automatyzacje na koncie, posortowane od najnowszych zmian, w formie podsumowań (bez kroków).

Parametry zapytania (wszystkie opcjonalne): folder_id (tylko automatyzacje w tym folderze, identyfikator z List folders lub none dla tych, które nie znajdują się w żadnym folderze), 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"]

Odpowiedź (200)

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

Jeśli usługa automatyzacji jest nieosiągalna, otrzymasz 503, nigdy pustą listę w zamian. Pusta lista zawsze oznacza brak automatyzacji.


Pobierz automatyzację

GET /automations/{automationId} zwraca jedną automatyzację wraz z pełnym grafem: rodzajem każdego kroku, etykietą, aliasem, akcją, parametrami i ustawieniami, a także połączeniami między nimi.

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

Odpowiedź (200)

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

Identyfikator, którego nie ma na tym koncie, zwraca 404.


Katalog kroków

GET /automations/steps zwraca wszystko, z czego można zbudować automatyzację:

  • node_kinds: 8 rodzajów kroków, każdy z etykietą i opisem.
  • triggers: każdy wyzwalacz, który może uruchomić automatyzację, wraz z polami ustawień (fields) i wartościami, które przekazuje do kolejnych kroków (output_keys).
  • actions: wbudowane akcje, które może wykonać krok akcji, każda z key (slug używany w grafie) oraz params, oznaczonymi required w miejscach, w których występują.
  • api_actions: operacje tego API, które może wywołać krok akcji. Bez q są one zwracane jako etykiety pogrupowane według obszarów w api_actions_by_tag, a płaska lista jest pusta, ponieważ jest ich kilkaset.
  • graph_rules: gramatyka tworzenia grafu: dane, które niesie każdy rodzaj kroku, każdy rodzaj wyzwalacza z kluczami ustawień, dostawcy akcji, nazwy gałęzi i składnia szablonów. Przeczytaj to przed utworzeniem lub edycją grafu.
  • counts: sumy dla każdej listy, niezależnie od tego, czego szukałeś.

To jest to, co oferuje kreator, a nie to, co zostało zbudowane na koncie. Sprawdź to, zanim stwierdzisz, że wyzwalacz lub akcja nie istnieje.

Parametry zapytania (wszystkie opcjonalne): q, słowo do przeszukania każdej listy (wielkość liter nie ma znaczenia) oraz sub_account_id.

Z q:

  • api_actions to płaska lista dopasowań, ograniczona do 60. api_actions_truncated to true, gdy zastosowano limit. Pierwsze dopasowania zawierają swoje parametry.
  • Akcje dla połączonych aplikacji zewnętrznych są również przeszukiwane i zwracane w app_actions. Szukaj według nazwy aplikacji, na przykład q=hubspot. Każda z nich informuje, czy konto ma połączoną tę aplikację (connected), a connected_apps zawiera listę aplikacji połączonych z kontem.
  • app_actions_unavailable to true, gdy akcji aplikacji nie udało się tym razem przeszukać. Pozostałe listy są nadal kompletne.
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()

Odpowiedź (200, skrócona)

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

Listy rodzajów kroków i wyzwalaczy poniżej pochodzą z tego punktu końcowego. Sam punkt końcowy jest zawsze aktualną listą.


Tworzenie automatyzacji

POST /automations tworzy automatyzację na podstawie nazwy i grafu. Jest ona zapisywana jako wyłączona, w formie szkicu.

Treść

Pole Wymagane Znaczenie
name Tak Jak nazywa się na liście. Krótko i konkretnie.
description Nie Jedno do trzech zdań o tym, co robi i kiedy się uruchamia.
graph Tak { nodes, edges }, patrz poniżej.
folder_id Nie Folder, w którym ma zostać zapisana, identyfikator z Listy folderów. Pominięte lub null oznacza brak folderu.

Graf. graph_rules z katalogu kroków to pełna gramatyka. W skrócie:

  • Każdy węzeł ma id (unikalny w grafie, na przykład trigger_1 lub send_reminder), type (jeden z 8 rodzajów kroków), opcjonalny label oraz ustawienia w data, pod kluczem nazwanym zgodnie z jego typem: 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 }.
  • Automatyzacja wymaga co najmniej jednego wyzwalacza. Aktualna gramatyka pozwala na maksymalnie 10, a automatyzacja uruchamia się, gdy którykolwiek z nich zostanie wywołany.
  • Każdy inny krok musi być osiągalny z wyzwalacza i żadne połączenie nie może prowadzić z powrotem do wcześniejszego kroku.
  • Każda krawędź ma source i target. Krawędzie wychodzące z warunku niosą sourceHandle true lub false. Krawędzie wychodzące z pętli niosą body lub done. Krawędzie wychodzące z opóźnienia “Czekaj na odpowiedź” niosą replied lub timed_out. Inne krawędzie nie mają sourceHandle; gramatyka wymienia resztę.
  • Slugi akcji i parametry pochodzą z katalogu. Nigdy nie zgaduj identyfikatora (agenta, tagu, listy, etapu): najpierw sprawdź go w API lub pozostaw pole jako "", aby osoba mogła wybrać je w kreatorze.
  • Pozycje są opcjonalne. Kroki bez nich są układane automatycznie.
  • Wartości z wcześniejszych kroków są zapisywane jako ${trigger.<field>} i ${nodes.<step>.<field>}. Zobacz Używanie wartości zwróconych przez wcześniejszy krok oraz Wyrażenia w przewodniku po automatyzacjach.

Graf jest akceptowany w dwóch zapisach: własnym kreatora (węzły z type i data, krawędzie z source i target, jak poniżej) oraz tym, który zwraca Pobierz automatyzację (węzły z kind, config, action, params; krawędzie z from, to, branch). Możesz więc odczytać automatyzację, zmienić krok i wysłać ją z powrotem.

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

Odpowiedź (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 to automatyzacja w postaci zapisanej, w tym samym formacie co Pobierz automatyzację.
  • draft to true, gdy jest wyłączona. Nowa automatyzacja jest zawsze szkicem, dopóki jej nie włączysz, więc enabled: false tutaj jest normalnym stanem, a nie błędem.
  • open_path to miejsce, w którym otwiera się ona w kreatorze aplikacji.
  • warnings wymienia rzeczy, których kreator nie mógł dokończyć, w formie krótkich etykiet (na przykład agent_function:not_linked). Jest pusta, gdy wszystko jest poprawne.

Operacja tworzenia nie jest bezpieczna do bezmyślnego powtarzania. Jeśli żądanie przekroczy limit czasu, wyświetl swoje automatyzacje przed ponownym wysłaniem, w przeciwnym razie możesz skończyć z dwoma szkicami.


Aktualizacja automatyzacji

PUT /automations/{automationId} zmienia nazwę, opis i/lub graf. Wyślij tylko te pola, które chcesz zmienić.

Treść: name, description, graph (wszystkie opcjonalne, wymagane przynajmniej jedno).

Operacja graph zastępuje cały graf, więc zawsze pracuj na tym, co jest zapisane:

  1. Odczytaj automatyzację za pomocą GET /automations/{automationId}.
  2. Zmień to, co jest potrzebne w tym grafie.
  3. Odeślij cały graf z powrotem, uwzględniając każdy krok.

Kiedy odsyłasz go z powrotem:

  • Zachowaj każdy element alias dokładnie w takiej formie, w jakiej go otrzymałeś. Późniejsze kroki odwołują się do kroku za pomocą jego aliasu (${nodes.<alias>.<field>}). Jeśli go zmienisz lub usuniesz, każde odwołanie do tego kroku będzie puste. Zobacz Nazywanie kroków.
  • Pozostaw wartości "[redacted]" bez zmian. Wartość wyświetlana jako "[redacted]" zachowuje swoją zapisaną wartość.
  • Przywróć skrócone teksty. Tekst, który powrócił zakończony wielokropkiem, został skrócony podczas odczytu.

Stan włączenia automatyzacji nigdy nie jest tutaj zmieniany. Jeśli jest ona włączona, Twoja edycja staje się aktywna natychmiast po zapisaniu. Gdy automatyzacja jest włączona, zmiana, która mogłaby spowodować jej samoczynne wyzwolenie, zostanie odrzucona: najpierw ją wyłącz.

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

Odpowiedź (200): ma ten sam kształt co tworzenie (automation, draft, open_path, warnings). Nieprzesłanie żadnego z name, description lub graph zwraca 400.


Włączanie i wyłączanie

POST /automations/{automationId}/enable włącza automatyzację, dzięki czemu od teraz będzie ona uruchamiana przez swój wyzwalacz. Wywołaj ją dopiero wtedy, gdy właściciel konta zapozna się z działaniem automatyzacji i jej odbiorcami oraz wyrazi zgodę na jej włączenie. Kreator odmawia włączenia grafu, którego nie może uruchomić (brak wyzwalacza, pętla, krok wyzwalający samego siebie), zwracając 400 z wyjaśnieniem przyczyny.

POST /automations/{automationId}/disable wyłącza ją (wstrzymuje). Trwające uruchomienia zostaną zakończone; nowe nie będą rozpoczynane. Wyłączenie jest zawsze dozwolone.

Żadne z tych wywołań nie wymaga treści (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"},
)

Odpowiedź (200): automatyzacja w postaci aktualnie zapisanej, w tym samym formacie co przy tworzeniu, z draft: false po włączeniu.


Historia uruchomień

GET /automations/{automationId}/runs zwraca uruchomienia jednej automatyzacji, od najnowszego: kiedy każde uruchomienie się rozpoczęło i zakończyło, co je wywołało, czy zakończyło się sukcesem oraz błąd w przypadku niepowodzenia. Odczytanie automatyzacji informuje o tym, co zrobiłaby. Historia uruchomień informuje o tym, co zrobiła, i jest to jedyny sposób, aby odróżnić automatyzację, która nigdy nie została uruchomiona, od takiej, która uruchamia się i za każdym razem kończy niepowodzeniem.

Parametry zapytania (wszystkie opcjonalne): limit (od 1 do 50, domyślnie 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"]

Odpowiedź (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 to live dla rzeczywistego uruchomienia lub safe dla bezpiecznego uruchomienia z edytora. Bezpieczne uruchomienie niczego nie wysyła, więc nie jest dowodem na to, że automatyzacja działa w rzeczywistym użyciu.
  • Pusta lista runs jest odpowiedzią, a nie brakiem danych. Odpowiedź zawiera wtedy note: albo wyzwalacz nigdy nie został uruchomiony, albo automatyzacja jest wyłączona, więc nic nie zostało uruchomione.

Foldery

Foldery służą jedynie do grupowania automatyzacji na liście. Nigdy nie zmieniają tego, co robi automatyzacja, ani tego, czy jest włączona. Zobacz Organizowanie automatyzacji w folderach.

Wyświetlanie folderów

GET /automations/folders zwraca foldery, każdy z informacją, ile automatyzacji zawiera, oraz unfiled_count: ile automatyzacji nie znajduje się w żadnym folderze.

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
}

Tworzenie folderu

POST /automations/folders za pomocą { "name": "Appointment reminders" }. Nazwa jest wymagana, może mieć do 100 znaków i musi być unikalna w ramach konta. Przenieś do niego automatyzacje za pomocą Przenieś automatyzację lub przekaż folder_id podczas tworzenia nowej.

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

Odpowiedź (201): { "success": true, "folder": { "id": "...", "name": "Appointment reminders", "automation_count": 0 } }. Nazwa, którą posiada już inny folder, zwróci 409 wraz z code: "folder_name_taken".

Zmiana nazwy folderu

PUT /automations/folders/{folderId} za pomocą { "name": "..." }. Automatyzacje w nim zawarte pozostają na swoim miejscu.

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

Usuwanie folderu

DELETE /automations/folders/{folderId} usuwa tylko folder. Automatyzacje w nim zawarte nie są usuwane: przenoszą się do folderu głównego i działają dokładnie tak samo jak wcześniej.

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

Przenoszenie automatyzacji do folderu

PUT /automations/{automationId}/folder za pomocą { "folder_id": "<folder id>" } lub { "folder_id": null }, aby usunąć ją z folderu. Wymagane jest folder_id. Zmienia się tylko miejsce, w którym wymieniona jest automatyzacja.

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

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


Katalog

Rodzaje kroków

Rodzaj Co robi
trigger Uruchamia automatyzację, gdy coś się wydarzy.
action Wykonuje jeden krok: wbudowaną akcję, akcję API, akcję połączonej aplikacji, żądanie HTTP lub wiadomość e-mail.
condition Dzieli przepływ na podstawie reguły na gałąź true i false.
transform Uruchamia krótki fragment kodu w celu przekształcenia danych między krokami.
ai Zadaje pytanie AI za pomocą napisanego przez Ciebie promptu. Może zwrócić tekst, oddzielne pola lub wybrać jedną z kilku gałęzi.
delay Czeka określony czas lub czeka na odpowiedź kontaktu (z limitem czasu).
loop Powtarza kroki wewnątrz dla każdego elementu na liście.
respond Zwraca odpowiedź na wywołanie webhooka lub wywołanie funkcji agenta AI, które rozpoczęło uruchomienie.

Wyzwalacze

Oto 40 wyzwalaczy wymienionych obecnie w katalogu, pogrupowanych tak, jak w kreatorze. Kolumna Ustawienia zawiera klucze ustawień wyzwalacza (fields), które zawężają moment jego aktywacji. Każdy wyzwalacz przyjmuje również respect_quiet_hours, run_hours, reentry oraz stop_on_response; zobacz Ustawienia automatyzacji.

Wiadomości

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Wiadomość przychodząca (incoming_message) Kontakt wysyła wiadomość na dowolnym kanale. campaign (ogranicza do jednego agenta AI), channel, message_filter_contains (słowo kluczowe), message_filter_regex (wzorzec)
Nieodebrane połączenie (missed_call) Ktoś dzwoni na jeden z Twoich numerów WhatsApp Web lub Twój własny numer SMS i nikt nie odbiera. to_number
Wiadomość dostarczona (message_delivered) Wysłana przez Ciebie wiadomość została potwierdzona jako dostarczona przez kanał. channel, agent
Wiadomość nieudana (message_failed) Wysłana przez Ciebie wiadomość nie mogła zostać dostarczona (zawiera błąd). channel, agent
Wiadomość wysłana (message_sent) Dowolna wiadomość opuszcza Twoje konto: agenta AI, Twoją, transmisję lub wiadomość uzupełniającą. Przefiltruj ją, w przeciwnym razie uruchomi się dla wszystkich. channel, sent_by
Wiadomość uzupełniająca wysłana (follow_up_sent) Automatyczna wiadomość uzupełniająca zostaje wysłana. brak
Wiadomość uzupełniająca pominięta (follow_up_skipped) Wiadomość uzupełniająca została wstrzymana, ponieważ warunek wysyłki nie został spełniony. brak
Wiadomości uzupełniające zakończone (follow_up_exhausted) Kontakt otrzymał ostatnią wiadomość uzupełniającą w sekwencji i nic więcej nie jest w kolejce. brak
Konwersacja zamknięta (conversation_closed) Czat zostaje zamknięty, z informacją o sposobie zakończenia i podsumowaniem. channel, agent
Transmisja zakończona (broadcast_completed) Transmisja zakończyła wysyłanie, z informacją o liczbie wysłanych i nieudanych wiadomości. brak
Odpowiedź leada posortowana (outreach_reply_labelled) Odpowiedź leada z zimnej kampanii e-mailowej zostaje posortowana, na przykład jako Zainteresowany. label
Komentarz Skool otrzymany (skool_comment_received) Członek komentuje post w Skool, który obserwuje jedna z Twoich reguł komentarzy. brak

Kontakty

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Nowy kontakt (contact_created) Nowa osoba kontaktuje się z Tobą po raz pierwszy na dowolnym kanale, a także w przypadku importów, API i kontaktów dodanych ręcznie. brak
Kontakt zaktualizowany (contact_updated) Pole kontaktu ulega zmianie. field
Kontakty dodane tutaj (contact_added) Tylko dla kontaktów, które samodzielnie dodasz do tej automatyzacji ze strony Kontakty. Jedno uruchomienie na kontakt. brak
Etykieta zastosowana (tag_applied) Etykieta zostaje dodana do kontaktu przez Twojego agenta AI, osobę, automatyzację lub import. tag_name, channel, applied_by
Etykieta usunięta (tag_removed) Etykieta zostaje usunięta z kontaktu. tag_name, channel
Członek Skool dołączył (skool_member_joined) Ktoś dołącza do społeczności Skool, którą posiadasz lub prowadzisz, wraz z profilem, odpowiedziami i wynikiem dopasowania. group_id, create_contact
Członek Skool zakwalifikowany (skool_member_qualified) Odpowiedzi nowego członka Skool osiągają wynik równy lub wyższy od Twojego progu. min_score

Transakcje

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Transakcja utworzona (deal_created) Nowa transakcja zostaje dodana do jednego z Twoich lejów sprzedaży. pipeline_id, stage_id
Etap transakcji zmieniony (deal_stage_changed) Transakcja przenosi się do innego etapu, wskazując etap, który opuściła i do którego weszła. pipeline_id, to_stage_id, from_stage_id
Transakcja zaktualizowana (deal_updated) Pole transakcji ulega zmianie. field

Spotkania

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Spotkanie zarezerwowane (appointment_booked) Nowe spotkanie zostaje zarezerwowane. brak
Spotkanie anulowane (appointment_cancelled) Zarezerwowane spotkanie zostaje anulowane. brak
Spotkanie przełożone (appointment_rescheduled) Zarezerwowane spotkanie zostaje przeniesione na inny termin, z podaniem starego i nowego czasu. event_id
Przed spotkaniem (appointment_upcoming) Określony czas przed każdym potwierdzonym spotkaniem, w celu wysłania przypomnień. Do pięciu przypomnień na automatyzację. offsets_minutes

Zadania

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Zadanie utworzone (task_created) Zadanie zostaje utworzone. task_type
Zadanie ukończone (task_completed) Zadanie zostaje przeniesione do etapu ukończonego. brak

Konto

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Niski stan środków (low_credit_balance) Twój stan środków spada poniżej progu alertu. brak
Kanał połączony (channel_connected) Jeden z Twoich kanałów kończy łączenie. channel
Kanał rozłączony (channel_disconnected) Jeden z Twoich kanałów zostaje rozłączony: wylogowany, odłączony lub przerwany. Numer WhatsApp Web, który łączy się automatycznie, liczy się tylko wtedy, gdy pozostaje nieaktywny przez ponad 30 minut. channel

Agencja

Wyzwalacz (kind) Aktywuje się, gdy Ustawienia
Podkonto utworzone (sub_account_created) Nowe konto klienta zostaje utworzone z poziomu Twojego pulpitu nawigacyjnego, API lub strony rejestracji. brak
Aktywność podkonta (sub_account_event) Coś dzieje się na jednym z Twoich kont klientów: kończą się środki, łączy się kanał, następuje zmiana planu. event, threshold

Ogólne i aplikacje

Wyzwalacz (kind) Uruchamia się, gdy Ustawienia
Według harmonogramu (schedule) Zgodnie z harmonogramem cron. cron, timezone
Webhook (webhook) Zewnętrzny system wywołuje adres webhook automatyzacji. webhook_secret
Funkcja agenta AI (agent_function) Twój agent AI wywołuje tę automatyzację jako funkcję podczas rozmowy. function_name, function_description, parameters, agent_ids, campaign_ids
Nowy element kanału (rss) Nowy element pojawia się w kanale RSS lub Atom. feed_url
Otrzymano e-mail (email_received) E-mail dociera do Twojej połączonej skrzynki odbiorczej. from_contains, subject_contains
Zdarzenie w aplikacji (app_event) Coś dzieje się w połączonej aplikacji: zmienia się etap transakcji, wpływa płatność, formularz zostaje przesłany. toolkit, trigger_slug, connected_account_id, config
Ręczne uruchomienie (manual) Tylko po ręcznym uruchomieniu. brak

Automatyzacja może zawierać maksymalnie jeden wyzwalacz każdego typu: webhook, app_event, agent_function, rss, schedule, email_received, appointment_upcoming oraz contact_added. Wyzwalacz, który uruchamia się po utworzeniu rekordu, nie może być połączony z akcją tworzącą ten sam rekord, ponieważ automatyzacja uruchamiałaby samą siebie.

Aby dowiedzieć się, co każdy wyzwalacz przekazuje do kolejnych kroków (output_keys) oraz poznać pełną listę akcji wraz z ich parametrami, przeczytaj GET /automations/steps. Przewodnik po automatyzacjach wyjaśnia każdy wyzwalacz językiem używanym w kreatorze.


Błędy

Każdy błąd ma standardową postać { "success": false, "error_code": <status>, "error": "..." }. Odrzucony graf zawiera dodatkowo code oraz 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 wymienia każdy problem, po jednym zdaniu z rozwiązaniem dla każdego z nich, a error jest pierwszym z nich. Napraw dokładnie to, co zostało wymienione, i wyślij cały graf ponownie. code to jeden z kodów invalid_graph, automation_graph_has_a_cycle, self_triggering_automation, no_trigger lub inny kod z kreatora.

Status Kiedy
400 Graf został odrzucony (patrz wyżej), brakuje wymaganego pola (name lub graph przy tworzeniu, folder_id przy przenoszeniu), aktualizacja nie zawierała żadnych zmian, identyfikator automatyzacji lub folderu jest nieprawidłowy, albo nazwa folderu jest brakująca, pusta lub zbyt długa (code: "invalid_name").
403 Konto nie posiada Automatyzacji; plan konta klienta nie obejmuje tworzenia i edycji automatyzacji (tylko zapis); lub uprawnienia członka zespołu do Automatyzacji są zbyt niskie (Podgląd dla odczytu, Edycja dla zapisu).
404 Brak automatyzacji o tym identyfikatorze na tym koncie, brak folderu o tym identyfikatorze (code: "folder_not_found") lub sub_account_id, który nie jest jednym z Twoich kont klientów.
409 Folder o tej nazwie już istnieje (code: "folder_name_taken").
413 Automatyzacja przekracza limit 1 MB akceptowany przez kreator. Przenieś duży kod lub dane poza jej kroki.
422 Kreator odrzucił żądanie z innego powodu. Sprawdź graf w odniesieniu do GET /automations/steps; ponowne wysłanie tego samego żądania nie pomoże.
503 Nie można było połączyć się z usługą automatyzacji. Spróbuj ponownie za chwilę. W przypadku tworzenia, najpierw wyświetl listę swoich automatyzacji, aby nie utworzyć drugiego szkicu.

Używanie tych punktów końcowych przez MCP

Każdy punkt końcowy na tej stronie jest również narzędziem dla asystenta AI, którego podłączasz przez MCP, przy zachowaniu tych samych zasad: nowa automatyzacja jest szkicem, dopóki nie zostanie włączona, a edycja działającej automatyzacji wchodzi w życie natychmiast.

Narzędzie Punkt końcowy
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

Następne kroki

  • Automatyzacje: jak działają wyzwalacze, kroki, zmienne i historia uruchomień w kreatorze.
  • API dla agencji: buduj automatyzacje na koncie klienta za pomocą sub_account_id.
  • Dokumentacja API: pełny interaktywny eksplorator punktów końcowych.