# Automatizaciones API

> Crea flujos de trabajo a partir de disparadores y pasos, lánzalos y consulta sus ejecuciones.

URL base: `https://api.emailit.com/v2`. Autentícate con `Authorization: Bearer <API key>`.

## Crear una automatización — POST /automations

> Crea una automatización en borrador a partir de un grafo de pasos de disparador y de acción, como un email de bienvenida que se envía cuando un contacto se une a una lista de contactos.

# Crear una automatización

Crea una automatización con el estado `draft` a partir de un grafo de pasos y conexiones. Requiere una clave de API con el permiso `full`. Las automatizaciones están en beta.

La automatización no hace nada hasta que la [inicias](/es/docs/api-reference/automations/start/). Cada ejecución cuesta 3 créditos al empezar, y cada email que envía `send_email` o `forward_email` cuesta 1 crédito más. En un espacio de trabajo sin verificar, esas acciones solo pueden enviar a las direcciones de email de las cuentas de los miembros del espacio de trabajo.

`POST /automations`

## Parámetros del cuerpo

- `context` (string, obligatorio): Sobre qué trata cada ejecución: `contact`, `email` o `event`. El contexto determina qué disparadores y acciones puedes usar, y no se puede cambiar después. Consulta [Contextos](#contexts).

- `name` (string, obligatorio): El nombre de la automatización, de hasta 191 caracteres.

- `description` (string | null): Una descripción opcional.

- `settings` (object): Las reglas de ejecución. Consulta [Configuración](#settings).

- `steps` (object[], obligatorio): Los pasos de disparador y de acción, con al menos un disparador. Consulta [Pasos](#steps).

- `connections` (object[], obligatorio): Las aristas entre los pasos. Pasa `[]` para un grafo que solo tenga un disparador. Consulta [Conexiones](#connections).

### Configuración

- `on_step_failure` (string): `stop` marca la ejecución como `failed` cuando falla un paso. `skip` registra el paso fallido y deja que el resto de la ejecución termine.

- `allow_reentry` (boolean): `false` ignora un disparo cuando el mismo contacto (o email) ya tiene una ejecución en curso en esta automatización.

- `max_concurrent_runs` (integer): El número máximo de ejecuciones con el estado `running` a la vez. `0` significa sin límite.

- `cooldown_seconds` (integer): Ignora un disparo cuando el mismo contacto (o email) inició una ejecución en esta automatización hace menos de este número de segundos.

### Pasos

- `key` (string, obligatorio): Tu identificador del paso, único dentro de la automatización, por ejemplo `welcome_email`. Las conexiones, las [estadísticas de pasos](/es/docs/api-reference/automations/step-stats/) y las actualizaciones hacen referencia a los pasos por su clave.

- `type` (string, obligatorio): `trigger` o `action`.

- `trigger` (string): El nombre del disparador, obligatorio cuando `type` es `trigger`. Consulta [Disparadores](#triggers).

- `action` (string): El nombre de la acción, obligatorio cuando `type` es `action`. Consulta [Acciones](#actions).

- `config` (object): La configuración del disparador o de la acción.

### Conexiones

- `from` (string, obligatorio): La clave del paso en el que empieza la arista.

- `to` (string, obligatorio): La clave del paso siguiente.

- `branch` (string): Qué resultado del paso `from` sigue esta arista. Los pasos `condition` usan `yes` y `no`; los pasos `experiment` usan claves de variante. Todos los demás pasos usan `default`.

## Contextos

| Contexto | Una ejecución trata sobre | Disparadores | Reglas |
| --- | --- | --- | --- |
| `contact` | Un contacto. `send_email` se envía a ese contacto. | `contact.*`, `system.*` | Uno o varios disparadores. Todos deben conectarse a la misma primera acción. |
| `email` | Un email (enviado o recibido). | `email.*`, `system.*` | Uno o varios disparadores. Todos deben conectarse a la misma primera acción. |
| `event` | Solo el payload del disparador. | `event.*`, `system.*` | Exactamente un disparador. |

Todas las acciones deben ser alcanzables desde un disparador. Una ejecución empieza en la acción conectada al disparador que se ha disparado y sigue las conexiones:

- `condition` solo sigue la arista cuyo `branch` es `yes` o `no`, según el resultado.
- `experiment` sigue las aristas de la variante elegida. Cuando termina ese camino, la ejecución continúa por las aristas `default` del paso de experimento.
- `wait` retrasa el paso siguiente.
- Todas las demás acciones siguen sus aristas `default`. Un paso con varias aristas de salida las recorre todas.

Una ejecución queda `completed` cuando no quedan pasos, `failed` cuando falla un paso (con `on_step_failure: "stop"`) y `canceled` cuando [detienes la automatización](/es/docs/api-reference/automations/stop/).

## Disparadores

| Disparador | Contexto | Se dispara cuando |
| --- | --- | --- |
| `contact.added_to_audience` | contact | Un contacto se suscribe a una lista de contactos, también cuando vuelve a suscribirse. |
| `contact.removed_from_audience` | contact | Se elimina un suscriptor de una lista de contactos. |
| `contact.updated` | contact | Se actualiza un contacto. |
| `contact.loaded_email` | contact | Un destinatario que es contacto del espacio de trabajo abre un email. |
| `contact.clicked_in_email` | contact | Un destinatario que es contacto del espacio de trabajo hace clic en un enlace con seguimiento. |
| `contact.date_anniversary` | contact | Cada día a las 00:00 UTC, para los contactos cuyo campo personalizado de fecha (`YYYY-MM-DD`) coincide en mes y día con la fecha de hoy. |
| `contact.on_date` | contact | Cada día a las 00:00 UTC, para los contactos cuyo campo personalizado de fecha es igual a la fecha de hoy. |
| `contact.visits_url`, `contact.on_purchase`, `contact.on_event` | contact | Se aceptan, pero Emailit todavía no los dispara. |
| `email.received` | email | Llega un email entrante. |
| `email.delivered`, `email.bounced`, `email.complained`, `email.loaded`, `email.clicked`, `email.failed`, `email.suppressed`, `email.canceled` | email | Se produce el evento de email del mismo nombre. |
| `event.<name>` | event | Cualquier nombre que empiece por `event.`. Emailit todavía no emite eventos `event.*`; inicia las automatizaciones de eventos con `system.manual`. |
| `system.manual` | todos | Llamas a [Lanzar una ejecución](/es/docs/api-reference/automations/trigger/). |
| `system.schedule` | todos | Se acepta, pero Emailit todavía no dispara los disparadores programados. |

Campos de `config` del disparador:

- `audience_id` (string): Para `contact.added_to_audience` y `contact.removed_from_audience`: solo se dispara para esta lista de contactos (`aud_…`).

- `date_field` (string): Para `contact.date_anniversary` y `contact.on_date`: la clave del [campo personalizado](/es/docs/contacts/custom-fields/) que contiene la fecha, por ejemplo `birthday`.

- `filter` (object): Solo se dispara cuando el evento cumple el filtro: `{ "match": "all", "rules": [{ "field": "subject", "operator": "contains", "value": "Invoice" }] }`. `match` es `all` (por defecto) o `any`. `field` es una ruta con puntos dentro del `object` del evento, por ejemplo `to` o `email.subject`; un prefijo `payload.` inicial se ignora. Operadores: `equals`, `not_equals`, `contains`, `not_contains`, `starts_with`, `ends_with`, `greater_than`, `less_than`, `in`, `not_in`, `is_set`, `is_not_set`. Todos los operadores excepto `is_set` e `is_not_set` necesitan un `value`; `in` y `not_in` aceptan un array.

## Acciones

| Acción | Contexto | Configuración |
| --- | --- | --- |
| `send_email` | todos | `type` (obligatorio, `template`), `template_id` (obligatorio: un ID `tem_` o el alias de una plantilla publicada), `from`, `subject`, `reply_to`, `to` |
| `forward_email` | email, event | `to` (obligatorio), `from`, `subject`, `email_id` |
| `wait` | todos | `seconds` (obligatorio, de 0 a 2.592.000, es decir, 30 días) |
| `condition` | todos | `filter` (obligatorio, consulta más abajo) |
| `experiment` | todos | `variants` (obligatorio), `control` |
| `call_webhook` | todos | `url` (obligatorio), `method`, `headers`, `body` |
| `run_automation` | todos | `automation_id` (obligatorio) |
| `end` | todos | Ninguna |
| `add_to_audience` | contact | `audience_id` (obligatorio) |
| `remove_from_audience` | contact | `audience_id` (obligatorio) |
| `edit_contact` | contact | `fields` (obligatorio) |
| `add_to_suppressions` | email, event | `type`, `reason`, `email` |
| `remove_from_suppressions` | email, event | `email` |
| `create_contact` | email, event | `email`, `first_name`, `audience_id` |

- **`send_email`** envía la plantilla. Por defecto, `from` es el remitente de la plantilla, y debe pertenecer a un dominio de envío verificado. `subject` sustituye el asunto de la plantilla. `reply_to` es una dirección o un array de direcciones. En el contexto `contact`, el email se envía al contacto de la ejecución; en los contextos `email` y `event`, indica `to`.
- **`forward_email`** reenvía el email de la ejecución (o el email de `email_id`) a `to`. Por defecto, `from` es el remitente original y `subject` es `Fwd: <original subject>`.
- **`condition`** acepta `{ "match": "all" | "any", "rules": [...] }` con los mismos operadores que los filtros de los disparadores. Los campos sin prefijo se resuelven contra el contacto (`first_name`, `custom_fields.plan`) o el email (`rcpt_to`, `subject`) de la ejecución; añade a un campo el prefijo `contact.`, `email.`, `payload.` o `meta.` para indicarlo de forma explícita. El paso continúa por `yes` o por `no`.
- **`experiment`** elige al azar, según su peso, una de las `variants` (y `control`), cada una con la forma `{ "key": "a", "weight": 50 }`, y continúa por la rama que lleva el nombre de la clave elegida.
- **`call_webhook`** envía una petición HTTP (método por defecto `POST`, `Content-Type` JSON) y registra la clase de estado (`2xx`, `4xx`, `5xx`), `timeout` o `network_error`. Una respuesta que no sea 2xx no hace fallar el paso.
- **`run_automation`** inicia una ejecución de otra automatización en marcha con el payload de esta ejecución. La ejecución actual continúa.
- **`edit_contact`** acepta `fields: [{ "key": "first_name", "value": "Ada" }]`. Las claves `email`, `first_name`, `last_name` y `unsubscribed` actualizan el contacto; cualquier otra clave asigna un valor a un campo personalizado.
- **`add_to_suppressions`** bloquea la dirección de la ejecución (`type` por defecto `recipient`, `reason` por defecto `automation`). **`remove_from_suppressions`** la desbloquea. En el contexto `event`, pasa `email`.
- **`create_contact`** crea el contacto (o encuentra el que ya existe) y, opcionalmente, lo suscribe a `audience_id`. En el contexto `email`, `email` es por defecto el destinatario del email.

Los valores de cadena de la configuración de cualquier acción pueden usar marcadores que Emailit rellena cuando se ejecuta el paso: `{{contact.email}}`, `{{email.mail_from}}`, `{{payload.object.subject}}` o `{{meta.source_event_id}}`, por ejemplo `"to": "{{email.mail_from}}"`. Las plantillas que envía `send_email` también renderizan directamente los campos del contacto, como `{{ first_name }}`.

## Devuelve

Devuelve `201 Created` con la automatización en `data`, incluidos el ID de cada paso (`aus_…`) y las conexiones. `status` es `draft`.

La creación comprueba la estructura del grafo: los nombres de los disparadores y de las acciones según el contexto, que las claves sean únicas, que las conexiones sean válidas, que todos los pasos sean alcanzables y que cualquier dirección `from` de `send_email` use un dominio de envío verificado. No comprueba que la configuración de cada acción esté completa; eso lo hace [Actualizar una automatización](/es/docs/api-reference/automations/update/). Los errores devuelven `400` con `errors` indexado por la ruta del campo.

**Petición** `POST /automations`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Welcome series",
    "context": "contact",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "settings": { "allow_reentry": false },
    "steps": [
      {
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "key": "welcome_email",
        "type": "action",
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      },
      {
        "key": "wait_1_day",
        "type": "action",
        "action": "wait",
        "config": { "seconds": 86400 }
      },
      {
        "key": "is_free_user",
        "type": "action",
        "action": "condition",
        "config": {
          "filter": {
            "match": "all",
            "rules": [{ "field": "custom_fields.plan", "operator": "is_not_set" }]
          }
        }
      },
      {
        "key": "upgrade_tips",
        "type": "action",
        "action": "send_email",
        "config": { "type": "template", "template_id": "getting-started-tips" }
      },
      { "key": "done", "type": "action", "action": "end" }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email" },
      { "from": "welcome_email", "to": "wait_1_day" },
      { "from": "wait_1_day", "to": "is_free_user" },
      { "from": "is_free_user", "to": "upgrade_tips", "branch": "yes" },
      { "from": "is_free_user", "to": "done", "branch": "no" }
    ]
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Welcome series',
    context: 'contact',
    description: 'Welcome new subscribers, then nudge free users a day later.',
    settings: { allow_reentry: false },
    steps: [
      {
        key: 'joined',
        type: 'trigger',
        trigger: 'contact.added_to_audience',
        config: { audience_id: 'aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV' },
      },
      {
        key: 'welcome_email',
        type: 'action',
        action: 'send_email',
        config: { type: 'template', template_id: 'welcome', from: 'Acme <hello@acme.com>' },
      },
      { key: 'wait_1_day', type: 'action', action: 'wait', config: { seconds: 86400 } },
      {
        key: 'is_free_user',
        type: 'action',
        action: 'condition',
        config: {
          filter: { match: 'all', rules: [{ field: 'custom_fields.plan', operator: 'is_not_set' }] },
        },
      },
      {
        key: 'upgrade_tips',
        type: 'action',
        action: 'send_email',
        config: { type: 'template', template_id: 'getting-started-tips' },
      },
      { key: 'done', type: 'action', action: 'end' },
    ],
    connections: [
      { from: 'joined', to: 'welcome_email' },
      { from: 'welcome_email', to: 'wait_1_day' },
      { from: 'wait_1_day', to: 'is_free_user' },
      { from: 'is_free_user', to: 'upgrade_tips', branch: 'yes' },
      { from: 'is_free_user', to: 'done', branch: 'no' },
    ],
  }),
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={
        "name": "Welcome series",
        "context": "contact",
        "description": "Welcome new subscribers, then nudge free users a day later.",
        "settings": {"allow_reentry": False},
        "steps": [
            {
                "key": "joined",
                "type": "trigger",
                "trigger": "contact.added_to_audience",
                "config": {"audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV"},
            },
            {
                "key": "welcome_email",
                "type": "action",
                "action": "send_email",
                "config": {"type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>"},
            },
            {"key": "wait_1_day", "type": "action", "action": "wait", "config": {"seconds": 86400}},
            {
                "key": "is_free_user",
                "type": "action",
                "action": "condition",
                "config": {
                    "filter": {
                        "match": "all",
                        "rules": [{"field": "custom_fields.plan", "operator": "is_not_set"}],
                    }
                },
            },
            {
                "key": "upgrade_tips",
                "type": "action",
                "action": "send_email",
                "config": {"type": "template", "template_id": "getting-started-tips"},
            },
            {"key": "done", "type": "action", "action": "end"},
        ],
        "connections": [
            {"from": "joined", "to": "welcome_email"},
            {"from": "welcome_email", "to": "wait_1_day"},
            {"from": "wait_1_day", "to": "is_free_user"},
            {"from": "is_free_user", "to": "upgrade_tips", "branch": "yes"},
            {"from": "is_free_user", "to": "done", "branch": "no"},
        ],
    },
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'name' => 'Welcome series',
        'context' => 'contact',
        'description' => 'Welcome new subscribers, then nudge free users a day later.',
        'settings' => ['allow_reentry' => false],
        'steps' => [
            [
                'key' => 'joined',
                'type' => 'trigger',
                'trigger' => 'contact.added_to_audience',
                'config' => ['audience_id' => 'aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV'],
            ],
            [
                'key' => 'welcome_email',
                'type' => 'action',
                'action' => 'send_email',
                'config' => ['type' => 'template', 'template_id' => 'welcome', 'from' => 'Acme <hello@acme.com>'],
            ],
            ['key' => 'wait_1_day', 'type' => 'action', 'action' => 'wait', 'config' => ['seconds' => 86400]],
            [
                'key' => 'is_free_user',
                'type' => 'action',
                'action' => 'condition',
                'config' => [
                    'filter' => [
                        'match' => 'all',
                        'rules' => [['field' => 'custom_fields.plan', 'operator' => 'is_not_set']],
                    ],
                ],
            ],
            [
                'key' => 'upgrade_tips',
                'type' => 'action',
                'action' => 'send_email',
                'config' => ['type' => 'template', 'template_id' => 'getting-started-tips'],
            ],
            ['key' => 'done', 'type' => 'action', 'action' => 'end'],
        ],
        'connections' => [
            ['from' => 'joined', 'to' => 'welcome_email'],
            ['from' => 'welcome_email', 'to' => 'wait_1_day'],
            ['from' => 'wait_1_day', 'to' => 'is_free_user'],
            ['from' => 'is_free_user', 'to' => 'upgrade_tips', 'branch' => 'yes'],
            ['from' => 'is_free_user', 'to' => 'done', 'branch' => 'no'],
        ],
    ],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**201**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "draft",
    "settings": { "allow_reentry": false },
    "last_triggered_at": null,
    "published_at": null,
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-01T09:41:05.318274+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      },
      {
        "id": "aus_3vM0ORwEXCQcyS7rylfQBQEXjVk",
        "key": "wait_1_day",
        "type": "action",
        "trigger": null,
        "action": "wait",
        "config": { "seconds": 86400 }
      },
      {
        "id": "aus_3HOgOzxaXBgVRpLFtpvJNo4vd5c",
        "key": "is_free_user",
        "type": "action",
        "trigger": null,
        "action": "condition",
        "config": {
          "filter": {
            "match": "all",
            "rules": [{ "field": "custom_fields.plan", "operator": "is_not_set" }]
          }
        }
      },
      {
        "id": "aus_3gCI5SWMPFVhOSawR6nz8sF55wp",
        "key": "upgrade_tips",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "getting-started-tips" }
      },
      {
        "id": "aus_3Pq7Wd2LxN8cVt5RmK0sHy4BfJe",
        "key": "done",
        "type": "action",
        "trigger": null,
        "action": "end",
        "config": {}
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" },
      { "from": "welcome_email", "to": "wait_1_day", "branch": "default" },
      { "from": "wait_1_day", "to": "is_free_user", "branch": "default" },
      { "from": "is_free_user", "to": "upgrade_tips", "branch": "yes" },
      { "from": "is_free_user", "to": "done", "branch": "no" }
    ]
  },
  "message": "Automation was successfully created.",
  "notify": true
}
```

**400**

```json
{
  "message": "Validation failed.",
  "errors": {
    "steps.1.action": ["Action \"forward_email\" is not allowed for context \"contact\"."],
    "steps": ["Action step \"upgrade_tips\" is not reachable from any trigger."]
  }
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/create/

## Obtener una automatización — GET /automations/{id}

> Obtén una automatización con su estado, su configuración, sus pasos de disparador y de acción, y las conexiones entre ellos.

# Obtener una automatización

Obtiene una automatización con su grafo completo. Requiere una clave de API con el permiso `full`.

`GET /automations/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Devuelve

Devuelve la automatización en `data`.

- `id` (string): El ID de la automatización, con el prefijo `aut_`.

- `context` (string): `contact`, `email` o `event`.

- `name` (string): El nombre de la automatización.

- `description` (string | null): Una descripción opcional.

- `status` (string): `draft`, `running`, `paused`, `stopped` o `archived`.

- `settings` (object): Las reglas de ejecución: `on_step_failure`, `allow_reentry`, `max_concurrent_runs`, `cooldown_seconds`. Vacío si no has configurado ninguna.

- `last_triggered_at` (string | null): Cuándo inició la automatización una ejecución por última vez.

- `published_at` (string | null): Cuándo se inició la automatización por primera vez.

- `steps` (object[]): El `id` (`aus_…`), `key`, `type`, `trigger`, `action` y `config` de cada paso. Los detalles de las ejecuciones hacen referencia a los pasos por su `id`; las estadísticas, por su `key`.

- `connections` (object[]): Las claves de paso `from` y `to` de cada arista y su `branch`.

Para saber qué significa cada disparador, acción y opción de configuración, consulta [Crear una automatización](/es/docs/api-reference/automations/create/). Devuelve `404` si la automatización no existe o se eliminó.

**Petición** `GET /automations/{id}`

**cURL**

```bash
curl https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "running",
    "settings": { "allow_reentry": false },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-03T14:12:40.551870+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      },
      {
        "id": "aus_3vM0ORwEXCQcyS7rylfQBQEXjVk",
        "key": "wait_1_day",
        "type": "action",
        "trigger": null,
        "action": "wait",
        "config": { "seconds": 86400 }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" },
      { "from": "welcome_email", "to": "wait_1_day", "branch": "default" }
    ]
  }
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/get/

