> ## Documentation Index
> Fetch the complete documentation index at: https://docs.famulor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Automation erstellen

> Erstelle eine Famulor-Automation aus einer Definition, aktiviere sie und prüfe sie mit einem echten Testlauf.

<Warning>
  **Famulor 1.0 API (Legacy).** Diese Seite gilt nur für Famulor 1.0 (`app.famulor.de`) und bleibt aus Kompatibilitätsgründen erhalten. Für die aktuelle Plattform nutze die [Famulor 2.0 API-Referenz](/de/api-reference/introduction).
</Warning>

Dieser Endpunkt erstellt eine Automation aus ihrer Definition (Trigger und verkettete Steps), aktiviert sie, führt einen echten Testlauf mit deinem Sample-Payload aus und meldet das Ergebnis Schritt für Schritt. Der Testlauf ist das Tor: schlägt der Test fehl, bleibt die Automation deaktiviert; eine Assistant-Event-Automation wird erst nach bestandenem Test an den Assistant gebunden.

Wenn eine fertige Vorlage passt, ist [Anwenden einer Vorlage](/de/api-v1/automations/apply-template) einfacher als eine Definition von Grund auf zu schreiben.

<Warning>
  Der Testlauf führt die Automation echt aus. Definitionen mit Steps, die Nachrichten oder E-Mails senden oder Anrufe starten, werden abgelehnt, sofern du nicht explizit `confirm_side_effects: true` setzt — und dann senden diese Steps während des Tests wirklich. Richte sie auf Empfänger, die dir gehören.
</Warning>

### Definitionsformat

Das `flow`-Objekt ist die Definition der Automation. Bevorzugte Form ist eine flache Liste:

```json theme={null}
{
  "trigger": { ... },
  "steps": [ step1, step2, ... ]
}
```

Die Steps werden in der angegebenen Reihenfolge an den Trigger gehängt. Nesting schreibst du nur dort, wo es nötig ist — bedingte Steps eines `BRANCH`-Steps unter `onSuccessAction` / `onFailureAction`. (Ein handverschachtelter Baum, in dem jeder Step unter dem `nextAction` des vorherigen liegt, wird ebenfalls akzeptiert.)

Eine Definition ersetzt immer die gesamte Automation — sie wird nie gemerged. Ein Trigger ohne Steps wird abgelehnt (`no_steps`): eine Automation, die nichts tut, kann nicht aktiviert werden.

#### Unterstützte Trigger (`trigger.settings`)

| Trigger               | pieceName / triggerName                                                                | Verhalten                                                                                                                                                                                                                |
| --------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Webhook               | `@activepieces/piece-webhook` / `catch_webhook`                                        | Du erhältst eine `webhook_url` für externe Systeme. Der Payload kommt gewrappt: Felder als `{{trigger['body']['field']}}`. Synchron mit deinem Sample getestet.                                                          |
| Anruf beendet         | `@famulor/piece-famulor` / `phoneCallEnded`                                            | Erfordert `assistant_id`. Nach grünem Test an den Assistant gebunden. Payload-Felder liegen direkt auf dem Trigger: `{{trigger['extracted_variables']['x']}}`, `{{trigger['customer_phone']}}`, …                        |
| Eingehender Anruf     | `@famulor/piece-famulor` / `inboundCall`                                               | Erfordert `assistant_id`. Läuft, bevor der Assistant antwortet; muss in einem Respond-Step enden, der eine flache Map von Strings zurückgibt.                                                                            |
| Neue Conversation     | `@famulor/piece-famulor` / `newConversation`                                           | Erfordert `assistant_id`.                                                                                                                                                                                                |
| Conversation beendet  | Webhook-Trigger + `bind_webhook: "conversation_ended"`                                 | Erfordert `assistant_id`. Feuert, wenn ein Chat endet; Payload kommt gewrappt — Felder über `{{trigger['body']['...']}}`.                                                                                                |
| Zeitplan              | `@activepieces/piece-schedule` / `every_x_minutes`, `every_day`, …                     | Kann nicht on-demand gefeuert werden — aktiviert als `active_untested`; der erste geplante Lauf ist der Beweis (Runs prüfen).                                                                                            |
| Externe Integrationen | eigener Trigger der Integration (neue Tabellenzeile, neuer CRM-Kontakt, neuer Lead, …) | Dein verbundenes Konto wird automatisch angehängt; fehlt es oder ist es abgelaufen, erhältst du `needs_connection` / `needs_reconnection` mit den genauen Schritten in der Famulor-App. Aktiviert als `active_untested`. |

