
# 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](../automations/automations.md) pagina. Deze handleiding behandelt het lezen en bouwen ervan via de API.

- **Basis-URL**: `https://api.dmchamp.com/v1`
- **Authenticatie**: uw API-sleutel (zie [Authenticatie](authentication.md))
- **Velden en bodies**: elke parameter en elk antwoordveld staat in de [API-referentie](reference.md#tag/automations)
- **Fouten**: zie [Fouten & Paginering](errors-and-pagination.md) en [Fouten](#errors) hieronder

> **Bureaus:** elk eindpunt op deze pagina accepteert `sub_account_id` als query-parameter, zodat je de automatiseringen van een klant kunt lezen en bouwen met je bureausleutel. Een `sub_account_id` die geen van je klantaccounts is, retourneert `404`. Zie [API voor bureaus](../agency/api-for-agencies.md).

---

## Hoe het werkt: eerst een concept

De API is zo gebouwd dat er niets per ongeluk begint te draaien.

1. **Lees de catalogus.** `GET /automations/steps` somt elke trigger, actie en staptype op die je kunt gebruiken, plus de grammatica voor het schrijven van een graaf (`graph_rules`).
2. **Maak een concept.** `POST /automations` slaat de automatisering **uitgeschakeld** op. Er draait nog niets.
3. **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.
4. **Schakel het in.** `POST /automations/{automationId}/enable` is 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](../settings/team-management.md): 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.

---

## Eindpunten

| Taak | Methode + pad | Explorer |
|---|---|---|
| Automatiseringen weergeven | `GET /automations` | [Openen in API-referentie](reference.md#tag/automations/GET/automations) |
| Een automatisering met zijn graaf ophalen | `GET /automations/{automationId}` | [Openen in API-referentie](reference.md#tag/automations/GET/automations/{automationId}) |
| De stapcatalogus lezen | `GET /automations/steps` | [Openen in API-referentie](reference.md#tag/automations/GET/automations/steps) |
| Een automatisering aanmaken (concept) | `POST /automations` | [Openen in API-referentie](reference.md#tag/automations/POST/automations) |
| Een automatisering bijwerken | `PUT /automations/{automationId}` | [Openen in API-referentie](reference.md#tag/automations/PUT/automations/{automationId}) |
| Inschakelen | `POST /automations/{automationId}/enable` | [Openen in API-referentie](reference.md#tag/automations/POST/automations/{automationId}/enable) |
| Uitschakelen | `POST /automations/{automationId}/disable` | [Openen in API-referentie](reference.md#tag/automations/POST/automations/{automationId}/disable) |
| De uitvoeringsgeschiedenis lezen | `GET /automations/{automationId}/runs` | [Openen in API-referentie](reference.md#tag/automations/GET/automations/{automationId}/runs) |
| Mappen weergeven | `GET /automations/folders` | [Openen in API-referentie](reference.md#tag/automations/GET/automations/folders) |
| Een map aanmaken | `POST /automations/folders` | [Openen in API-referentie](reference.md#tag/automations/POST/automations/folders) |
| Een map hernoemen | `PUT /automations/folders/{folderId}` | [Openen in API-referentie](reference.md#tag/automations/PUT/automations/folders/{folderId}) |
| Een map verwijderen | `DELETE /automations/folders/{folderId}` | [Openen in API-referentie](reference.md#tag/automations/DELETE/automations/folders/{folderId}) |
| Een automatisering naar een map verplaatsen | `PUT /automations/{automationId}/folder` | [Openen in API-referentie](reference.md#tag/automations/PUT/automations/{automationId}/folder) |

---

## Automatiseringen lezen

`GET /automations` retourneert samenvattingen (geen stappen), meest recent gewijzigd eerst; `folder_id=none` geeft de automatiseringen weer die in geen enkele map staan. `GET /automations/{automationId}` voegt de volledige `graph` toe: elke stap (`nodes[]`) met zijn `kind`, `label`, `alias`, `action`, `params` en `config`, en de verbindingen (`edges[]`) met `from`, `to` en, na een voorwaarde of iets dergelijks, `branch`.

```bash
curl "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f?apiKey=YOUR_API_KEY"
```

**Goed om te weten**

- **`alias` is hoe latere stappen de output van een stap lezen**, als `${nodes.<alias>.<field>}`. Een stap zonder output wordt verwezen via zijn id.
- `params` wordt behouden voor oudere lezers; `config` bevat dezelfde waarden en meer (de regels van een voorwaarde, de prompt van een AI-stap, de duur van een vertraging, de slug en parameters van een actie).
- **Geheimen zijn 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 beletselteken. Als u die stap terugstuurt, plaats dan eerst de volledige tekst terug.
- 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.

### De stapcatalogus

`GET /automations/steps` retourneert alles waaruit een automatisering kan worden opgebouwd: de 8 `node_kinds`, elke trigger met zijn instellingen `fields` en `output_keys`, de ingebouwde `actions` met hun parameters, de `api_actions` (bewerkingen van deze API die een actiestap kan aanroepen), de `graph_rules` grammatica, en `counts`. Dit is wat de builder **aanbiedt**, niet wat het account heeft gebouwd: controleer dit voordat u concludeert dat een trigger of actie niet bestaat.

- Zonder `q` komen de honderden API-acties terug als labels gegroepeerd per gebied in `api_actions_by_tag` en is de platte lijst leeg.
- Met `q` (een hoofdletterongevoelig woord), is `api_actions` de platte lijst met overeenkomsten, begrensd op 60 (`api_actions_truncated` geeft aan wanneer). Acties voor verbonden apps van derden worden ook doorzocht en komen terug in `app_actions`: zoek op de naam van de app, bijvoorbeeld `q=hubspot`. Elke actie geeft aan of het account die app `connected` heeft, en `connected_apps` somt de verbonden apps op. `app_actions_unavailable` is `true` wanneer de app-acties deze keer niet konden worden doorzocht; de andere lijsten zijn nog steeds volledig.

---

## Aanmaken en bewerken

### Een concept aanmaken

```bash
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" }]
    }
  }'
```

```json
{ "success": true, "automation": { "id": "8d2c7f1e-…", "enabled": false, "…": "…" }, "draft": true, "open_path": "/automations/8d2c7f1e-…", "warnings": [] }
```

`draft: true` en `enabled: false` zijn normaal, geen fout: een nieuwe automatisering is altijd een concept totdat u deze inschakelt. `warnings` somt op wat de builder niet kon voltooien, als korte labels (bijvoorbeeld `agent_function:not_linked`).

**De graaf schrijven.** `graph_rules` uit de catalogus is de volledige grammatica. Kort gezegd:

- Elk knooppunt heeft een `id` (uniek in de graaf), een `type` (een van de 8 [stapsoorten](#step-kinds)), een optionele `label`, en zijn instellingen in `data` onder een sleutel vernoemd naar het type (`data.trigger`, `data.action`, `data.condition`, `data.delay`, `data.ai`, `data.loop`, `data.transform`, `data.respond`).
- Een automatisering heeft ten minste éé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 vanuit een trigger, en geen enkele verbinding mag terugleiden naar een eerdere stap.
- Randen die een voorwaarde verlaten, bevatten `sourceHandle` `true` of `false`; een lus `body` of `done`; een 'Wacht op antwoord'-vertraging `replied` of `timed_out`. Andere randen hebben er geen.
- Actie-slugs en parameters komen uit de catalogus. **Raad nooit een id** (een agent, een label, 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 [Gebruikmaken van wat een eerdere stap retourneerde](../automations/automations.md#using-what-an-earlier-step-returned) en [Expressies](../automations/automations.md#expressions).
- De graaf wordt geaccepteerd in twee schrijfwijzen: die van de builder zelf (hierboven) en die waarmee een leesactie antwoordt (`kind`, `config`, `from`, `to`, `branch`). U kunt dus een automatisering lezen, een stap wijzigen en deze terugsturen.
- **Het is niet veilig om een aanmaakactie blindelings te herhalen.** Als een verzoek een time-out krijgt, lijst dan uw automatiseringen op voordat u het opnieuw verstuurt, anders eindigt u mogelijk met twee concepten.

### Bijwerken

`PUT /automations/{automationId}` wijzigt `name`, `description` en/of `graph` (ten minste één, of `400`). Een `graph` vervangt de **volledige** graaf, dus werk altijd vanuit wat is opgeslagen: lees het, wijzig wat je nodig hebt en stuur de volledige graaf terug.

```bash
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)" }'
```

- **Houd elke `alias` van een stap precies zoals je deze hebt ontvangen.** Wijzig of verwijder deze niet, anders wordt elke verwijzing naar die stap leeg. Zie [Je stappen benoemen](../automations/automations.md#naming-your-steps).
- **Laat `"[redacted]"` waarden zoals ze zijn**, en **herstel ingekorte teksten** (een tekst die eindigt met een beletselteken was ingekort in de leesactie).
- Of de automatisering is ingeschakeld, wordt hier nooit gewijzigd. Als deze is ingeschakeld, is je wijziging live zodra deze is opgeslagen. Terwijl deze is ingeschakeld, wordt een wijziging die ervoor zou zorgen dat deze zichzelf activeert geweigerd: schakel deze eerst uit.

### 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 bij wie, en hiermee akkoord is gegaan. De builder weigert een graaf in te schakelen die niet kan worden uitgevoerd (geen trigger, een lus, een stap die zichzelf activeert) met een `400` die uitlegt waarom.

```bash
curl -X POST "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/enable?apiKey=YOUR_API_KEY"
```

`POST /automations/{automationId}/disable` pauzeert deze: uitvoeringen die al bezig zijn worden voltooid, er starten geen nieuwe uitvoeringen. Uitschakelen is altijd toegestaan. Geen van beide aanroepen vereist een body.

---

## Uitvoeringsgeschiedenis

`GET /automations/{automationId}/runs` retourneert de uitvoeringen van één automatisering, de nieuwste eerst (`limit` 1 tot 50, standaard 10): wanneer elk is gestart en voltooid, wat het heeft geactiveerd, of het is geslaagd en de foutmelding wanneer het is mislukt. Het lezen van de automatisering vertelt je wat deze **zou** doen; de uitvoeringsgeschiedenis vertelt je wat deze **heeft gedaan**, en het is de enige manier om een automatisering die nooit heeft gedraaid te onderscheiden van een die draait en elke keer faalt.

```bash
curl "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs?apiKey=YOUR_API_KEY&limit=20"
```

- `mode` is `live` voor een echte uitvoering, of `safe` voor 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 `runs` lijst is een antwoord, geen leemte. Het antwoord bevat dan een `note`: ofwel de trigger is nooit afgegaan, of de automatisering is uitgeschakeld.

---

## 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](../automations/automations.md#organizing-automations-in-folders).

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

- Het weergeven van mappen retourneert ook `unfiled_count`, het aantal automatiseringen dat zich in geen enkele map bevindt.
- Een mapnaam is vereist, maximaal 100 tekens, en uniek voor het account (`409`, `code: "folder_name_taken"`). Je kunt een automatisering ook archiveren door `folder_id` door te geven wanneer je deze aanmaakt.
- Hernoemen laat de automatiseringen waar ze zijn.
- **Het verwijderen van een map verwijdert alleen de map.** De automatiseringen verplaatsen zich naar 'geen map' en blijven precies zo draaien als voorheen; het antwoord geeft aan hoeveel er zijn verplaatst (`moved_to_no_folder`).
- Bij een verplaatsing is `folder_id` vereist; stuur `null` om de automatisering uit de map te halen.

---

## 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](../automations/automations.md#automation-settings).

**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](../automations/automations.md#triggers) 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: `errors` somt elk probleem op, elk met één corrigeerbare zin, en `error` is de eerste. Corrigeer precies wat er 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, een verplicht veld ontbreekt (`name` of `graph` bij een aanmaak, `folder_id` bij een verplaatsing), een update stuurde niets om te wijzigen, een id is niet geldig, of een mapnaam ontbreekt, is leeg of te lang (`code: "invalid_name"`). |
| `403` | Het account heeft geen Automatiseringen; het abonnement van een klantaccount bevat geen mogelijkheid tot het aanmaken en bewerken van automatiseringen (alleen schrijven); of de **Automatiseringen**-toegang van het teamlid is te laag. |
| `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 je 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`; hetzelfde verzoek opnieuw sturen helpt niet. |
| `503` | De automatiseringsservice kon niet worden bereikt. Probeer het over een moment opnieuw. Bij een aanmaak: vermeld eerst je automatiseringen zodat je geen tweede concept maakt. |

::: master-only
## Deze eindpunten gebruiken via MCP

Elk eindpunt op deze pagina is ook een tool voor een AI-assistent die u [verbindt via MCP](../integrations/connect-ai-clients.md), 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](../automations/automations.md): hoe triggers, stappen, variabelen en de uitvoeringsgeschiedenis werken in de builder.
- [API voor bureaus](../agency/api-for-agencies.md): bouw automatiseringen op een klantaccount met `sub_account_id`.
- [API-referentie](reference.md): de volledige interactieve eindpuntverkenner.