## Actualizar una automatización — POST /automations/{id}

> Cambia el nombre de una automatización o su configuración, o sustituye su grafo de pasos y conexiones con una validación completa.

# Actualizar una automatización

Actualiza el nombre, la descripción, la configuración o el grafo de una automatización. Requiere una clave de API con el permiso `full`. El contexto no se puede cambiar.

Para cambiar el grafo, envía `steps` y `connections` juntos; sustituyen el grafo actual. Los pasos cuya `key` ya existe conservan su ID y su historial de ejecuciones, los pasos que no incluyas se eliminan y las claves nuevas se añaden. A diferencia de la creación, la actualización también valida la configuración de cada acción (por ejemplo, `send_email` necesita `type` y `template_id`, y `wait` necesita `seconds`).

[Pausa la automatización](/es/docs/api-reference/automations/pause/) antes de cambiar el grafo de una automatización en marcha y después [vuelve a iniciarla](/es/docs/api-reference/automations/start/) para que los nuevos disparadores surtan efecto.

`POST /automations/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Parámetros del cuerpo

- `name` (string): El nombre, de hasta 191 caracteres.

- `description` (string): La descripción.

- `settings` (object): Sustituye toda la configuración: `on_step_failure`, `allow_reentry`, `max_concurrent_runs`, `cooldown_seconds`. Consulta [Configuración](/es/docs/api-reference/automations/create/#settings).

- `steps` (object[]): La lista completa de pasos. Obligatorio si envías `connections`. Consulta [Pasos](/es/docs/api-reference/automations/create/#steps).

- `connections` (object[]): La lista completa de conexiones. Obligatorio si envías `steps`. Consulta [Conexiones](/es/docs/api-reference/automations/create/#connections).

## Devuelve

Devuelve la automatización actualizada en `data`, con `message` y `notify`. Devuelve `400` con `errors` indexado por la ruta del campo si la validación falla, y `404` si la automatización no existe.

**Petición** `POST /automations/{id}`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Welcome series (v2)",
    "settings": { "allow_reentry": false, "on_step_failure": "skip" }
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Welcome series (v2)',
    settings: { allow_reentry: false, on_step_failure: 'skip' },
  }),
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={
        "name": "Welcome series (v2)",
        "settings": {"allow_reentry": False, "on_step_failure": "skip"},
    },
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'name' => 'Welcome series (v2)',
        'settings' => ['allow_reentry' => false, 'on_step_failure' => 'skip'],
    ],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series (v2)",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "paused",
    "settings": { "allow_reentry": false, "on_step_failure": "skip" },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-04T08:15:22.730115+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully updated.",
  "notify": true
}
```