Steps referenzieren frühere Ausgaben über den Step-Namen — `{{step_1['body']['field']}}` für HTTP-Steps (JSON liegt unter `body`). Häufige Step-Formen: HTTP-Requests, Code-Transforms, Branches, Delays, Respond-Steps und Famulor-Plattform-Aktionen (SMS/WhatsApp senden, Anruf starten, Lead erneut in die Queue). Am einfachsten lernst du die genaue Form, indem du eine bestehende Automation mit [Automation abrufen](/de/api-v1/automations/get) liest oder eine Vorlage anwendest und das Ergebnis inspizierst.

### Anfrage-Body

<ParamField body="name" type="string" required>
  Ein kurzer, menschenlesbarer Name für die Automation (max. 255 Zeichen)
</ParamField>

<ParamField body="flow" type="object" required>
  Die Automation-Definition — `{"trigger": {...}, "steps": [...]}` wie oben beschrieben. Max. 1 MB.
</ParamField>

<ParamField body="sample" type="object">
  Ein realistisch geformter Sample-Payload für den Testlauf (was der Trigger empfängt). Bei Assistant-Events wird bei Weglassen ein kanonisches Sample aus den Variablen des Assistants verwendet. Max. 256 KB.
</ParamField>

<ParamField body="assistant_id" type="integer">
  Pflicht für Assistant-Event-Automationen (`phoneCallEnded`, `inboundCall`, `newConversation` und `bind_webhook`): der Assistant, an den die Automation gebunden wird. Er empfängt die echten Events erst nach bestandenem Test. (Bei Plattform-Triggern funktioniert auch die Auswahl des Assistants in `settings.input.assistant` — der explizite Parameter hat Vorrang.)
</ParamField>

<ParamField body="bind_webhook" type="string">
  Nur für webhook-getriggerte Definitionen: an das Conversation-Ended-Event des Assistants binden. Einziger unterstützter Wert: `conversation_ended`. Erfordert `assistant_id`.
</ParamField>

<ParamField body="confirm_side_effects" type="boolean">
  Pflicht (`true`), wenn die Definition Steps enthält, die Nachrichten oder E-Mails senden, Anrufe starten oder Non-GET-HTTP-Requests machen — der Testlauf führt sie echt aus.
</ParamField>

### Antwort

Liefert `201`, wenn die Automation aktiv ist (`active` / `active_untested`), `200`, wenn sie gebaut wurde, der Test aber fehlschlug (`test_failed`), und `422` für eine Definition, die den Testlauf nie erreicht hat (siehe Fehlercodes unten).

<ResponseField name="automation_id" type="string">
  Die ID der erstellten Automation
</ResponseField>

<ResponseField name="webhook_url" type="string | null">
  Bei webhook-getriggerten Automationen (inkl. Conversation-Ended): die URL, die externe Systeme aufrufen. `null` bei Assistant-Event- und Schedule-Automationen.
</ResponseField>

<ResponseField name="status" type="string">
  `active` — Testlauf bestanden; die Automation ist live (und bei Assistant-Events gebunden).
  `active_untested` — Trigger kann nicht on-demand gefeuert werden (Schedules, externe Integrationen); die Automation ist live und scharf, der erste echte Event ist der Beweis.
  `test_failed` — Testlauf fehlgeschlagen; Automation bleibt deaktiviert. Lies `test.steps` für die Klassifikation pro Step.
</ResponseField>

