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.
- Podstawowy adres URL:
https://api.dmchamp.com/v1 - Uwierzytelnianie: Twój klucz API (zobacz Uwierzytelnianie)
- Błędy: zobacz Błędy i stronicowanie oraz Błędy poniżej
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_idjako 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, zwraca404. Zobacz API dla agencji.
Jak to działa: najpierw wersja robocza
API zostało zbudowane tak, aby nic nie uruchamiało się przypadkowo.
- Przeczytaj katalog.
GET /automations/stepszawiera listę wszystkich wyzwalaczy, działań i rodzajów kroków, których możesz użyć, oraz gramatykę pisania grafu (graph_rules). - Utwórz wersję roboczą.
POST /automationsprzechowuje automatyzację wyłączoną. Nic jeszcze nie działa. - 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. - Włącz ją.
POST /automations/{automationId}/enableto 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 zkey(slug używany w grafie) orazparams, oznaczonymirequiredw miejscach, w których występują.api_actions: operacje tego API, które może wywołać krok akcji. Bezqsą one zwracane jako etykiety pogrupowane według obszarów wapi_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_actionsto płaska lista dopasowań, ograniczona do 60.api_actions_truncatedtotrue, 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ładq=hubspot. Każda z nich informuje, czy konto ma połączoną tę aplikację (connected), aconnected_appszawiera listę aplikacji połączonych z kontem. app_actions_unavailabletotrue, 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ładtrigger_1lubsend_reminder),type(jeden z 8 rodzajów kroków), opcjonalnylabeloraz ustawienia wdata, 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
sourceitarget. Krawędzie wychodzące z warunku niosąsourceHandletruelubfalse. Krawędzie wychodzące z pętli niosąbodylubdone. Krawędzie wychodzące z opóźnienia “Czekaj na odpowiedź” niosąrepliedlubtimed_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": []
}
automationto automatyzacja w postaci zapisanej, w tym samym formacie co Pobierz automatyzację.drafttotrue, gdy jest wyłączona. Nowa automatyzacja jest zawsze szkicem, dopóki jej nie włączysz, więcenabled: falsetutaj jest normalnym stanem, a nie błędem.open_pathto miejsce, w którym otwiera się ona w kreatorze aplikacji.warningswymienia rzeczy, których kreator nie mógł dokończyć, w formie krótkich etykiet (na przykładagent_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:
- Odczytaj automatyzację za pomocą
GET /automations/{automationId}. - Zmień to, co jest potrzebne w tym grafie.
- Odeślij cały graf z powrotem, uwzględniając każdy krok.
Kiedy odsyłasz go z powrotem:
- Zachowaj każdy element
aliasdokł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"
}
]
}
modetolivedla rzeczywistego uruchomienia lubsafedla 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
runsjest odpowiedzią, a nie brakiem danych. Odpowiedź zawiera wtedynote: 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.