**400**

```json
{
  "message": "Validation failed.",
  "errors": {
    "steps.2.config.seconds": ["Wait seconds cannot exceed 2592000 (30 days)."],
    "steps.1.config.template_id": ["Template ID is required when type is \"template\"."]
  }
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/update/

## Listar automatizaciones — GET /automations

> Lista las automatizaciones de un espacio de trabajo con paginación page y per_page, filtradas por contexto, estado o nombre.

# Listar automatizaciones

Devuelve las automatizaciones del espacio de trabajo, de la más reciente a la más antigua, sin sus pasos ni sus conexiones. Requiere una clave de API con el permiso `full`. Las automatizaciones eliminadas no se listan.

`GET /automations`

## Parámetros de consulta

- `page` (integer): El número de página, empezando por 1.

- `per_page` (integer): Automatizaciones por página, de 1 a 100.

- `filter[context]` (string): Solo las automatizaciones con este contexto: `contact`, `email` o `event`.

- `filter[status]` (string): Solo las automatizaciones con este estado: `draft`, `running`, `paused`, `stopped` o `archived`.

- `filter[name]` (string): Búsqueda en parte del nombre, sin distinguir mayúsculas y minúsculas.

- `sort` (string): El campo de ordenación: `name`, `created_at`, `updated_at` o `last_triggered_at`.

- `order` (string): El sentido de la ordenación: `asc` o `desc`.

También puedes usar los filtros genéricos `key.condition=value` sobre `name`, `status`, `context` y `created_at`, con `match`. Consulta [Filtrado](/es/docs/api-reference/filtering/).

## Devuelve

- `data` (object[]): Las automatizaciones de esta página: `id`, `context`, `name`, `description`, `status`, `settings`, `last_triggered_at`, `published_at`, `created_at`, `updated_at`. En esta lista, `settings` siempre es un objeto vacío; para consultarlo, [obtén la automatización](/es/docs/api-reference/automations/get/).

- `total_records` (integer): El número de automatizaciones que coinciden.

- `per_page` (integer): El tamaño de página usado.

- `current_page` (integer): El número de esta página.

- `total_pages` (integer): El número de páginas.

**Petición** `GET /automations`

**cURL**

```bash
curl -G https://api.emailit.com/v2/automations \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  --data-urlencode "filter[status]=running" \
  -d sort=last_triggered_at \
  -d per_page=50