<ResponseField name="test" type="object">
  Ergebnis des Testlaufs

  <Expandable title="test-Eigenschaften">
    <ResponseField name="run_status" type="string">
      `SUCCEEDED`, `PAUSED`, `FAILED` oder `not_tested` (nicht testbare Trigger); selten `no_run`, wenn der Test keinen Ausführungsdatensatz erzeugt hat. `PAUSED` zählt als Erfolg: der Lauf wartet an einem Delay-Step auf die Zielzeit — alle Steps davor sind bereits gelaufen.
    </ResponseField>

    <ResponseField name="steps" type="array">
      Ergebnis pro Step des Testlaufs

      <Expandable title="Step-Eigenschaften">
        <ResponseField name="name" type="string">
          Der Step-Name (`trigger`, `step_1`, …)
        </ResponseField>

        <ResponseField name="status" type="string">
          `SUCCEEDED`, `FAILED` oder `PAUSED`
        </ResponseField>

        <ResponseField name="classification" type="string">
          `ok`, `paused_at_delay` oder — bei Fehlern — `wiring_error` (Definition falsch: reparieren über [Automation aktualisieren](/de/api-v1/automations/update)), `missing_connection` (Konto muss zuerst in der Famulor-App verbunden werden), `missing_record` (Sample referenziert nicht existierende Daten — oft unkritisch).
        </ResponseField>

        <ResponseField name="error" type="string | null">
          Fehlermeldung des Steps, falls fehlgeschlagen
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="response" type="object | string | null">
  Bei synchron getesteten Automationen (Webhook- und Inbound-Trigger): was die Automation während des Testlaufs geantwortet hat
</ResponseField>

<ResponseField name="binding" type="object | null">
  Bei Assistant-Event-Automationen: `{"type": "post_call" | "inbound" | "conversation" | "conversation_ended", "assistant_id": <id>, "bound": <bool>}`. `bound` ist nur nach grünem Test `true`.
</ResponseField>

### Fehlercodes (422)

Harte Fehler liefern `{"message": "...", "error": "<code>"}` und nichts wird aktiviert. Wichtige Codes:

| error                                                | Bedeutung                                                                                                                                                                 |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `side_effects_require_confirmation`                  | Die Definition enthält Steps, die im Test echt senden würden — erneut mit `confirm_side_effects: true` versuchen, nachdem die Empfänger geprüft wurden.                   |
| `no_steps`                                           | Am Trigger hängen keine Steps.                                                                                                                                            |
| `invalid_definition` / `unsupported_trigger`         | Der Definition fehlt der Trigger, oder der Trigger-Typ wird nicht unterstützt.                                                                                            |
| `assistant_required` / `assistant_not_found`         | Der Trigger braucht eine `assistant_id`, oder der Assistant gehört nicht zu deinem Account.                                                                               |
| `binding_conflict`                                   | Der Assistant hat bereits eine Automation (oder einen Custom-Webhook) für dieses Event — ein Slot pro Event-Typ. Bestehende Automation aktualisieren oder zuerst löschen. |
| `needs_connection` / `needs_reconnection`            | Das Integrationskonto des Triggers muss zuerst in der Famulor-App verbunden (oder neu verbunden) werden — die Meldung enthält die genauen Schritte.                       |
| `import_failed` / `publish_failed` / `create_failed` | Die Definition wurde abgelehnt oder konnte nicht aktiviert werden.                                                                                                        |

<ResponseExample>
  ```json 201 Created (Webhook, Test bestanden) theme={null} theme={null}
  {
    "automation_id": "f4EaLhOW2zoEsXXSOJP2r",
    "webhook_url": "https://automate.famulor.ai/api/v1/webhooks/f4EaLhOW2zoEsXXSOJP2r",
    "status": "active",
    "test": {
      "run_status": "SUCCEEDED",
      "steps": [
        { "name": "trigger", "status": "SUCCEEDED", "classification": "ok", "error": null },
        { "name": "step_1", "status": "SUCCEEDED", "classification": "ok", "error": null }
      ]
    },
    "response": { "ok": "true", "echo": "hello" },
    "binding": null
  }
  ```

  ```json 201 Created (Schedule, active_untested) theme={null} theme={null}
  {
    "automation_id": "aB3xYz01MnOpQrStUvWxY",
    "webhook_url": null,
    "status": "active_untested",
    "test": {
      "run_status": "not_tested",
      "steps": []
    },
    "response": null,
    "binding": null
  }
  ```

  ```json 422 Validation Error theme={null} theme={null}
  {
    "message": "This automation contains steps that would REALLY send messages, emails or start calls during the test run: Send SMS. Confirm with the user first — point those steps at a safe recipient the user owns — then retry with confirm_side_effects set to true.",
    "error": "side_effects_require_confirmation"
  }
  ```
</ResponseExample>

<Tip>
  Verwandte Seiten: [Vorlagen auflisten](/de/api-v1/automations/list-templates), [Vorlage anwenden](/de/api-v1/automations/apply-template) und [Authentifizierung](/de/api-v1/authentication).
</Tip>
