Automations API
Een automatisering is een workflow die bestaat uit stappen: een of meer triggers die deze starten, gevolgd door acties, voorwaarden, vertragingen, AI-stappen en de rest, verbonden in een graaf. Het is dezelfde automatisering die je ziet en bewerkt op de Automations pagina. Deze handleiding behandelt het lezen en bouwen ervan via de API.
- Basis-URL:
https://api.dmchamp.com/v1 - Authenticatie: je API-sleutel (zie Authenticatie)
- Fouten: zie Fouten & Paginering en Fouten hieronder
Alle onderstaande voorbeelden tonen de ?apiKey= query-vorm in cURL en de X-API-Key header in JavaScript en Python. Beide werken op elk eindpunt.
Bureaus: elk eindpunt op deze pagina accepteert
sub_account_idals query-parameter, zodat je de automatiseringen van een klant kunt lezen en bouwen met je bureausleutel. Eensub_account_iddie geen van je klantaccounts is, retourneert404. Zie API voor bureaus.
Hoe het werkt: eerst een concept
De API is zo gebouwd dat er niets per ongeluk begint te draaien.
- Lees de catalogus.
GET /automations/stepssomt elke trigger, actie en staptype op die je kunt gebruiken, plus de grammatica voor het schrijven van een graaf (graph_rules). - Maak een concept.
POST /automationsslaat de automatisering uitgeschakeld op. Er draait nog niets. - Controleer het. Lees het terug, open het in de builder (het antwoord geeft je de
open_path) en zorg ervoor dat de eigenaar van het account heeft gezien wat het doet en voor wie. - Schakel het in.
POST /automations/{automationId}/enableis een aparte aanroep. Dit is de stap die echte dingen in gang zet: berichten verzonden, records gewijzigd, tools gegeven aan een AI-agent.
Bewerken verandert nooit of een automatisering aan of uit staat. Dat betekent ook dat een bewerking aan een automatisering die aan staat, direct effect heeft op de actieve automatisering. Om een draaiende automatisering veilig te wijzigen, schakel je deze uit, bewerk je deze, controleer je deze en schakel je deze weer in.
Elke graaf die je verstuurt, doorloopt dezelfde controles die het builder-canvas toepast. Een graaf die niet geopend of uitgevoerd kan worden, wordt geweigerd met een 400 die precies aangeeft wat er moet worden hersteld.
Toegang
- Het account heeft Automations nodig. Zonder dit retourneert elke aanroep op deze pagina
403. - De toegang van een teamlid volgt hun Automations-gedeelte in Teambeheer: voor lezen (lijst, ophalen, stappen, runs, mappen) is Weergeven nodig, voor alles wat iets wijzigt is Bewerken nodig.
- Op een klantaccount waarvan het abonnement het maken en bewerken van automatiseringen niet toestaat, retourneren de schrijfaanroepen
403, precies zoals de builder in de app doet.
Het automatiseringsobject
De lijst retourneert een samenvatting van elke automatisering, zonder de stappen:
{
"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"
}
| Veld | Betekenis |
|---|---|
id |
Het id van de automatisering. |
name |
Hoe het in de lijst wordt genoemd. |
description |
Eén tot drie zinnen over wat het doet, of null. |
enabled |
Of het is ingeschakeld. Een uitgeschakelde automatisering draait nooit. |
updated_at |
Wanneer het voor het laatst is gewijzigd. |
trigger_kind |
Wat het activeert, bijvoorbeeld incoming_message, schedule, webhook, agent_function of manual. null wanneer de graaf nog geen trigger heeft. |
folder_id, folder_name |
De map waarin het is opgeslagen, of null voor geen map. |
Het lezen van één automatisering voegt created_at en zijn graph toe:
{
"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" }]
}
}
Elke stap (nodes[]) bevat:
| Veld | Betekenis |
|---|---|
id |
Het id van de stap, uniek binnen de graaf. |
kind |
Het type stap: trigger, action, condition, transform, ai, delay, loop of respond. Zie Staptypes. |
label |
De naam die op de stap in de builder wordt getoond. |
alias |
De referentienaam van de stap. Latere stappen lezen de output als ${nodes.<alias>.<field>}. null op een stap die er geen heeft (deze wordt dan verwezen via het id). |
action |
Wat de stap doet: de actie die wordt uitgevoerd, of bij een triggerstap het triggertype. null op andere stappen. |
params |
De parameters van de actie bij een actiestap, of de instellingen van de trigger bij een triggerstap. null op elk ander type. Behouden voor oudere readers: config bevat dezelfde waarden en meer. |
config |
De volledige instellingen van de stap zoals de builder deze opslaat, voor elk type stap: de regels van een voorwaarde, de prompt van een AI-stap, de duur van een vertraging, de slug en parameters van een actie. |
Elke verbinding (edges[]) heeft from en to (stap-ids), en branch wanneer deze een tak van een stap volgt, bijvoorbeeld true of false na een voorwaarde.
Twee zaken in config worden gewijzigd bij het uitgaan:
- Geheimen worden verborgen. Waarden die eruitzien als inloggegevens (webhook-geheimen, tokens, API-sleutels, wachtwoorden, header-waarden) komen terug als
"[redacted]". Stuur"[redacted]"ongewijzigd terug en de opgeslagen waarde blijft behouden. - Lange teksten worden ingekort. Een enkele tekst langer dan ongeveer 4.000 tekens wordt ingekort en eindigt met een weglatingsteken. Als u die stap terugstuurt, plaats dan eerst de volledige tekst terug.
Automatiseringen vermelden
GET /automations retourneert de automatiseringen in het account, meest recent gewijzigd eerst, als samenvattingen (geen stappen).
Queryparameters (allemaal optioneel): folder_id (alleen de automatiseringen in die map, een id van Mappen vermelden, of none voor diegene zonder map), 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"]
Antwoord (200)
{ "success": true, "automations": [{ "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": false, "...": "..." }] }
Als de automatiseringsservice niet kan worden bereikt, krijgt u een 503, nooit een lege lijst in de plaats. Een lege lijst betekent altijd dat er geen automatiseringen zijn.
Een automatisering ophalen
GET /automations/{automationId} retourneert één automatisering met zijn volledige graaf: het type, label, alias, actie, parameters en instellingen van elke stap, plus de verbindingen daartussen.
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"]
Antwoord (200)
{ "success": true, "automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "graph": { "nodes": ["..."], "edges": ["..."] } } }
Een id dat niet bij dit account hoort, retourneert 404.
Stapcatalogus
GET /automations/steps retourneert alles waaruit een automatisering kan worden opgebouwd:
node_kinds: de 8 soorten stappen, elk met een label en een beschrijving.triggers: elke trigger die een automatisering kan starten, met de bijbehorende instellingsvelden (fields) en de waarden die deze doorgeeft aan volgende stappen (output_keys).actions: de ingebouwde acties die een actiestap kan uitvoeren, elk met zijnkey(de slug die je in een graaf gebruikt) en zijnparams, gemarkeerd metrequiredwaar ze zich bevinden.api_actions: de bewerkingen van deze API die een actiestap kan aanroepen. Zonderqkomen ze terug als labels gegroepeerd per gebied inapi_actions_by_tag, en de platte lijst is leeg, omdat er honderden van zijn.graph_rules: de grammatica voor het schrijven van een graaf: de gegevens die elk staptype bevat, elk triggertype met zijn instellingssleutels, de actieproviders, de vertakkingsnamen en de sjabloonsyntaxis. Lees dit voordat je er een maakt of bewerkt.counts: de totalen per lijst, waar je ook op hebt gezocht.
Dit is wat de builder biedt, niet wat het account heeft gebouwd. Controleer dit voordat je concludeert dat een trigger of actie niet bestaat.
Queryparameters (allemaal optioneel): q, een woord om elke lijst te doorzoeken (niet hoofdlettergevoelig), en sub_account_id.
Met q:
api_actionsis de platte lijst met overeenkomsten, begrensd op 60.api_actions_truncatedistruewanneer de limiet is toegepast. De eerste overeenkomsten bevatten hun parameters.- Acties voor gekoppelde apps van derden worden ook doorzocht en komen terug in
app_actions. Zoek op de naam van de app, bijvoorbeeldq=hubspot. Elke actie geeft aan of het account die app heeft gekoppeld (connected), enconnected_appssomt de apps op die het account heeft gekoppeld. app_actions_unavailableistruewanneer de app-acties deze keer niet konden worden doorzocht. De andere lijsten zijn nog steeds volledig.
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()
Antwoord (200, ingekort)
{
"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 }
}
De lijsten met stapsoorten en triggers hieronder zijn afkomstig van dit eindpunt. Het eindpunt zelf is altijd de huidige lijst.
Een automatisering maken
POST /automations maakt een automatisering op basis van een naam en een graaf. Deze wordt uitgeschakeld opgeslagen, als concept.
Body
| Veld | Verplicht | Betekenis |
|---|---|---|
name |
Ja | Hoe het in de lijst wordt genoemd. Kort en specifiek. |
description |
Nee | Eén tot drie zinnen over wat het doet en wanneer het wordt uitgevoerd. |
graph |
Ja | { nodes, edges }, zie hieronder. |
folder_id |
Nee | De map waarin het moet worden opgeslagen, een id uit Lijst mappen. Indien weggelaten of null, wordt het in geen enkele map geplaatst. |
De graaf. graph_rules uit de stapcatalogus is de volledige grammatica. Kort gezegd:
- Elk knooppunt heeft een
id(uniek in de graaf, bijvoorbeeldtrigger_1ofsend_reminder), eentype(een van de 8 stapsoorten), een optionelelabel, en de instellingen indata, onder een sleutel die is vernoemd naar het type: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 }. - Een automatisering heeft minimaal één trigger nodig. De live grammatica staat er maximaal 10 toe, en de automatisering start wanneer een van deze wordt geactiveerd.
- Elke andere stap moet bereikbaar zijn vanaf een trigger, en er mag geen verbinding terugleiden naar een eerdere stap.
- Elke verbinding heeft een
sourceen eentarget. Verbindingen die een voorwaarde verlaten, bevattensourceHandletrueoffalse. Verbindingen die een lus verlaten, bevattenbodyofdone. Verbindingen die een ‘Wachten op antwoord’-vertraging verlaten, bevattenrepliedoftimed_out. Andere verbindingen hebben geensourceHandle; de grammatica somt de rest op. - Actieslugs en parameters komen uit de catalogus. Raad nooit een id (een agent, een tag, een lijst, een fase): zoek deze eerst op met de API, of laat het veld als
""zodat de persoon in de builder kan kiezen. - Posities zijn optioneel. Stappen zonder positie worden automatisch ingedeeld.
- Waarden van eerdere stappen worden geschreven als
${trigger.<field>}en${nodes.<step>.<field>}. Zie Gebruik van wat een eerdere stap heeft geretourneerd en Expressies in de Automatiseringengids.
De graaf wordt geaccepteerd in twee schrijfwijzen: die van de builder zelf (knooppunten met type en data, verbindingen met source en target, zoals hieronder) en die waarmee Een automatisering ophalen antwoordt (knooppunten met kind, config, action, params; verbindingen met from, to, branch). Je kunt dus een automatisering lezen, een stap wijzigen en deze terugsturen.
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()
Antwoord (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": []
}
automationis de automatisering zoals opgeslagen, in dezelfde vorm als Een automatisering ophalen.draftistrueterwijl deze is uitgeschakeld. Een nieuwe automatisering is altijd een concept totdat je deze inschakelt, dusenabled: falseis hier normaal, geen fout.open_pathis waar deze opent in de builder van de app.warningssomt zaken op die de builder niet kon voltooien, als korte labels (bijvoorbeeldagent_function:not_linked). Deze is leeg wanneer alles in orde is.
Het is niet veilig om een create blindelings te herhalen. Als een verzoek een time-out krijgt, vermeld dan eerst je automatiseringen voordat je het opnieuw verstuurt, anders eindig je mogelijk met twee concepten.
Een automatisering bijwerken
PUT /automations/{automationId} wijzigt de naam, de beschrijving en/of het schema. Stuur alleen de velden die je wilt wijzigen.
Body: name, description, graph (allemaal optioneel, ten minste één).
Een graph vervangt het volledige schema, dus werk altijd vanuit wat er is opgeslagen:
- Lees de automatisering met
GET /automations/{automationId}. - Wijzig wat je nodig hebt in dat schema.
- Stuur het volledige schema terug, inclusief elke stap.
Wanneer je het terugstuurt:
- Houd de
aliasvan elke stap exact zoals je deze hebt ontvangen. Latere stappen verwijzen naar een stap via de alias (${nodes.<alias>.<field>}). Wijzig of verwijder deze niet, anders wordt elke verwijzing naar die stap leeg. Zie Je stappen een naam geven. - Laat
"[redacted]"waarden zoals ze zijn. Een waarde die wordt weergegeven als"[redacted]"behoudt de opgeslagen waarde. - Herstel ingekorte teksten. Een tekst die eindigde met een beletselteken was ingekort tijdens het lezen.
Of de automatisering aan staat, wordt hier nooit gewijzigd. Als deze aan staat, is je wijziging live zodra deze is opgeslagen. Terwijl een automatisering aan staat, wordt een wijziging die ervoor zou zorgen dat deze zichzelf activeert geweigerd: schakel deze eerst uit.
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"]})
Response (200): dezelfde vorm als een create (automation, draft, open_path, warnings). Als je niets van name, description of graph verstuurt, wordt 400 geretourneerd.
In- en uitschakelen
POST /automations/{automationId}/enable schakelt een automatisering in, zodat deze vanaf nu op basis van de trigger wordt uitgevoerd. Roep dit pas aan nadat de eigenaar van het account heeft gezien wat de automatisering doet en voor wie, en akkoord is gegaan met het inschakelen. De builder weigert een schema in te schakelen dat niet kan worden uitgevoerd (geen trigger, een lus, een stap die zichzelf activeert) met een 400 die aangeeft waarom.
POST /automations/{automationId}/disable schakelt deze uit (pauzeert deze). Reeds lopende uitvoeringen worden voltooid; er starten geen nieuwe uitvoeringen. Uitschakelen is altijd toegestaan.
Geen van beide aanroepen vereist een 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"},
)
Response (200): de automatisering zoals deze nu is opgeslagen, in dezelfde vorm als een create, met draft: false na een inschakeling.
Uitvoeringsgeschiedenis
GET /automations/{automationId}/runs retourneert de uitvoeringen van één automatisering, de nieuwste eerst: wanneer elke uitvoering is gestart en beëindigd, wat deze heeft geactiveerd, of deze is geslaagd en de foutmelding wanneer deze is mislukt. Het lezen van de automatisering vertelt u wat deze zou doen. De uitvoeringsgeschiedenis vertelt u wat deze heeft gedaan, en het is de enige manier om een automatisering die nooit heeft gedraaid te onderscheiden van een automatisering die draait en elke keer mislukt.
Queryparameters (allemaal optioneel): limit (1 tot 50, standaard 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"]
Antwoord (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"
}
]
}
modeislivevoor een echte uitvoering, ofsafevoor een Veilige uitvoering vanuit de editor. Een veilige uitvoering verstuurt niets, dus het is geen bewijs dat de automatisering in echt gebruik werkt.- Een lege
runslijst is een antwoord, geen leemte. Het antwoord bevat dan eennote: ofwel de trigger is nooit afgegaan, of de automatisering is uitgeschakeld, waardoor er niets is uitgevoerd.
Mappen
Mappen groeperen alleen automatiseringen in de lijst. Ze veranderen nooit wat een automatisering doet of of deze is ingeschakeld. Zie Automatiseringen in mappen organiseren.
Mappen weergeven
GET /automations/folders retourneert de mappen, elk met het aantal automatiseringen dat het bevat, plus unfiled_count: hoeveel automatiseringen zich in geen enkele map bevinden.
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
}
Een map maken
POST /automations/folders met { "name": "Appointment reminders" }. De naam is verplicht, maximaal 100 tekens, en moet uniek zijn binnen het account. Plaats automatiseringen in de map met Een automatisering verplaatsen, of geef folder_id door wanneer u er een maakt.
curl -X POST "https://api.dmchamp.com/v1/automations/folders?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Appointment reminders" }'
Antwoord (201): { "success": true, "folder": { "id": "...", "name": "Appointment reminders", "automation_count": 0 } }. Een naam die al door een andere map wordt gebruikt, retourneert 409 met code: "folder_name_taken".
Een map hernoemen
PUT /automations/folders/{folderId} met { "name": "..." }. De automatiseringen in de map blijven waar ze zijn.
Antwoord (200): { "success": true, "folder": { ... } }.
Een map verwijderen
DELETE /automations/folders/{folderId} verwijdert alleen de map. De automatiseringen daarin worden niet verwijderd: ze verplaatsen zich naar geen enkele map en blijven precies zo werken als voorheen.
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." }
Een automatisering naar een map verplaatsen
PUT /automations/{automationId}/folder met { "folder_id": "<folder id>" }, of { "folder_id": null } om het uit de map te halen. folder_id is vereist. Alleen de plek waar de automatisering wordt vermeld, verandert.
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" }'
Antwoord (200): { "success": true, "automation_id": "...", "folder_id": "..." }.
Catalogus
Soorten stappen
| Soort | Wat het doet |
|---|---|
trigger |
Start de automatisering wanneer er iets gebeurt. |
action |
Voert één stap uit: een ingebouwde actie, een API-actie, de actie van een verbonden app, een HTTP-verzoek of een e-mail. |
condition |
Splitst de stroom op basis van een regel in een true- en een false-tak. |
transform |
Voert een kort stukje code uit om gegevens tussen stappen te herstructureren. |
ai |
Vraagt de AI met een prompt die je zelf schrijft. Het kan tekst retourneren, velden scheiden of een van de verschillende takken kiezen. |
delay |
Wacht een ingestelde tijd, of wacht tot de contactpersoon antwoordt (met een time-out). |
loop |
Herhaalt de stappen erin voor elk item in een lijst. |
respond |
Geeft een antwoord terug aan de webhook-aanroep of de AI-agentfunctie-aanroep die de uitvoering heeft gestart. |
Triggers
Dit zijn de 40 triggers die de catalogus vandaag bevat, gegroepeerd zoals de builder ze groepeert. De kolom Instellingen bevat de eigen instellingssleutels van de trigger (fields), die beperken wanneer deze wordt geactiveerd. Elke trigger accepteert ook respect_quiet_hours, run_hours, reentry en stop_on_response; zie Automatiseringsinstellingen.
Berichten
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Inkomend bericht (incoming_message) |
Een contactpersoon stuurt een bericht via een willekeurig kanaal. | campaign (beperkt tot één AI-agent), channel, message_filter_contains (trefwoord), message_filter_regex (patroon) |
Gemiste oproep (missed_call) |
Iemand belt een van je WhatsApp Web-nummers of je eigen sms-nummer en er wordt niet opgenomen. | to_number |
Bericht afgeleverd (message_delivered) |
Een bericht dat je hebt verzonden, is door het kanaal als afgeleverd bevestigd. | channel, agent |
Bericht mislukt (message_failed) |
Een bericht dat je hebt verzonden, kon niet worden afgeleverd, met de foutmelding. | channel, agent |
Bericht verzonden (message_sent) |
Elk bericht verlaat je account: dat van de AI, dat van jou, een broadcast, een follow-up. Filter het, anders wordt het op allemaal uitgevoerd. | channel, sent_by |
Follow-up verzonden (follow_up_sent) |
Een automatische follow-up wordt verstuurd. | geen |
Follow-up overgeslagen (follow_up_skipped) |
Een follow-up werd tegengehouden omdat de verzendvoorwaarde niet werd gehaald. | geen |
Follow-ups voltooid (follow_up_exhausted) |
Een contactpersoon heeft de laatste follow-up in de reeks ontvangen en er staat niets meer in de wachtrij. | geen |
Gesprek gesloten (conversation_closed) |
Een chat is gesloten, met de manier waarop deze is beëindigd en een samenvatting. | channel, agent |
Broadcast voltooid (broadcast_completed) |
Een broadcast is klaar met verzenden, met het aantal verzonden en mislukte berichten. | geen |
Lead-antwoord gesorteerd (outreach_reply_labelled) |
Het antwoord van een cold email-lead is gesorteerd, bijvoorbeeld als Geïnteresseerd. | label |
Skool-reactie ontvangen (skool_comment_received) |
Een lid reageert onder een Skool-bericht dat een van je reactieregels in de gaten houdt. | geen |
Contacten
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Nieuwe contactpersoon (contact_created) |
Een nieuwe persoon bereikt je voor het eerst via een willekeurig kanaal, en ook voor imports, de API en contactpersonen die je handmatig aanmaakt. | geen |
Contactpersoon bijgewerkt (contact_updated) |
Een contactveld verandert. | field |
Contactpersonen die je hier toevoegt (contact_added) |
Alleen voor contactpersonen die je zelf vanuit de pagina Contactpersonen in deze automatisering plaatst. Eén uitvoering per contactpersoon. | geen |
Label toegepast (tag_applied) |
Een label wordt toegevoegd aan een contactpersoon, door je AI-agent, een persoon, een automatisering of een import. | tag_name, channel, applied_by |
Label verwijderd (tag_removed) |
Een label wordt van een contactpersoon verwijderd. | tag_name, channel |
Skool-lid lid geworden (skool_member_joined) |
Iemand wordt lid van een Skool-community die jij bezit of beheert, met hun profiel, antwoorden en fit-score. | group_id, create_contact |
Skool-lid gekwalificeerd (skool_member_qualified) |
De antwoorden van een nieuw Skool-lid scoren op of boven je drempelwaarde. | min_score |
Deals
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Deal aangemaakt (deal_created) |
Een nieuwe deal wordt toegevoegd aan een van je pijplijnen. | pipeline_id, stage_id |
Deal-fase gewijzigd (deal_stage_changed) |
Een deal verplaatst naar een andere fase, met vermelding van de fase die werd verlaten en de fase die werd betreden. | pipeline_id, to_stage_id, from_stage_id |
Deal bijgewerkt (deal_updated) |
Een dealveld verandert. | field |
Afspraken
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Afspraak geboekt (appointment_booked) |
Een nieuwe afspraak is geboekt. | geen |
Afspraak geannuleerd (appointment_cancelled) |
Een geboekte afspraak is geannuleerd. | geen |
Afspraak verplaatst (appointment_rescheduled) |
Een geboekte afspraak verplaatst naar een ander tijdstip, met het oude tijdstip naast het nieuwe. | event_id |
Voor een afspraak (appointment_upcoming) |
Een ingestelde tijd vóór elke bevestigde afspraak, voor herinneringen. Maximaal vijf herinneringen per automatisering. | offsets_minutes |
Taken
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Taak aangemaakt (task_created) |
Een taak is aangemaakt. | task_type |
Taak voltooid (task_completed) |
Een taak is verplaatst naar een voltooide fase. | geen |
Account
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Laag kredietsaldo (low_credit_balance) |
Je kredietsaldo zakt onder je waarschuwingsdrempel. | geen |
Kanaal verbonden (channel_connected) |
Een van je kanalen is klaar met verbinden. | channel |
Kanaal verbroken (channel_disconnected) |
Een van je kanalen valt weg: uitgelogd, ontkoppeld of afgesloten. Een WhatsApp Web-nummer dat uit zichzelf opnieuw verbinding maakt, telt alleen als het na 30 minuten nog steeds offline is. | channel |
Bureau
Trigger (kind) |
Activeert wanneer | Instellingen |
|---|---|---|
Sub-account aangemaakt (sub_account_created) |
Een nieuw klantaccount is aangemaakt, vanuit je dashboard, de API of je aanmeldpagina. | geen |
Sub-accountactiviteit (sub_account_event) |
Er gebeurt iets op een van je klantaccounts: kredieten raken op, een kanaal verbindt, een abonnement wijzigt. | event, threshold |
Algemeen en apps
Trigger (kind) |
Wordt geactiveerd bij | Instellingen |
|---|---|---|
Op schema (schedule) |
Op een cron-schema. | cron, timezone |
Webhook (webhook) |
Een extern systeem roept het webhook-adres van de automatisering aan. | webhook_secret |
AI Agent-functie (agent_function) |
Uw AI-agent roept deze automatisering aan als een functie tijdens een gesprek. | function_name, function_description, parameters, agent_ids, campaign_ids |
Nieuw feed-item (rss) |
Er verschijnt een nieuw item in een RSS- of Atom-feed. | feed_url |
E-mail ontvangen (email_received) |
Er komt een e-mail binnen in uw eigen gekoppelde mailbox. | from_contains, subject_contains |
App-gebeurtenis (app_event) |
Er gebeurt iets in een gekoppelde app: een dealfase verandert, een betaling komt binnen, een formulier wordt ingediend. | toolkit, trigger_slug, connected_account_id, config |
Handmatige uitvoering (manual) |
Alleen wanneer deze handmatig wordt gestart. | geen |
Een automatisering kan maximaal één trigger bevatten van elk type webhook, app_event, agent_function, rss, schedule, email_received, appointment_upcoming en contact_added. Een trigger die wordt geactiveerd wanneer een record wordt aangemaakt, kan niet worden gekoppeld aan de actie die hetzelfde record aanmaakt, omdat de automatisering zichzelf dan zou activeren.
Voor wat elke trigger doorgeeft aan latere stappen (output_keys) en de volledige lijst met acties en hun parameters, lees GET /automations/steps. De Automations-handleiding legt elke trigger uit in de bewoordingen van de builder.
Fouten
Elke fout heeft de gebruikelijke vorm { "success": false, "error_code": <status>, "error": "..." }. Een geweigerde graaf voegt code en errors toe:
{
"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 somt elk probleem op, elk in één corrigeerbare zin, en error is de eerste. Corrigeer precies wat er vermeld staat en stuur de volledige graaf opnieuw. code is een van invalid_graph, automation_graph_has_a_cycle, self_triggering_automation, no_trigger, of een andere code van de builder.
| Status | Wanneer |
|---|---|
400 |
De graaf werd geweigerd (zie hierboven), een verplicht veld ontbreekt (name of graph bij een aanmaak, folder_id bij een verplaatsing), een update stuurde niets om te wijzigen, een automatisering- of map-id is niet geldig, of een mapnaam ontbreekt, is leeg of te lang (code: "invalid_name"). |
403 |
Het account heeft geen Automations; het abonnement van een klantaccount bevat niet het aanmaken en bewerken van automatiseringen (alleen schrijven); of de toegang van het teamlid tot Automations is te beperkt (Weergeven voor lezen, Bewerken voor schrijven). |
404 |
Geen automatisering met die id op dit account, geen map met die id (code: "folder_not_found"), of een sub_account_id die niet een van uw klantaccounts is. |
409 |
Een map met die naam bestaat al (code: "folder_name_taken"). |
413 |
De automatisering is groter dan de 1 MB die de builder accepteert. Verplaats grote code of data uit de stappen. |
422 |
De builder heeft het verzoek om een andere reden afgewezen. Controleer de graaf aan de hand van GET /automations/steps; het opnieuw verzenden van hetzelfde verzoek helpt niet. |
503 |
De automatiseringsservice kon niet worden bereikt. Probeer het over een moment opnieuw. Bij een aanmaak: vermeld eerst uw automatiseringen zodat u geen tweede concept maakt. |
Deze eindpunten gebruiken via MCP
Elk eindpunt op deze pagina is ook een tool voor een AI-assistent die u verbindt via MCP, met dezelfde regels: een nieuwe automatisering is een concept totdat deze is ingeschakeld, en een bewerking aan een actieve automatisering is direct live.
| Tool | Eindpunt |
|---|---|
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 |
Volgende stappen
- Automations: hoe triggers, stappen, variabelen en de uitvoeringsgeschiedenis werken in de builder.
- API voor bureaus: bouw automatiseringen op een klantaccount met
sub_account_id. - API-referentie: de volledige interactieve eindpuntverkenner.