```

**Node.js**

```javascript
const params = new URLSearchParams({ 'filter[status]': 'running', sort: 'last_triggered_at', per_page: '50' });
const res = await fetch(`https://api.emailit.com/v2/automations?${params}`, {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data, total_pages } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"filter[status]": "running", "sort": "last_triggered_at", "per_page": 50},
)
automations = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['filter[status]' => 'running', 'sort' => 'last_triggered_at', 'per_page' => 50],
]);
$automations = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": [
    {
      "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
      "context": "contact",
      "name": "Welcome series",
      "description": "Welcome new subscribers, then nudge free users a day later.",
      "status": "running",
      "settings": {},
      "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
      "published_at": "2026-10-01T10:00:02.204118+00:00",
      "created_at": "2026-10-01T09:41:05.318274+00:00",
      "updated_at": "2026-10-03T14:12:40.551870+00:00"
    }
  ],
  "total_records": 1,
  "per_page": 50,
  "current_page": 1,
  "total_pages": 1
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/list/

## Eliminar una automatización — DELETE /automations/{id}

> Elimina una automatización para que deje de reaccionar a los disparadores. Si también quieres cancelar las ejecuciones en curso, detenla antes.

# Eliminar una automatización

Elimina una automatización. Desaparece de las listas y deja de reaccionar a los disparadores. Requiere una clave de API con el permiso `full`.

