DM Champ Docs

API Otomatisasi

Otomatisasi adalah alur kerja yang terdiri dari langkah-langkah: satu atau lebih pemicu yang memulainya, kemudian tindakan, kondisi, penundaan, langkah AI, dan lainnya, yang dihubungkan ke dalam sebuah grafik. Ini adalah otomatisasi yang sama dengan yang Anda lihat dan edit di halaman Otomatisasi. Panduan ini mencakup cara membaca dan membangunnya melalui API.

Semua contoh di bawah menunjukkan bentuk kueri ?apiKey= dalam cURL dan header X-API-Key dalam JavaScript dan Python. Keduanya berfungsi di setiap endpoint.

Agensi: setiap endpoint di halaman ini menerima sub_account_id sebagai parameter kueri, sehingga Anda dapat membaca dan membangun otomatisasi klien dengan kunci agensi Anda. sub_account_id yang bukan salah satu akun klien Anda akan mengembalikan 404. Lihat API untuk Agensi.


Cara kerjanya: buat draf terlebih dahulu

API ini dibuat agar tidak ada yang berjalan secara tidak sengaja.

  1. Baca katalog. GET /automations/steps mencantumkan setiap pemicu, tindakan, dan jenis langkah yang dapat Anda gunakan, ditambah tata bahasa untuk menulis grafik (graph_rules).
  2. Buat draf. POST /automations menyimpan otomatisasi dalam keadaan nonaktif. Belum ada yang berjalan.
  3. Periksa. Baca kembali, buka di pembuat (respons memberikan open_path-nya), dan pastikan pemilik akun telah melihat apa yang dilakukan otomatisasi tersebut dan kepada siapa.
  4. Aktifkan. POST /automations/{automationId}/enable adalah panggilan tersendiri. Ini adalah langkah yang membuat hal nyata terjadi: pesan terkirim, catatan berubah, alat diberikan kepada agen AI.

Mengedit tidak akan pernah mengubah status otomatisasi apakah aktif atau nonaktif. Itu juga berarti pengeditan pada otomatisasi yang aktif akan segera berlaku pada otomatisasi yang sedang berjalan. Untuk mengubah otomatisasi yang sedang berjalan dengan aman, nonaktifkan, edit, periksa, lalu aktifkan kembali.

Setiap grafik yang Anda kirim melalui pemeriksaan yang sama dengan yang diterapkan oleh kanvas pembuat. Grafik yang tidak dapat dibuka atau dijalankan akan ditolak dengan 400 yang mencantumkan dengan tepat apa yang perlu diperbaiki.

Akses

  • Akun memerlukan Otomatisasi. Tanpanya, setiap panggilan di halaman ini akan mengembalikan 403.
  • Akses anggota tim mengikuti area Otomatisasi mereka di Manajemen Tim: membaca (daftar, ambil, langkah, proses, folder) memerlukan Lihat, segala sesuatu yang mengubah sesuatu memerlukan Edit.
  • Pada akun klien yang paketnya tidak menyertakan pembuatan dan pengeditan otomatisasi, panggilan tulis akan mengembalikan 403, persis seperti yang dilakukan pembuat di aplikasi.

Objek otomatisasi

Daftar ini mengembalikan ringkasan setiap otomatisasi, tanpa langkah-langkahnya:

{
  "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"
}
Bidang Arti
id ID otomatisasi.
name Nama otomatisasi dalam daftar.
description Satu hingga tiga kalimat tentang apa yang dilakukannya, atau null.
enabled Apakah otomatisasi diaktifkan. Otomatisasi yang dinonaktifkan tidak akan pernah berjalan.
updated_at Kapan terakhir kali diubah.
trigger_kind Apa yang memicunya, misalnya incoming_message, schedule, webhook, agent_function atau manual. null jika grafik belum memiliki pemicu.
folder_id, folder_name Folder tempat otomatisasi disimpan, atau null jika tidak ada folder.

Membaca satu otomatisasi menambahkan created_at dan graph-nya:

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

Setiap langkah (nodes[]) memuat:

