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

# Crear automatización

> Crea una automatización de Famulor a partir de una definición, actívala y compruébala con una ejecución de prueba real.

<Warning>
  **API de Famulor 1.0 (legado).** Esta página se aplica únicamente a Famulor 1.0 (`app.famulor.de`) y se conserva por compatibilidad. Para la plataforma actual, usa la [referencia de la API de Famulor 2.0](/es/api-reference/introduction).
</Warning>

Este endpoint crea una automatización a partir de su definición (un activador y sus pasos encadenados), la activa, ejecuta una prueba real con tu payload de ejemplo y reporta el resultado paso a paso. La ejecución de prueba es la puerta de entrada: una automatización cuya prueba falla queda desactivada, y una automatización de eventos de asistente solo se vincula al asistente después de superar la prueba.

Cuando una plantilla lista para usar se ajusta a lo que necesitas, [aplicarla](/es/api-v1/automations/apply-template) es más sencillo que escribir una definición desde cero.

<Warning>
  La ejecución de prueba ejecuta la automatización de verdad. Las definiciones que contienen pasos que envían mensajes o correos, o inician llamadas, se rechazan a menos que pases explícitamente `confirm_side_effects: true`; y cuando lo haces, esos pasos realmente se ejecutan durante la prueba. Dirígelos a destinatarios que te pertenezcan.
</Warning>

### El formato de la definición

El objeto `flow` es la definición de la automatización. La forma preferida es una lista plana:

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

Los pasos se encadenan al activador en el orden indicado. El único anidamiento que debes escribir tú mismo es el que necesita un paso concreto: los pasos condicionales de un paso `BRANCH` van bajo `onSuccessAction` / `onFailureAction`. (También se acepta un árbol anidado a mano, en el que cada paso está bajo el `nextAction` del anterior).

Una definición siempre reemplaza toda la automatización; nunca se combina con la anterior. Un activador sin pasos se rechaza (`no_steps`): una automatización que no hace nada no se puede activar.

#### Activadores admitidos (`trigger.settings`)

| Activador               | pieceName / triggerName                                                                                     | Comportamiento                                                                                                                                                                                                                      |
| ----------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Webhook                 | `@activepieces/piece-webhook` / `catch_webhook`                                                             | Obtienes una `webhook_url` para llamar desde sistemas externos. El payload llega envuelto: referencia los campos como `{{trigger['body']['field']}}`. Se prueba de forma síncrona con tu ejemplo.                                   |
| Llamada finalizada      | `@famulor/piece-famulor` / `phoneCallEnded`                                                                 | Requiere `assistant_id`. Se vincula al asistente tras una prueba superada. Los campos del payload están directamente en el activador: `{{trigger['extracted_variables']['x']}}`, `{{trigger['customer_phone']}}`, …                 |
| Llamada entrante        | `@famulor/piece-famulor` / `inboundCall`                                                                    | Requiere `assistant_id`. Se ejecuta antes de que el asistente responda; debe terminar en un paso de respuesta que devuelva un mapa plano de cadenas de texto.                                                                       |
| Nueva conversación      | `@famulor/piece-famulor` / `newConversation`                                                                | Requiere `assistant_id`.                                                                                                                                                                                                            |
| Conversación finalizada | activador de webhook + `bind_webhook: "conversation_ended"`                                                 | Requiere `assistant_id`. Se dispara cuando termina un chat; el payload llega envuelto, así que referencia los campos mediante `{{trigger['body']['...']}}`.                                                                         |
| Programación            | `@activepieces/piece-schedule` / `every_x_minutes`, `every_day`, …                                          | No se puede disparar a demanda: se activa como `active_untested`; la primera ejecución programada es la prueba (consulta las ejecuciones).                                                                                          |
| Integraciones externas  | el propio activador de la integración (nueva fila de hoja de cálculo, nuevo contacto de CRM, nuevo lead, …) | Tu cuenta conectada se vincula automáticamente; si falta o ha caducado, obtienes un error `needs_connection` / `needs_reconnection` con los pasos exactos para solucionarlo en la app de Famulor. Se activa como `active_untested`. |

Los pasos referencian la salida de pasos anteriores por el nombre del paso: `{{step_1['body']['field']}}` para pasos HTTP (su JSON se anida bajo `body`). Formas habituales de paso: solicitudes HTTP, transformaciones de código, ramificaciones, retrasos, pasos de respuesta y acciones de la plataforma Famulor (enviar SMS/WhatsApp, iniciar una llamada, volver a poner un lead en cola). La forma más fácil de aprender la estructura exacta de un paso es leer una automatización existente con [Obtener automatización](/es/api-v1/automations/get) o aplicar una plantilla e inspeccionar lo que ha creado.

### Cuerpo de la solicitud

<ParamField body="name" type="string" required>
  Un nombre breve y legible para la automatización (máx. 255 caracteres)
</ParamField>

<ParamField body="flow" type="object" required>
  La definición de la automatización — `{"trigger": {...}, "steps": [...]}` como se describe arriba. Máx. 1 MB.
</ParamField>

<ParamField body="sample" type="object">
  Un payload de ejemplo con una forma realista para la ejecución de prueba (lo que recibirá el activador). Para eventos de asistente, si se omite se usa un ejemplo canónico construido a partir de las propias variables del asistente. Máx. 256 KB.
</ParamField>