Las ejecuciones que ya están en curso no se cancelan. Para cancelarlas, [detén la automatización](/es/docs/api-reference/automations/stop/) antes de eliminarla.

`DELETE /automations/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Devuelve

Devuelve un `message` que confirma la eliminación. Devuelve `404` si la automatización no existe o ya se eliminó.

**Petición** `DELETE /automations/{id}`

**cURL**

```bash
curl -X DELETE https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const result = await res.json();
```

**Python**

```python
import os, requests

r = requests.delete(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
result = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->delete('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$result = json_decode($response->getBody(), true);
```

**200**

```json
{
  "message": "Automation was deleted successfully.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/delete/

## Iniciar una automatización — POST /automations/{id}/start

> Pon una automatización en running para que sus disparadores inicien ejecuciones nuevas. Funciona con automatizaciones en borrador, pausadas y detenidas.

# Iniciar una automatización

Cambia el estado de la automatización a `running`. A partir de ese momento, los disparadores que coinciden inician ejecuciones; los eventos que se produjeron antes de iniciarla, no. Requiere una clave de API con el permiso `full`.

Puedes iniciar una automatización `draft`, `paused` o `stopped`. El primer inicio asigna `published_at`.

Al iniciarla no se vuelve a validar el grafo. Si creaste la automatización con [Crear una automatización](/es/docs/api-reference/automations/create/), que solo comprueba la estructura, asegúrate de que la configuración de cada acción esté completa, o envía el grafo una vez con [Actualizar una automatización](/es/docs/api-reference/automations/update/), que lo valida por completo. Un paso con una configuración incompleta falla cuando una ejecución llega a él.

`POST /automations/{id}/start`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Devuelve

Devuelve la automatización en `data` con `status` igual a `running`. Devuelve `404` si la automatización no existe.

**Petición** `POST /automations/{id}/start`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "running",
    "settings": { "allow_reentry": false },
    "last_triggered_at": null,
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-01T10:00:02.204118+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully started.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/start/

## Pausar una automatización — POST /automations/{id}/pause

> Pausa una automatización para que sus disparadores dejen de iniciar ejecuciones nuevas, mientras las ejecuciones en curso continúan hasta el final.

# Pausar una automatización

Cambia el estado de la automatización a `paused`. Sus disparadores dejan de iniciar ejecuciones nuevas, pero las ejecuciones en curso continúan, incluidas las que están esperando en un paso `wait`. Requiere una clave de API con el permiso `full`.

Si además quieres cancelar las ejecuciones en curso, [detén la automatización](/es/docs/api-reference/automations/stop/). Para que vuelva a reaccionar a los disparadores, [iníciala](/es/docs/api-reference/automations/start/) de nuevo.

`POST /automations/{id}/pause`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Devuelve

Devuelve la automatización en `data` con `status` igual a `paused`. Devuelve `404` si la automatización no existe.

**Petición** `POST /automations/{id}/pause`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "paused",
    "settings": { "allow_reentry": false },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-04T08:10:51.004732+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully paused.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/pause/

## Detener una automatización — POST /automations/{id}/stop

> Detén una automatización y cancela todas sus ejecuciones en curso. Solo está disponible a través de la API, no en el panel.

# Detener una automatización

Cambia el estado de la automatización a `stopped` y cancela todas las ejecuciones que siguen en `running`; esas ejecuciones pasan al estado `canceled` y sus pasos restantes no se ejecutan. Requiere una clave de API con el permiso `full`.

Detener una automatización solo es posible a través de la API. Si quieres que las ejecuciones en curso continúen, [pausa la automatización](/es/docs/api-reference/automations/pause/). Puedes volver a [iniciar](/es/docs/api-reference/automations/start/) una automatización detenida; las ejecuciones nuevas empiezan desde cero.

`POST /automations/{id}/stop`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Devuelve

Devuelve la automatización en `data` con `status` igual a `stopped`. Devuelve `404` si la automatización no existe.

**Petición** `POST /automations/{id}/stop`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "stopped",
    "settings": { "allow_reentry": false },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-05T16:45:09.882301+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully stopped.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/stop/

## Lanzar una ejecución — POST /automations/{id}/trigger

> Dispara el disparador system.manual de una automatización en marcha con tu propio payload para iniciar una ejecución desde tu código.

# Lanzar una ejecución

Dispara el disparador `system.manual` con el payload que elijas. La automatización debe estar en `running` y tener un paso de disparador `system.manual`; si no, no se inicia ninguna ejecución. Requiere una clave de API con el permiso `full`. Los disparadores manuales solo están disponibles a través de la API.

La ejecución se inicia de forma asíncrona y cuesta 3 créditos, como cualquier otra ejecución. Puedes encontrarla con [Listar ejecuciones](/es/docs/api-reference/automations/runs/).

> **Se disparan todos los disparadores manuales del espacio de trabajo:** Actualmente, Emailit entrega el disparador manual a todas las automatizaciones en marcha del espacio de trabajo que tienen un paso de disparador `system.manual`, no solo a la de la ruta. Para limitar una automatización a sus propias llamadas, añade un filtro a su paso de disparador: `{ "match": "all", "rules": [{ "field": "automation_id", "operator": "equals", "value": "aut_…" }] }`.

`POST /automations/{id}/trigger`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Parámetros del cuerpo

- `payload` (object): Los datos de la ejecución. Emailit añade `automation_id` y guarda el resultado como el `payload` de la ejecución. Los pasos pueden leerlo con marcadores como `{{payload.order_id}}` y con condiciones como `payload.plan`. Sobre qué trata la ejecución depende del contexto de la automatización: - `contact`: pasa `contact_id` (`con_…`). Las acciones de contacto y `send_email` usan ese contacto. - `email`: pasa `email_id` (`em_…`). Las acciones de email usan ese email. - `event`: cualquier dato. Indica `to` o `email` en la configuración de las acciones, por ejemplo `"to": "{{payload.customer_email}}"`.

## Devuelve

Devuelve `200` con un `message` cuando el disparo se pone en cola. Devuelve `422` si la automatización no está en `running` y `404` si no existe.

**Petición** `POST /automations/{id}/trigger`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payload": {
      "contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A",
      "plan": "pro",
      "order_id": "ord_1042"
    }
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    payload: { contact_id: 'con_3munwNLaXKUARc6ff9wPtxKVq4A', plan: 'pro', order_id: 'ord_1042' },
  }),
});
const result = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={"payload": {"contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A", "plan": "pro", "order_id": "ord_1042"}},
)
result = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'payload' => ['contact_id' => 'con_3munwNLaXKUARc6ff9wPtxKVq4A', 'plan' => 'pro', 'order_id' => 'ord_1042'],
    ],
]);
$result = json_decode($response->getBody(), true);
```

**200**

```json
{
  "message": "Automation trigger dispatched."
}
```

**422**

```json
{
  "message": "Automation must be running to trigger."
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/trigger/

## Listar ejecuciones — GET /automations/{id}/runs

> Lista las ejecuciones de una automatización, de la más reciente a la más antigua, con el evento que las disparó, el payload, el estado y los tiempos de cada una.

# Listar ejecuciones

Devuelve las ejecuciones de una automatización, de la más reciente a la más antigua. Cada ejecución es un recorrido por el grafo que inicia un disparador. Requiere una clave de API con el permiso `full`.

`GET /automations/{id}/runs`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Parámetros de consulta

- `page` (integer): El número de página, empezando por 1.

- `per_page` (integer): Ejecuciones por página, de 1 a 100.

- `filter[status]` (string): Solo las ejecuciones con este estado: `running`, `completed`, `failed` o `canceled`.

También puedes filtrar con `key.condition=value` sobre `status`, `event` y `created_at` (por ejemplo, `created_at.after=2026-10-01`), y ordenar con `order` y `direction` por esas mismas claves. Consulta [Filtrado](/es/docs/api-reference/filtering/).

## Devuelve

- `data` (object[]): Las ejecuciones de esta página. Consulta los campos más abajo.

- `total_records, per_page, current_page, total_pages` (integer): Los datos de paginación.

Cada ejecución tiene:

- `id` (string): El ID de la ejecución, con el prefijo `aur_`.

- `automation_id` (string): La automatización (`aut_…`).

- `contact_id` (string | null): El contacto de la ejecución (`con_…`) en el contexto `contact`.

- `email_id` (string | null): El email de la ejecución (`em_…`) en el contexto `email`.

- `event_id` (string | null): El ID del evento de origen, si el payload del disparador lo incluye.

- `event` (string): El disparador que inició la ejecución, por ejemplo `contact.added_to_audience` o `system.manual`.

- `payload` (object): Siempre es un objeto vacío en esta lista. Para consultar el payload del disparador, [obtén la ejecución](/es/docs/api-reference/automations/run/).

- `meta` (object): Siempre es un objeto vacío en esta lista. Para consultar sus metadatos, como `failure_reason`, obtén la ejecución.

- `status` (string): `running`, `completed`, `failed` o `canceled` (se detuvo la automatización).

- `started_at, completed_at, created_at, updated_at` (string | null): Marcas de tiempo en UTC.

**Petición** `GET /automations/{id}/runs`

**cURL**

```bash
curl -G https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  --data-urlencode "filter[status]=failed"
```

**Node.js**

```javascript
const params = new URLSearchParams({ 'filter[status]': 'failed' });
const res = await fetch(
  `https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs?${params}`,
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: runs } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"filter[status]": "failed"},
)
runs = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['filter[status]' => 'failed'],
]);
$runs = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": [
    {
      "id": "aur_3q6GdFk2eRSG093grI0v9e6REu8",
      "automation_id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
      "contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A",
      "email_id": null,
      "event_id": null,
      "event": "contact.added_to_audience",
      "payload": {},
      "meta": {},
      "status": "failed",
      "started_at": "2026-10-03T14:12:40.551870+00:00",
      "completed_at": "2026-10-03T14:12:41.093355+00:00",
      "created_at": "2026-10-03T14:12:40.551870+00:00",
      "updated_at": "2026-10-03T14:12:41.093355+00:00"
    }
  ],
  "total_records": 1,
  "per_page": 25,
  "current_page": 1,
  "total_pages": 1
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/runs/

## Obtener una ejecución — GET /automations/{id}/runs/{run_id}

> Obtén una ejecución de una automatización con el payload del disparador, los metadatos y el estado y el resultado de cada paso que ejecutó.

# Obtener una ejecución

Obtiene una ejecución de una automatización, incluidos los pasos que ejecutó. Requiere una clave de API con el permiso `full`.

`GET /automations/{id}/runs/{run_id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

- `run_id` (string, obligatorio): El ID de la ejecución (`aur_…`).

## Devuelve

Devuelve la ejecución en `data` con los campos que se describen en [Listar ejecuciones](/es/docs/api-reference/automations/runs/), además de `payload` y `meta` completos y un array `run_steps`.

- `payload` (object | null): El payload del disparador: los datos del evento (`{ "object": { … } }`) o el payload que pasaste a [Lanzar una ejecución](/es/docs/api-reference/automations/trigger/), con `automation_id` añadido.

- `meta` (object | null): `source_event_id` vincula la ejecución con el evento que la inició. Las ejecuciones fallidas pueden tener `failure_reason`: `insufficient_credits` (no se pudieron cobrar los 3 créditos de la ejecución) o `run_timeout` (la ejecución seguía en `running` después de 72 horas sin ningún paso en espera).

- `run_steps` (object[]): Una entrada por cada paso al que llegó la ejecución: - `step_id`: el ID del paso (`aus_…`). Relaciónalo con `steps[].id` de [Obtener una automatización](/es/docs/api-reference/automations/get/). - `status`: `running`, `waiting` (un paso `wait` cuyo tiempo aún no ha transcurrido), `completed` o `failed`. - `data`: el resultado del paso. Por ejemplo, `send_email` devuelve `{ "result": "email_queued", "email_oid": "em_…", "to": "…" }`, `condition` devuelve `{ "result": true, "branch": "yes" }` y los pasos fallidos devuelven `{ "error": "…" }`. - `started_at`, `completed_at`, `created_at`.

Devuelve `404` si la automatización o la ejecución no existen.

**Petición** `GET /automations/{id}/runs/{run_id}`

**cURL**

```bash
curl https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8 \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch(
  'https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8',
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: run } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
run = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$run = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aur_3q6GdFk2eRSG093grI0v9e6REu8",
    "automation_id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A",
    "email_id": null,
    "event_id": null,
    "event": "contact.added_to_audience",
    "payload": {
      "object": {
        "id": "sub_3Fh2pQx9LmZr4Wt7Nc0bVd8KsYe",
        "object": "subscriber",
        "subscribed": true,
        "audience": { "id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "name": "Newsletter" },
        "contact": { "id": "con_3munwNLaXKUARc6ff9wPtxKVq4A", "email": "ada@example.com" }
      }
    },
    "meta": { "source_event_id": "evt_3Kd8sWq1NzXc5Vb7Mt2LpRy0HgA" },
    "status": "running",
    "started_at": "2026-10-03T14:12:40.551870+00:00",
    "completed_at": null,
    "created_at": "2026-10-03T14:12:40.551870+00:00",
    "updated_at": "2026-10-03T14:12:40.551870+00:00",
    "run_steps": [
      {
        "step_id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "status": "completed",
        "data": {
          "result": "email_queued",
          "outcome": "accepted",
          "email_oid": "em_3Cp8cMgPskzB8tIlgUyNJkpDp9O",
          "to": "ada@example.com"
        },
        "started_at": "2026-10-03T14:12:40.702113+00:00",
        "completed_at": "2026-10-03T14:12:40.918540+00:00",
        "created_at": "2026-10-03T14:12:40.702113+00:00"
      },
      {
        "step_id": "aus_3vM0ORwEXCQcyS7rylfQBQEXjVk",
        "status": "waiting",
        "data": { "status": "waiting", "delayMs": 86400000, "seconds": 86400 },
        "started_at": "2026-10-03T14:12:41.004221+00:00",
        "completed_at": null,
        "created_at": "2026-10-03T14:12:41.004221+00:00"
      }
    ]
  }
}
```

**404**

```json
{
  "message": "Run not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/run/

## Obtener estadísticas — GET /automations/{id}/stats

> Obtén los recuentos por paso de una automatización: cuántas ejecuciones llegaron a cada paso, los estados de los pasos, los resultados y un embudo de emails.

# Obtener estadísticas

Devuelve los recuentos de todos los pasos de una automatización, indexados por la clave del paso. Requiere una clave de API con el permiso `full`.

`GET /automations/{id}/stats`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

## Parámetros de consulta

- `since` (string): Solo cuenta las ejecuciones de pasos creadas en este momento o después. Fecha y hora RFC 3339, por ejemplo `2026-10-01T00:00:00Z`.

- `until` (string): Solo cuenta las ejecuciones de pasos creadas en este momento o antes. Fecha y hora RFC 3339.

- `run_ids[]` (string): Solo cuenta estas ejecuciones (`aur_…`). Repite el parámetro para indicar varias ejecuciones.

## Devuelve

Devuelve `data`, un objeto con una entrada por cada clave de paso. Los pasos a los que no ha llegado ninguna ejecución tienen un `total` de `0`.

- `total` (integer): El número de veces que las ejecuciones llegaron al paso.

- `by_status` (object): Los recuentos por estado del paso: `running`, `waiting`, `completed`, `failed`.

- `by_outcome` (object): Los recuentos por resultado. `send_email` y `forward_email`: `accepted` y, después, el último estado del email (`delivered`, `loaded`, `clicked`, `bounced`, `failed`, `complained`, `unsubscribed`, `canceled`). `condition`: `matched`, `not_matched`. `experiment`: la clave de la variante elegida. `call_webhook`: `2xx`, `4xx`, `5xx`, `timeout`, `network_error`. Pasos fallidos: `error`.

- `funnel` (object): Solo en los pasos `send_email`. Recuentos acumulados: `accepted` incluye todos los emails que llegaron más lejos, `delivered` incluye los emails cargados y con clic, y `loaded` incluye los emails con clic. `bounced`, `failed`, `complained` y `unsubscribed` son recuentos simples.

**Petición** `GET /automations/{id}/stats`

**cURL**

```bash
curl -G https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -d since=2026-10-01T00:00:00Z
```

**Node.js**

```javascript
const params = new URLSearchParams({ since: '2026-10-01T00:00:00Z' });
const res = await fetch(
  `https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats?${params}`,
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: stats } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"since": "2026-10-01T00:00:00Z"},
)
stats = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['since' => '2026-10-01T00:00:00Z'],
]);
$stats = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "joined": { "total": 0, "by_status": {}, "by_outcome": {} },
    "welcome_email": {
      "total": 412,
      "by_status": { "completed": 409, "failed": 3 },
      "by_outcome": { "delivered": 251, "loaded": 98, "clicked": 41, "bounced": 19, "error": 3 },
      "funnel": {
        "accepted": 390,
        "delivered": 390,
        "loaded": 139,
        "clicked": 41,
        "bounced": 19,
        "failed": 0,
        "complained": 0,
        "unsubscribed": 0
      }
    },
    "wait_1_day": {
      "total": 409,
      "by_status": { "completed": 352, "waiting": 57 },
      "by_outcome": {}
    },
    "is_free_user": {
      "total": 352,
      "by_status": { "completed": 352 },
      "by_outcome": { "matched": 270, "not_matched": 82 }
    },
    "upgrade_tips": {
      "total": 270,
      "by_status": { "completed": 270 },
      "by_outcome": { "accepted": 12, "delivered": 180, "loaded": 61, "clicked": 17 },
      "funnel": {
        "accepted": 270,
        "delivered": 258,
        "loaded": 78,
        "clicked": 17,
        "bounced": 0,
        "failed": 0,
        "complained": 0,
        "unsubscribed": 0
      }
    },
    "done": {
      "total": 82,
      "by_status": { "completed": 82 },
      "by_outcome": {}
    }
  }
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/stats/