Bidang Arti
id Id langkah, unik di dalam grafik.
kind Jenis langkah: trigger, action, condition, transform, ai, delay, loop atau respond. Lihat Jenis langkah.
label Nama yang ditampilkan pada langkah di pembuat.
alias Nama referensi langkah. Langkah selanjutnya membaca output-nya sebagai ${nodes.<alias>.<field>}. null pada langkah yang tidak memilikinya (langkah tersebut kemudian direferensikan berdasarkan id-nya).
action Apa yang dilakukan langkah tersebut: tindakan yang dijalankannya, atau pada langkah pemicu, jenis pemicunya. null pada langkah lainnya.
params Parameter tindakan pada langkah tindakan, atau pengaturan pemicu pada langkah pemicu. null pada setiap jenis lainnya. Disimpan untuk pembaca lama: config memuat nilai yang sama dan lebih banyak lagi.
config Pengaturan lengkap langkah sebagaimana pembuat menyimpannya, untuk setiap jenis langkah: aturan kondisi, prompt langkah AI, durasi penundaan, slug dan parameter tindakan.

Setiap koneksi (edges[]) memiliki from dan to (id langkah), dan branch saat mengikuti satu cabang langkah, misalnya true atau false setelah kondisi.

Dua hal dalam config diubah saat keluar:

  • Rahasia disembunyikan. Nilai yang terlihat seperti kredensial (rahasia webhook, token, kunci API, kata sandi, nilai header) dikembalikan sebagai "[redacted]". Kirim "[redacted]" kembali tanpa diubah dan nilai yang tersimpan akan tetap terjaga.
  • Teks panjang dipersingkat. Satu teks yang lebih panjang dari sekitar 4.000 karakter akan dipotong dan diakhiri dengan elipsis. Jika Anda mengirim langkah itu kembali, masukkan teks lengkapnya terlebih dahulu.

Daftar otomatisasi

GET /automations mengembalikan otomatisasi pada akun, yang paling baru diubah ditampilkan pertama, sebagai ringkasan (tanpa langkah).

Parameter kueri (semuanya opsional): folder_id (hanya otomatisasi di folder tersebut, id dari Daftar folder, atau none untuk yang tidak ada di folder mana pun), 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"]

Respons (200)

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

Jika layanan otomatisasi tidak dapat dijangkau, Anda akan mendapatkan 503, bukan daftar kosong. Daftar kosong selalu berarti tidak ada otomatisasi.


Mendapatkan otomatisasi

GET /automations/{automationId} mengembalikan satu otomatisasi dengan grafik lengkapnya: jenis, label, alias, tindakan, parameter, dan pengaturan setiap langkah, ditambah koneksi di antara langkah-langkah tersebut.

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

Respons (200)

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

Id yang tidak ada di akun ini akan mengembalikan 404.


Katalog langkah

GET /automations/steps mengembalikan semua hal yang dapat digunakan untuk membangun otomatisasi:

  • node_kinds: 8 jenis langkah, masing-masing dengan label dan deskripsi.
  • triggers: setiap pemicu yang dapat memulai otomatisasi, dengan kolom pengaturannya (fields) dan nilai yang diteruskan ke langkah berikutnya (output_keys).
  • actions: tindakan bawaan yang dapat dijalankan oleh langkah tindakan, masing-masing dengan key (slug yang Anda gunakan dalam grafik) dan params-nya, ditandai required di tempatnya.
  • api_actions: operasi API ini yang dapat dipanggil oleh langkah tindakan. Tanpa q, operasi tersebut kembali sebagai label yang dikelompokkan berdasarkan area di api_actions_by_tag, dan daftar datar kosong, karena jumlahnya ada ratusan.
  • graph_rules: tata bahasa untuk menulis grafik: data yang dibawa setiap jenis langkah, setiap jenis pemicu dengan kunci pengaturannya, penyedia tindakan, nama cabang, dan sintaksis templat. Baca ini sebelum Anda membuat atau mengeditnya.
  • counts: total per daftar, apa pun yang Anda cari.

Ini adalah apa yang ditawarkan oleh pembuat, bukan apa yang telah dibuat oleh akun. Periksa ini sebelum Anda menyimpulkan bahwa pemicu atau tindakan tidak ada.

Parameter kueri (semua opsional): q, kata untuk mencari setiap daftar (tidak peka huruf besar-kecil), dan sub_account_id.