<ParamField body="assistant_id" type="integer">
  Obligatorio para automatizaciones de eventos de asistente (`phoneCallEnded`, `inboundCall`, `newConversation` y `bind_webhook`): el asistente al que se vincula esta automatización. Empieza a recibir los eventos reales de ese asistente después de superar la prueba. (En los activadores de plataforma, seleccionar el asistente dentro de `settings.input.assistant` del activador también funciona; el parámetro explícito tiene prioridad).
</ParamField>

<ParamField body="bind_webhook" type="string">
  Solo para una definición activada por webhook: la vincula al evento de conversación finalizada del asistente. El único valor admitido es `conversation_ended`. Requiere `assistant_id`.
</ParamField>

<ParamField body="confirm_side_effects" type="boolean">
  Obligatorio (`true`) cuando la definición contiene pasos que envían mensajes o correos, inician llamadas o hacen solicitudes HTTP que no son GET; la ejecución de prueba los ejecuta de verdad.
</ParamField>

### Respuesta

Devuelve `201` cuando la automatización está activa (`active` / `active_untested`), `200` cuando se creó pero su ejecución de prueba falló (`test_failed`), y `422` para una definición que nunca llegó a la ejecución de prueba (consulta los códigos de error más abajo).

<ResponseField name="automation_id" type="string">
  El ID de la automatización creada
</ResponseField>

<ResponseField name="webhook_url" type="string | null">
  Para automatizaciones activadas por webhook (incluidas las de conversación finalizada): la URL que llaman los sistemas externos para dispararla. `null` para automatizaciones de eventos de asistente y de programación.
</ResponseField>

<ResponseField name="status" type="string">
  `active` — la ejecución de prueba se superó; la automatización está activa (y vinculada, en el caso de eventos de asistente).
  `active_untested` — el activador no se puede disparar a demanda (programaciones, integraciones externas); la automatización está activa y lista, y el primer evento real es la prueba.
  `test_failed` — la ejecución de prueba falló; la automatización quedó desactivada. Consulta `test.steps` para la clasificación por paso.
</ResponseField>

<ResponseField name="test" type="object">
  El resultado de la ejecución de prueba

  <Expandable title="propiedades de test">
    <ResponseField name="run_status" type="string">
      `SUCCEEDED`, `PAUSED`, `FAILED`, o `not_tested` (activadores que no se pueden probar); rara vez `no_run` cuando la prueba no generó ningún registro de ejecución. `PAUSED` cuenta como éxito: la ejecución está detenida en un paso de Retraso esperando su hora objetivo; todos los pasos anteriores al retraso ya se ejecutaron.
    </ResponseField>

    <ResponseField name="steps" type="array">
      Resultado por paso de la ejecución de prueba

      <Expandable title="propiedades de step">
        <ResponseField name="name" type="string">
          El nombre del paso (`trigger`, `step_1`, …)
        </ResponseField>

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

        <ResponseField name="classification" type="string">
          `ok`, `paused_at_delay`, o —para fallos— `wiring_error` (la definición está mal: corrígela y repárala mediante [Actualizar automatización](/es/api-v1/automations/update)), `missing_connection` (primero hay que conectar una cuenta en la app de Famulor), `missing_record` (el ejemplo hacía referencia a datos que no existen; a menudo no es grave).
        </ResponseField>

        <ResponseField name="error" type="string | null">
          El mensaje de error del paso, si falló
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="response" type="object | string | null">
  Para automatizaciones probadas de forma síncrona (activadores de webhook e inbound): lo que respondió la automatización durante la ejecución de prueba
</ResponseField>

<ResponseField name="binding" type="object | null">
  Para automatizaciones de eventos de asistente: `{"type": "post_call" | "inbound" | "conversation" | "conversation_ended", "assistant_id": <id>, "bound": <bool>}`. `bound` solo es `true` después de una prueba superada.
</ResponseField>

### Códigos de error (422)

Los fallos graves devuelven `{"message": "...", "error": "<code>"}` y no se activa nada. Códigos destacados:

| error                                                | Significado                                                                                                                                                                                                               |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `side_effects_require_confirmation`                  | La definición contiene pasos que enviarían datos de verdad durante la prueba: vuelve a intentarlo con `confirm_side_effects: true` después de comprobar los destinatarios.                                                |
| `no_steps`                                           | El activador no tiene pasos encadenados.                                                                                                                                                                                  |
| `invalid_definition` / `unsupported_trigger`         | A la definición le falta el activador, o usa un tipo de activador no compatible.                                                                                                                                          |
| `assistant_required` / `assistant_not_found`         | El activador necesita un `assistant_id`, o el asistente no pertenece a tu cuenta.                                                                                                                                         |
| `binding_conflict`                                   | El asistente ya tiene una automatización (o un webhook personalizado) para este evento: cada asistente tiene un único espacio por tipo de evento. Actualiza la automatización existente en su lugar, o elimínala primero. |
| `needs_connection` / `needs_reconnection`            | La cuenta de integración del activador debe conectarse (o reconectarse) primero en la app de Famulor; el mensaje contiene los pasos exactos.                                                                              |
| `import_failed` / `publish_failed` / `create_failed` | La definición fue rechazada o no se pudo activar.                                                                                                                                                                         |

<ResponseExample>
  ```json 201 Created (webhook, test passed) 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>
  Páginas relacionadas: [Listar plantillas de automatización](/es/api-v1/automations/list-templates), [Aplicar plantilla de automatización](/es/api-v1/automations/apply-template), y [Autenticación](/es/api-v1/authentication).
</Tip>