## Obtener estadísticas de un paso — GET /automations/{id}/steps/{step_key}/stats

> Obtén los recuentos de un solo paso de una automatización a partir de su clave: ejecuciones, estados, resultados y el embudo de emails.

# Obtener estadísticas de un paso

Devuelve los recuentos de un paso de una automatización. Requiere una clave de API con el permiso `full`. Los campos son los mismos que en [Obtener estadísticas](/es/docs/api-reference/automations/stats/).

`GET /automations/{id}/steps/{step_key}/stats`

## Parámetros de ruta

- `id` (string, obligatorio): El ID de la automatización (`aut_…`).

- `step_key` (string, obligatorio): La `key` del paso, por ejemplo `welcome_email`.

## Parámetros de consulta

- `since` (string): Solo cuenta las ejecuciones de pasos creadas en este momento o después. Fecha y hora RFC 3339.

- `until` (string): Solo cuenta las ejecuciones de pasos creadas en este momento o antes. Fecha y hora RFC 3339.

## Devuelve

Devuelve `data` con `total`, `by_status`, `by_outcome` y, en los pasos `send_email`, `funnel`. Devuelve `404` si la automatización o la clave del paso no existen.

**Petición** `GET /automations/{id}/steps/{step_key}/stats`

**cURL**

```bash
curl https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch(
  'https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats',
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: stats } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
stats = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$stats = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "total": 412,
    "by_status": { "completed": 409, "failed": 3 },
    "by_outcome": { "delivered": 251, "loaded": 98, "clicked": 41, "bounced": 19, "error": 3 },
    "funnel": {
      "accepted": 390,
      "delivered": 390,
      "loaded": 139,
      "clicked": 41,
      "bounced": 19,
      "failed": 0,
      "complained": 0,
      "unsubscribed": 0
    }
  }
}
```

**404**

```json
{
  "message": "Step not found."
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/automations/step-stats/