Dengan q:

  • api_actions adalah daftar kecocokan datar, dibatasi hingga 60. api_actions_truncated adalah true saat batas diterapkan. Kecocokan pertama membawa parameternya.
  • Tindakan untuk aplikasi pihak ketiga yang terhubung juga dicari dan kembali di app_actions. Cari berdasarkan nama aplikasi, misalnya q=hubspot. Masing-masing menyatakan apakah akun telah menghubungkan aplikasi tersebut (connected), dan connected_apps mencantumkan aplikasi yang telah dihubungkan oleh akun.
  • app_actions_unavailable adalah true saat tindakan aplikasi tidak dapat dicari kali ini. Daftar lainnya tetap lengkap.
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()

Respons (200, disingkat)

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

Daftar jenis langkah dan pemicu di bawah ini diambil dari titik akhir ini. Titik akhir itu sendiri selalu merupakan daftar saat ini.


Membuat otomatisasi

POST /automations membuat otomatisasi dari nama dan grafik. Otomatisasi disimpan dalam keadaan dimatikan, sebagai draf.

Isi

Bidang Wajib Arti
name Ya Apa namanya dalam daftar. Singkat dan spesifik.
description Tidak Satu hingga tiga kalimat tentang apa yang dilakukannya dan kapan dijalankan.
graph Ya { nodes, edges }, lihat di bawah.
folder_id Tidak Folder untuk menyimpannya, id dari Daftar folder. Jika dikosongkan atau null, otomatisasi tidak masuk ke folder mana pun.

Grafik. graph_rules dari katalog langkah adalah tata bahasa lengkapnya. Singkatnya:

  • Setiap simpul memiliki id (unik dalam grafik, misalnya trigger_1 atau send_reminder), type (salah satu dari 8 jenis langkah), label opsional, dan pengaturannya di data, di bawah kunci yang dinamai menurut jenisnya: 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 }.
  • Otomatisasi memerlukan setidaknya satu pemicu. Tata bahasa langsung memungkinkan hingga 10, dan otomatisasi dimulai saat salah satunya aktif.
  • Setiap langkah lainnya harus dapat dijangkau dari pemicu, dan tidak ada koneksi yang boleh mengarah kembali ke langkah sebelumnya.
  • Setiap tepi memiliki source dan target. Tepi yang meninggalkan kondisi membawa sourceHandle true atau false. Tepi yang meninggalkan perulangan membawa body atau done. Tepi yang meninggalkan penundaan Tunggu balasan membawa replied atau timed_out. Tepi lainnya tidak memiliki sourceHandle; tata bahasa mencantumkan sisanya.
  • Slug dan parameter tindakan berasal dari katalog. Jangan pernah menebak id (agen, tag, daftar, tahap): cari terlebih dahulu dengan API, atau biarkan bidang sebagai "" agar orang tersebut dapat memilih di pembuat.
  • Posisi bersifat opsional. Langkah tanpa posisi akan diletakkan secara otomatis.
  • Nilai dari langkah sebelumnya ditulis sebagai ${trigger.<field>} dan ${nodes.<step>.<field>}. Lihat Menggunakan apa yang dikembalikan langkah sebelumnya dan Ekspresi dalam panduan Otomatisasi.

Grafik diterima dalam dua ejaan: milik pembuat (simpul dengan type dan data, tepi dengan source dan target, seperti di bawah) dan yang dijawab oleh Dapatkan otomatisasi (simpul dengan kind, config, action, params; tepi dengan from, to, branch). Jadi, Anda dapat membaca otomatisasi, mengubah langkah, dan mengirimnya kembali.

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

Respons (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 adalah otomatisasi seperti yang disimpan, dalam bentuk yang sama dengan Dapatkan otomatisasi.
  • draft adalah true saat dimatikan. Otomatisasi baru selalu berupa draf sampai Anda mengaktifkannya, jadi enabled: false di sini adalah normal, bukan kegagalan.
  • open_path adalah tempat otomatisasi terbuka di pembuat aplikasi.
  • warnings mencantumkan hal-hal yang tidak dapat diselesaikan oleh pembuat, sebagai label singkat (misalnya agent_function:not_linked). Daftar ini kosong jika semuanya bersih.

Operasi buat tidak aman untuk diulang secara membabi buta. Jika permintaan mengalami waktu habis (timeout), buat daftar otomatisasi Anda sebelum mengirimnya kembali, atau Anda mungkin akan mendapatkan dua draf.


Memperbarui otomatisasi

PUT /automations/{automationId} mengubah nama, deskripsi, dan/atau grafik. Kirim hanya kolom yang ingin Anda ubah.

Body: name, description, graph (semuanya opsional, setidaknya satu).

Sebuah graph menggantikan seluruh grafik, jadi selalu kerjakan berdasarkan apa yang tersimpan:

  1. Baca otomatisasi dengan GET /automations/{automationId}.
  2. Ubah apa yang Anda perlukan dalam grafik tersebut.
  3. Kirim kembali seluruh grafik, termasuk setiap langkahnya.

Saat Anda mengirimnya kembali:

  • Pertahankan alias setiap langkah persis seperti yang Anda terima. Langkah selanjutnya merujuk pada suatu langkah berdasarkan aliasnya (${nodes.<alias>.<field>}). Jika Anda mengubah atau menghapusnya, setiap referensi ke langkah tersebut akan menjadi kosong. Lihat Menamai langkah Anda.
  • Biarkan nilai "[redacted]" sebagaimana adanya. Nilai yang ditampilkan sebagai "[redacted]" tetap mempertahankan nilai yang tersimpan.
  • Pulihkan teks yang dipotong. Teks yang muncul dengan akhiran elipsis telah dipotong saat pembacaan.

Status aktif atau tidaknya otomatisasi tidak pernah diubah di sini. Jika aktif, hasil edit Anda akan langsung diterapkan segera setelah disimpan. Saat otomatisasi aktif, perubahan yang dapat memicu otomatisasi itu sendiri akan ditolak: nonaktifkan terlebih dahulu.

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

Respons (200): memiliki bentuk yang sama dengan pembuatan (automation, draft, open_path, warnings). Mengirimkan salah satu dari name, description, atau graph akan mengembalikan 400.


Aktifkan dan nonaktifkan

POST /automations/{automationId}/enable mengaktifkan otomatisasi, sehingga otomatisasi tersebut akan berjalan berdasarkan pemicunya mulai saat ini. Panggil hanya setelah pemilik akun melihat apa yang dilakukan otomatisasi tersebut dan kepada siapa, serta telah setuju untuk mengaktifkannya. Pembuat (builder) akan menolak untuk mengaktifkan grafik yang tidak dapat dijalankan (tidak ada pemicu, perulangan, langkah yang memicu dirinya sendiri) dengan 400 yang menjelaskan alasannya.

POST /automations/{automationId}/disable menonaktifkannya (menjeda). Proses yang sedang berjalan akan diselesaikan; tidak ada proses baru yang dimulai. Penonaktifan selalu diizinkan.

Kedua panggilan tidak memerlukan isi (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"},
)

Respons (200): otomatisasi sebagaimana tersimpan saat ini, dalam bentuk yang sama dengan pembuatan, dengan draft: false setelah pengaktifan.


Riwayat eksekusi

GET /automations/{automationId}/runs mengembalikan eksekusi dari satu otomatisasi, yang terbaru terlebih dahulu: kapan setiap eksekusi dimulai dan selesai, apa yang memicunya, apakah berhasil, dan kesalahan saat gagal. Membaca otomatisasi memberi tahu Anda apa yang akan dilakukannya. Riwayat eksekusi memberi tahu Anda apa yang telah dilakukannya, dan ini adalah satu-satunya cara untuk membedakan otomatisasi yang tidak pernah berjalan dengan yang berjalan dan gagal setiap saat.

Parameter kueri (semuanya opsional): limit (1 hingga 50, default 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"]

Respons (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 adalah live untuk eksekusi nyata, atau safe untuk Eksekusi aman dari editor. Eksekusi aman tidak mengirim apa pun, jadi itu bukan bukti bahwa otomatisasi berfungsi dalam penggunaan nyata.
  • Daftar runs yang kosong adalah sebuah jawaban, bukan celah. Respons tersebut kemudian membawa note: entah pemicu belum pernah aktif, atau otomatisasi dimatikan, sehingga tidak ada yang berjalan.

Folder

Folder hanya mengelompokkan otomatisasi dalam daftar. Folder tidak pernah mengubah apa yang dilakukan otomatisasi atau apakah otomatisasi tersebut aktif. Lihat Mengatur otomatisasi dalam folder.

Daftar folder

GET /automations/folders mengembalikan folder, masing-masing dengan jumlah otomatisasi yang dimuatnya, ditambah unfiled_count: berapa banyak otomatisasi yang tidak berada dalam folder apa pun.

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
}

Membuat folder

POST /automations/folders dengan { "name": "Appointment reminders" }. Nama wajib diisi, maksimal 100 karakter, dan harus unik di akun tersebut. Masukkan otomatisasi ke dalamnya dengan Memindahkan otomatisasi, atau berikan folder_id saat Anda membuatnya.

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

Respons (201): { "success": true, "folder": { "id": "...", "name": "Appointment reminders", "automation_count": 0 } }. Nama yang sudah dimiliki folder lain akan mengembalikan 409 dengan code: "folder_name_taken".

Mengganti nama folder

PUT /automations/folders/{folderId} dengan { "name": "..." }. Otomatisasi di dalamnya tetap berada di tempatnya.

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

Menghapus folder

DELETE /automations/folders/{folderId} hanya menghapus folder tersebut. Otomasi di dalamnya tidak dihapus: otomasi tersebut akan berpindah ke luar folder dan tetap berjalan seperti sebelumnya.

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

Memindahkan otomasi ke folder

PUT /automations/{automationId}/folder dengan { "folder_id": "<folder id>" }, atau { "folder_id": null } untuk mengeluarkannya dari folder. folder_id diperlukan. Hanya lokasi daftar otomasi yang berubah.

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

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


Katalog

Jenis langkah

Jenis Apa fungsinya
trigger Memulai otomasi saat sesuatu terjadi.
action Menjalankan satu langkah: tindakan bawaan, tindakan API, tindakan aplikasi yang terhubung, permintaan HTTP, atau email.
condition Membagi alur berdasarkan aturan, menjadi cabang true dan false.
transform Menjalankan potongan kode singkat untuk mengubah bentuk data antar langkah.
ai Bertanya kepada AI dengan perintah yang Anda tulis. AI dapat mengembalikan teks, memisahkan kolom, atau memilih salah satu dari beberapa cabang.
delay Menunggu selama waktu yang ditentukan, atau menunggu kontak membalas (dengan batas waktu).
loop Mengulangi langkah-langkah di dalamnya untuk setiap item dalam daftar.
respond Mengembalikan respons ke panggilan webhook atau panggilan fungsi agen AI yang memulai eksekusi.

Pemicu

Ini adalah 40 pemicu yang tercantum dalam katalog saat ini, dikelompokkan sebagaimana pembuat otomasi mengelompokkannya. Kolom Pengaturan berisi kunci pengaturan pemicu itu sendiri (fields), yang mempersempit kapan pemicu tersebut aktif. Setiap pemicu juga memerlukan respect_quiet_hours, run_hours, reentry dan stop_on_response; lihat Pengaturan otomasi.

Pesan

Pemicu (kind) Aktif saat Pengaturan
Pesan masuk (incoming_message) Kontak mengirim pesan di saluran mana pun. campaign (membatasinya ke satu agen AI), channel, message_filter_contains (kata kunci), message_filter_regex (pola)
Panggilan tak terjawab (missed_call) Seseorang menelepon salah satu nomor WhatsApp Web Anda atau nomor SMS Anda sendiri dan tidak ada yang mengangkat. to_number
Pesan terkirim (message_delivered) Pesan yang Anda kirim dikonfirmasi terkirim oleh saluran tersebut. channel, agent
Pesan gagal (message_failed) Pesan yang Anda kirim tidak dapat terkirim, beserta error-nya. channel, agent
Pesan dikirim (message_sent) Pesan apa pun keluar dari akun Anda: milik AI, milik Anda, siaran, atau tindak lanjut. Filter pesan tersebut, atau pesan akan berjalan pada semuanya. channel, sent_by
Tindak lanjut dikirim (follow_up_sent) Tindak lanjut otomatis terkirim. tidak ada
Tindak lanjut dilewati (follow_up_skipped) Tindak lanjut ditahan karena kondisi pengirimannya gagal. tidak ada
Tindak lanjut selesai (follow_up_exhausted) Kontak telah menerima tindak lanjut terakhir dalam urutan dan tidak ada lagi yang mengantre. tidak ada
Percakapan ditutup (conversation_closed) Obrolan ditutup, dengan keterangan bagaimana obrolan berakhir dan ringkasannya. channel, agent
Siaran selesai (broadcast_completed) Siaran selesai dikirim, dengan keterangan berapa banyak yang terkirim dan berapa banyak yang gagal. tidak ada
Balasan prospek disortir (outreach_reply_labelled) Balasan prospek email dingin disortir, misalnya sebagai Tertarik. label
Komentar Skool diterima (skool_comment_received) Anggota berkomentar di bawah postingan Skool yang dipantau oleh salah satu aturan komentar Anda. tidak ada

Kontak

Pemicu (kind) Aktif saat Pengaturan
Kontak baru (contact_created) Seseorang yang baru menghubungi Anda untuk pertama kalinya di saluran mana pun, dan juga untuk impor, API, serta kontak yang Anda buat secara manual. tidak ada
Kontak diperbarui (contact_updated) Kolom kontak berubah. field
Kontak yang Anda tambahkan di sini (contact_added) Hanya untuk kontak yang Anda masukkan sendiri ke dalam otomasi ini dari halaman Kontak. Satu eksekusi per kontak. tidak ada
Tag diterapkan (tag_applied) Tag ditambahkan ke kontak, oleh agen AI Anda, seseorang, otomasi, atau impor. tag_name, channel, applied_by
Tag dihapus (tag_removed) Tag dihapus dari kontak. tag_name, channel
Anggota Skool bergabung (skool_member_joined) Seseorang bergabung dengan komunitas Skool yang Anda miliki atau kelola, dengan profil, jawaban, dan skor kecocokan mereka. group_id, create_contact
Anggota Skool terkualifikasi (skool_member_qualified) Jawaban anggota Skool baru mencapai atau melebihi ambang batas Anda. min_score

Kesepakatan

Pemicu (kind) Aktif saat Pengaturan
Kesepakatan dibuat (deal_created) Kesepakatan baru ditambahkan ke salah satu saluran pipa Anda. pipeline_id, stage_id
Tahap kesepakatan berubah (deal_stage_changed) Kesepakatan berpindah ke tahap yang berbeda, dengan menyebutkan tahap yang ditinggalkan dan tahap yang dimasuki. pipeline_id, to_stage_id, from_stage_id
Kesepakatan diperbarui (deal_updated) Kolom kesepakatan berubah. field

Janji Temu

Pemicu (kind) Aktif saat Pengaturan
Janji temu dipesan (appointment_booked) Janji temu baru dipesan. tidak ada
Janji temu dibatalkan (appointment_cancelled) Janji temu yang sudah dipesan dibatalkan. tidak ada
Janji temu dijadwalkan ulang (appointment_rescheduled) Janji temu yang sudah dipesan berpindah ke waktu lain, dengan waktu lama ditampilkan di samping waktu baru. event_id
Sebelum janji temu (appointment_upcoming) Waktu yang ditentukan sebelum setiap janji temu yang dikonfirmasi, untuk pengingat. Hingga lima pengingat per otomasi. offsets_minutes

Tugas

Pemicu (kind) Aktif saat Pengaturan
Tugas dibuat (task_created) Tugas dibuat. task_type
Tugas selesai (task_completed) Tugas dipindahkan ke tahap selesai. tidak ada

Akun

Pemicu (kind) Aktif saat Pengaturan
Saldo kredit rendah (low_credit_balance) Saldo kredit Anda turun di bawah ambang batas peringatan Anda. tidak ada
Saluran terhubung (channel_connected) Salah satu saluran Anda selesai terhubung. channel
Saluran terputus (channel_disconnected) Salah satu saluran Anda terputus: keluar, tidak tertaut, atau terputus. Nomor WhatsApp Web yang terhubung kembali dengan sendirinya hanya dihitung jika masih mati setelah 30 menit. channel

Agensi

Pemicu (kind) Aktif saat Pengaturan
Sub-akun dibuat (sub_account_created) Akun klien baru dibuat, dari dasbor Anda, API, atau halaman pendaftaran Anda. tidak ada
Aktivitas sub-akun (sub_account_event) Sesuatu terjadi pada salah satu akun klien Anda: kredit hampir habis, saluran terhubung, perubahan paket. event, threshold

Umum dan aplikasi

Pemicu (kind) Berjalan saat Pengaturan
Sesuai jadwal (schedule) Pada jadwal cron. cron, timezone
Webhook (webhook) Sistem luar memanggil alamat webhook otomatisasi. webhook_secret
Fungsi Agen AI (agent_function) Agen AI Anda memanggil otomatisasi ini sebagai fungsi selama percakapan. function_name, function_description, parameters, agent_ids, campaign_ids
Item feed baru (rss) Item baru muncul di feed RSS atau Atom. feed_url
Email diterima (email_received) Email tiba di kotak masuk Anda yang terhubung. from_contains, subject_contains
Peristiwa aplikasi (app_event) Sesuatu terjadi di aplikasi yang terhubung: tahap kesepakatan berubah, pembayaran masuk, formulir dikirimkan. toolkit, trigger_slug, connected_account_id, config
Jalankan manual (manual) Hanya saat dijalankan secara manual. tidak ada

Satu otomatisasi dapat menampung paling banyak satu pemicu untuk masing-masing webhook, app_event, agent_function, rss, schedule, email_received, appointment_upcoming dan contact_added. Pemicu yang berjalan saat catatan dibuat tidak dapat dipasangkan dengan tindakan yang membuat catatan yang sama, karena otomatisasi tersebut akan memicu dirinya sendiri.

Untuk mengetahui apa yang diberikan setiap pemicu ke langkah-langkah selanjutnya (output_keys) dan daftar lengkap tindakan beserta parameternya, baca GET /automations/steps. Panduan Otomatisasi menjelaskan setiap pemicu dengan bahasa pembuatnya.


Kesalahan

Setiap kesalahan memiliki bentuk umum { "success": false, "error_code": <status>, "error": "..." }. Grafik yang ditolak menambahkan code dan 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 mencantumkan setiap masalah, masing-masing dengan satu kalimat perbaikan, dan error adalah yang pertama. Perbaiki persis apa yang tercantum dan kirimkan kembali seluruh grafik. code adalah salah satu dari invalid_graph, automation_graph_has_a_cycle, self_triggering_automation, no_trigger, atau kode lain dari pembuatnya.

Status Kapan
400 Grafik ditolak (lihat di atas), kolom wajib diisi tidak ada (name atau graph saat pembuatan, folder_id saat pemindahan), pembaruan tidak mengirimkan perubahan apa pun, id otomatisasi atau folder tidak valid, atau nama folder tidak ada, kosong, atau terlalu panjang (code: "invalid_name").
403 Akun tidak memiliki Otomatisasi; paket akun klien tidak mencakup pembuatan dan pengeditan otomatisasi (hanya tulis); atau akses Otomatisasi anggota tim terlalu rendah (Lihat untuk baca, Edit untuk tulis).
404 Tidak ada otomatisasi dengan id tersebut di akun ini, tidak ada folder dengan id tersebut (code: "folder_not_found"), atau sub_account_id yang bukan salah satu akun klien Anda.
409 Folder dengan nama tersebut sudah ada (code: "folder_name_taken").
413 Otomatisasi lebih besar dari 1 MB yang diterima oleh pembuat. Pindahkan kode atau data besar keluar dari langkah-langkahnya.
422 Pembuat menolak permintaan karena alasan lain. Periksa grafik terhadap GET /automations/steps; mengirimkan permintaan yang sama lagi tidak akan membantu.
503 Layanan otomatisasi tidak dapat dijangkau. Coba lagi nanti. Untuk pembuatan, buat daftar otomatisasi Anda terlebih dahulu agar Anda tidak membuat draf kedua.

Menggunakan endpoint ini melalui MCP

Setiap endpoint di halaman ini juga merupakan alat untuk asisten AI yang Anda hubungkan melalui MCP, dengan aturan yang sama: otomatisasi baru adalah draf sampai diaktifkan, dan pengeditan pada otomatisasi yang sedang berjalan bersifat langsung.

Alat Endpoint
list_automations GET /automations
get_automation GET /automations/{automationId}
list_automation_steps GET /automations/steps
create_automation POST /automations
update_automation PUT /automations/{automationId}
enable_automation POST /automations/{automationId}/enable
disable_automation POST /automations/{automationId}/disable
list_automation_runs GET /automations/{automationId}/runs
list_automation_folders GET /automations/folders
create_automation_folder POST /automations/folders
rename_automation_folder PUT /automations/folders/{folderId}
delete_automation_folder DELETE /automations/folders/{folderId}
move_automation_to_folder PUT /automations/{automationId}/folder

Langkah berikutnya

  • Otomatisasi: cara kerja pemicu, langkah, variabel, dan riwayat proses di pembuat.
  • API untuk Agensi: membangun otomatisasi pada akun klien dengan sub_account_id.
  • Referensi API: penjelajah endpoint interaktif lengkap.